brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · 42bd514 Raw
99 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * soc-intel-quirks.h - prototypes for quirk autodetection4 *5 * Copyright (c) 2019, Intel Corporation.6 *7 */8 9#ifndef _SND_SOC_INTEL_QUIRKS_H10#define _SND_SOC_INTEL_QUIRKS_H11 12#include <linux/platform_data/x86/soc.h>13 14#if IS_REACHABLE(CONFIG_IOSF_MBI)15 16#include <linux/dmi.h>17#include <asm/iosf_mbi.h>18 19static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)20{21	/*22	 * List of systems which:23	 * 1. Use a non CR version of the Bay Trail SoC24	 * 2. Contain at least 6 interrupt resources so that the25	 *    platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below26	 *    succeeds27	 * 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 528	 *29	 * This needs to be here so that it can be shared between the SST and30	 * SOF drivers. We rely on the compiler to optimize this out in files31	 * where soc_intel_is_byt_cr is not used.32	 */33	static const struct dmi_system_id force_bytcr_table[] = {34		{	/* Lenovo Yoga Tablet 2 series */35			.matches = {36				DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),37				DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),38			},39		},40		{}41	};42	struct device *dev = &pdev->dev;43	int status = 0;44 45	if (!soc_intel_is_byt())46		return false;47 48	if (dmi_check_system(force_bytcr_table))49		return true;50 51	if (iosf_mbi_available()) {52		u32 bios_status;53 54		status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */55				       MBI_REG_READ, /* 0x10 */56				       0x006, /* BIOS_CONFIG */57				       &bios_status);58 59		if (status) {60			dev_err(dev, "could not read PUNIT BIOS_CONFIG\n");61		} else {62			/* bits 26:27 mirror PMIC options */63			bios_status = (bios_status >> 26) & 3;64 65			if (bios_status == 1 || bios_status == 3) {66				dev_info(dev, "Detected Baytrail-CR platform\n");67				return true;68			}69 70			dev_info(dev, "BYT-CR not detected\n");71		}72	} else {73		dev_info(dev, "IOSF_MBI not available, no BYT-CR detection\n");74	}75 76	if (!platform_get_resource(pdev, IORESOURCE_IRQ, 5)) {77		/*78		 * Some devices detected as BYT-T have only a single IRQ listed,79		 * causing platform_get_irq with index 5 to return -ENXIO.80		 * The correct IRQ in this case is at index 0, as on BYT-CR.81		 */82		dev_info(dev, "Falling back to Baytrail-CR platform\n");83		return true;84	}85 86	return false;87}88 89#else90 91static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)92{93	return false;94}95 96#endif97 98#endif /* _SND_SOC_INTEL_QUIRKS_H */99