0001
0002
0003
0004
0005
0006
0007
0008
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
0021 static const struct pci_device_id ignore_resource_conflicts_ids[] = {
0022
0023 { PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, 0x9d64, 0x152d, 0x1182), },
0024
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
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
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
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
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
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
0237 { PCI_VDEVICE(INTEL, 0x1bad), (kernel_ulong_t)&bxt_uart_info },
0238 { PCI_VDEVICE(INTEL, 0x1bae), (kernel_ulong_t)&bxt_uart_info },
0239
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
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
0269 { PCI_VDEVICE(INTEL, 0x38a8), (kernel_ulong_t)&spt_uart_info },
0270
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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");