linux/drivers/mfd/intel-lpss-pci.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Intel LPSS PCI support.
   4 *
   5 * Copyright (C) 2015, Intel Corporation
   6 *
   7 * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
   8 *          Mika Westerberg <mika.westerberg@linux.intel.com>
   9 */
  10
  11#include <linux/ioport.h>
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/pci.h>
  15#include <linux/pm_runtime.h>
  16#include <linux/property.h>
  17
  18#include "intel-lpss.h"
  19
  20static int intel_lpss_pci_probe(struct pci_dev *pdev,
  21                                const struct pci_device_id *id)
  22{
  23        struct intel_lpss_platform_info *info;
  24        int ret;
  25
  26        ret = pcim_enable_device(pdev);
  27        if (ret)
  28                return ret;
  29
  30        info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
  31                            GFP_KERNEL);
  32        if (!info)
  33                return -ENOMEM;
  34
  35        info->mem = &pdev->resource[0];
  36        info->irq = pdev->irq;
  37
  38        /* Probably it is enough to set this for iDMA capable devices only */
  39        pci_set_master(pdev);
  40        pci_try_set_mwi(pdev);
  41
  42        ret = intel_lpss_probe(&pdev->dev, info);
  43        if (ret)
  44                return ret;
  45
  46        pm_runtime_put(&pdev->dev);
  47        pm_runtime_allow(&pdev->dev);
  48
  49        return 0;
  50}
  51
  52static void intel_lpss_pci_remove(struct pci_dev *pdev)
  53{
  54        pm_runtime_forbid(&pdev->dev);
  55        pm_runtime_get_sync(&pdev->dev);
  56
  57        intel_lpss_remove(&pdev->dev);
  58}
  59
  60static INTEL_LPSS_PM_OPS(intel_lpss_pci_pm_ops);
  61
  62static const struct intel_lpss_platform_info spt_info = {
  63        .clk_rate = 120000000,
  64};
  65
  66static struct property_entry spt_i2c_properties[] = {
  67        PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),
  68        { },
  69};
  70
  71static const struct intel_lpss_platform_info spt_i2c_info = {
  72        .clk_rate = 120000000,
  73        .properties = spt_i2c_properties,
  74};
  75
  76static struct property_entry uart_properties[] = {
  77        PROPERTY_ENTRY_U32("reg-io-width", 4),
  78        PROPERTY_ENTRY_U32("reg-shift", 2),
  79        PROPERTY_ENTRY_BOOL("snps,uart-16550-compatible"),
  80        { },
  81};
  82
  83static const struct intel_lpss_platform_info spt_uart_info = {
  84        .clk_rate = 120000000,
  85        .clk_con_id = "baudclk",
  86        .properties = uart_properties,
  87};
  88
  89static const struct intel_lpss_platform_info bxt_info = {
  90        .clk_rate = 100000000,
  91};
  92
  93static const struct intel_lpss_platform_info bxt_uart_info = {
  94        .clk_rate = 100000000,
  95        .clk_con_id = "baudclk",
  96        .properties = uart_properties,
  97};
  98
  99static struct property_entry bxt_i2c_properties[] = {
 100        PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 42),
 101        PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
 102        PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 208),
 103        { },
 104};
 105
 106static const struct intel_lpss_platform_info bxt_i2c_info = {
 107        .clk_rate = 133000000,
 108        .properties = bxt_i2c_properties,
 109};
 110
 111static struct property_entry apl_i2c_properties[] = {
 112        PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 207),
 113        PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
 114        PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 208),
 115        { },
 116};
 117
 118static const struct intel_lpss_platform_info apl_i2c_info = {
 119        .clk_rate = 133000000,
 120        .properties = apl_i2c_properties,
 121};
 122
 123static const struct intel_lpss_platform_info cnl_i2c_info = {
 124        .clk_rate = 216000000,
 125        .properties = spt_i2c_properties,
 126};
 127
 128static const struct pci_device_id intel_lpss_pci_ids[] = {
 129        /* CML */
 130        { PCI_VDEVICE(INTEL, 0x02a8), (kernel_ulong_t)&spt_uart_info },
 131        { PCI_VDEVICE(INTEL, 0x02a9), (kernel_ulong_t)&spt_uart_info },
 132        { PCI_VDEVICE(INTEL, 0x02aa), (kernel_ulong_t)&spt_info },
 133        { PCI_VDEVICE(INTEL, 0x02ab), (kernel_ulong_t)&spt_info },
 134        { PCI_VDEVICE(INTEL, 0x02c5), (kernel_ulong_t)&cnl_i2c_info },
 135        { PCI_VDEVICE(INTEL, 0x02c6), (kernel_ulong_t)&cnl_i2c_info },
 136        { PCI_VDEVICE(INTEL, 0x02c7), (kernel_ulong_t)&spt_uart_info },
 137        { PCI_VDEVICE(INTEL, 0x02e8), (kernel_ulong_t)&cnl_i2c_info },
 138        { PCI_VDEVICE(INTEL, 0x02e9), (kernel_ulong_t)&cnl_i2c_info },
 139        { PCI_VDEVICE(INTEL, 0x02ea), (kernel_ulong_t)&cnl_i2c_info },
 140        { PCI_VDEVICE(INTEL, 0x02eb), (kernel_ulong_t)&cnl_i2c_info },
 141        { PCI_VDEVICE(INTEL, 0x02fb), (kernel_ulong_t)&spt_info },
 142        /* BXT A-Step */
 143        { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info },
 144        { PCI_VDEVICE(INTEL, 0x0aae), (kernel_ulong_t)&bxt_i2c_info },
 145        { PCI_VDEVICE(INTEL, 0x0ab0), (kernel_ulong_t)&bxt_i2c_info },
 146        { PCI_VDEVICE(INTEL, 0x0ab2), (kernel_ulong_t)&bxt_i2c_info },
 147        { PCI_VDEVICE(INTEL, 0x0ab4), (kernel_ulong_t)&bxt_i2c_info },
 148        { PCI_VDEVICE(INTEL, 0x0ab6), (kernel_ulong_t)&bxt_i2c_info },
 149        { PCI_VDEVICE(INTEL, 0x0ab8), (kernel_ulong_t)&bxt_i2c_info },
 150        { PCI_VDEVICE(INTEL, 0x0aba), (kernel_ulong_t)&bxt_i2c_info },
 151        { PCI_VDEVICE(INTEL, 0x0abc), (kernel_ulong_t)&bxt_uart_info },
 152        { PCI_VDEVICE(INTEL, 0x0abe), (kernel_ulong_t)&bxt_uart_info },
 153        { PCI_VDEVICE(INTEL, 0x0ac0), (kernel_ulong_t)&bxt_uart_info },
 154        { PCI_VDEVICE(INTEL, 0x0ac2), (kernel_ulong_t)&bxt_info },
 155        { PCI_VDEVICE(INTEL, 0x0ac4), (kernel_ulong_t)&bxt_info },
 156        { PCI_VDEVICE(INTEL, 0x0ac6), (kernel_ulong_t)&bxt_info },
 157        { PCI_VDEVICE(INTEL, 0x0aee), (kernel_ulong_t)&bxt_uart_info },
 158        /* BXT B-Step */
 159        { PCI_VDEVICE(INTEL, 0x1aac), (kernel_ulong_t)&bxt_i2c_info },
 160        { PCI_VDEVICE(INTEL, 0x1aae), (kernel_ulong_t)&bxt_i2c_info },
 161        { PCI_VDEVICE(INTEL, 0x1ab0), (kernel_ulong_t)&bxt_i2c_info },
 162        { PCI_VDEVICE(INTEL, 0x1ab2), (kernel_ulong_t)&bxt_i2c_info },
 163        { PCI_VDEVICE(INTEL, 0x1ab4), (kernel_ulong_t)&bxt_i2c_info },
 164        { PCI_VDEVICE(INTEL, 0x1ab6), (kernel_ulong_t)&bxt_i2c_info },
 165        { PCI_VDEVICE(INTEL, 0x1ab8), (kernel_ulong_t)&bxt_i2c_info },
 166        { PCI_VDEVICE(INTEL, 0x1aba), (kernel_ulong_t)&bxt_i2c_info },
 167        { PCI_VDEVICE(INTEL, 0x1abc), (kernel_ulong_t)&bxt_uart_info },
 168        { PCI_VDEVICE(INTEL, 0x1abe), (kernel_ulong_t)&bxt_uart_info },
 169        { PCI_VDEVICE(INTEL, 0x1ac0), (kernel_ulong_t)&bxt_uart_info },
 170        { PCI_VDEVICE(INTEL, 0x1ac2), (kernel_ulong_t)&bxt_info },
 171        { PCI_VDEVICE(INTEL, 0x1ac4), (kernel_ulong_t)&bxt_info },
 172        { PCI_VDEVICE(INTEL, 0x1ac6), (kernel_ulong_t)&bxt_info },
 173        { PCI_VDEVICE(INTEL, 0x1aee), (kernel_ulong_t)&bxt_uart_info },
 174        /* GLK */
 175        { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&bxt_i2c_info },
 176        { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&bxt_i2c_info },
 177        { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&bxt_i2c_info },
 178        { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&bxt_i2c_info },
 179        { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&bxt_i2c_info },
 180        { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&bxt_i2c_info },
 181        { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&bxt_i2c_info },
 182        { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&bxt_i2c_info },
 183        { PCI_VDEVICE(INTEL, 0x31bc), (kernel_ulong_t)&bxt_uart_info },
 184        { PCI_VDEVICE(INTEL, 0x31be), (kernel_ulong_t)&bxt_uart_info },
 185        { PCI_VDEVICE(INTEL, 0x31c0), (kernel_ulong_t)&bxt_uart_info },
 186        { PCI_VDEVICE(INTEL, 0x31ee), (kernel_ulong_t)&bxt_uart_info },
 187        { PCI_VDEVICE(INTEL, 0x31c2), (kernel_ulong_t)&bxt_info },
 188        { PCI_VDEVICE(INTEL, 0x31c4), (kernel_ulong_t)&bxt_info },
 189        { PCI_VDEVICE(INTEL, 0x31c6), (kernel_ulong_t)&bxt_info },
 190        /* ICL-LP */
 191        { PCI_VDEVICE(INTEL, 0x34a8), (kernel_ulong_t)&spt_uart_info },
 192        { PCI_VDEVICE(INTEL, 0x34a9), (kernel_ulong_t)&spt_uart_info },
 193        { PCI_VDEVICE(INTEL, 0x34aa), (kernel_ulong_t)&spt_info },
 194        { PCI_VDEVICE(INTEL, 0x34ab), (kernel_ulong_t)&spt_info },
 195        { PCI_VDEVICE(INTEL, 0x34c5), (kernel_ulong_t)&bxt_i2c_info },
 196        { PCI_VDEVICE(INTEL, 0x34c6), (kernel_ulong_t)&bxt_i2c_info },
 197        { PCI_VDEVICE(INTEL, 0x34c7), (kernel_ulong_t)&spt_uart_info },
 198        { PCI_VDEVICE(INTEL, 0x34e8), (kernel_ulong_t)&bxt_i2c_info },
 199        { PCI_VDEVICE(INTEL, 0x34e9), (kernel_ulong_t)&bxt_i2c_info },
 200        { PCI_VDEVICE(INTEL, 0x34ea), (kernel_ulong_t)&bxt_i2c_info },
 201        { PCI_VDEVICE(INTEL, 0x34eb), (kernel_ulong_t)&bxt_i2c_info },
 202        { PCI_VDEVICE(INTEL, 0x34fb), (kernel_ulong_t)&spt_info },
 203        /* APL */
 204        { PCI_VDEVICE(INTEL, 0x5aac), (kernel_ulong_t)&apl_i2c_info },
 205        { PCI_VDEVICE(INTEL, 0x5aae), (kernel_ulong_t)&apl_i2c_info },
 206        { PCI_VDEVICE(INTEL, 0x5ab0), (kernel_ulong_t)&apl_i2c_info },
 207        { PCI_VDEVICE(INTEL, 0x5ab2), (kernel_ulong_t)&apl_i2c_info },
 208        { PCI_VDEVICE(INTEL, 0x5ab4), (kernel_ulong_t)&apl_i2c_info },
 209        { PCI_VDEVICE(INTEL, 0x5ab6), (kernel_ulong_t)&apl_i2c_info },
 210        { PCI_VDEVICE(INTEL, 0x5ab8), (kernel_ulong_t)&apl_i2c_info },
 211        { PCI_VDEVICE(INTEL, 0x5aba), (kernel_ulong_t)&apl_i2c_info },
 212        { PCI_VDEVICE(INTEL, 0x5abc), (kernel_ulong_t)&bxt_uart_info },
 213        { PCI_VDEVICE(INTEL, 0x5abe), (kernel_ulong_t)&bxt_uart_info },
 214        { PCI_VDEVICE(INTEL, 0x5ac0), (kernel_ulong_t)&bxt_uart_info },
 215        { PCI_VDEVICE(INTEL, 0x5ac2), (kernel_ulong_t)&bxt_info },
 216        { PCI_VDEVICE(INTEL, 0x5ac4), (kernel_ulong_t)&bxt_info },
 217        { PCI_VDEVICE(INTEL, 0x5ac6), (kernel_ulong_t)&bxt_info },
 218        { PCI_VDEVICE(INTEL, 0x5aee), (kernel_ulong_t)&bxt_uart_info },
 219        /* SPT-LP */
 220        { PCI_VDEVICE(INTEL, 0x9d27), (kernel_ulong_t)&spt_uart_info },
 221        { PCI_VDEVICE(INTEL, 0x9d28), (kernel_ulong_t)&spt_uart_info },
 222        { PCI_VDEVICE(INTEL, 0x9d29), (kernel_ulong_t)&spt_info },
 223        { PCI_VDEVICE(INTEL, 0x9d2a), (kernel_ulong_t)&spt_info },
 224        { PCI_VDEVICE(INTEL, 0x9d60), (kernel_ulong_t)&spt_i2c_info },
 225        { PCI_VDEVICE(INTEL, 0x9d61), (kernel_ulong_t)&spt_i2c_info },
 226        { PCI_VDEVICE(INTEL, 0x9d62), (kernel_ulong_t)&spt_i2c_info },
 227        { PCI_VDEVICE(INTEL, 0x9d63), (kernel_ulong_t)&spt_i2c_info },
 228        { PCI_VDEVICE(INTEL, 0x9d64), (kernel_ulong_t)&spt_i2c_info },
 229        { PCI_VDEVICE(INTEL, 0x9d65), (kernel_ulong_t)&spt_i2c_info },
 230        { PCI_VDEVICE(INTEL, 0x9d66), (kernel_ulong_t)&spt_uart_info },
 231        /* CNL-LP */
 232        { PCI_VDEVICE(INTEL, 0x9da8), (kernel_ulong_t)&spt_uart_info },
 233        { PCI_VDEVICE(INTEL, 0x9da9), (kernel_ulong_t)&spt_uart_info },
 234        { PCI_VDEVICE(INTEL, 0x9daa), (kernel_ulong_t)&spt_info },
 235        { PCI_VDEVICE(INTEL, 0x9dab), (kernel_ulong_t)&spt_info },
 236        { PCI_VDEVICE(INTEL, 0x9dfb), (kernel_ulong_t)&spt_info },
 237        { PCI_VDEVICE(INTEL, 0x9dc5), (kernel_ulong_t)&cnl_i2c_info },
 238        { PCI_VDEVICE(INTEL, 0x9dc6), (kernel_ulong_t)&cnl_i2c_info },
 239        { PCI_VDEVICE(INTEL, 0x9dc7), (kernel_ulong_t)&spt_uart_info },
 240        { PCI_VDEVICE(INTEL, 0x9de8), (kernel_ulong_t)&cnl_i2c_info },
 241        { PCI_VDEVICE(INTEL, 0x9de9), (kernel_ulong_t)&cnl_i2c_info },
 242        { PCI_VDEVICE(INTEL, 0x9dea), (kernel_ulong_t)&cnl_i2c_info },
 243        { PCI_VDEVICE(INTEL, 0x9deb), (kernel_ulong_t)&cnl_i2c_info },
 244        /* SPT-H */
 245        { PCI_VDEVICE(INTEL, 0xa127), (kernel_ulong_t)&spt_uart_info },
 246        { PCI_VDEVICE(INTEL, 0xa128), (kernel_ulong_t)&spt_uart_info },
 247        { PCI_VDEVICE(INTEL, 0xa129), (kernel_ulong_t)&spt_info },
 248        { PCI_VDEVICE(INTEL, 0xa12a), (kernel_ulong_t)&spt_info },
 249        { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_i2c_info },
 250        { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info },
 251        { PCI_VDEVICE(INTEL, 0xa162), (kernel_ulong_t)&spt_i2c_info },
 252        { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info },
 253        /* KBL-H */
 254        { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&spt_uart_info },
 255        { PCI_VDEVICE(INTEL, 0xa2a8), (kernel_ulong_t)&spt_uart_info },
 256        { PCI_VDEVICE(INTEL, 0xa2a9), (kernel_ulong_t)&spt_info },
 257        { PCI_VDEVICE(INTEL, 0xa2aa), (kernel_ulong_t)&spt_info },
 258        { PCI_VDEVICE(INTEL, 0xa2e0), (kernel_ulong_t)&spt_i2c_info },
 259        { PCI_VDEVICE(INTEL, 0xa2e1), (kernel_ulong_t)&spt_i2c_info },
 260        { PCI_VDEVICE(INTEL, 0xa2e2), (kernel_ulong_t)&spt_i2c_info },
 261        { PCI_VDEVICE(INTEL, 0xa2e3), (kernel_ulong_t)&spt_i2c_info },
 262        { PCI_VDEVICE(INTEL, 0xa2e6), (kernel_ulong_t)&spt_uart_info },
 263        /* CNL-H */
 264        { PCI_VDEVICE(INTEL, 0xa328), (kernel_ulong_t)&spt_uart_info },
 265        { PCI_VDEVICE(INTEL, 0xa329), (kernel_ulong_t)&spt_uart_info },
 266        { PCI_VDEVICE(INTEL, 0xa32a), (kernel_ulong_t)&spt_info },
 267        { PCI_VDEVICE(INTEL, 0xa32b), (kernel_ulong_t)&spt_info },
 268        { PCI_VDEVICE(INTEL, 0xa37b), (kernel_ulong_t)&spt_info },
 269        { PCI_VDEVICE(INTEL, 0xa347), (kernel_ulong_t)&spt_uart_info },
 270        { PCI_VDEVICE(INTEL, 0xa368), (kernel_ulong_t)&cnl_i2c_info },
 271        { PCI_VDEVICE(INTEL, 0xa369), (kernel_ulong_t)&cnl_i2c_info },
 272        { PCI_VDEVICE(INTEL, 0xa36a), (kernel_ulong_t)&cnl_i2c_info },
 273        { PCI_VDEVICE(INTEL, 0xa36b), (kernel_ulong_t)&cnl_i2c_info },
 274        { }
 275};
 276MODULE_DEVICE_TABLE(pci, intel_lpss_pci_ids);
 277
 278static struct pci_driver intel_lpss_pci_driver = {
 279        .name = "intel-lpss",
 280        .id_table = intel_lpss_pci_ids,
 281        .probe = intel_lpss_pci_probe,
 282        .remove = intel_lpss_pci_remove,
 283        .driver = {
 284                .pm = &intel_lpss_pci_pm_ops,
 285        },
 286};
 287
 288module_pci_driver(intel_lpss_pci_driver);
 289
 290MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
 291MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
 292MODULE_DESCRIPTION("Intel LPSS PCI driver");
 293MODULE_LICENSE("GPL v2");
 294