diff options
Diffstat (limited to 'drivers/mmc/host/sdhci.h')
-rw-r--r-- | drivers/mmc/host/sdhci.h | 120 |
1 files changed, 94 insertions, 26 deletions
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 299118de8933..5bb355281765 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -10,18 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * PCI registers | ||
14 | */ | ||
15 | |||
16 | #define PCI_SDHCI_IFPIO 0x00 | ||
17 | #define PCI_SDHCI_IFDMA 0x01 | ||
18 | #define PCI_SDHCI_IFVENDOR 0x02 | ||
19 | |||
20 | #define PCI_SLOT_INFO 0x40 /* 8 bits */ | ||
21 | #define PCI_SLOT_INFO_SLOTS(x) ((x >> 4) & 7) | ||
22 | #define PCI_SLOT_INFO_FIRST_BAR_MASK 0x07 | ||
23 | |||
24 | /* | ||
25 | * Controller registers | 13 | * Controller registers |
26 | */ | 14 | */ |
27 | 15 | ||
@@ -72,6 +60,11 @@ | |||
72 | #define SDHCI_CTRL_LED 0x01 | 60 | #define SDHCI_CTRL_LED 0x01 |
73 | #define SDHCI_CTRL_4BITBUS 0x02 | 61 | #define SDHCI_CTRL_4BITBUS 0x02 |
74 | #define SDHCI_CTRL_HISPD 0x04 | 62 | #define SDHCI_CTRL_HISPD 0x04 |
63 | #define SDHCI_CTRL_DMA_MASK 0x18 | ||
64 | #define SDHCI_CTRL_SDMA 0x00 | ||
65 | #define SDHCI_CTRL_ADMA1 0x08 | ||
66 | #define SDHCI_CTRL_ADMA32 0x10 | ||
67 | #define SDHCI_CTRL_ADMA64 0x18 | ||
75 | 68 | ||
76 | #define SDHCI_POWER_CONTROL 0x29 | 69 | #define SDHCI_POWER_CONTROL 0x29 |
77 | #define SDHCI_POWER_ON 0x01 | 70 | #define SDHCI_POWER_ON 0x01 |
@@ -117,6 +110,7 @@ | |||
117 | #define SDHCI_INT_DATA_END_BIT 0x00400000 | 110 | #define SDHCI_INT_DATA_END_BIT 0x00400000 |
118 | #define SDHCI_INT_BUS_POWER 0x00800000 | 111 | #define SDHCI_INT_BUS_POWER 0x00800000 |
119 | #define SDHCI_INT_ACMD12ERR 0x01000000 | 112 | #define SDHCI_INT_ACMD12ERR 0x01000000 |
113 | #define SDHCI_INT_ADMA_ERROR 0x02000000 | ||
120 | 114 | ||
121 | #define SDHCI_INT_NORMAL_MASK 0x00007FFF | 115 | #define SDHCI_INT_NORMAL_MASK 0x00007FFF |
122 | #define SDHCI_INT_ERROR_MASK 0xFFFF8000 | 116 | #define SDHCI_INT_ERROR_MASK 0xFFFF8000 |
@@ -140,11 +134,14 @@ | |||
140 | #define SDHCI_CLOCK_BASE_SHIFT 8 | 134 | #define SDHCI_CLOCK_BASE_SHIFT 8 |
141 | #define SDHCI_MAX_BLOCK_MASK 0x00030000 | 135 | #define SDHCI_MAX_BLOCK_MASK 0x00030000 |
142 | #define SDHCI_MAX_BLOCK_SHIFT 16 | 136 | #define SDHCI_MAX_BLOCK_SHIFT 16 |
137 | #define SDHCI_CAN_DO_ADMA2 0x00080000 | ||
138 | #define SDHCI_CAN_DO_ADMA1 0x00100000 | ||
143 | #define SDHCI_CAN_DO_HISPD 0x00200000 | 139 | #define SDHCI_CAN_DO_HISPD 0x00200000 |
144 | #define SDHCI_CAN_DO_DMA 0x00400000 | 140 | #define SDHCI_CAN_DO_DMA 0x00400000 |
145 | #define SDHCI_CAN_VDD_330 0x01000000 | 141 | #define SDHCI_CAN_VDD_330 0x01000000 |
146 | #define SDHCI_CAN_VDD_300 0x02000000 | 142 | #define SDHCI_CAN_VDD_300 0x02000000 |
147 | #define SDHCI_CAN_VDD_180 0x04000000 | 143 | #define SDHCI_CAN_VDD_180 0x04000000 |
144 | #define SDHCI_CAN_64BIT 0x10000000 | ||
148 | 145 | ||
149 | /* 44-47 reserved for more caps */ | 146 | /* 44-47 reserved for more caps */ |
150 | 147 | ||
@@ -152,7 +149,16 @@ | |||
152 | 149 | ||
153 | /* 4C-4F reserved for more max current */ | 150 | /* 4C-4F reserved for more max current */ |
154 | 151 | ||
155 | /* 50-FB reserved */ | 152 | #define SDHCI_SET_ACMD12_ERROR 0x50 |
153 | #define SDHCI_SET_INT_ERROR 0x52 | ||
154 | |||
155 | #define SDHCI_ADMA_ERROR 0x54 | ||
156 | |||
157 | /* 55-57 reserved */ | ||
158 | |||
159 | #define SDHCI_ADMA_ADDRESS 0x58 | ||
160 | |||
161 | /* 60-FB reserved */ | ||
156 | 162 | ||
157 | #define SDHCI_SLOT_INT_STATUS 0xFC | 163 | #define SDHCI_SLOT_INT_STATUS 0xFC |
158 | 164 | ||
@@ -161,11 +167,50 @@ | |||
161 | #define SDHCI_VENDOR_VER_SHIFT 8 | 167 | #define SDHCI_VENDOR_VER_SHIFT 8 |
162 | #define SDHCI_SPEC_VER_MASK 0x00FF | 168 | #define SDHCI_SPEC_VER_MASK 0x00FF |
163 | #define SDHCI_SPEC_VER_SHIFT 0 | 169 | #define SDHCI_SPEC_VER_SHIFT 0 |
170 | #define SDHCI_SPEC_100 0 | ||
171 | #define SDHCI_SPEC_200 1 | ||
164 | 172 | ||
165 | struct sdhci_chip; | 173 | struct sdhci_ops; |
166 | 174 | ||
167 | struct sdhci_host { | 175 | struct sdhci_host { |
168 | struct sdhci_chip *chip; | 176 | /* Data set by hardware interface driver */ |
177 | const char *hw_name; /* Hardware bus name */ | ||
178 | |||
179 | unsigned int quirks; /* Deviations from spec. */ | ||
180 | |||
181 | /* Controller doesn't honor resets unless we touch the clock register */ | ||
182 | #define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0) | ||
183 | /* Controller has bad caps bits, but really supports DMA */ | ||
184 | #define SDHCI_QUIRK_FORCE_DMA (1<<1) | ||
185 | /* Controller doesn't like to be reset when there is no card inserted. */ | ||
186 | #define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2) | ||
187 | /* Controller doesn't like clearing the power reg before a change */ | ||
188 | #define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3) | ||
189 | /* Controller has flaky internal state so reset it on each ios change */ | ||
190 | #define SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS (1<<4) | ||
191 | /* Controller has an unusable DMA engine */ | ||
192 | #define SDHCI_QUIRK_BROKEN_DMA (1<<5) | ||
193 | /* Controller has an unusable ADMA engine */ | ||
194 | #define SDHCI_QUIRK_BROKEN_ADMA (1<<6) | ||
195 | /* Controller can only DMA from 32-bit aligned addresses */ | ||
196 | #define SDHCI_QUIRK_32BIT_DMA_ADDR (1<<7) | ||
197 | /* Controller can only DMA chunk sizes that are a multiple of 32 bits */ | ||
198 | #define SDHCI_QUIRK_32BIT_DMA_SIZE (1<<8) | ||
199 | /* Controller can only ADMA chunks that are a multiple of 32 bits */ | ||
200 | #define SDHCI_QUIRK_32BIT_ADMA_SIZE (1<<9) | ||
201 | /* Controller needs to be reset after each request to stay stable */ | ||
202 | #define SDHCI_QUIRK_RESET_AFTER_REQUEST (1<<10) | ||
203 | /* Controller needs voltage and power writes to happen separately */ | ||
204 | #define SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER (1<<11) | ||
205 | /* Controller provides an incorrect timeout value for transfers */ | ||
206 | #define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12) | ||
207 | |||
208 | int irq; /* Device IRQ */ | ||
209 | void __iomem * ioaddr; /* Mapped address */ | ||
210 | |||
211 | const struct sdhci_ops *ops; /* Low level hw interface */ | ||
212 | |||
213 | /* Internal data */ | ||
169 | struct mmc_host *mmc; /* MMC structure */ | 214 | struct mmc_host *mmc; /* MMC structure */ |
170 | 215 | ||
171 | #ifdef CONFIG_LEDS_CLASS | 216 | #ifdef CONFIG_LEDS_CLASS |
@@ -176,7 +221,11 @@ struct sdhci_host { | |||
176 | 221 | ||
177 | int flags; /* Host attributes */ | 222 | int flags; /* Host attributes */ |
178 | #define SDHCI_USE_DMA (1<<0) /* Host is DMA capable */ | 223 | #define SDHCI_USE_DMA (1<<0) /* Host is DMA capable */ |
179 | #define SDHCI_REQ_USE_DMA (1<<1) /* Use DMA for this req. */ | 224 | #define SDHCI_USE_ADMA (1<<1) /* Host is ADMA capable */ |
225 | #define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */ | ||
226 | #define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */ | ||
227 | |||
228 | unsigned int version; /* SDHCI spec. version */ | ||
180 | 229 | ||
181 | unsigned int max_clk; /* Max possible freq (MHz) */ | 230 | unsigned int max_clk; /* Max possible freq (MHz) */ |
182 | unsigned int timeout_clk; /* Timeout freq (KHz) */ | 231 | unsigned int timeout_clk; /* Timeout freq (KHz) */ |
@@ -194,22 +243,41 @@ struct sdhci_host { | |||
194 | int offset; /* Offset into current sg */ | 243 | int offset; /* Offset into current sg */ |
195 | int remain; /* Bytes left in current */ | 244 | int remain; /* Bytes left in current */ |
196 | 245 | ||
197 | int irq; /* Device IRQ */ | 246 | int sg_count; /* Mapped sg entries */ |
198 | int bar; /* PCI BAR index */ | 247 | |
199 | unsigned long addr; /* Bus address */ | 248 | u8 *adma_desc; /* ADMA descriptor table */ |
200 | void __iomem * ioaddr; /* Mapped address */ | 249 | u8 *align_buffer; /* Bounce buffer */ |
250 | |||
251 | dma_addr_t adma_addr; /* Mapped ADMA descr. table */ | ||
252 | dma_addr_t align_addr; /* Mapped bounce buffer */ | ||
201 | 253 | ||
202 | struct tasklet_struct card_tasklet; /* Tasklet structures */ | 254 | struct tasklet_struct card_tasklet; /* Tasklet structures */ |
203 | struct tasklet_struct finish_tasklet; | 255 | struct tasklet_struct finish_tasklet; |
204 | 256 | ||
205 | struct timer_list timer; /* Timer for timeouts */ | 257 | struct timer_list timer; /* Timer for timeouts */ |
206 | }; | ||
207 | 258 | ||
208 | struct sdhci_chip { | 259 | unsigned long private[0] ____cacheline_aligned; |
209 | struct pci_dev *pdev; | 260 | }; |
210 | 261 | ||
211 | unsigned long quirks; | ||
212 | 262 | ||
213 | int num_slots; /* Slots on controller */ | 263 | struct sdhci_ops { |
214 | struct sdhci_host *hosts[0]; /* Pointers to hosts */ | 264 | int (*enable_dma)(struct sdhci_host *host); |
215 | }; | 265 | }; |
266 | |||
267 | |||
268 | extern struct sdhci_host *sdhci_alloc_host(struct device *dev, | ||
269 | size_t priv_size); | ||
270 | extern void sdhci_free_host(struct sdhci_host *host); | ||
271 | |||
272 | static inline void *sdhci_priv(struct sdhci_host *host) | ||
273 | { | ||
274 | return (void *)host->private; | ||
275 | } | ||
276 | |||
277 | extern int sdhci_add_host(struct sdhci_host *host); | ||
278 | extern void sdhci_remove_host(struct sdhci_host *host, int dead); | ||
279 | |||
280 | #ifdef CONFIG_PM | ||
281 | extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state); | ||
282 | extern int sdhci_resume_host(struct sdhci_host *host); | ||
283 | #endif | ||