Blame view
include/sdhci.h
11.2 KB
af62a5578 MMC: add sdhci ge... |
1 2 3 4 |
/* * Copyright 2011, Marvell Semiconductor Inc. * Lei Wen <leiwen@marvell.com> * |
1a4596601 Add GPL-2.0+ SPDX... |
5 |
* SPDX-License-Identifier: GPL-2.0+ |
af62a5578 MMC: add sdhci ge... |
6 7 8 9 10 11 12 13 |
* * Back ported to the 8xx platform (from the 8260 platform) by * Murray.Jensen@cmst.csiro.au, 27-Jan-01. */ #ifndef __SDHCI_HW_H #define __SDHCI_HW_H #include <asm/io.h> |
6cf1b17cd mmc: sdhci: add m... |
14 |
#include <mmc.h> |
0347960b8 dm: mmc: Remove u... |
15 |
#include <asm/gpio.h> |
6cf1b17cd mmc: sdhci: add m... |
16 |
|
af62a5578 MMC: add sdhci ge... |
17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* * Controller registers */ #define SDHCI_DMA_ADDRESS 0x00 #define SDHCI_BLOCK_SIZE 0x04 #define SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF)) #define SDHCI_BLOCK_COUNT 0x06 #define SDHCI_ARGUMENT 0x08 #define SDHCI_TRANSFER_MODE 0x0C |
91914581a mmc: sdhci: use t... |
31 32 33 34 35 |
#define SDHCI_TRNS_DMA BIT(0) #define SDHCI_TRNS_BLK_CNT_EN BIT(1) #define SDHCI_TRNS_ACMD12 BIT(2) #define SDHCI_TRNS_READ BIT(4) #define SDHCI_TRNS_MULTI BIT(5) |
af62a5578 MMC: add sdhci ge... |
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#define SDHCI_COMMAND 0x0E #define SDHCI_CMD_RESP_MASK 0x03 #define SDHCI_CMD_CRC 0x08 #define SDHCI_CMD_INDEX 0x10 #define SDHCI_CMD_DATA 0x20 #define SDHCI_CMD_ABORTCMD 0xC0 #define SDHCI_CMD_RESP_NONE 0x00 #define SDHCI_CMD_RESP_LONG 0x01 #define SDHCI_CMD_RESP_SHORT 0x02 #define SDHCI_CMD_RESP_SHORT_BUSY 0x03 #define SDHCI_MAKE_CMD(c, f) (((c & 0xff) << 8) | (f & 0xff)) #define SDHCI_GET_CMD(c) ((c>>8) & 0x3f) #define SDHCI_RESPONSE 0x10 #define SDHCI_BUFFER 0x20 #define SDHCI_PRESENT_STATE 0x24 |
91914581a mmc: sdhci: use t... |
57 58 59 60 61 62 63 64 65 66 |
#define SDHCI_CMD_INHIBIT BIT(0) #define SDHCI_DATA_INHIBIT BIT(1) #define SDHCI_DOING_WRITE BIT(8) #define SDHCI_DOING_READ BIT(9) #define SDHCI_SPACE_AVAILABLE BIT(10) #define SDHCI_DATA_AVAILABLE BIT(11) #define SDHCI_CARD_PRESENT BIT(16) #define SDHCI_CARD_STATE_STABLE BIT(17) #define SDHCI_CARD_DETECT_PIN_LEVEL BIT(18) #define SDHCI_WRITE_PROTECT BIT(19) |
af62a5578 MMC: add sdhci ge... |
67 68 |
#define SDHCI_HOST_CONTROL 0x28 |
91914581a mmc: sdhci: use t... |
69 70 71 |
#define SDHCI_CTRL_LED BIT(0) #define SDHCI_CTRL_4BITBUS BIT(1) #define SDHCI_CTRL_HISPD BIT(2) |
af62a5578 MMC: add sdhci ge... |
72 73 74 75 76 |
#define SDHCI_CTRL_DMA_MASK 0x18 #define SDHCI_CTRL_SDMA 0x00 #define SDHCI_CTRL_ADMA1 0x08 #define SDHCI_CTRL_ADMA32 0x10 #define SDHCI_CTRL_ADMA64 0x18 |
91914581a mmc: sdhci: use t... |
77 78 79 |
#define SDHCI_CTRL_8BITBUS BIT(5) #define SDHCI_CTRL_CD_TEST_INS BIT(6) #define SDHCI_CTRL_CD_TEST BIT(7) |
af62a5578 MMC: add sdhci ge... |
80 81 82 83 84 85 86 87 88 89 |
#define SDHCI_POWER_CONTROL 0x29 #define SDHCI_POWER_ON 0x01 #define SDHCI_POWER_180 0x0A #define SDHCI_POWER_300 0x0C #define SDHCI_POWER_330 0x0E #define SDHCI_BLOCK_GAP_CONTROL 0x2A #define SDHCI_WAKE_UP_CONTROL 0x2B |
91914581a mmc: sdhci: use t... |
90 91 92 |
#define SDHCI_WAKE_ON_INT BIT(0) #define SDHCI_WAKE_ON_INSERT BIT(1) #define SDHCI_WAKE_ON_REMOVE BIT(2) |
af62a5578 MMC: add sdhci ge... |
93 94 95 96 97 98 99 |
#define SDHCI_CLOCK_CONTROL 0x2C #define SDHCI_DIVIDER_SHIFT 8 #define SDHCI_DIVIDER_HI_SHIFT 6 #define SDHCI_DIV_MASK 0xFF #define SDHCI_DIV_MASK_LEN 8 #define SDHCI_DIV_HI_MASK 0x300 |
91914581a mmc: sdhci: use t... |
100 101 102 103 |
#define SDHCI_PROG_CLOCK_MODE BIT(5) #define SDHCI_CLOCK_CARD_EN BIT(2) #define SDHCI_CLOCK_INT_STABLE BIT(1) #define SDHCI_CLOCK_INT_EN BIT(0) |
af62a5578 MMC: add sdhci ge... |
104 105 106 107 108 109 110 111 112 113 114 |
#define SDHCI_TIMEOUT_CONTROL 0x2E #define SDHCI_SOFTWARE_RESET 0x2F #define SDHCI_RESET_ALL 0x01 #define SDHCI_RESET_CMD 0x02 #define SDHCI_RESET_DATA 0x04 #define SDHCI_INT_STATUS 0x30 #define SDHCI_INT_ENABLE 0x34 #define SDHCI_SIGNAL_ENABLE 0x38 |
91914581a mmc: sdhci: use t... |
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
#define SDHCI_INT_RESPONSE BIT(0) #define SDHCI_INT_DATA_END BIT(1) #define SDHCI_INT_DMA_END BIT(3) #define SDHCI_INT_SPACE_AVAIL BIT(4) #define SDHCI_INT_DATA_AVAIL BIT(5) #define SDHCI_INT_CARD_INSERT BIT(6) #define SDHCI_INT_CARD_REMOVE BIT(7) #define SDHCI_INT_CARD_INT BIT(8) #define SDHCI_INT_ERROR BIT(15) #define SDHCI_INT_TIMEOUT BIT(16) #define SDHCI_INT_CRC BIT(17) #define SDHCI_INT_END_BIT BIT(18) #define SDHCI_INT_INDEX BIT(19) #define SDHCI_INT_DATA_TIMEOUT BIT(20) #define SDHCI_INT_DATA_CRC BIT(21) #define SDHCI_INT_DATA_END_BIT BIT(22) #define SDHCI_INT_BUS_POWER BIT(23) #define SDHCI_INT_ACMD12ERR BIT(24) #define SDHCI_INT_ADMA_ERROR BIT(25) |
af62a5578 MMC: add sdhci ge... |
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
#define SDHCI_INT_NORMAL_MASK 0x00007FFF #define SDHCI_INT_ERROR_MASK 0xFFFF8000 #define SDHCI_INT_CMD_MASK (SDHCI_INT_RESPONSE | SDHCI_INT_TIMEOUT | \ SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX) #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ SDHCI_INT_DATA_END_BIT | SDHCI_INT_ADMA_ERROR) #define SDHCI_INT_ALL_MASK ((unsigned int)-1) #define SDHCI_ACMD12_ERR 0x3C /* 3E-3F reserved */ #define SDHCI_CAPABILITIES 0x40 #define SDHCI_TIMEOUT_CLK_MASK 0x0000003F #define SDHCI_TIMEOUT_CLK_SHIFT 0 #define SDHCI_TIMEOUT_CLK_UNIT 0x00000080 #define SDHCI_CLOCK_BASE_MASK 0x00003F00 #define SDHCI_CLOCK_V3_BASE_MASK 0x0000FF00 #define SDHCI_CLOCK_BASE_SHIFT 8 #define SDHCI_MAX_BLOCK_MASK 0x00030000 #define SDHCI_MAX_BLOCK_SHIFT 16 |
91914581a mmc: sdhci: use t... |
159 160 161 162 163 164 165 166 167 |
#define SDHCI_CAN_DO_8BIT BIT(18) #define SDHCI_CAN_DO_ADMA2 BIT(19) #define SDHCI_CAN_DO_ADMA1 BIT(20) #define SDHCI_CAN_DO_HISPD BIT(21) #define SDHCI_CAN_DO_SDMA BIT(22) #define SDHCI_CAN_VDD_330 BIT(24) #define SDHCI_CAN_VDD_300 BIT(25) #define SDHCI_CAN_VDD_180 BIT(26) #define SDHCI_CAN_64BIT BIT(28) |
af62a5578 MMC: add sdhci ge... |
168 169 |
#define SDHCI_CAPABILITIES_1 0x44 |
a0d0d86f5 mmc: atmel_sdhci:... |
170 171 |
#define SDHCI_CLOCK_MUL_MASK 0x00FF0000 #define SDHCI_CLOCK_MUL_SHIFT 16 |
af62a5578 MMC: add sdhci ge... |
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
#define SDHCI_MAX_CURRENT 0x48 /* 4C-4F reserved for more max current */ #define SDHCI_SET_ACMD12_ERROR 0x50 #define SDHCI_SET_INT_ERROR 0x52 #define SDHCI_ADMA_ERROR 0x54 /* 55-57 reserved */ #define SDHCI_ADMA_ADDRESS 0x58 /* 60-FB reserved */ #define SDHCI_SLOT_INT_STATUS 0xFC #define SDHCI_HOST_VERSION 0xFE #define SDHCI_VENDOR_VER_MASK 0xFF00 #define SDHCI_VENDOR_VER_SHIFT 8 #define SDHCI_SPEC_VER_MASK 0x00FF #define SDHCI_SPEC_VER_SHIFT 0 #define SDHCI_SPEC_100 0 #define SDHCI_SPEC_200 1 #define SDHCI_SPEC_300 2 |
113e5dfcd mmc: sdhci: use t... |
198 |
#define SDHCI_GET_VERSION(x) (x->version & SDHCI_SPEC_VER_MASK) |
af62a5578 MMC: add sdhci ge... |
199 200 201 202 203 204 205 206 207 208 209 |
/* * End of controller registers. */ #define SDHCI_MAX_DIV_SPEC_200 256 #define SDHCI_MAX_DIV_SPEC_300 2046 /* * quirks */ #define SDHCI_QUIRK_32BIT_DMA_ADDR (1 << 0) |
5af9a5699 mmc: mv_sdhci: Fi... |
210 |
#define SDHCI_QUIRK_REG32_RW (1 << 1) |
3a6383207 mmc: sdhci: add t... |
211 |
#define SDHCI_QUIRK_BROKEN_R1B (1 << 2) |
236bfecff mmc: add the quir... |
212 213 |
#define SDHCI_QUIRK_NO_HISPD_BIT (1 << 3) #define SDHCI_QUIRK_BROKEN_VOLTAGE (1 << 4) |
13243f2ea mmc: sdhci: Add a... |
214 |
#define SDHCI_QUIRK_WAIT_SEND_CMD (1 << 6) |
113e5dfcd mmc: sdhci: use t... |
215 |
#define SDHCI_QUIRK_USE_WIDE8 (1 << 8) |
af62a5578 MMC: add sdhci ge... |
216 |
|
0d2f15f9c mmc: sdhci: fix b... |
217 218 |
/* to make gcc happy */ struct sdhci_host; |
af62a5578 MMC: add sdhci ge... |
219 220 221 222 223 224 225 |
/* * Host SDMA buffer boundary. Valid values from 4K to 512K in powers of 2. */ #define SDHCI_DEFAULT_BOUNDARY_SIZE (512 * 1024) #define SDHCI_DEFAULT_BOUNDARY_ARG (7) struct sdhci_ops { #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS |
62226b686 mmc: sdhci: move ... |
226 227 228 229 230 231 |
u32 (*read_l)(struct sdhci_host *host, int reg); u16 (*read_w)(struct sdhci_host *host, int reg); u8 (*read_b)(struct sdhci_host *host, int reg); void (*write_l)(struct sdhci_host *host, u32 val, int reg); void (*write_w)(struct sdhci_host *host, u16 val, int reg); void (*write_b)(struct sdhci_host *host, u8 val, int reg); |
af62a5578 MMC: add sdhci ge... |
232 |
#endif |
62226b686 mmc: sdhci: move ... |
233 234 |
int (*get_cd)(struct sdhci_host *host); void (*set_control_reg)(struct sdhci_host *host); |
210841c69 mmc: sdhci: Add s... |
235 |
void (*set_ios_post)(struct sdhci_host *host); |
62226b686 mmc: sdhci: move ... |
236 |
void (*set_clock)(struct sdhci_host *host, u32 div); |
af62a5578 MMC: add sdhci ge... |
237 238 239 |
}; struct sdhci_host { |
cacd1d2f3 mmc: sdhci: add c... |
240 |
const char *name; |
af62a5578 MMC: add sdhci ge... |
241 242 |
void *ioaddr; unsigned int quirks; |
236bfecff mmc: add the quir... |
243 |
unsigned int host_caps; |
af62a5578 MMC: add sdhci ge... |
244 |
unsigned int version; |
6d0e34bf4 mmc: sdhci: Disti... |
245 |
unsigned int max_clk; /* Maximum Base Clock frequency */ |
6dffdbc3a mmc: sdhci: Add t... |
246 |
unsigned int clk_mul; /* Clock Multiplier value */ |
af62a5578 MMC: add sdhci ge... |
247 |
unsigned int clock; |
6cf1b17cd mmc: sdhci: add m... |
248 |
struct mmc *mmc; |
af62a5578 MMC: add sdhci ge... |
249 |
const struct sdhci_ops *ops; |
b09ed6e4f mmc: s5p_sdhci: a... |
250 |
int index; |
236bfecff mmc: add the quir... |
251 |
|
3577fe8be drivers:mmc:sdhci... |
252 |
int bus_width; |
0347960b8 dm: mmc: Remove u... |
253 254 |
struct gpio_desc pwr_gpio; /* Power GPIO */ struct gpio_desc cd_gpio; /* Card Detect GPIO */ |
3577fe8be drivers:mmc:sdhci... |
255 |
|
236bfecff mmc: add the quir... |
256 |
uint voltages; |
93bfd6167 mmc: Split mmc st... |
257 258 |
struct mmc_config cfg; |
af62a5578 MMC: add sdhci ge... |
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
}; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg) { if (unlikely(host->ops->write_l)) host->ops->write_l(host, val, reg); else writel(val, host->ioaddr + reg); } static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg) { if (unlikely(host->ops->write_w)) host->ops->write_w(host, val, reg); else writew(val, host->ioaddr + reg); } static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg) { if (unlikely(host->ops->write_b)) host->ops->write_b(host, val, reg); else writeb(val, host->ioaddr + reg); } static inline u32 sdhci_readl(struct sdhci_host *host, int reg) { if (unlikely(host->ops->read_l)) return host->ops->read_l(host, reg); else return readl(host->ioaddr + reg); } static inline u16 sdhci_readw(struct sdhci_host *host, int reg) { if (unlikely(host->ops->read_w)) return host->ops->read_w(host, reg); else return readw(host->ioaddr + reg); } static inline u8 sdhci_readb(struct sdhci_host *host, int reg) { if (unlikely(host->ops->read_b)) return host->ops->read_b(host, reg); else return readb(host->ioaddr + reg); } #else static inline void sdhci_writel(struct sdhci_host *host, u32 val, int reg) { writel(val, host->ioaddr + reg); } static inline void sdhci_writew(struct sdhci_host *host, u16 val, int reg) { writew(val, host->ioaddr + reg); } static inline void sdhci_writeb(struct sdhci_host *host, u8 val, int reg) { writeb(val, host->ioaddr + reg); } static inline u32 sdhci_readl(struct sdhci_host *host, int reg) { return readl(host->ioaddr + reg); } static inline u16 sdhci_readw(struct sdhci_host *host, int reg) { return readw(host->ioaddr + reg); } static inline u8 sdhci_readb(struct sdhci_host *host, int reg) { return readb(host->ioaddr + reg); } #endif |
ef1e4eda6 dm: mmc: sdhci: S... |
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
#ifdef CONFIG_BLK /** * sdhci_setup_cfg() - Set up the configuration for DWMMC * * This is used to set up an SDHCI device when you are using CONFIG_BLK. * * This should be called from your MMC driver's probe() method once you have * the information required. * * Generally your driver will have a platform data structure which holds both * the configuration (struct mmc_config) and the MMC device info (struct mmc). * For example: * * struct msm_sdhc_plat { * struct mmc_config cfg; * struct mmc mmc; * }; * * ... * * Inside U_BOOT_DRIVER(): * .platdata_auto_alloc_size = sizeof(struct msm_sdhc_plat), * * To access platform data: * struct msm_sdhc_plat *plat = dev_get_platdata(dev); * * See msm_sdhci.c for an example. * * @cfg: Configuration structure to fill in (generally &plat->mmc) |
14bed52d2 mmc: sdhci: remov... |
371 |
* @host: SDHCI host structure |
6d0e34bf4 mmc: sdhci: Disti... |
372 373 |
* @f_max: Maximum supported clock frequency in HZ (0 for default) * @f_min: Minimum supported clock frequency in HZ (0 for default) |
ef1e4eda6 dm: mmc: sdhci: S... |
374 |
*/ |
14bed52d2 mmc: sdhci: remov... |
375 |
int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host, |
6d0e34bf4 mmc: sdhci: Disti... |
376 |
u32 f_max, u32 f_min); |
ef1e4eda6 dm: mmc: sdhci: S... |
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 |
/** * sdhci_bind() - Set up a new MMC block device * * This is used to set up an SDHCI block device when you are using CONFIG_BLK. * It should be called from your driver's bind() method. * * See msm_sdhci.c for an example. * * @dev: Device to set up * @mmc: Pointer to mmc structure (normally &plat->mmc) * @cfg: Empty configuration structure (generally &plat->cfg). This is * normally all zeroes at this point. The only purpose of passing * this in is to set mmc->cfg to it. * @return 0 if OK, -ve if the block device could not be created */ int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg); #else /** * add_sdhci() - Add a new SDHCI interface * * This is used when you are not using CONFIG_BLK. Convert your driver over! * * @host: SDHCI host structure |
6d0e34bf4 mmc: sdhci: Disti... |
402 403 |
* @f_max: Maximum supported clock frequency in HZ (0 for default) * @f_min: Minimum supported clock frequency in HZ (0 for default) |
ef1e4eda6 dm: mmc: sdhci: S... |
404 405 |
* @return 0 if OK, -ve on error */ |
6d0e34bf4 mmc: sdhci: Disti... |
406 |
int add_sdhci(struct sdhci_host *host, u32 f_max, u32 f_min); |
ef1e4eda6 dm: mmc: sdhci: S... |
407 |
#endif /* !CONFIG_BLK */ |
e7881d85a dm: mmc: Drop CON... |
408 |
#ifdef CONFIG_DM_MMC |
ef1e4eda6 dm: mmc: sdhci: S... |
409 410 411 412 413 |
/* Export the operations to drivers */ int sdhci_probe(struct udevice *dev); extern const struct dm_mmc_ops sdhci_ops; #else #endif |
af62a5578 MMC: add sdhci ge... |
414 |
#endif /* __SDHCI_HW_H */ |