diff options
Diffstat (limited to 'include/linux/mmc/card.h')
| -rw-r--r-- | include/linux/mmc/card.h | 189 |
1 files changed, 188 insertions, 1 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index adb4888248be..c6927a4d157f 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #define LINUX_MMC_CARD_H | 11 | #define LINUX_MMC_CARD_H |
| 12 | 12 | ||
| 13 | #include <linux/mmc/core.h> | 13 | #include <linux/mmc/core.h> |
| 14 | #include <linux/mod_devicetable.h> | ||
| 14 | 15 | ||
| 15 | struct mmc_cid { | 16 | struct mmc_cid { |
| 16 | unsigned int manfid; | 17 | unsigned int manfid; |
| @@ -29,6 +30,7 @@ struct mmc_csd { | |||
| 29 | unsigned short cmdclass; | 30 | unsigned short cmdclass; |
| 30 | unsigned short tacc_clks; | 31 | unsigned short tacc_clks; |
| 31 | unsigned int tacc_ns; | 32 | unsigned int tacc_ns; |
| 33 | unsigned int c_size; | ||
| 32 | unsigned int r2w_factor; | 34 | unsigned int r2w_factor; |
| 33 | unsigned int max_dtr; | 35 | unsigned int max_dtr; |
| 34 | unsigned int erase_size; /* In sectors */ | 36 | unsigned int erase_size; /* In sectors */ |
| @@ -45,6 +47,10 @@ struct mmc_ext_csd { | |||
| 45 | u8 rev; | 47 | u8 rev; |
| 46 | u8 erase_group_def; | 48 | u8 erase_group_def; |
| 47 | u8 sec_feature_support; | 49 | u8 sec_feature_support; |
| 50 | u8 rel_sectors; | ||
| 51 | u8 rel_param; | ||
| 52 | u8 part_config; | ||
| 53 | unsigned int part_time; /* Units: ms */ | ||
| 48 | unsigned int sa_timeout; /* Units: 100ns */ | 54 | unsigned int sa_timeout; /* Units: 100ns */ |
| 49 | unsigned int hs_max_dtr; | 55 | unsigned int hs_max_dtr; |
| 50 | unsigned int sectors; | 56 | unsigned int sectors; |
| @@ -57,13 +63,18 @@ struct mmc_ext_csd { | |||
| 57 | bool enhanced_area_en; /* enable bit */ | 63 | bool enhanced_area_en; /* enable bit */ |
| 58 | unsigned long long enhanced_area_offset; /* Units: Byte */ | 64 | unsigned long long enhanced_area_offset; /* Units: Byte */ |
| 59 | unsigned int enhanced_area_size; /* Units: KB */ | 65 | unsigned int enhanced_area_size; /* Units: KB */ |
| 66 | unsigned int boot_size; /* in bytes */ | ||
| 60 | }; | 67 | }; |
| 61 | 68 | ||
| 62 | struct sd_scr { | 69 | struct sd_scr { |
| 63 | unsigned char sda_vsn; | 70 | unsigned char sda_vsn; |
| 71 | unsigned char sda_spec3; | ||
| 64 | unsigned char bus_widths; | 72 | unsigned char bus_widths; |
| 65 | #define SD_SCR_BUS_WIDTH_1 (1<<0) | 73 | #define SD_SCR_BUS_WIDTH_1 (1<<0) |
| 66 | #define SD_SCR_BUS_WIDTH_4 (1<<2) | 74 | #define SD_SCR_BUS_WIDTH_4 (1<<2) |
| 75 | unsigned char cmds; | ||
| 76 | #define SD_SCR_CMD20_SUPPORT (1<<0) | ||
| 77 | #define SD_SCR_CMD23_SUPPORT (1<<1) | ||
| 67 | }; | 78 | }; |
| 68 | 79 | ||
| 69 | struct sd_ssr { | 80 | struct sd_ssr { |
| @@ -74,6 +85,39 @@ struct sd_ssr { | |||
| 74 | 85 | ||
| 75 | struct sd_switch_caps { | 86 | struct sd_switch_caps { |
| 76 | unsigned int hs_max_dtr; | 87 | unsigned int hs_max_dtr; |
| 88 | unsigned int uhs_max_dtr; | ||
| 89 | #define UHS_SDR104_MAX_DTR 208000000 | ||
| 90 | #define UHS_SDR50_MAX_DTR 100000000 | ||
| 91 | #define UHS_DDR50_MAX_DTR 50000000 | ||
| 92 | #define UHS_SDR25_MAX_DTR UHS_DDR50_MAX_DTR | ||
| 93 | #define UHS_SDR12_MAX_DTR 25000000 | ||
| 94 | unsigned int sd3_bus_mode; | ||
| 95 | #define UHS_SDR12_BUS_SPEED 0 | ||
| 96 | #define UHS_SDR25_BUS_SPEED 1 | ||
| 97 | #define UHS_SDR50_BUS_SPEED 2 | ||
| 98 | #define UHS_SDR104_BUS_SPEED 3 | ||
| 99 | #define UHS_DDR50_BUS_SPEED 4 | ||
| 100 | |||
| 101 | #define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED) | ||
| 102 | #define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED) | ||
| 103 | #define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED) | ||
| 104 | #define SD_MODE_UHS_SDR104 (1 << UHS_SDR104_BUS_SPEED) | ||
| 105 | #define SD_MODE_UHS_DDR50 (1 << UHS_DDR50_BUS_SPEED) | ||
| 106 | unsigned int sd3_drv_type; | ||
| 107 | #define SD_DRIVER_TYPE_B 0x01 | ||
| 108 | #define SD_DRIVER_TYPE_A 0x02 | ||
| 109 | #define SD_DRIVER_TYPE_C 0x04 | ||
| 110 | #define SD_DRIVER_TYPE_D 0x08 | ||
| 111 | unsigned int sd3_curr_limit; | ||
| 112 | #define SD_SET_CURRENT_LIMIT_200 0 | ||
| 113 | #define SD_SET_CURRENT_LIMIT_400 1 | ||
| 114 | #define SD_SET_CURRENT_LIMIT_600 2 | ||
| 115 | #define SD_SET_CURRENT_LIMIT_800 3 | ||
| 116 | |||
| 117 | #define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200) | ||
| 118 | #define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400) | ||
| 119 | #define SD_MAX_CURRENT_600 (1 << SD_SET_CURRENT_LIMIT_600) | ||
| 120 | #define SD_MAX_CURRENT_800 (1 << SD_SET_CURRENT_LIMIT_800) | ||
| 77 | }; | 121 | }; |
| 78 | 122 | ||
| 79 | struct sdio_cccr { | 123 | struct sdio_cccr { |
| @@ -118,6 +162,8 @@ struct mmc_card { | |||
| 118 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ | 162 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ |
| 119 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 163 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
| 120 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | 164 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ |
| 165 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ | ||
| 166 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ | ||
| 121 | unsigned int quirks; /* card quirks */ | 167 | unsigned int quirks; /* card quirks */ |
| 122 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 168 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
| 123 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 169 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
| @@ -125,6 +171,10 @@ struct mmc_card { | |||
| 125 | #define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */ | 171 | #define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */ |
| 126 | /* (missing CIA registers) */ | 172 | /* (missing CIA registers) */ |
| 127 | #define MMC_QUIRK_BROKEN_CLK_GATING (1<<3) /* clock gating the sdio bus will make card fail */ | 173 | #define MMC_QUIRK_BROKEN_CLK_GATING (1<<3) /* clock gating the sdio bus will make card fail */ |
| 174 | #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4) /* SDIO card has nonstd function interfaces */ | ||
| 175 | #define MMC_QUIRK_DISABLE_CD (1<<5) /* disconnect CD/DAT[3] resistor */ | ||
| 176 | #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ | ||
| 177 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ | ||
| 128 | 178 | ||
| 129 | unsigned int erase_size; /* erase size in sectors */ | 179 | unsigned int erase_size; /* erase size in sectors */ |
| 130 | unsigned int erase_shift; /* if erase unit is power 2 */ | 180 | unsigned int erase_shift; /* if erase unit is power 2 */ |
| @@ -145,14 +195,100 @@ struct mmc_card { | |||
| 145 | struct sdio_cccr cccr; /* common card info */ | 195 | struct sdio_cccr cccr; /* common card info */ |
| 146 | struct sdio_cis cis; /* common tuple info */ | 196 | struct sdio_cis cis; /* common tuple info */ |
| 147 | struct sdio_func *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */ | 197 | struct sdio_func *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */ |
| 198 | struct sdio_func *sdio_single_irq; /* SDIO function when only one IRQ active */ | ||
| 148 | unsigned num_info; /* number of info strings */ | 199 | unsigned num_info; /* number of info strings */ |
| 149 | const char **info; /* info strings */ | 200 | const char **info; /* info strings */ |
| 150 | struct sdio_func_tuple *tuples; /* unknown common tuples */ | 201 | struct sdio_func_tuple *tuples; /* unknown common tuples */ |
| 151 | 202 | ||
| 203 | unsigned int sd_bus_speed; /* Bus Speed Mode set for the card */ | ||
| 204 | |||
| 152 | struct dentry *debugfs_root; | 205 | struct dentry *debugfs_root; |
| 153 | }; | 206 | }; |
| 154 | 207 | ||
| 155 | void mmc_fixup_device(struct mmc_card *dev); | 208 | /* |
| 209 | * The world is not perfect and supplies us with broken mmc/sdio devices. | ||
| 210 | * For at least some of these bugs we need a work-around. | ||
| 211 | */ | ||
| 212 | |||
| 213 | struct mmc_fixup { | ||
| 214 | /* CID-specific fields. */ | ||
| 215 | const char *name; | ||
| 216 | |||
| 217 | /* Valid revision range */ | ||
| 218 | u64 rev_start, rev_end; | ||
| 219 | |||
| 220 | unsigned int manfid; | ||
| 221 | unsigned short oemid; | ||
| 222 | |||
| 223 | /* SDIO-specfic fields. You can use SDIO_ANY_ID here of course */ | ||
| 224 | u16 cis_vendor, cis_device; | ||
| 225 | |||
| 226 | void (*vendor_fixup)(struct mmc_card *card, int data); | ||
| 227 | int data; | ||
| 228 | }; | ||
| 229 | |||
| 230 | #define CID_MANFID_ANY (-1u) | ||
| 231 | #define CID_OEMID_ANY ((unsigned short) -1) | ||
| 232 | #define CID_NAME_ANY (NULL) | ||
| 233 | |||
| 234 | #define END_FIXUP { 0 } | ||
| 235 | |||
| 236 | #define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \ | ||
| 237 | _cis_vendor, _cis_device, \ | ||
| 238 | _fixup, _data) \ | ||
| 239 | { \ | ||
| 240 | .name = (_name), \ | ||
| 241 | .manfid = (_manfid), \ | ||
| 242 | .oemid = (_oemid), \ | ||
| 243 | .rev_start = (_rev_start), \ | ||
| 244 | .rev_end = (_rev_end), \ | ||
| 245 | .cis_vendor = (_cis_vendor), \ | ||
| 246 | .cis_device = (_cis_device), \ | ||
| 247 | .vendor_fixup = (_fixup), \ | ||
| 248 | .data = (_data), \ | ||
| 249 | } | ||
| 250 | |||
| 251 | #define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \ | ||
| 252 | _fixup, _data) \ | ||
| 253 | _FIXUP_EXT(_name, _manfid, \ | ||
| 254 | _oemid, _rev_start, _rev_end, \ | ||
| 255 | SDIO_ANY_ID, SDIO_ANY_ID, \ | ||
| 256 | _fixup, _data) \ | ||
| 257 | |||
| 258 | #define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \ | ||
| 259 | MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data) | ||
| 260 | |||
| 261 | #define SDIO_FIXUP(_vendor, _device, _fixup, _data) \ | ||
| 262 | _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \ | ||
| 263 | CID_OEMID_ANY, 0, -1ull, \ | ||
| 264 | _vendor, _device, \ | ||
| 265 | _fixup, _data) \ | ||
| 266 | |||
| 267 | #define cid_rev(hwrev, fwrev, year, month) \ | ||
| 268 | (((u64) hwrev) << 40 | \ | ||
| 269 | ((u64) fwrev) << 32 | \ | ||
| 270 | ((u64) year) << 16 | \ | ||
| 271 | ((u64) month)) | ||
| 272 | |||
| 273 | #define cid_rev_card(card) \ | ||
| 274 | cid_rev(card->cid.hwrev, \ | ||
| 275 | card->cid.fwrev, \ | ||
| 276 | card->cid.year, \ | ||
| 277 | card->cid.month) | ||
| 278 | |||
| 279 | /* | ||
| 280 | * Unconditionally quirk add/remove. | ||
| 281 | */ | ||
| 282 | |||
| 283 | static inline void __maybe_unused add_quirk(struct mmc_card *card, int data) | ||
| 284 | { | ||
| 285 | card->quirks |= data; | ||
| 286 | } | ||
| 287 | |||
| 288 | static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | ||
| 289 | { | ||
| 290 | card->quirks &= ~data; | ||
| 291 | } | ||
| 156 | 292 | ||
| 157 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) | 293 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) |
| 158 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) | 294 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) |
| @@ -163,12 +299,50 @@ void mmc_fixup_device(struct mmc_card *dev); | |||
| 163 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 299 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
| 164 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | 300 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) |
| 165 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) | 301 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) |
| 302 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | ||
| 303 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) | ||
| 166 | 304 | ||
| 167 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 305 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 168 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 306 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| 169 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 307 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
| 170 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | 308 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) |
| 171 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) | 309 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) |
| 310 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | ||
| 311 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) | ||
| 312 | |||
| 313 | /* | ||
| 314 | * Quirk add/remove for MMC products. | ||
| 315 | */ | ||
| 316 | |||
| 317 | static inline void __maybe_unused add_quirk_mmc(struct mmc_card *card, int data) | ||
| 318 | { | ||
| 319 | if (mmc_card_mmc(card)) | ||
| 320 | card->quirks |= data; | ||
| 321 | } | ||
| 322 | |||
| 323 | static inline void __maybe_unused remove_quirk_mmc(struct mmc_card *card, | ||
| 324 | int data) | ||
| 325 | { | ||
| 326 | if (mmc_card_mmc(card)) | ||
| 327 | card->quirks &= ~data; | ||
| 328 | } | ||
| 329 | |||
| 330 | /* | ||
| 331 | * Quirk add/remove for SD products. | ||
| 332 | */ | ||
| 333 | |||
| 334 | static inline void __maybe_unused add_quirk_sd(struct mmc_card *card, int data) | ||
| 335 | { | ||
| 336 | if (mmc_card_sd(card)) | ||
| 337 | card->quirks |= data; | ||
| 338 | } | ||
| 339 | |||
| 340 | static inline void __maybe_unused remove_quirk_sd(struct mmc_card *card, | ||
| 341 | int data) | ||
| 342 | { | ||
| 343 | if (mmc_card_sd(card)) | ||
| 344 | card->quirks &= ~data; | ||
| 345 | } | ||
| 172 | 346 | ||
| 173 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) | 347 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) |
| 174 | { | 348 | { |
| @@ -180,6 +354,16 @@ static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c) | |||
| 180 | return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; | 354 | return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; |
| 181 | } | 355 | } |
| 182 | 356 | ||
| 357 | static inline int mmc_card_disable_cd(const struct mmc_card *c) | ||
| 358 | { | ||
| 359 | return c->quirks & MMC_QUIRK_DISABLE_CD; | ||
| 360 | } | ||
| 361 | |||
| 362 | static inline int mmc_card_nonstd_func_interface(const struct mmc_card *c) | ||
| 363 | { | ||
| 364 | return c->quirks & MMC_QUIRK_NONSTD_FUNC_IF; | ||
| 365 | } | ||
| 366 | |||
| 183 | #define mmc_card_name(c) ((c)->cid.prod_name) | 367 | #define mmc_card_name(c) ((c)->cid.prod_name) |
| 184 | #define mmc_card_id(c) (dev_name(&(c)->dev)) | 368 | #define mmc_card_id(c) (dev_name(&(c)->dev)) |
| 185 | 369 | ||
| @@ -203,4 +387,7 @@ struct mmc_driver { | |||
| 203 | extern int mmc_register_driver(struct mmc_driver *); | 387 | extern int mmc_register_driver(struct mmc_driver *); |
| 204 | extern void mmc_unregister_driver(struct mmc_driver *); | 388 | extern void mmc_unregister_driver(struct mmc_driver *); |
| 205 | 389 | ||
| 390 | extern void mmc_fixup_device(struct mmc_card *card, | ||
| 391 | const struct mmc_fixup *table); | ||
| 392 | |||
| 206 | #endif | 393 | #endif |
