Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * soc-intel-quirks.h - prototypes for quirk autodetection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2019, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #ifndef _SND_SOC_INTEL_QUIRKS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #define _SND_SOC_INTEL_QUIRKS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #if IS_ENABLED(CONFIG_X86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <asm/cpu_device_id.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/intel-family.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/iosf_mbi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define SOC_INTEL_IS_CPU(soc, type)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static inline bool soc_intel_is_##soc(void)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	static const struct x86_cpu_id soc##_cpu_ids[] = {	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 		X86_MATCH_INTEL_FAM6_MODEL(type, NULL),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 		{}						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	};							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	const struct x86_cpu_id *id;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	id = x86_match_cpu(soc##_cpu_ids);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	if (id)							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 		return true;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	return false;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) SOC_INTEL_IS_CPU(byt, ATOM_SILVERMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) SOC_INTEL_IS_CPU(cht, ATOM_AIRMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) SOC_INTEL_IS_CPU(apl, ATOM_GOLDMONT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) SOC_INTEL_IS_CPU(glk, ATOM_GOLDMONT_PLUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) SOC_INTEL_IS_CPU(cml, KABYLAKE_L);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	 * List of systems which:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	 * 1. Use a non CR version of the Bay Trail SoC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	 * 2. Contain at least 6 interrupt resources so that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	 *    platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	 *    succeeds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	 * 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	 * This needs to be here so that it can be shared between the SST and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	 * SOF drivers. We rely on the compiler to optimize this out in files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	 * where soc_intel_is_byt_cr is not used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	static const struct dmi_system_id force_bytcr_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		{	/* Lenovo Yoga Tablet 2 series */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 			.matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 				DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 				DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 			},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	struct device *dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	if (!soc_intel_is_byt())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (dmi_check_system(force_bytcr_table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	if (iosf_mbi_available()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		u32 bios_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 				       MBI_REG_READ, /* 0x10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 				       0x006, /* BIOS_CONFIG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 				       &bios_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 			dev_err(dev, "could not read PUNIT BIOS_CONFIG\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 			/* bits 26:27 mirror PMIC options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 			bios_status = (bios_status >> 26) & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 			if (bios_status == 1 || bios_status == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 				dev_info(dev, "Detected Baytrail-CR platform\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 				return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			dev_info(dev, "BYT-CR not detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		dev_info(dev, "IOSF_MBI not available, no BYT-CR detection\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	if (!platform_get_resource(pdev, IORESOURCE_IRQ, 5)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		 * Some devices detected as BYT-T have only a single IRQ listed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		 * causing platform_get_irq with index 5 to return -ENXIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		 * The correct IRQ in this case is at index 0, as on BYT-CR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 		dev_info(dev, "Falling back to Baytrail-CR platform\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) static inline bool soc_intel_is_byt_cr(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static inline bool soc_intel_is_byt(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static inline bool soc_intel_is_cht(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static inline bool soc_intel_is_apl(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static inline bool soc_intel_is_glk(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) static inline bool soc_intel_is_cml(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)  #endif /* _SND_SOC_INTEL_QUIRKS_H */