1e149ca29SPierre-Louis Bossart /* SPDX-License-Identifier: GPL-2.0-only */ 2536cfd2fSPierre-Louis Bossart /* 3536cfd2fSPierre-Louis Bossart * soc-intel-quirks.h - prototypes for quirk autodetection 4536cfd2fSPierre-Louis Bossart * 5536cfd2fSPierre-Louis Bossart * Copyright (c) 2019, Intel Corporation. 6536cfd2fSPierre-Louis Bossart * 7536cfd2fSPierre-Louis Bossart */ 8536cfd2fSPierre-Louis Bossart 9536cfd2fSPierre-Louis Bossart #ifndef _SND_SOC_INTEL_QUIRKS_H 10536cfd2fSPierre-Louis Bossart #define _SND_SOC_INTEL_QUIRKS_H 11536cfd2fSPierre-Louis Bossart 12536cfd2fSPierre-Louis Bossart #if IS_ENABLED(CONFIG_X86) 13536cfd2fSPierre-Louis Bossart 14*8ade6d8bSHans de Goede #include <linux/dmi.h> 15536cfd2fSPierre-Louis Bossart #include <asm/cpu_device_id.h> 16536cfd2fSPierre-Louis Bossart #include <asm/intel-family.h> 17536cfd2fSPierre-Louis Bossart #include <asm/iosf_mbi.h> 18536cfd2fSPierre-Louis Bossart 19536cfd2fSPierre-Louis Bossart #define SOC_INTEL_IS_CPU(soc, type) \ 20536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_##soc(void) \ 21536cfd2fSPierre-Louis Bossart { \ 22536cfd2fSPierre-Louis Bossart static const struct x86_cpu_id soc##_cpu_ids[] = { \ 23d51ba9c6SThomas Gleixner X86_MATCH_INTEL_FAM6_MODEL(type, NULL), \ 24536cfd2fSPierre-Louis Bossart {} \ 25536cfd2fSPierre-Louis Bossart }; \ 26536cfd2fSPierre-Louis Bossart const struct x86_cpu_id *id; \ 27536cfd2fSPierre-Louis Bossart \ 28536cfd2fSPierre-Louis Bossart id = x86_match_cpu(soc##_cpu_ids); \ 29536cfd2fSPierre-Louis Bossart if (id) \ 30536cfd2fSPierre-Louis Bossart return true; \ 31536cfd2fSPierre-Louis Bossart return false; \ 32536cfd2fSPierre-Louis Bossart } 33536cfd2fSPierre-Louis Bossart 34d51ba9c6SThomas Gleixner SOC_INTEL_IS_CPU(byt, ATOM_SILVERMONT); 35d51ba9c6SThomas Gleixner SOC_INTEL_IS_CPU(cht, ATOM_AIRMONT); 36d51ba9c6SThomas Gleixner SOC_INTEL_IS_CPU(apl, ATOM_GOLDMONT); 37d51ba9c6SThomas Gleixner SOC_INTEL_IS_CPU(glk, ATOM_GOLDMONT_PLUS); 38d51ba9c6SThomas Gleixner SOC_INTEL_IS_CPU(cml, KABYLAKE_L); 39536cfd2fSPierre-Louis Bossart 40536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt_cr(struct platform_device *pdev) 41536cfd2fSPierre-Louis Bossart { 42*8ade6d8bSHans de Goede /* 43*8ade6d8bSHans de Goede * List of systems which: 44*8ade6d8bSHans de Goede * 1. Use a non CR version of the Bay Trail SoC 45*8ade6d8bSHans de Goede * 2. Contain at least 6 interrupt resources so that the 46*8ade6d8bSHans de Goede * platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below 47*8ade6d8bSHans de Goede * succeeds 48*8ade6d8bSHans de Goede * 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 5 49*8ade6d8bSHans de Goede * 50*8ade6d8bSHans de Goede * This needs to be here so that it can be shared between the SST and 51*8ade6d8bSHans de Goede * SOF drivers. We rely on the compiler to optimize this out in files 52*8ade6d8bSHans de Goede * where soc_intel_is_byt_cr is not used. 53*8ade6d8bSHans de Goede */ 54*8ade6d8bSHans de Goede static const struct dmi_system_id force_bytcr_table[] = { 55*8ade6d8bSHans de Goede { /* Lenovo Yoga Tablet 2 series */ 56*8ade6d8bSHans de Goede .matches = { 57*8ade6d8bSHans de Goede DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 58*8ade6d8bSHans de Goede DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"), 59*8ade6d8bSHans de Goede }, 60*8ade6d8bSHans de Goede }, 61*8ade6d8bSHans de Goede {} 62*8ade6d8bSHans de Goede }; 63536cfd2fSPierre-Louis Bossart struct device *dev = &pdev->dev; 64536cfd2fSPierre-Louis Bossart int status = 0; 65536cfd2fSPierre-Louis Bossart 66536cfd2fSPierre-Louis Bossart if (!soc_intel_is_byt()) 67536cfd2fSPierre-Louis Bossart return false; 68536cfd2fSPierre-Louis Bossart 69*8ade6d8bSHans de Goede if (dmi_check_system(force_bytcr_table)) 70*8ade6d8bSHans de Goede return true; 71*8ade6d8bSHans de Goede 72536cfd2fSPierre-Louis Bossart if (iosf_mbi_available()) { 73536cfd2fSPierre-Louis Bossart u32 bios_status; 74536cfd2fSPierre-Louis Bossart 75536cfd2fSPierre-Louis Bossart status = iosf_mbi_read(BT_MBI_UNIT_PMC, /* 0x04 PUNIT */ 76536cfd2fSPierre-Louis Bossart MBI_REG_READ, /* 0x10 */ 77536cfd2fSPierre-Louis Bossart 0x006, /* BIOS_CONFIG */ 78536cfd2fSPierre-Louis Bossart &bios_status); 79536cfd2fSPierre-Louis Bossart 80536cfd2fSPierre-Louis Bossart if (status) { 81536cfd2fSPierre-Louis Bossart dev_err(dev, "could not read PUNIT BIOS_CONFIG\n"); 82536cfd2fSPierre-Louis Bossart } else { 83536cfd2fSPierre-Louis Bossart /* bits 26:27 mirror PMIC options */ 84536cfd2fSPierre-Louis Bossart bios_status = (bios_status >> 26) & 3; 85536cfd2fSPierre-Louis Bossart 86536cfd2fSPierre-Louis Bossart if (bios_status == 1 || bios_status == 3) { 87536cfd2fSPierre-Louis Bossart dev_info(dev, "Detected Baytrail-CR platform\n"); 88536cfd2fSPierre-Louis Bossart return true; 89536cfd2fSPierre-Louis Bossart } 90536cfd2fSPierre-Louis Bossart 91536cfd2fSPierre-Louis Bossart dev_info(dev, "BYT-CR not detected\n"); 92536cfd2fSPierre-Louis Bossart } 93536cfd2fSPierre-Louis Bossart } else { 94536cfd2fSPierre-Louis Bossart dev_info(dev, "IOSF_MBI not available, no BYT-CR detection\n"); 95536cfd2fSPierre-Louis Bossart } 96536cfd2fSPierre-Louis Bossart 97536cfd2fSPierre-Louis Bossart if (!platform_get_resource(pdev, IORESOURCE_IRQ, 5)) { 98536cfd2fSPierre-Louis Bossart /* 99536cfd2fSPierre-Louis Bossart * Some devices detected as BYT-T have only a single IRQ listed, 100536cfd2fSPierre-Louis Bossart * causing platform_get_irq with index 5 to return -ENXIO. 101536cfd2fSPierre-Louis Bossart * The correct IRQ in this case is at index 0, as on BYT-CR. 102536cfd2fSPierre-Louis Bossart */ 103536cfd2fSPierre-Louis Bossart dev_info(dev, "Falling back to Baytrail-CR platform\n"); 104536cfd2fSPierre-Louis Bossart return true; 105536cfd2fSPierre-Louis Bossart } 106536cfd2fSPierre-Louis Bossart 107536cfd2fSPierre-Louis Bossart return false; 108536cfd2fSPierre-Louis Bossart } 109536cfd2fSPierre-Louis Bossart 110536cfd2fSPierre-Louis Bossart #else 111536cfd2fSPierre-Louis Bossart 112536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt_cr(struct platform_device *pdev) 113536cfd2fSPierre-Louis Bossart { 114536cfd2fSPierre-Louis Bossart return false; 115536cfd2fSPierre-Louis Bossart } 116536cfd2fSPierre-Louis Bossart 117536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_byt(void) 118536cfd2fSPierre-Louis Bossart { 119536cfd2fSPierre-Louis Bossart return false; 120536cfd2fSPierre-Louis Bossart } 121536cfd2fSPierre-Louis Bossart 122536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_cht(void) 123536cfd2fSPierre-Louis Bossart { 124536cfd2fSPierre-Louis Bossart return false; 125536cfd2fSPierre-Louis Bossart } 126536cfd2fSPierre-Louis Bossart 127536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_apl(void) 128536cfd2fSPierre-Louis Bossart { 129536cfd2fSPierre-Louis Bossart return false; 130536cfd2fSPierre-Louis Bossart } 131536cfd2fSPierre-Louis Bossart 132536cfd2fSPierre-Louis Bossart static inline bool soc_intel_is_glk(void) 133536cfd2fSPierre-Louis Bossart { 134536cfd2fSPierre-Louis Bossart return false; 135536cfd2fSPierre-Louis Bossart } 136536cfd2fSPierre-Louis Bossart 137c643c189SMac Chiang static inline bool soc_intel_is_cml(void) 138c643c189SMac Chiang { 139c643c189SMac Chiang return false; 140c643c189SMac Chiang } 141536cfd2fSPierre-Louis Bossart #endif 142536cfd2fSPierre-Louis Bossart 143536cfd2fSPierre-Louis Bossart #endif /* _SND_SOC_INTEL_QUIRKS_H */ 144