Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Intel LPSS PCI support.
0004  *
0005  * Copyright (C) 2015, Intel Corporation
0006  *
0007  * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
0008  *          Mika Westerberg <mika.westerberg@linux.intel.com>
0009  */
0010 
0011 #include <linux/ioport.h>
0012 #include <linux/kernel.h>
0013 #include <linux/module.h>
0014 #include <linux/pci.h>
0015 #include <linux/pm_runtime.h>
0016 #include <linux/property.h>
0017 
0018 #include "intel-lpss.h"
0019 
0020 /* Some DSDTs have an unused GEXP ACPI device conflicting with I2C4 resources */
0021 static const struct pci_device_id ignore_resource_conflicts_ids[] = {
0022     /* Microsoft Surface Go (version 1) I2C4 */
0023     { PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, 0x9d64, 0x152d, 0x1182), },
0024     /* Microsoft Surface Go 2 I2C4 */
0025     { PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, 0x9d64, 0x152d, 0x1237), },
0026     { }
0027 };
0028 
0029 static int intel_lpss_pci_probe(struct pci_dev *pdev,
0030                 const struct pci_device_id *id)
0031 {
0032     struct intel_lpss_platform_info *info;
0033     int ret;
0034 
0035     ret = pcim_enable_device(pdev);
0036     if (ret)
0037         return ret;
0038 
0039     info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
0040                 GFP_KERNEL);
0041     if (!info)
0042         return -ENOMEM;
0043 
0044     info->mem = &pdev->resource[0];
0045     info->irq = pdev->irq;
0046 
0047     if (pci_match_id(ignore_resource_conflicts_ids, pdev))
0048         info->ignore_resource_conflicts = true;
0049 
0050     pdev->d3cold_delay = 0;
0051 
0052     /* Probably it is enough to set this for iDMA capable devices only */
0053     pci_set_master(pdev);
0054     pci_try_set_mwi(pdev);
0055 
0056     ret = intel_lpss_probe(&pdev->dev, info);
0057     if (ret)
0058         return ret;
0059 
0060     pm_runtime_put(&pdev->dev);
0061     pm_runtime_allow(&pdev->dev);
0062 
0063     return 0;
0064 }
0065 
0066 static void intel_lpss_pci_remove(struct pci_dev *pdev)
0067 {
0068     pm_runtime_forbid(&pdev->dev);
0069     pm_runtime_get_sync(&pdev->dev);
0070 
0071     intel_lpss_remove(&pdev->dev);
0072 }
0073 
0074 static INTEL_LPSS_PM_OPS(intel_lpss_pci_pm_ops);
0075 
0076 static const struct intel_lpss_platform_info spt_info = {
0077     .clk_rate = 120000000,
0078 };
0079 
0080 static const struct property_entry spt_i2c_properties[] = {
0081     PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),
0082     { },
0083 };
0084 
0085 static const struct software_node spt_i2c_node = {
0086     .properties = spt_i2c_properties,
0087 };
0088 
0089 static const struct intel_lpss_platform_info spt_i2c_info = {
0090     .clk_rate = 120000000,
0091     .swnode = &spt_i2c_node,
0092 };
0093 
0094 static const struct property_entry uart_properties[] = {
0095     PROPERTY_ENTRY_U32("reg-io-width", 4),
0096     PROPERTY_ENTRY_U32("reg-shift", 2),
0097     PROPERTY_ENTRY_BOOL("snps,uart-16550-compatible"),
0098     { },
0099 };
0100 
0101 static const struct software_node uart_node = {
0102     .properties = uart_properties,
0103 };
0104 
0105 static const struct intel_lpss_platform_info spt_uart_info = {
0106     .clk_rate = 120000000,
0107     .clk_con_id = "baudclk",
0108     .swnode = &uart_node,
0109 };
0110 
0111 static const struct intel_lpss_platform_info bxt_info = {
0112     .clk_rate = 100000000,
0113 };
0114 
0115 static const struct intel_lpss_platform_info bxt_uart_info = {
0116     .clk_rate = 100000000,
0117     .clk_con_id = "baudclk",
0118     .swnode = &uart_node,
0119 };
0120 
0121 static const struct property_entry bxt_i2c_properties[] = {
0122     PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 42),
0123     PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
0124     PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 208),
0125     { },
0126 };
0127 
0128 static const struct software_node bxt_i2c_node = {
0129     .properties = bxt_i2c_properties,
0130 };
0131 
0132 static const struct intel_lpss_platform_info bxt_i2c_info = {
0133     .clk_rate = 133000000,
0134     .swnode = &bxt_i2c_node,
0135 };
0136 
0137 static const struct property_entry apl_i2c_properties[] = {
0138     PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 207),
0139     PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
0140     PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 208),
0141     { },
0142 };
0143 
0144 static const struct software_node apl_i2c_node = {
0145     .properties = apl_i2c_properties,
0146 };
0147 
0148 static const struct intel_lpss_platform_info apl_i2c_info = {
0149     .clk_rate = 133000000,
0150     .swnode = &apl_i2c_node,
0151 };
0152 
0153 static const struct property_entry glk_i2c_properties[] = {
0154     PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 313),
0155     PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
0156     PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 290),
0157     { },
0158 };
0159 
0160 static const struct software_node glk_i2c_node = {
0161     .properties = glk_i2c_properties,
0162 };
0163 
0164 static const struct intel_lpss_platform_info glk_i2c_info = {
0165     .clk_rate = 133000000,
0166     .swnode = &glk_i2c_node,
0167 };
0168 
0169 static const struct intel_lpss_platform_info cnl_i2c_info = {
0170     .clk_rate = 216000000,
0171     .swnode = &spt_i2c_node,
0172 };
0173 
0174 static const struct intel_lpss_platform_info ehl_i2c_info = {
0175     .clk_rate = 100000000,
0176     .swnode = &bxt_i2c_node,
0177 };
0178 
0179 static const struct pci_device_id intel_lpss_pci_ids[] = {
0180     /* CML-LP */
0181     { PCI_VDEVICE(INTEL, 0x02a8), (kernel_ulong_t)&spt_uart_info },
0182     { PCI_VDEVICE(INTEL, 0x02a9), (kernel_ulong_t)&spt_uart_info },
0183     { PCI_VDEVICE(INTEL, 0x02aa), (kernel_ulong_t)&spt_info },
0184     { PCI_VDEVICE(INTEL, 0x02ab), (kernel_ulong_t)&spt_info },
0185     { PCI_VDEVICE(INTEL, 0x02c5), (kernel_ulong_t)&cnl_i2c_info },
0186     { PCI_VDEVICE(INTEL, 0x02c6), (kernel_ulong_t)&cnl_i2c_info },
0187     { PCI_VDEVICE(INTEL, 0x02c7), (kernel_ulong_t)&spt_uart_info },
0188     { PCI_VDEVICE(INTEL, 0x02e8), (kernel_ulong_t)&cnl_i2c_info },
0189     { PCI_VDEVICE(INTEL, 0x02e9), (kernel_ulong_t)&cnl_i2c_info },
0190     { PCI_VDEVICE(INTEL, 0x02ea), (kernel_ulong_t)&cnl_i2c_info },
0191     { PCI_VDEVICE(INTEL, 0x02eb), (kernel_ulong_t)&cnl_i2c_info },
0192     { PCI_VDEVICE(INTEL, 0x02fb), (kernel_ulong_t)&spt_info },
0193     /* CML-H */
0194     { PCI_VDEVICE(INTEL, 0x06a8), (kernel_ulong_t)&spt_uart_info },
0195     { PCI_VDEVICE(INTEL, 0x06a9), (kernel_ulong_t)&spt_uart_info },
0196     { PCI_VDEVICE(INTEL, 0x06aa), (kernel_ulong_t)&spt_info },
0197     { PCI_VDEVICE(INTEL, 0x06ab), (kernel_ulong_t)&spt_info },
0198     { PCI_VDEVICE(INTEL, 0x06c7), (kernel_ulong_t)&spt_uart_info },
0199     { PCI_VDEVICE(INTEL, 0x06e8), (kernel_ulong_t)&cnl_i2c_info },
0200     { PCI_VDEVICE(INTEL, 0x06e9), (kernel_ulong_t)&cnl_i2c_info },
0201     { PCI_VDEVICE(INTEL, 0x06ea), (kernel_ulong_t)&cnl_i2c_info },
0202     { PCI_VDEVICE(INTEL, 0x06eb), (kernel_ulong_t)&cnl_i2c_info },
0203     { PCI_VDEVICE(INTEL, 0x06fb), (kernel_ulong_t)&spt_info },
0204     /* BXT A-Step */
0205     { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info },
0206     { PCI_VDEVICE(INTEL, 0x0aae), (kernel_ulong_t)&bxt_i2c_info },
0207     { PCI_VDEVICE(INTEL, 0x0ab0), (kernel_ulong_t)&bxt_i2c_info },
0208     { PCI_VDEVICE(INTEL, 0x0ab2), (kernel_ulong_t)&bxt_i2c_info },
0209     { PCI_VDEVICE(INTEL, 0x0ab4), (kernel_ulong_t)&bxt_i2c_info },
0210     { PCI_VDEVICE(INTEL, 0x0ab6), (kernel_ulong_t)&bxt_i2c_info },
0211     { PCI_VDEVICE(INTEL, 0x0ab8), (kernel_ulong_t)&bxt_i2c_info },
0212     { PCI_VDEVICE(INTEL, 0x0aba), (kernel_ulong_t)&bxt_i2c_info },
0213     { PCI_VDEVICE(INTEL, 0x0abc), (kernel_ulong_t)&bxt_uart_info },
0214     { PCI_VDEVICE(INTEL, 0x0abe), (kernel_ulong_t)&bxt_uart_info },
0215     { PCI_VDEVICE(INTEL, 0x0ac0), (kernel_ulong_t)&bxt_uart_info },
0216     { PCI_VDEVICE(INTEL, 0x0ac2), (kernel_ulong_t)&bxt_info },
0217     { PCI_VDEVICE(INTEL, 0x0ac4), (kernel_ulong_t)&bxt_info },
0218     { PCI_VDEVICE(INTEL, 0x0ac6), (kernel_ulong_t)&bxt_info },
0219     { PCI_VDEVICE(INTEL, 0x0aee), (kernel_ulong_t)&bxt_uart_info },
0220     /* BXT B-Step */
0221     { PCI_VDEVICE(INTEL, 0x1aac), (kernel_ulong_t)&bxt_i2c_info },
0222     { PCI_VDEVICE(INTEL, 0x1aae), (kernel_ulong_t)&bxt_i2c_info },
0223     { PCI_VDEVICE(INTEL, 0x1ab0), (kernel_ulong_t)&bxt_i2c_info },
0224     { PCI_VDEVICE(INTEL, 0x1ab2), (kernel_ulong_t)&bxt_i2c_info },
0225     { PCI_VDEVICE(INTEL, 0x1ab4), (kernel_ulong_t)&bxt_i2c_info },
0226     { PCI_VDEVICE(INTEL, 0x1ab6), (kernel_ulong_t)&bxt_i2c_info },
0227     { PCI_VDEVICE(INTEL, 0x1ab8), (kernel_ulong_t)&bxt_i2c_info },
0228     { PCI_VDEVICE(INTEL, 0x1aba), (kernel_ulong_t)&bxt_i2c_info },
0229     { PCI_VDEVICE(INTEL, 0x1abc), (kernel_ulong_t)&bxt_uart_info },
0230     { PCI_VDEVICE(INTEL, 0x1abe), (kernel_ulong_t)&bxt_uart_info },
0231     { PCI_VDEVICE(INTEL, 0x1ac0), (kernel_ulong_t)&bxt_uart_info },
0232     { PCI_VDEVICE(INTEL, 0x1ac2), (kernel_ulong_t)&bxt_info },
0233     { PCI_VDEVICE(INTEL, 0x1ac4), (kernel_ulong_t)&bxt_info },
0234     { PCI_VDEVICE(INTEL, 0x1ac6), (kernel_ulong_t)&bxt_info },
0235     { PCI_VDEVICE(INTEL, 0x1aee), (kernel_ulong_t)&bxt_uart_info },
0236     /* EBG */
0237     { PCI_VDEVICE(INTEL, 0x1bad), (kernel_ulong_t)&bxt_uart_info },
0238     { PCI_VDEVICE(INTEL, 0x1bae), (kernel_ulong_t)&bxt_uart_info },
0239     /* GLK */
0240     { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&glk_i2c_info },
0241     { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&glk_i2c_info },
0242     { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&glk_i2c_info },
0243     { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&glk_i2c_info },
0244     { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&glk_i2c_info },
0245     { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&glk_i2c_info },
0246     { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&glk_i2c_info },
0247     { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&glk_i2c_info },
0248     { PCI_VDEVICE(INTEL, 0x31bc), (kernel_ulong_t)&bxt_uart_info },
0249     { PCI_VDEVICE(INTEL, 0x31be), (kernel_ulong_t)&bxt_uart_info },
0250     { PCI_VDEVICE(INTEL, 0x31c0), (kernel_ulong_t)&bxt_uart_info },
0251     { PCI_VDEVICE(INTEL, 0x31c2), (kernel_ulong_t)&bxt_info },
0252     { PCI_VDEVICE(INTEL, 0x31c4), (kernel_ulong_t)&bxt_info },
0253     { PCI_VDEVICE(INTEL, 0x31c6), (kernel_ulong_t)&bxt_info },
0254     { PCI_VDEVICE(INTEL, 0x31ee), (kernel_ulong_t)&bxt_uart_info },
0255     /* ICL-LP */
0256     { PCI_VDEVICE(INTEL, 0x34a8), (kernel_ulong_t)&spt_uart_info },
0257     { PCI_VDEVICE(INTEL, 0x34a9), (kernel_ulong_t)&spt_uart_info },
0258     { PCI_VDEVICE(INTEL, 0x34aa), (kernel_ulong_t)&spt_info },
0259     { PCI_VDEVICE(INTEL, 0x34ab), (kernel_ulong_t)&spt_info },
0260     { PCI_VDEVICE(INTEL, 0x34c5), (kernel_ulong_t)&bxt_i2c_info },
0261     { PCI_VDEVICE(INTEL, 0x34c6), (kernel_ulong_t)&bxt_i2c_info },
0262     { PCI_VDEVICE(INTEL, 0x34c7), (kernel_ulong_t)&spt_uart_info },
0263     { PCI_VDEVICE(INTEL, 0x34e8), (kernel_ulong_t)&bxt_i2c_info },
0264     { PCI_VDEVICE(INTEL, 0x34e9), (kernel_ulong_t)&bxt_i2c_info },
0265     { PCI_VDEVICE(INTEL, 0x34ea), (kernel_ulong_t)&bxt_i2c_info },
0266     { PCI_VDEVICE(INTEL, 0x34eb), (kernel_ulong_t)&bxt_i2c_info },
0267     { PCI_VDEVICE(INTEL, 0x34fb), (kernel_ulong_t)&spt_info },
0268     /* ICL-N */
0269     { PCI_VDEVICE(INTEL, 0x38a8), (kernel_ulong_t)&spt_uart_info },
0270     /* TGL-H */
0271     { PCI_VDEVICE(INTEL, 0x43a7), (kernel_ulong_t)&bxt_uart_info },
0272     { PCI_VDEVICE(INTEL, 0x43a8), (kernel_ulong_t)&bxt_uart_info },
0273     { PCI_VDEVICE(INTEL, 0x43a9), (kernel_ulong_t)&bxt_uart_info },
0274     { PCI_VDEVICE(INTEL, 0x43aa), (kernel_ulong_t)&bxt_info },
0275     { PCI_VDEVICE(INTEL, 0x43ab), (kernel_ulong_t)&bxt_info },
0276     { PCI_VDEVICE(INTEL, 0x43ad), (kernel_ulong_t)&bxt_i2c_info },
0277     { PCI_VDEVICE(INTEL, 0x43ae), (kernel_ulong_t)&bxt_i2c_info },
0278     { PCI_VDEVICE(INTEL, 0x43d8), (kernel_ulong_t)&bxt_i2c_info },
0279     { PCI_VDEVICE(INTEL, 0x43da), (kernel_ulong_t)&bxt_uart_info },
0280     { PCI_VDEVICE(INTEL, 0x43e8), (kernel_ulong_t)&bxt_i2c_info },
0281     { PCI_VDEVICE(INTEL, 0x43e9), (kernel_ulong_t)&bxt_i2c_info },
0282     { PCI_VDEVICE(INTEL, 0x43ea), (kernel_ulong_t)&bxt_i2c_info },
0283     { PCI_VDEVICE(INTEL, 0x43eb), (kernel_ulong_t)&bxt_i2c_info },
0284     { PCI_VDEVICE(INTEL, 0x43fb), (kernel_ulong_t)&bxt_info },
0285     { PCI_VDEVICE(INTEL, 0x43fd), (kernel_ulong_t)&bxt_info },
0286     /* EHL */
0287     { PCI_VDEVICE(INTEL, 0x4b28), (kernel_ulong_t)&bxt_uart_info },
0288     { PCI_VDEVICE(INTEL, 0x4b29), (kernel_ulong_t)&bxt_uart_info },
0289     { PCI_VDEVICE(INTEL, 0x4b2a), (kernel_ulong_t)&bxt_info },
0290     { PCI_VDEVICE(INTEL, 0x4b2b), (kernel_ulong_t)&bxt_info },
0291     { PCI_VDEVICE(INTEL, 0x4b37), (kernel_ulong_t)&bxt_info },
0292     { PCI_VDEVICE(INTEL, 0x4b44), (kernel_ulong_t)&ehl_i2c_info },
0293     { PCI_VDEVICE(INTEL, 0x4b45), (kernel_ulong_t)&ehl_i2c_info },
0294     { PCI_VDEVICE(INTEL, 0x4b4b), (kernel_ulong_t)&ehl_i2c_info },
0295     { PCI_VDEVICE(INTEL, 0x4b4c), (kernel_ulong_t)&ehl_i2c_info },
0296     { PCI_VDEVICE(INTEL, 0x4b4d), (kernel_ulong_t)&bxt_uart_info },
0297     { PCI_VDEVICE(INTEL, 0x4b78), (kernel_ulong_t)&ehl_i2c_info },
0298     { PCI_VDEVICE(INTEL, 0x4b79), (kernel_ulong_t)&ehl_i2c_info },
0299     { PCI_VDEVICE(INTEL, 0x4b7a), (kernel_ulong_t)&ehl_i2c_info },
0300     { PCI_VDEVICE(INTEL, 0x4b7b), (kernel_ulong_t)&ehl_i2c_info },
0301     /* JSL */
0302     { PCI_VDEVICE(INTEL, 0x4da8), (kernel_ulong_t)&spt_uart_info },
0303     { PCI_VDEVICE(INTEL, 0x4da9), (kernel_ulong_t)&spt_uart_info },
0304     { PCI_VDEVICE(INTEL, 0x4daa), (kernel_ulong_t)&spt_info },
0305     { PCI_VDEVICE(INTEL, 0x4dab), (kernel_ulong_t)&spt_info },
0306     { PCI_VDEVICE(INTEL, 0x4dc5), (kernel_ulong_t)&bxt_i2c_info },
0307     { PCI_VDEVICE(INTEL, 0x4dc6), (kernel_ulong_t)&bxt_i2c_info },
0308     { PCI_VDEVICE(INTEL, 0x4dc7), (kernel_ulong_t)&spt_uart_info },
0309     { PCI_VDEVICE(INTEL, 0x4de8), (kernel_ulong_t)&bxt_i2c_info },
0310     { PCI_VDEVICE(INTEL, 0x4de9), (kernel_ulong_t)&bxt_i2c_info },
0311     { PCI_VDEVICE(INTEL, 0x4dea), (kernel_ulong_t)&bxt_i2c_info },
0312     { PCI_VDEVICE(INTEL, 0x4deb), (kernel_ulong_t)&bxt_i2c_info },
0313     { PCI_VDEVICE(INTEL, 0x4dfb), (kernel_ulong_t)&spt_info },
0314     /* ADL-P */
0315     { PCI_VDEVICE(INTEL, 0x51a8), (kernel_ulong_t)&bxt_uart_info },
0316     { PCI_VDEVICE(INTEL, 0x51a9), (kernel_ulong_t)&bxt_uart_info },
0317     { PCI_VDEVICE(INTEL, 0x51aa), (kernel_ulong_t)&bxt_info },
0318     { PCI_VDEVICE(INTEL, 0x51ab), (kernel_ulong_t)&bxt_info },
0319     { PCI_VDEVICE(INTEL, 0x51c5), (kernel_ulong_t)&bxt_i2c_info },
0320     { PCI_VDEVICE(INTEL, 0x51c6), (kernel_ulong_t)&bxt_i2c_info },
0321     { PCI_VDEVICE(INTEL, 0x51c7), (kernel_ulong_t)&bxt_uart_info },
0322     { PCI_VDEVICE(INTEL, 0x51d8), (kernel_ulong_t)&bxt_i2c_info },
0323     { PCI_VDEVICE(INTEL, 0x51d9), (kernel_ulong_t)&bxt_i2c_info },
0324     { PCI_VDEVICE(INTEL, 0x51e8), (kernel_ulong_t)&bxt_i2c_info },
0325     { PCI_VDEVICE(INTEL, 0x51e9), (kernel_ulong_t)&bxt_i2c_info },
0326     { PCI_VDEVICE(INTEL, 0x51ea), (kernel_ulong_t)&bxt_i2c_info },
0327     { PCI_VDEVICE(INTEL, 0x51eb), (kernel_ulong_t)&bxt_i2c_info },
0328     { PCI_VDEVICE(INTEL, 0x51fb), (kernel_ulong_t)&bxt_info },
0329     /* ADL-M */
0330     { PCI_VDEVICE(INTEL, 0x54a8), (kernel_ulong_t)&bxt_uart_info },
0331     { PCI_VDEVICE(INTEL, 0x54a9), (kernel_ulong_t)&bxt_uart_info },
0332     { PCI_VDEVICE(INTEL, 0x54aa), (kernel_ulong_t)&bxt_info },
0333     { PCI_VDEVICE(INTEL, 0x54ab), (kernel_ulong_t)&bxt_info },
0334     { PCI_VDEVICE(INTEL, 0x54c5), (kernel_ulong_t)&bxt_i2c_info },
0335     { PCI_VDEVICE(INTEL, 0x54c6), (kernel_ulong_t)&bxt_i2c_info },
0336     { PCI_VDEVICE(INTEL, 0x54c7), (kernel_ulong_t)&bxt_uart_info },
0337     { PCI_VDEVICE(INTEL, 0x54e8), (kernel_ulong_t)&bxt_i2c_info },
0338     { PCI_VDEVICE(INTEL, 0x54e9), (kernel_ulong_t)&bxt_i2c_info },
0339     { PCI_VDEVICE(INTEL, 0x54ea), (kernel_ulong_t)&bxt_i2c_info },
0340     { PCI_VDEVICE(INTEL, 0x54eb), (kernel_ulong_t)&bxt_i2c_info },
0341     { PCI_VDEVICE(INTEL, 0x54fb), (kernel_ulong_t)&bxt_info },
0342     /* APL */
0343     { PCI_VDEVICE(INTEL, 0x5aac), (kernel_ulong_t)&apl_i2c_info },
0344     { PCI_VDEVICE(INTEL, 0x5aae), (kernel_ulong_t)&apl_i2c_info },
0345     { PCI_VDEVICE(INTEL, 0x5ab0), (kernel_ulong_t)&apl_i2c_info },
0346     { PCI_VDEVICE(INTEL, 0x5ab2), (kernel_ulong_t)&apl_i2c_info },
0347     { PCI_VDEVICE(INTEL, 0x5ab4), (kernel_ulong_t)&apl_i2c_info },
0348     { PCI_VDEVICE(INTEL, 0x5ab6), (kernel_ulong_t)&apl_i2c_info },
0349     { PCI_VDEVICE(INTEL, 0x5ab8), (kernel_ulong_t)&apl_i2c_info },
0350     { PCI_VDEVICE(INTEL, 0x5aba), (kernel_ulong_t)&apl_i2c_info },
0351     { PCI_VDEVICE(INTEL, 0x5abc), (kernel_ulong_t)&bxt_uart_info },
0352     { PCI_VDEVICE(INTEL, 0x5abe), (kernel_ulong_t)&bxt_uart_info },
0353     { PCI_VDEVICE(INTEL, 0x5ac0), (kernel_ulong_t)&bxt_uart_info },
0354     { PCI_VDEVICE(INTEL, 0x5ac2), (kernel_ulong_t)&bxt_info },
0355     { PCI_VDEVICE(INTEL, 0x5ac4), (kernel_ulong_t)&bxt_info },
0356     { PCI_VDEVICE(INTEL, 0x5ac6), (kernel_ulong_t)&bxt_info },
0357     { PCI_VDEVICE(INTEL, 0x5aee), (kernel_ulong_t)&bxt_uart_info },
0358     /* RPL-S */
0359     { PCI_VDEVICE(INTEL, 0x7a28), (kernel_ulong_t)&bxt_uart_info },
0360     { PCI_VDEVICE(INTEL, 0x7a29), (kernel_ulong_t)&bxt_uart_info },
0361     { PCI_VDEVICE(INTEL, 0x7a2a), (kernel_ulong_t)&bxt_info },
0362     { PCI_VDEVICE(INTEL, 0x7a2b), (kernel_ulong_t)&bxt_info },
0363     { PCI_VDEVICE(INTEL, 0x7a4c), (kernel_ulong_t)&bxt_i2c_info },
0364     { PCI_VDEVICE(INTEL, 0x7a4d), (kernel_ulong_t)&bxt_i2c_info },
0365     { PCI_VDEVICE(INTEL, 0x7a4e), (kernel_ulong_t)&bxt_i2c_info },
0366     { PCI_VDEVICE(INTEL, 0x7a4f), (kernel_ulong_t)&bxt_i2c_info },
0367     { PCI_VDEVICE(INTEL, 0x7a5c), (kernel_ulong_t)&bxt_uart_info },
0368     { PCI_VDEVICE(INTEL, 0x7a79), (kernel_ulong_t)&bxt_info },
0369     { PCI_VDEVICE(INTEL, 0x7a7b), (kernel_ulong_t)&bxt_info },
0370     { PCI_VDEVICE(INTEL, 0x7a7c), (kernel_ulong_t)&bxt_i2c_info },
0371     { PCI_VDEVICE(INTEL, 0x7a7d), (kernel_ulong_t)&bxt_i2c_info },
0372     { PCI_VDEVICE(INTEL, 0x7a7e), (kernel_ulong_t)&bxt_uart_info },
0373     /* ADL-S */
0374     { PCI_VDEVICE(INTEL, 0x7aa8), (kernel_ulong_t)&bxt_uart_info },
0375     { PCI_VDEVICE(INTEL, 0x7aa9), (kernel_ulong_t)&bxt_uart_info },
0376     { PCI_VDEVICE(INTEL, 0x7aaa), (kernel_ulong_t)&bxt_info },
0377     { PCI_VDEVICE(INTEL, 0x7aab), (kernel_ulong_t)&bxt_info },
0378     { PCI_VDEVICE(INTEL, 0x7acc), (kernel_ulong_t)&bxt_i2c_info },
0379     { PCI_VDEVICE(INTEL, 0x7acd), (kernel_ulong_t)&bxt_i2c_info },
0380     { PCI_VDEVICE(INTEL, 0x7ace), (kernel_ulong_t)&bxt_i2c_info },
0381     { PCI_VDEVICE(INTEL, 0x7acf), (kernel_ulong_t)&bxt_i2c_info },
0382     { PCI_VDEVICE(INTEL, 0x7adc), (kernel_ulong_t)&bxt_uart_info },
0383     { PCI_VDEVICE(INTEL, 0x7af9), (kernel_ulong_t)&bxt_info },
0384     { PCI_VDEVICE(INTEL, 0x7afb), (kernel_ulong_t)&bxt_info },
0385     { PCI_VDEVICE(INTEL, 0x7afc), (kernel_ulong_t)&bxt_i2c_info },
0386     { PCI_VDEVICE(INTEL, 0x7afd), (kernel_ulong_t)&bxt_i2c_info },
0387     { PCI_VDEVICE(INTEL, 0x7afe), (kernel_ulong_t)&bxt_uart_info },
0388     /* MTL-P */
0389     { PCI_VDEVICE(INTEL, 0x7e25), (kernel_ulong_t)&bxt_uart_info },
0390     { PCI_VDEVICE(INTEL, 0x7e26), (kernel_ulong_t)&bxt_uart_info },
0391     { PCI_VDEVICE(INTEL, 0x7e27), (kernel_ulong_t)&bxt_info },
0392     { PCI_VDEVICE(INTEL, 0x7e30), (kernel_ulong_t)&bxt_info },
0393     { PCI_VDEVICE(INTEL, 0x7e46), (kernel_ulong_t)&bxt_info },
0394     { PCI_VDEVICE(INTEL, 0x7e50), (kernel_ulong_t)&bxt_i2c_info },
0395     { PCI_VDEVICE(INTEL, 0x7e51), (kernel_ulong_t)&bxt_i2c_info },
0396     { PCI_VDEVICE(INTEL, 0x7e52), (kernel_ulong_t)&bxt_uart_info },
0397     { PCI_VDEVICE(INTEL, 0x7e78), (kernel_ulong_t)&bxt_i2c_info },
0398     { PCI_VDEVICE(INTEL, 0x7e79), (kernel_ulong_t)&bxt_i2c_info },
0399     { PCI_VDEVICE(INTEL, 0x7e7a), (kernel_ulong_t)&bxt_i2c_info },
0400     { PCI_VDEVICE(INTEL, 0x7e7b), (kernel_ulong_t)&bxt_i2c_info },
0401     /* LKF */
0402     { PCI_VDEVICE(INTEL, 0x98a8), (kernel_ulong_t)&bxt_uart_info },
0403     { PCI_VDEVICE(INTEL, 0x98a9), (kernel_ulong_t)&bxt_uart_info },
0404     { PCI_VDEVICE(INTEL, 0x98aa), (kernel_ulong_t)&bxt_info },
0405     { PCI_VDEVICE(INTEL, 0x98c5), (kernel_ulong_t)&bxt_i2c_info },
0406     { PCI_VDEVICE(INTEL, 0x98c6), (kernel_ulong_t)&bxt_i2c_info },
0407     { PCI_VDEVICE(INTEL, 0x98c7), (kernel_ulong_t)&bxt_uart_info },
0408     { PCI_VDEVICE(INTEL, 0x98e8), (kernel_ulong_t)&bxt_i2c_info },
0409     { PCI_VDEVICE(INTEL, 0x98e9), (kernel_ulong_t)&bxt_i2c_info },
0410     { PCI_VDEVICE(INTEL, 0x98ea), (kernel_ulong_t)&bxt_i2c_info },
0411     { PCI_VDEVICE(INTEL, 0x98eb), (kernel_ulong_t)&bxt_i2c_info },
0412     /* SPT-LP */
0413     { PCI_VDEVICE(INTEL, 0x9d27), (kernel_ulong_t)&spt_uart_info },
0414     { PCI_VDEVICE(INTEL, 0x9d28), (kernel_ulong_t)&spt_uart_info },
0415     { PCI_VDEVICE(INTEL, 0x9d29), (kernel_ulong_t)&spt_info },
0416     { PCI_VDEVICE(INTEL, 0x9d2a), (kernel_ulong_t)&spt_info },
0417     { PCI_VDEVICE(INTEL, 0x9d60), (kernel_ulong_t)&spt_i2c_info },
0418     { PCI_VDEVICE(INTEL, 0x9d61), (kernel_ulong_t)&spt_i2c_info },
0419     { PCI_VDEVICE(INTEL, 0x9d62), (kernel_ulong_t)&spt_i2c_info },
0420     { PCI_VDEVICE(INTEL, 0x9d63), (kernel_ulong_t)&spt_i2c_info },
0421     { PCI_VDEVICE(INTEL, 0x9d64), (kernel_ulong_t)&spt_i2c_info },
0422     { PCI_VDEVICE(INTEL, 0x9d65), (kernel_ulong_t)&spt_i2c_info },
0423     { PCI_VDEVICE(INTEL, 0x9d66), (kernel_ulong_t)&spt_uart_info },
0424     /* CNL-LP */
0425     { PCI_VDEVICE(INTEL, 0x9da8), (kernel_ulong_t)&spt_uart_info },
0426     { PCI_VDEVICE(INTEL, 0x9da9), (kernel_ulong_t)&spt_uart_info },
0427     { PCI_VDEVICE(INTEL, 0x9daa), (kernel_ulong_t)&spt_info },
0428     { PCI_VDEVICE(INTEL, 0x9dab), (kernel_ulong_t)&spt_info },
0429     { PCI_VDEVICE(INTEL, 0x9dc5), (kernel_ulong_t)&cnl_i2c_info },
0430     { PCI_VDEVICE(INTEL, 0x9dc6), (kernel_ulong_t)&cnl_i2c_info },
0431     { PCI_VDEVICE(INTEL, 0x9dc7), (kernel_ulong_t)&spt_uart_info },
0432     { PCI_VDEVICE(INTEL, 0x9de8), (kernel_ulong_t)&cnl_i2c_info },
0433     { PCI_VDEVICE(INTEL, 0x9de9), (kernel_ulong_t)&cnl_i2c_info },
0434     { PCI_VDEVICE(INTEL, 0x9dea), (kernel_ulong_t)&cnl_i2c_info },
0435     { PCI_VDEVICE(INTEL, 0x9deb), (kernel_ulong_t)&cnl_i2c_info },
0436     { PCI_VDEVICE(INTEL, 0x9dfb), (kernel_ulong_t)&spt_info },
0437     /* TGL-LP */
0438     { PCI_VDEVICE(INTEL, 0xa0a8), (kernel_ulong_t)&bxt_uart_info },
0439     { PCI_VDEVICE(INTEL, 0xa0a9), (kernel_ulong_t)&bxt_uart_info },
0440     { PCI_VDEVICE(INTEL, 0xa0aa), (kernel_ulong_t)&spt_info },
0441     { PCI_VDEVICE(INTEL, 0xa0ab), (kernel_ulong_t)&spt_info },
0442     { PCI_VDEVICE(INTEL, 0xa0c5), (kernel_ulong_t)&spt_i2c_info },
0443     { PCI_VDEVICE(INTEL, 0xa0c6), (kernel_ulong_t)&spt_i2c_info },
0444     { PCI_VDEVICE(INTEL, 0xa0c7), (kernel_ulong_t)&bxt_uart_info },
0445     { PCI_VDEVICE(INTEL, 0xa0d8), (kernel_ulong_t)&spt_i2c_info },
0446     { PCI_VDEVICE(INTEL, 0xa0d9), (kernel_ulong_t)&spt_i2c_info },
0447     { PCI_VDEVICE(INTEL, 0xa0da), (kernel_ulong_t)&bxt_uart_info },
0448     { PCI_VDEVICE(INTEL, 0xa0db), (kernel_ulong_t)&bxt_uart_info },
0449     { PCI_VDEVICE(INTEL, 0xa0dc), (kernel_ulong_t)&bxt_uart_info },
0450     { PCI_VDEVICE(INTEL, 0xa0dd), (kernel_ulong_t)&bxt_uart_info },
0451     { PCI_VDEVICE(INTEL, 0xa0de), (kernel_ulong_t)&spt_info },
0452     { PCI_VDEVICE(INTEL, 0xa0df), (kernel_ulong_t)&spt_info },
0453     { PCI_VDEVICE(INTEL, 0xa0e8), (kernel_ulong_t)&spt_i2c_info },
0454     { PCI_VDEVICE(INTEL, 0xa0e9), (kernel_ulong_t)&spt_i2c_info },
0455     { PCI_VDEVICE(INTEL, 0xa0ea), (kernel_ulong_t)&spt_i2c_info },
0456     { PCI_VDEVICE(INTEL, 0xa0eb), (kernel_ulong_t)&spt_i2c_info },
0457     { PCI_VDEVICE(INTEL, 0xa0fb), (kernel_ulong_t)&spt_info },
0458     { PCI_VDEVICE(INTEL, 0xa0fd), (kernel_ulong_t)&spt_info },
0459     { PCI_VDEVICE(INTEL, 0xa0fe), (kernel_ulong_t)&spt_info },
0460     /* SPT-H */
0461     { PCI_VDEVICE(INTEL, 0xa127), (kernel_ulong_t)&spt_uart_info },
0462     { PCI_VDEVICE(INTEL, 0xa128), (kernel_ulong_t)&spt_uart_info },
0463     { PCI_VDEVICE(INTEL, 0xa129), (kernel_ulong_t)&spt_info },
0464     { PCI_VDEVICE(INTEL, 0xa12a), (kernel_ulong_t)&spt_info },
0465     { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_i2c_info },
0466     { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info },
0467     { PCI_VDEVICE(INTEL, 0xa162), (kernel_ulong_t)&spt_i2c_info },
0468     { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info },
0469     /* KBL-H */
0470     { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&spt_uart_info },
0471     { PCI_VDEVICE(INTEL, 0xa2a8), (kernel_ulong_t)&spt_uart_info },
0472     { PCI_VDEVICE(INTEL, 0xa2a9), (kernel_ulong_t)&spt_info },
0473     { PCI_VDEVICE(INTEL, 0xa2aa), (kernel_ulong_t)&spt_info },
0474     { PCI_VDEVICE(INTEL, 0xa2e0), (kernel_ulong_t)&spt_i2c_info },
0475     { PCI_VDEVICE(INTEL, 0xa2e1), (kernel_ulong_t)&spt_i2c_info },
0476     { PCI_VDEVICE(INTEL, 0xa2e2), (kernel_ulong_t)&spt_i2c_info },
0477     { PCI_VDEVICE(INTEL, 0xa2e3), (kernel_ulong_t)&spt_i2c_info },
0478     { PCI_VDEVICE(INTEL, 0xa2e6), (kernel_ulong_t)&spt_uart_info },
0479     /* CNL-H */
0480     { PCI_VDEVICE(INTEL, 0xa328), (kernel_ulong_t)&spt_uart_info },
0481     { PCI_VDEVICE(INTEL, 0xa329), (kernel_ulong_t)&spt_uart_info },
0482     { PCI_VDEVICE(INTEL, 0xa32a), (kernel_ulong_t)&spt_info },
0483     { PCI_VDEVICE(INTEL, 0xa32b), (kernel_ulong_t)&spt_info },
0484     { PCI_VDEVICE(INTEL, 0xa347), (kernel_ulong_t)&spt_uart_info },
0485     { PCI_VDEVICE(INTEL, 0xa368), (kernel_ulong_t)&cnl_i2c_info },
0486     { PCI_VDEVICE(INTEL, 0xa369), (kernel_ulong_t)&cnl_i2c_info },
0487     { PCI_VDEVICE(INTEL, 0xa36a), (kernel_ulong_t)&cnl_i2c_info },
0488     { PCI_VDEVICE(INTEL, 0xa36b), (kernel_ulong_t)&cnl_i2c_info },
0489     { PCI_VDEVICE(INTEL, 0xa37b), (kernel_ulong_t)&spt_info },
0490     /* CML-V */
0491     { PCI_VDEVICE(INTEL, 0xa3a7), (kernel_ulong_t)&spt_uart_info },
0492     { PCI_VDEVICE(INTEL, 0xa3a8), (kernel_ulong_t)&spt_uart_info },
0493     { PCI_VDEVICE(INTEL, 0xa3a9), (kernel_ulong_t)&spt_info },
0494     { PCI_VDEVICE(INTEL, 0xa3aa), (kernel_ulong_t)&spt_info },
0495     { PCI_VDEVICE(INTEL, 0xa3e0), (kernel_ulong_t)&spt_i2c_info },
0496     { PCI_VDEVICE(INTEL, 0xa3e1), (kernel_ulong_t)&spt_i2c_info },
0497     { PCI_VDEVICE(INTEL, 0xa3e2), (kernel_ulong_t)&spt_i2c_info },
0498     { PCI_VDEVICE(INTEL, 0xa3e3), (kernel_ulong_t)&spt_i2c_info },
0499     { PCI_VDEVICE(INTEL, 0xa3e6), (kernel_ulong_t)&spt_uart_info },
0500     { }
0501 };
0502 MODULE_DEVICE_TABLE(pci, intel_lpss_pci_ids);
0503 
0504 static struct pci_driver intel_lpss_pci_driver = {
0505     .name = "intel-lpss",
0506     .id_table = intel_lpss_pci_ids,
0507     .probe = intel_lpss_pci_probe,
0508     .remove = intel_lpss_pci_remove,
0509     .driver = {
0510         .pm = &intel_lpss_pci_pm_ops,
0511     },
0512 };
0513 
0514 module_pci_driver(intel_lpss_pci_driver);
0515 
0516 MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
0517 MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
0518 MODULE_DESCRIPTION("Intel LPSS PCI driver");
0519 MODULE_LICENSE("GPL v2");