1*536cfd2fSPierre-Louis Bossart /* SPDX-License-Identifier: GPL-2.0 */ 2*536cfd2fSPierre-Louis Bossart /* 3*536cfd2fSPierre-Louis Bossart * soc-intel-quirks.h - prototypes for quirk autodetection 4*536cfd2fSPierre-Louis Bossart * 5*536cfd2fSPierre-Louis Bossart * Copyright (c) 2019, Intel Corporation. 6*536cfd2fSPierre-Louis Bossart * 7*536cfd2fSPierre-Louis Bossart */ 8*536cfd2fSPierre-Louis Bossart 9*536cfd2fSPierre-Louis Bossart #ifndef _SND_SOC_INTEL_QUIRKS_H 10*536cfd2fSPierre-Louis Bossart #define _SND_SOC_INTEL_QUIRKS_H 11*536cfd2fSPierre-Louis Bossart 12*536cfd2fSPierre-Louis Bossart #if IS_ENABLED(CONFIG_X86) 13*536cfd2fSPierre-Louis Bossart 14*536cfd2fSPierre-Louis Bossart #include <asm/cpu_device_id.h> 15*536cfd2fSPierre-Louis Bossart #include <asm/intel-family.h> 16*536cfd2fSPierre-Louis Bossart #include <asm/iosf_mbi.h> 17*536cfd2fSPierre-Louis Bossart 18*536cfd2fSPierre-Louis Bossart #define ICPU(model) { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, } 19*536cfd2fSPierre-Louis Bossart 20*536cfd2fSPierre-Louis Bossart #define SOC_INTEL_IS_CPU(soc, type) \ 21*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_##soc(void) \ 22*536cfd2fSPierre-Louis Bossart { \ 23*536cfd2fSPierre-Louis Bossart static const struct x86_cpu_id soc##_cpu_ids[] = { \ 24*536cfd2fSPierre-Louis Bossart ICPU(type), \ 25*536cfd2fSPierre-Louis Bossart {} \ 26*536cfd2fSPierre-Louis Bossart }; \ 27*536cfd2fSPierre-Louis Bossart const struct x86_cpu_id *id; \ 28*536cfd2fSPierre-Louis Bossart \ 29*536cfd2fSPierre-Louis Bossart id = x86_match_cpu(soc##_cpu_ids); \ 30*536cfd2fSPierre-Louis Bossart if (id) \ 31*536cfd2fSPierre-Louis Bossart return true; \ 32*536cfd2fSPierre-Louis Bossart return false; \ 33*536cfd2fSPierre-Louis Bossart } 34*536cfd2fSPierre-Louis Bossart 35*536cfd2fSPierre-Louis Bossart SOC_INTEL_IS_CPU(byt, INTEL_FAM6_ATOM_SILVERMONT); 36*536cfd2fSPierre-Louis Bossart SOC_INTEL_IS_CPU(cht, INTEL_FAM6_ATOM_AIRMONT); 37*536cfd2fSPierre-Louis Bossart SOC_INTEL_IS_CPU(apl, INTEL_FAM6_ATOM_GOLDMONT); 38*536cfd2fSPierre-Louis Bossart SOC_INTEL_IS_CPU(glk, INTEL_FAM6_ATOM_GOLDMONT_PLUS); 39*536cfd2fSPierre-Louis Bossart 40*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt_cr(struct platform_device *pdev) 41*536cfd2fSPierre-Louis Bossart { 42*536cfd2fSPierre-Louis Bossart struct device *dev = &pdev->dev; 43*536cfd2fSPierre-Louis Bossart int status = 0; 44*536cfd2fSPierre-Louis Bossart 45*536cfd2fSPierre-Louis Bossart if (!soc_intel_is_byt()) 46*536cfd2fSPierre-Louis Bossart return false; 47*536cfd2fSPierre-Louis Bossart 48*536cfd2fSPierre-Louis Bossart if (iosf_mbi_available()) { 49*536cfd2fSPierre-Louis Bossart u32 bios_status; 50*536cfd2fSPierre-Louis Bossart 51*536cfd2fSPierre-Louis Bossart status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */ 52*536cfd2fSPierre-Louis Bossart MBI_REG_READ, /* 0x10 */ 53*536cfd2fSPierre-Louis Bossart 0x006, /* BIOS_CONFIG */ 54*536cfd2fSPierre-Louis Bossart &bios_status); 55*536cfd2fSPierre-Louis Bossart 56*536cfd2fSPierre-Louis Bossart if (status) { 57*536cfd2fSPierre-Louis Bossart dev_err(dev, "could not read PUNIT BIOS_CONFIG\n"); 58*536cfd2fSPierre-Louis Bossart } else { 59*536cfd2fSPierre-Louis Bossart /* bits 26:27 mirror PMIC options */ 60*536cfd2fSPierre-Louis Bossart bios_status = (bios_status >> 26) & 3; 61*536cfd2fSPierre-Louis Bossart 62*536cfd2fSPierre-Louis Bossart if (bios_status == 1 || bios_status == 3) { 63*536cfd2fSPierre-Louis Bossart dev_info(dev, "Detected Baytrail-CR platform\n"); 64*536cfd2fSPierre-Louis Bossart return true; 65*536cfd2fSPierre-Louis Bossart } 66*536cfd2fSPierre-Louis Bossart 67*536cfd2fSPierre-Louis Bossart dev_info(dev, "BYT-CR not detected\n"); 68*536cfd2fSPierre-Louis Bossart } 69*536cfd2fSPierre-Louis Bossart } else { 70*536cfd2fSPierre-Louis Bossart dev_info(dev, "IOSF_MBI not available, no BYT-CR detection\n"); 71*536cfd2fSPierre-Louis Bossart } 72*536cfd2fSPierre-Louis Bossart 73*536cfd2fSPierre-Louis Bossart if (!platform_get_resource(pdev, IORESOURCE_IRQ, 5)) { 74*536cfd2fSPierre-Louis Bossart /* 75*536cfd2fSPierre-Louis Bossart * Some devices detected as BYT-T have only a single IRQ listed, 76*536cfd2fSPierre-Louis Bossart * causing platform_get_irq with index 5 to return -ENXIO. 77*536cfd2fSPierre-Louis Bossart * The correct IRQ in this case is at index 0, as on BYT-CR. 78*536cfd2fSPierre-Louis Bossart */ 79*536cfd2fSPierre-Louis Bossart dev_info(dev, "Falling back to Baytrail-CR platform\n"); 80*536cfd2fSPierre-Louis Bossart return true; 81*536cfd2fSPierre-Louis Bossart } 82*536cfd2fSPierre-Louis Bossart 83*536cfd2fSPierre-Louis Bossart return false; 84*536cfd2fSPierre-Louis Bossart } 85*536cfd2fSPierre-Louis Bossart 86*536cfd2fSPierre-Louis Bossart #else 87*536cfd2fSPierre-Louis Bossart 88*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt_cr(struct platform_device *pdev) 89*536cfd2fSPierre-Louis Bossart { 90*536cfd2fSPierre-Louis Bossart return false; 91*536cfd2fSPierre-Louis Bossart } 92*536cfd2fSPierre-Louis Bossart 93*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt(void) 94*536cfd2fSPierre-Louis Bossart { 95*536cfd2fSPierre-Louis Bossart return false; 96*536cfd2fSPierre-Louis Bossart } 97*536cfd2fSPierre-Louis Bossart 98*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_cht(void) 99*536cfd2fSPierre-Louis Bossart { 100*536cfd2fSPierre-Louis Bossart return false; 101*536cfd2fSPierre-Louis Bossart } 102*536cfd2fSPierre-Louis Bossart 103*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_apl(void) 104*536cfd2fSPierre-Louis Bossart { 105*536cfd2fSPierre-Louis Bossart return false; 106*536cfd2fSPierre-Louis Bossart } 107*536cfd2fSPierre-Louis Bossart 108*536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_glk(void) 109*536cfd2fSPierre-Louis Bossart { 110*536cfd2fSPierre-Louis Bossart return false; 111*536cfd2fSPierre-Louis Bossart } 112*536cfd2fSPierre-Louis Bossart 113*536cfd2fSPierre-Louis Bossart #endif 114*536cfd2fSPierre-Louis Bossart 115*536cfd2fSPierre-Louis Bossart #endif /* _SND_SOC_INTEL_QUIRKS_H */ 116