blob: e63fb9b3b77647eb6ba7cbe2c9e863945f930993 [file] [log] [blame]
Adam Lee522624f2013-12-18 22:23:38 +08001#ifndef __SDHCI_PCI_H
2#define __SDHCI_PCI_H
3
4/*
Matthias Kraemerc949c902017-05-15 23:44:17 +02005 * PCI device IDs, sub IDs
Adam Lee522624f2013-12-18 22:23:38 +08006 */
7
8#define PCI_DEVICE_ID_INTEL_PCH_SDIO0 0x8809
9#define PCI_DEVICE_ID_INTEL_PCH_SDIO1 0x880a
10#define PCI_DEVICE_ID_INTEL_BYT_EMMC 0x0f14
11#define PCI_DEVICE_ID_INTEL_BYT_SDIO 0x0f15
12#define PCI_DEVICE_ID_INTEL_BYT_SD 0x0f16
13#define PCI_DEVICE_ID_INTEL_BYT_EMMC2 0x0f50
Alan Cox066173b2014-08-20 13:27:44 +030014#define PCI_DEVICE_ID_INTEL_BSW_EMMC 0x2294
15#define PCI_DEVICE_ID_INTEL_BSW_SDIO 0x2295
16#define PCI_DEVICE_ID_INTEL_BSW_SD 0x2296
Andy Shevchenko1f64cec2016-07-12 14:03:42 +030017#define PCI_DEVICE_ID_INTEL_MRFLD_MMC 0x1190
Adam Lee522624f2013-12-18 22:23:38 +080018#define PCI_DEVICE_ID_INTEL_CLV_SDIO0 0x08f9
19#define PCI_DEVICE_ID_INTEL_CLV_SDIO1 0x08fa
20#define PCI_DEVICE_ID_INTEL_CLV_SDIO2 0x08fb
21#define PCI_DEVICE_ID_INTEL_CLV_EMMC0 0x08e5
22#define PCI_DEVICE_ID_INTEL_CLV_EMMC1 0x08e6
Derek Browne43e968c2014-06-24 06:56:36 -070023#define PCI_DEVICE_ID_INTEL_QRK_SD 0x08A7
Adrian Hunter1f7f2652015-01-05 14:47:58 +020024#define PCI_DEVICE_ID_INTEL_SPT_EMMC 0x9d2b
25#define PCI_DEVICE_ID_INTEL_SPT_SDIO 0x9d2c
26#define PCI_DEVICE_ID_INTEL_SPT_SD 0x9d2d
Adrian Hunter06bf9c52015-10-06 10:26:21 +030027#define PCI_DEVICE_ID_INTEL_DNV_EMMC 0x19db
Adrian Hunter4fd4c062015-10-21 11:15:45 +030028#define PCI_DEVICE_ID_INTEL_BXT_SD 0x0aca
29#define PCI_DEVICE_ID_INTEL_BXT_EMMC 0x0acc
30#define PCI_DEVICE_ID_INTEL_BXT_SDIO 0x0ad0
Adrian Hunter01d6b2a2016-04-04 12:40:37 +030031#define PCI_DEVICE_ID_INTEL_BXTM_SD 0x1aca
32#define PCI_DEVICE_ID_INTEL_BXTM_EMMC 0x1acc
33#define PCI_DEVICE_ID_INTEL_BXTM_SDIO 0x1ad0
Adrian Hunter4fd4c062015-10-21 11:15:45 +030034#define PCI_DEVICE_ID_INTEL_APL_SD 0x5aca
35#define PCI_DEVICE_ID_INTEL_APL_EMMC 0x5acc
36#define PCI_DEVICE_ID_INTEL_APL_SDIO 0x5ad0
Adrian Hunter2d1956d2016-11-22 11:03:37 +020037#define PCI_DEVICE_ID_INTEL_GLK_SD 0x31ca
38#define PCI_DEVICE_ID_INTEL_GLK_EMMC 0x31cc
39#define PCI_DEVICE_ID_INTEL_GLK_SDIO 0x31d0
Adam Lee522624f2013-12-18 22:23:38 +080040
Matthias Kraemerc949c902017-05-15 23:44:17 +020041#define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000
42#define PCI_DEVICE_ID_VIA_95D0 0x95d0
43#define PCI_DEVICE_ID_REALTEK_5250 0x5250
44
45#define PCI_SUBDEVICE_ID_NI_7884 0x7884
46
47/*
48 * PCI device class and mask
49 */
50
51#define SYSTEM_SDHCI (PCI_CLASS_SYSTEM_SDHCI << 8)
52#define PCI_CLASS_MASK 0xFFFF00
53
54/*
55 * Macros for PCI device-description
56 */
57
58#define _PCI_VEND(vend) PCI_VENDOR_ID_##vend
59#define _PCI_DEV(vend, dev) PCI_DEVICE_ID_##vend##_##dev
60#define _PCI_SUBDEV(subvend, subdev) PCI_SUBDEVICE_ID_##subvend##_##subdev
61
62#define SDHCI_PCI_DEVICE(vend, dev, cfg) { \
63 .vendor = _PCI_VEND(vend), .device = _PCI_DEV(vend, dev), \
64 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \
65 .driver_data = (kernel_ulong_t)&(sdhci_##cfg) \
66}
67
68#define SDHCI_PCI_SUBDEVICE(vend, dev, subvend, subdev, cfg) { \
69 .vendor = _PCI_VEND(vend), .device = _PCI_DEV(vend, dev), \
70 .subvendor = _PCI_VEND(subvend), \
71 .subdevice = _PCI_SUBDEV(subvend, subdev), \
72 .driver_data = (kernel_ulong_t)&(sdhci_##cfg) \
73}
74
75#define SDHCI_PCI_DEVICE_CLASS(vend, cl, cl_msk, cfg) { \
76 .vendor = _PCI_VEND(vend), .device = PCI_ANY_ID, \
77 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \
78 .class = (cl), .class_mask = (cl_msk), \
79 .driver_data = (kernel_ulong_t)&(sdhci_##cfg) \
80}
81
Adam Lee522624f2013-12-18 22:23:38 +080082/*
83 * PCI registers
84 */
85
86#define PCI_SDHCI_IFPIO 0x00
87#define PCI_SDHCI_IFDMA 0x01
88#define PCI_SDHCI_IFVENDOR 0x02
89
90#define PCI_SLOT_INFO 0x40 /* 8 bits */
91#define PCI_SLOT_INFO_SLOTS(x) ((x >> 4) & 7)
92#define PCI_SLOT_INFO_FIRST_BAR_MASK 0x07
93
94#define MAX_SLOTS 8
95
96struct sdhci_pci_chip;
97struct sdhci_pci_slot;
98
99struct sdhci_pci_fixes {
100 unsigned int quirks;
101 unsigned int quirks2;
102 bool allow_runtime_pm;
Adrian Hunter77a01222014-01-13 09:49:16 +0200103 bool own_cd_for_runtime_pm;
Adam Lee522624f2013-12-18 22:23:38 +0800104
105 int (*probe) (struct sdhci_pci_chip *);
106
107 int (*probe_slot) (struct sdhci_pci_slot *);
Adrian Hunter61c951d2017-03-20 19:50:48 +0200108 int (*add_host) (struct sdhci_pci_slot *);
Adam Lee522624f2013-12-18 22:23:38 +0800109 void (*remove_slot) (struct sdhci_pci_slot *, int);
110
Adrian Hunterb7813f02017-03-20 19:50:50 +0200111#ifdef CONFIG_PM_SLEEP
Adam Lee522624f2013-12-18 22:23:38 +0800112 int (*suspend) (struct sdhci_pci_chip *);
113 int (*resume) (struct sdhci_pci_chip *);
Adrian Hunterb7813f02017-03-20 19:50:50 +0200114#endif
Adrian Hunter966d6962017-03-20 19:50:52 +0200115#ifdef CONFIG_PM
116 int (*runtime_suspend) (struct sdhci_pci_chip *);
117 int (*runtime_resume) (struct sdhci_pci_chip *);
118#endif
Adrian Hunter6bc09062016-10-05 12:11:23 +0300119
120 const struct sdhci_ops *ops;
Adrian Hunterac9f67b2017-03-20 19:50:33 +0200121 size_t priv_size;
Adam Lee522624f2013-12-18 22:23:38 +0800122};
123
124struct sdhci_pci_slot {
125 struct sdhci_pci_chip *chip;
126 struct sdhci_host *host;
127 struct sdhci_pci_data *data;
128
Adam Lee522624f2013-12-18 22:23:38 +0800129 int rst_n_gpio;
130 int cd_gpio;
131 int cd_irq;
132
Adrian Hunterff59c522014-09-24 10:27:31 +0300133 int cd_idx;
134 bool cd_override_level;
135
Adam Lee522624f2013-12-18 22:23:38 +0800136 void (*hw_reset)(struct sdhci_host *host);
Adrian Hunterac9f67b2017-03-20 19:50:33 +0200137 unsigned long private[0] ____cacheline_aligned;
Adam Lee522624f2013-12-18 22:23:38 +0800138};
139
140struct sdhci_pci_chip {
141 struct pci_dev *pdev;
142
143 unsigned int quirks;
144 unsigned int quirks2;
145 bool allow_runtime_pm;
Adrian Hunterd38dcad2017-03-20 19:50:32 +0200146 bool pm_retune;
147 bool rpm_retune;
Adam Lee522624f2013-12-18 22:23:38 +0800148 const struct sdhci_pci_fixes *fixes;
149
150 int num_slots; /* Slots on controller */
151 struct sdhci_pci_slot *slots[MAX_SLOTS]; /* Pointers to host slots */
152};
153
Adrian Hunterac9f67b2017-03-20 19:50:33 +0200154static inline void *sdhci_pci_priv(struct sdhci_pci_slot *slot)
155{
156 return (void *)slot->private;
157}
158
Adrian Hunter30cf2802017-03-20 19:50:51 +0200159#ifdef CONFIG_PM_SLEEP
160int sdhci_pci_resume_host(struct sdhci_pci_chip *chip);
161#endif
162
Adam Lee522624f2013-12-18 22:23:38 +0800163#endif /* __SDHCI_PCI_H */