diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-13 23:41:15 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-13 23:41:15 -0500 |
| commit | 4b8be38cf782f8ebebc089083fa0572ade79d7ca (patch) | |
| tree | 2f88a0a5c1c0be9121c31b5a2775ae2f979cfa66 /include/linux | |
| parent | 5df1b274cd2f0304339c7f5586fa16cce0fdfce2 (diff) | |
| parent | 0db13fc2abbb0b1a8d8efee20dfbd7f3c5d54022 (diff) | |
Merge tag 'mmc-merge-for-3.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc
MMC highlights for 3.3:
Core:
* Support for the HS200 high-speed eMMC mode.
* Support SDIO 3.0 Ultra High Speed cards.
* Kill pending block requests immediately if card is removed.
* Enable the eMMC feature for locking boot partitions read-only
until next power on, exposed via sysfs.
Drivers:
* Runtime PM support for Intel Medfield SDIO.
* Suspend/resume support for sdhci-spear.
* sh-mmcif now processes requests asynchronously.
* tag 'mmc-merge-for-3.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc: (58 commits)
mmc: fix a deadlock between system suspend and MMC block IO
mmc: sdhci: restore the enabled dma when do reset all
mmc: dw_mmc: miscaculated the fifo-depth with wrong bit operation
mmc: host: Adds support for eMMC 4.5 HS200 mode
mmc: core: HS200 mode support for eMMC 4.5
mmc: dw_mmc: fixed wrong bit operation for SDMMC_GET_FCNT()
mmc: core: Separate the timeout value for cache-ctrl
mmc: sdhci-spear: Fix compilation error
mmc: sdhci: Deal with failure case in sdhci_suspend_host
mmc: dw_mmc: Clear the DDR mode for non-DDR
mmc: sd: Fix SDR12 timing regression
mmc: sdhci: Fix tuning timer incorrect setting when suspending host
mmc: core: Add option to prevent eMMC sleep command
mmc: omap_hsmmc: use threaded irq handler for card-detect.
mmc: sdhci-pci: enable runtime PM for Medfield SDIO
mmc: sdhci: Always pass clock request value zero to set_clock host op
mmc: sdhci-pci: remove SDHCI_QUIRK2_OWN_CARD_DETECTION
mmc: sdhci-pci: get gpio numbers from platform data
mmc: sdhci-pci: add platform data
mmc: sdhci: prevent card detection activity for non-removable cards
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/amba/mmci.h | 2 | ||||
| -rw-r--r-- | include/linux/mmc/card.h | 23 | ||||
| -rw-r--r-- | include/linux/mmc/cd-gpio.h | 19 | ||||
| -rw-r--r-- | include/linux/mmc/core.h | 2 | ||||
| -rw-r--r-- | include/linux/mmc/dw_mmc.h | 1 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 25 | ||||
| -rw-r--r-- | include/linux/mmc/mmc.h | 72 | ||||
| -rw-r--r-- | include/linux/mmc/sdhci-pci-data.h | 18 | ||||
| -rw-r--r-- | include/linux/mmc/sdhci.h | 3 | ||||
| -rw-r--r-- | include/linux/mmc/sdio.h | 29 |
10 files changed, 185 insertions, 9 deletions
diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index 21114810c7c0..0101e9c17fa1 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h | |||
| @@ -30,6 +30,7 @@ struct dma_chan; | |||
| 30 | * @cd_invert: true if the gpio_cd pin value is active low | 30 | * @cd_invert: true if the gpio_cd pin value is active low |
| 31 | * @capabilities: the capabilities of the block as implemented in | 31 | * @capabilities: the capabilities of the block as implemented in |
| 32 | * this platform, signify anything MMC_CAP_* from mmc/host.h | 32 | * this platform, signify anything MMC_CAP_* from mmc/host.h |
| 33 | * @capabilities2: more capabilities, MMC_CAP2_* from mmc/host.h | ||
| 33 | * @dma_filter: function used to select an appropriate RX and TX | 34 | * @dma_filter: function used to select an appropriate RX and TX |
| 34 | * DMA channel to be used for DMA, if and only if you're deploying the | 35 | * DMA channel to be used for DMA, if and only if you're deploying the |
| 35 | * generic DMA engine | 36 | * generic DMA engine |
| @@ -52,6 +53,7 @@ struct mmci_platform_data { | |||
| 52 | int gpio_cd; | 53 | int gpio_cd; |
| 53 | bool cd_invert; | 54 | bool cd_invert; |
| 54 | unsigned long capabilities; | 55 | unsigned long capabilities; |
| 56 | unsigned long capabilities2; | ||
| 55 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | 57 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); |
| 56 | void *dma_rx_param; | 58 | void *dma_rx_param; |
| 57 | void *dma_tx_param; | 59 | void *dma_tx_param; |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index c8ef9bc54d50..9f22ba572de0 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -71,6 +71,8 @@ struct mmc_ext_csd { | |||
| 71 | bool hpi_en; /* HPI enablebit */ | 71 | bool hpi_en; /* HPI enablebit */ |
| 72 | bool hpi; /* HPI support bit */ | 72 | bool hpi; /* HPI support bit */ |
| 73 | unsigned int hpi_cmd; /* cmd used as HPI */ | 73 | unsigned int hpi_cmd; /* cmd used as HPI */ |
| 74 | unsigned int boot_ro_lock; /* ro lock support */ | ||
| 75 | bool boot_ro_lockable; | ||
| 74 | u8 raw_partition_support; /* 160 */ | 76 | u8 raw_partition_support; /* 160 */ |
| 75 | u8 raw_erased_mem_count; /* 181 */ | 77 | u8 raw_erased_mem_count; /* 181 */ |
| 76 | u8 raw_ext_csd_structure; /* 194 */ | 78 | u8 raw_ext_csd_structure; /* 194 */ |
| @@ -110,6 +112,7 @@ struct sd_ssr { | |||
| 110 | struct sd_switch_caps { | 112 | struct sd_switch_caps { |
| 111 | unsigned int hs_max_dtr; | 113 | unsigned int hs_max_dtr; |
| 112 | unsigned int uhs_max_dtr; | 114 | unsigned int uhs_max_dtr; |
| 115 | #define HIGH_SPEED_MAX_DTR 50000000 | ||
| 113 | #define UHS_SDR104_MAX_DTR 208000000 | 116 | #define UHS_SDR104_MAX_DTR 208000000 |
| 114 | #define UHS_SDR50_MAX_DTR 100000000 | 117 | #define UHS_SDR50_MAX_DTR 100000000 |
| 115 | #define UHS_DDR50_MAX_DTR 50000000 | 118 | #define UHS_DDR50_MAX_DTR 50000000 |
| @@ -117,11 +120,13 @@ struct sd_switch_caps { | |||
| 117 | #define UHS_SDR12_MAX_DTR 25000000 | 120 | #define UHS_SDR12_MAX_DTR 25000000 |
| 118 | unsigned int sd3_bus_mode; | 121 | unsigned int sd3_bus_mode; |
| 119 | #define UHS_SDR12_BUS_SPEED 0 | 122 | #define UHS_SDR12_BUS_SPEED 0 |
| 123 | #define HIGH_SPEED_BUS_SPEED 1 | ||
| 120 | #define UHS_SDR25_BUS_SPEED 1 | 124 | #define UHS_SDR25_BUS_SPEED 1 |
| 121 | #define UHS_SDR50_BUS_SPEED 2 | 125 | #define UHS_SDR50_BUS_SPEED 2 |
| 122 | #define UHS_SDR104_BUS_SPEED 3 | 126 | #define UHS_SDR104_BUS_SPEED 3 |
| 123 | #define UHS_DDR50_BUS_SPEED 4 | 127 | #define UHS_DDR50_BUS_SPEED 4 |
| 124 | 128 | ||
| 129 | #define SD_MODE_HIGH_SPEED (1 << HIGH_SPEED_BUS_SPEED) | ||
| 125 | #define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED) | 130 | #define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED) |
| 126 | #define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED) | 131 | #define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED) |
| 127 | #define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED) | 132 | #define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED) |
| @@ -184,6 +189,10 @@ struct mmc_part { | |||
| 184 | unsigned int part_cfg; /* partition type */ | 189 | unsigned int part_cfg; /* partition type */ |
| 185 | char name[MAX_MMC_PART_NAME_LEN]; | 190 | char name[MAX_MMC_PART_NAME_LEN]; |
| 186 | bool force_ro; /* to make boot parts RO by default */ | 191 | bool force_ro; /* to make boot parts RO by default */ |
| 192 | unsigned int area_type; | ||
| 193 | #define MMC_BLK_DATA_AREA_MAIN (1<<0) | ||
| 194 | #define MMC_BLK_DATA_AREA_BOOT (1<<1) | ||
| 195 | #define MMC_BLK_DATA_AREA_GP (1<<2) | ||
| 187 | }; | 196 | }; |
| 188 | 197 | ||
| 189 | /* | 198 | /* |
| @@ -206,6 +215,8 @@ struct mmc_card { | |||
| 206 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | 215 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ |
| 207 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ | 216 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ |
| 208 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ | 217 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ |
| 218 | #define MMC_CARD_REMOVED (1<<7) /* card has been removed */ | ||
| 219 | #define MMC_STATE_HIGHSPEED_200 (1<<8) /* card is in HS200 mode */ | ||
| 209 | unsigned int quirks; /* card quirks */ | 220 | unsigned int quirks; /* card quirks */ |
| 210 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 221 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
| 211 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 222 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
| @@ -261,12 +272,14 @@ struct mmc_card { | |||
| 261 | * This function fill contents in mmc_part. | 272 | * This function fill contents in mmc_part. |
| 262 | */ | 273 | */ |
| 263 | static inline void mmc_part_add(struct mmc_card *card, unsigned int size, | 274 | static inline void mmc_part_add(struct mmc_card *card, unsigned int size, |
| 264 | unsigned int part_cfg, char *name, int idx, bool ro) | 275 | unsigned int part_cfg, char *name, int idx, bool ro, |
| 276 | int area_type) | ||
| 265 | { | 277 | { |
| 266 | card->part[card->nr_parts].size = size; | 278 | card->part[card->nr_parts].size = size; |
| 267 | card->part[card->nr_parts].part_cfg = part_cfg; | 279 | card->part[card->nr_parts].part_cfg = part_cfg; |
| 268 | sprintf(card->part[card->nr_parts].name, name, idx); | 280 | sprintf(card->part[card->nr_parts].name, name, idx); |
| 269 | card->part[card->nr_parts].force_ro = ro; | 281 | card->part[card->nr_parts].force_ro = ro; |
| 282 | card->part[card->nr_parts].area_type = area_type; | ||
| 270 | card->nr_parts++; | 283 | card->nr_parts++; |
| 271 | } | 284 | } |
| 272 | 285 | ||
| @@ -362,18 +375,24 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
| 362 | #define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT) | 375 | #define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT) |
| 363 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) | 376 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) |
| 364 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 377 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
| 378 | #define mmc_card_hs200(c) ((c)->state & MMC_STATE_HIGHSPEED_200) | ||
| 365 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | 379 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) |
| 366 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) | 380 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) |
| 367 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | 381 | #define mmc_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) |
| 382 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | ||
| 368 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) | 383 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) |
| 384 | #define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED)) | ||
| 369 | 385 | ||
| 370 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 386 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 371 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 387 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| 372 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 388 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
| 389 | #define mmc_card_set_hs200(c) ((c)->state |= MMC_STATE_HIGHSPEED_200) | ||
| 373 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | 390 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) |
| 374 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) | 391 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) |
| 392 | #define mmc_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | ||
| 375 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | 393 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) |
| 376 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) | 394 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) |
| 395 | #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) | ||
| 377 | 396 | ||
| 378 | /* | 397 | /* |
| 379 | * Quirk add/remove for MMC products. | 398 | * Quirk add/remove for MMC products. |
diff --git a/include/linux/mmc/cd-gpio.h b/include/linux/mmc/cd-gpio.h new file mode 100644 index 000000000000..a8e469783318 --- /dev/null +++ b/include/linux/mmc/cd-gpio.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* | ||
| 2 | * Generic GPIO card-detect helper header | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef MMC_CD_GPIO_H | ||
| 12 | #define MMC_CD_GPIO_H | ||
| 13 | |||
| 14 | struct mmc_host; | ||
| 15 | int mmc_cd_gpio_request(struct mmc_host *host, unsigned int gpio, | ||
| 16 | unsigned int irq, unsigned long flags); | ||
| 17 | void mmc_cd_gpio_free(struct mmc_host *host); | ||
| 18 | |||
| 19 | #endif | ||
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 174a844a5dda..87a976cc5654 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
| @@ -180,6 +180,8 @@ extern int mmc_try_claim_host(struct mmc_host *host); | |||
| 180 | 180 | ||
| 181 | extern int mmc_flush_cache(struct mmc_card *); | 181 | extern int mmc_flush_cache(struct mmc_card *); |
| 182 | 182 | ||
| 183 | extern int mmc_detect_card_removed(struct mmc_host *host); | ||
| 184 | |||
| 183 | /** | 185 | /** |
| 184 | * mmc_claim_host - exclusively claim a host | 186 | * mmc_claim_host - exclusively claim a host |
| 185 | * @host: mmc host to claim | 187 | * @host: mmc host to claim |
diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 6dc9b80568a0..e8779c6d1759 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h | |||
| @@ -214,6 +214,7 @@ struct dw_mci_board { | |||
| 214 | unsigned int bus_hz; /* Bus speed */ | 214 | unsigned int bus_hz; /* Bus speed */ |
| 215 | 215 | ||
| 216 | unsigned int caps; /* Capabilities */ | 216 | unsigned int caps; /* Capabilities */ |
| 217 | unsigned int caps2; /* More capabilities */ | ||
| 217 | /* | 218 | /* |
| 218 | * Override fifo depth. If 0, autodetect it from the FIFOTH register, | 219 | * Override fifo depth. If 0, autodetect it from the FIFOTH register, |
| 219 | * but note that this may not be reliable after a bootloader has used | 220 | * but note that this may not be reliable after a bootloader has used |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index a3ac9c48e5de..dd13e0539092 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -56,10 +56,13 @@ struct mmc_ios { | |||
| 56 | #define MMC_TIMING_UHS_SDR50 3 | 56 | #define MMC_TIMING_UHS_SDR50 3 |
| 57 | #define MMC_TIMING_UHS_SDR104 4 | 57 | #define MMC_TIMING_UHS_SDR104 4 |
| 58 | #define MMC_TIMING_UHS_DDR50 5 | 58 | #define MMC_TIMING_UHS_DDR50 5 |
| 59 | #define MMC_TIMING_MMC_HS200 6 | ||
| 59 | 60 | ||
| 60 | #define MMC_SDR_MODE 0 | 61 | #define MMC_SDR_MODE 0 |
| 61 | #define MMC_1_2V_DDR_MODE 1 | 62 | #define MMC_1_2V_DDR_MODE 1 |
| 62 | #define MMC_1_8V_DDR_MODE 2 | 63 | #define MMC_1_8V_DDR_MODE 2 |
| 64 | #define MMC_1_2V_SDR_MODE 3 | ||
| 65 | #define MMC_1_8V_SDR_MODE 4 | ||
| 63 | 66 | ||
| 64 | unsigned char signal_voltage; /* signalling voltage (1.8V or 3.3V) */ | 67 | unsigned char signal_voltage; /* signalling voltage (1.8V or 3.3V) */ |
| 65 | 68 | ||
| @@ -148,7 +151,9 @@ struct mmc_host_ops { | |||
| 148 | void (*init_card)(struct mmc_host *host, struct mmc_card *card); | 151 | void (*init_card)(struct mmc_host *host, struct mmc_card *card); |
| 149 | 152 | ||
| 150 | int (*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios); | 153 | int (*start_signal_voltage_switch)(struct mmc_host *host, struct mmc_ios *ios); |
| 151 | int (*execute_tuning)(struct mmc_host *host); | 154 | |
| 155 | /* The tuning command opcode value is different for SD and eMMC cards */ | ||
| 156 | int (*execute_tuning)(struct mmc_host *host, u32 opcode); | ||
| 152 | void (*enable_preset_value)(struct mmc_host *host, bool enable); | 157 | void (*enable_preset_value)(struct mmc_host *host, bool enable); |
| 153 | int (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv); | 158 | int (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv); |
| 154 | void (*hw_reset)(struct mmc_host *host); | 159 | void (*hw_reset)(struct mmc_host *host); |
| @@ -167,6 +172,11 @@ struct mmc_async_req { | |||
| 167 | int (*err_check) (struct mmc_card *, struct mmc_async_req *); | 172 | int (*err_check) (struct mmc_card *, struct mmc_async_req *); |
| 168 | }; | 173 | }; |
| 169 | 174 | ||
| 175 | struct mmc_hotplug { | ||
| 176 | unsigned int irq; | ||
| 177 | void *handler_priv; | ||
| 178 | }; | ||
| 179 | |||
| 170 | struct mmc_host { | 180 | struct mmc_host { |
| 171 | struct device *parent; | 181 | struct device *parent; |
| 172 | struct device class_dev; | 182 | struct device class_dev; |
| @@ -242,6 +252,11 @@ struct mmc_host { | |||
| 242 | #define MMC_CAP2_CACHE_CTRL (1 << 1) /* Allow cache control */ | 252 | #define MMC_CAP2_CACHE_CTRL (1 << 1) /* Allow cache control */ |
| 243 | #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2) /* Notify poweroff supported */ | 253 | #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2) /* Notify poweroff supported */ |
| 244 | #define MMC_CAP2_NO_MULTI_READ (1 << 3) /* Multiblock reads don't work */ | 254 | #define MMC_CAP2_NO_MULTI_READ (1 << 3) /* Multiblock reads don't work */ |
| 255 | #define MMC_CAP2_NO_SLEEP_CMD (1 << 4) /* Don't allow sleep command */ | ||
| 256 | #define MMC_CAP2_HS200_1_8V_SDR (1 << 5) /* can support */ | ||
| 257 | #define MMC_CAP2_HS200_1_2V_SDR (1 << 6) /* can support */ | ||
| 258 | #define MMC_CAP2_HS200 (MMC_CAP2_HS200_1_8V_SDR | \ | ||
| 259 | MMC_CAP2_HS200_1_2V_SDR) | ||
| 245 | 260 | ||
| 246 | mmc_pm_flag_t pm_caps; /* supported pm features */ | 261 | mmc_pm_flag_t pm_caps; /* supported pm features */ |
| 247 | unsigned int power_notify_type; | 262 | unsigned int power_notify_type; |
| @@ -253,10 +268,12 @@ struct mmc_host { | |||
| 253 | int clk_requests; /* internal reference counter */ | 268 | int clk_requests; /* internal reference counter */ |
| 254 | unsigned int clk_delay; /* number of MCI clk hold cycles */ | 269 | unsigned int clk_delay; /* number of MCI clk hold cycles */ |
| 255 | bool clk_gated; /* clock gated */ | 270 | bool clk_gated; /* clock gated */ |
| 256 | struct work_struct clk_gate_work; /* delayed clock gate */ | 271 | struct delayed_work clk_gate_work; /* delayed clock gate */ |
| 257 | unsigned int clk_old; /* old clock value cache */ | 272 | unsigned int clk_old; /* old clock value cache */ |
| 258 | spinlock_t clk_lock; /* lock for clk fields */ | 273 | spinlock_t clk_lock; /* lock for clk fields */ |
| 259 | struct mutex clk_gate_mutex; /* mutex for clock gating */ | 274 | struct mutex clk_gate_mutex; /* mutex for clock gating */ |
| 275 | struct device_attribute clkgate_delay_attr; | ||
| 276 | unsigned long clkgate_delay; | ||
| 260 | #endif | 277 | #endif |
| 261 | 278 | ||
| 262 | /* host specific block data */ | 279 | /* host specific block data */ |
| @@ -297,6 +314,8 @@ struct mmc_host { | |||
| 297 | int claim_cnt; /* "claim" nesting count */ | 314 | int claim_cnt; /* "claim" nesting count */ |
| 298 | 315 | ||
| 299 | struct delayed_work detect; | 316 | struct delayed_work detect; |
| 317 | int detect_change; /* card detect flag */ | ||
| 318 | struct mmc_hotplug hotplug; | ||
| 300 | 319 | ||
| 301 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ | 320 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ |
| 302 | unsigned int bus_refs; /* reference counter */ | 321 | unsigned int bus_refs; /* reference counter */ |
| @@ -323,6 +342,8 @@ struct mmc_host { | |||
| 323 | struct fault_attr fail_mmc_request; | 342 | struct fault_attr fail_mmc_request; |
| 324 | #endif | 343 | #endif |
| 325 | 344 | ||
| 345 | unsigned int actual_clock; /* Actual HC clock rate */ | ||
| 346 | |||
| 326 | unsigned long private[0] ____cacheline_aligned; | 347 | unsigned long private[0] ____cacheline_aligned; |
| 327 | }; | 348 | }; |
| 328 | 349 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 0e7135697d11..fb9f6e116e1c 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */ | 51 | #define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */ |
| 52 | #define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */ | 52 | #define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */ |
| 53 | #define MMC_SEND_TUNING_BLOCK 19 /* adtc R1 */ | 53 | #define MMC_SEND_TUNING_BLOCK 19 /* adtc R1 */ |
| 54 | #define MMC_SEND_TUNING_BLOCK_HS200 21 /* adtc R1 */ | ||
| 54 | 55 | ||
| 55 | /* class 3 */ | 56 | /* class 3 */ |
| 56 | #define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */ | 57 | #define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */ |
| @@ -280,6 +281,7 @@ struct _mmc_csd { | |||
| 280 | #define EXT_CSD_RST_N_FUNCTION 162 /* R/W */ | 281 | #define EXT_CSD_RST_N_FUNCTION 162 /* R/W */ |
| 281 | #define EXT_CSD_SANITIZE_START 165 /* W */ | 282 | #define EXT_CSD_SANITIZE_START 165 /* W */ |
| 282 | #define EXT_CSD_WR_REL_PARAM 166 /* RO */ | 283 | #define EXT_CSD_WR_REL_PARAM 166 /* RO */ |
| 284 | #define EXT_CSD_BOOT_WP 173 /* R/W */ | ||
| 283 | #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ | 285 | #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ |
| 284 | #define EXT_CSD_PART_CONFIG 179 /* R/W */ | 286 | #define EXT_CSD_PART_CONFIG 179 /* R/W */ |
| 285 | #define EXT_CSD_ERASED_MEM_CONT 181 /* RO */ | 287 | #define EXT_CSD_ERASED_MEM_CONT 181 /* RO */ |
| @@ -321,6 +323,11 @@ struct _mmc_csd { | |||
| 321 | 323 | ||
| 322 | #define EXT_CSD_WR_REL_PARAM_EN (1<<2) | 324 | #define EXT_CSD_WR_REL_PARAM_EN (1<<2) |
| 323 | 325 | ||
| 326 | #define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40) | ||
| 327 | #define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10) | ||
| 328 | #define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04) | ||
| 329 | #define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01) | ||
| 330 | |||
| 324 | #define EXT_CSD_PART_CONFIG_ACC_MASK (0x7) | 331 | #define EXT_CSD_PART_CONFIG_ACC_MASK (0x7) |
| 325 | #define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1) | 332 | #define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1) |
| 326 | #define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4) | 333 | #define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4) |
| @@ -333,13 +340,76 @@ struct _mmc_csd { | |||
| 333 | 340 | ||
| 334 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ | 341 | #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run at 26MHz */ |
| 335 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ | 342 | #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run at 52MHz */ |
| 336 | #define EXT_CSD_CARD_TYPE_MASK 0xF /* Mask out reserved bits */ | 343 | #define EXT_CSD_CARD_TYPE_MASK 0x3F /* Mask out reserved bits */ |
| 337 | #define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */ | 344 | #define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */ |
| 338 | /* DDR mode @1.8V or 3V I/O */ | 345 | /* DDR mode @1.8V or 3V I/O */ |
| 339 | #define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */ | 346 | #define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */ |
| 340 | /* DDR mode @1.2V I/O */ | 347 | /* DDR mode @1.2V I/O */ |
| 341 | #define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ | 348 | #define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ |
| 342 | | EXT_CSD_CARD_TYPE_DDR_1_2V) | 349 | | EXT_CSD_CARD_TYPE_DDR_1_2V) |
| 350 | #define EXT_CSD_CARD_TYPE_SDR_1_8V (1<<4) /* Card can run at 200MHz */ | ||
| 351 | #define EXT_CSD_CARD_TYPE_SDR_1_2V (1<<5) /* Card can run at 200MHz */ | ||
| 352 | /* SDR mode @1.2V I/O */ | ||
| 353 | |||
| 354 | #define EXT_CSD_CARD_TYPE_SDR_200 (EXT_CSD_CARD_TYPE_SDR_1_8V | \ | ||
| 355 | EXT_CSD_CARD_TYPE_SDR_1_2V) | ||
| 356 | |||
| 357 | #define EXT_CSD_CARD_TYPE_SDR_ALL (EXT_CSD_CARD_TYPE_SDR_200 | \ | ||
| 358 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 359 | EXT_CSD_CARD_TYPE_26) | ||
| 360 | |||
| 361 | #define EXT_CSD_CARD_TYPE_SDR_1_2V_ALL (EXT_CSD_CARD_TYPE_SDR_1_2V | \ | ||
| 362 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 363 | EXT_CSD_CARD_TYPE_26) | ||
| 364 | |||
| 365 | #define EXT_CSD_CARD_TYPE_SDR_1_8V_ALL (EXT_CSD_CARD_TYPE_SDR_1_8V | \ | ||
| 366 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 367 | EXT_CSD_CARD_TYPE_26) | ||
| 368 | |||
| 369 | #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_1_2V | \ | ||
| 370 | EXT_CSD_CARD_TYPE_DDR_1_8V | \ | ||
| 371 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 372 | EXT_CSD_CARD_TYPE_26) | ||
| 373 | |||
| 374 | #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_1_8V | \ | ||
| 375 | EXT_CSD_CARD_TYPE_DDR_1_8V | \ | ||
| 376 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 377 | EXT_CSD_CARD_TYPE_26) | ||
| 378 | |||
| 379 | #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_1_2V | \ | ||
| 380 | EXT_CSD_CARD_TYPE_DDR_1_2V | \ | ||
| 381 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 382 | EXT_CSD_CARD_TYPE_26) | ||
| 383 | |||
| 384 | #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_1_8V | \ | ||
| 385 | EXT_CSD_CARD_TYPE_DDR_1_2V | \ | ||
| 386 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 387 | EXT_CSD_CARD_TYPE_26) | ||
| 388 | |||
| 389 | #define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52 (EXT_CSD_CARD_TYPE_SDR_1_2V | \ | ||
| 390 | EXT_CSD_CARD_TYPE_DDR_52 | \ | ||
| 391 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 392 | EXT_CSD_CARD_TYPE_26) | ||
| 393 | |||
| 394 | #define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52 (EXT_CSD_CARD_TYPE_SDR_1_8V | \ | ||
| 395 | EXT_CSD_CARD_TYPE_DDR_52 | \ | ||
| 396 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 397 | EXT_CSD_CARD_TYPE_26) | ||
| 398 | |||
| 399 | #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V (EXT_CSD_CARD_TYPE_SDR_200 | \ | ||
| 400 | EXT_CSD_CARD_TYPE_DDR_1_8V | \ | ||
| 401 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 402 | EXT_CSD_CARD_TYPE_26) | ||
| 403 | |||
| 404 | #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V (EXT_CSD_CARD_TYPE_SDR_200 | \ | ||
| 405 | EXT_CSD_CARD_TYPE_DDR_1_2V | \ | ||
| 406 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 407 | EXT_CSD_CARD_TYPE_26) | ||
| 408 | |||
| 409 | #define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52 (EXT_CSD_CARD_TYPE_SDR_200 | \ | ||
| 410 | EXT_CSD_CARD_TYPE_DDR_52 | \ | ||
| 411 | EXT_CSD_CARD_TYPE_52 | \ | ||
| 412 | EXT_CSD_CARD_TYPE_26) | ||
| 343 | 413 | ||
| 344 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ | 414 | #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */ |
| 345 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ | 415 | #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */ |
diff --git a/include/linux/mmc/sdhci-pci-data.h b/include/linux/mmc/sdhci-pci-data.h new file mode 100644 index 000000000000..8959604a13d3 --- /dev/null +++ b/include/linux/mmc/sdhci-pci-data.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #ifndef LINUX_MMC_SDHCI_PCI_DATA_H | ||
| 2 | #define LINUX_MMC_SDHCI_PCI_DATA_H | ||
| 3 | |||
| 4 | struct pci_dev; | ||
| 5 | |||
| 6 | struct sdhci_pci_data { | ||
| 7 | struct pci_dev *pdev; | ||
| 8 | int slotno; | ||
| 9 | int rst_n_gpio; /* Set to -EINVAL if unused */ | ||
| 10 | int cd_gpio; /* Set to -EINVAL if unused */ | ||
| 11 | int (*setup)(struct sdhci_pci_data *data); | ||
| 12 | void (*cleanup)(struct sdhci_pci_data *data); | ||
| 13 | }; | ||
| 14 | |||
| 15 | extern struct sdhci_pci_data *(*sdhci_pci_get_data)(struct pci_dev *pdev, | ||
| 16 | int slotno); | ||
| 17 | |||
| 18 | #endif | ||
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index e4b69353678d..c750f85177d9 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h | |||
| @@ -90,8 +90,6 @@ struct sdhci_host { | |||
| 90 | 90 | ||
| 91 | unsigned int quirks2; /* More deviations from spec. */ | 91 | unsigned int quirks2; /* More deviations from spec. */ |
| 92 | 92 | ||
| 93 | #define SDHCI_QUIRK2_OWN_CARD_DETECTION (1<<0) | ||
| 94 | |||
| 95 | int irq; /* Device IRQ */ | 93 | int irq; /* Device IRQ */ |
| 96 | void __iomem *ioaddr; /* Mapped address */ | 94 | void __iomem *ioaddr; /* Mapped address */ |
| 97 | 95 | ||
| @@ -121,6 +119,7 @@ struct sdhci_host { | |||
| 121 | #define SDHCI_AUTO_CMD23 (1<<7) /* Auto CMD23 support */ | 119 | #define SDHCI_AUTO_CMD23 (1<<7) /* Auto CMD23 support */ |
| 122 | #define SDHCI_PV_ENABLED (1<<8) /* Preset value enabled */ | 120 | #define SDHCI_PV_ENABLED (1<<8) /* Preset value enabled */ |
| 123 | #define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO irq enabled */ | 121 | #define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO irq enabled */ |
| 122 | #define SDHCI_HS200_NEEDS_TUNING (1<<10) /* HS200 needs tuning */ | ||
| 124 | 123 | ||
| 125 | unsigned int version; /* SDHCI spec. version */ | 124 | unsigned int version; /* SDHCI spec. version */ |
| 126 | 125 | ||
diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index e0b1123497b9..c9fe66c58f8f 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | * [8:0] Byte/block count | 38 | * [8:0] Byte/block count |
| 39 | */ | 39 | */ |
| 40 | 40 | ||
| 41 | #define R4_18V_PRESENT (1<<24) | ||
| 41 | #define R4_MEMORY_PRESENT (1 << 27) | 42 | #define R4_MEMORY_PRESENT (1 << 27) |
| 42 | 43 | ||
| 43 | /* | 44 | /* |
| @@ -85,6 +86,7 @@ | |||
| 85 | #define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */ | 86 | #define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */ |
| 86 | #define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */ | 87 | #define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */ |
| 87 | #define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */ | 88 | #define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */ |
| 89 | #define SDIO_SD_REV_3_00 3 /* SD Physical Spev Version 3.00 */ | ||
| 88 | 90 | ||
| 89 | #define SDIO_CCCR_IOEx 0x02 | 91 | #define SDIO_CCCR_IOEx 0x02 |
| 90 | #define SDIO_CCCR_IORx 0x03 | 92 | #define SDIO_CCCR_IORx 0x03 |
| @@ -134,8 +136,31 @@ | |||
| 134 | #define SDIO_CCCR_SPEED 0x13 | 136 | #define SDIO_CCCR_SPEED 0x13 |
| 135 | 137 | ||
| 136 | #define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */ | 138 | #define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */ |
| 137 | #define SDIO_SPEED_EHS 0x02 /* Enable High-Speed mode */ | 139 | #define SDIO_SPEED_BSS_SHIFT 1 |
| 138 | 140 | #define SDIO_SPEED_BSS_MASK (7<<SDIO_SPEED_BSS_SHIFT) | |
| 141 | #define SDIO_SPEED_SDR12 (0<<SDIO_SPEED_BSS_SHIFT) | ||
| 142 | #define SDIO_SPEED_SDR25 (1<<SDIO_SPEED_BSS_SHIFT) | ||
| 143 | #define SDIO_SPEED_SDR50 (2<<SDIO_SPEED_BSS_SHIFT) | ||
| 144 | #define SDIO_SPEED_SDR104 (3<<SDIO_SPEED_BSS_SHIFT) | ||
| 145 | #define SDIO_SPEED_DDR50 (4<<SDIO_SPEED_BSS_SHIFT) | ||
| 146 | #define SDIO_SPEED_EHS SDIO_SPEED_SDR25 /* Enable High-Speed */ | ||
| 147 | |||
| 148 | #define SDIO_CCCR_UHS 0x14 | ||
| 149 | #define SDIO_UHS_SDR50 0x01 | ||
| 150 | #define SDIO_UHS_SDR104 0x02 | ||
| 151 | #define SDIO_UHS_DDR50 0x04 | ||
| 152 | |||
| 153 | #define SDIO_CCCR_DRIVE_STRENGTH 0x15 | ||
| 154 | #define SDIO_SDTx_MASK 0x07 | ||
| 155 | #define SDIO_DRIVE_SDTA (1<<0) | ||
| 156 | #define SDIO_DRIVE_SDTC (1<<1) | ||
| 157 | #define SDIO_DRIVE_SDTD (1<<2) | ||
| 158 | #define SDIO_DRIVE_DTSx_MASK 0x03 | ||
| 159 | #define SDIO_DRIVE_DTSx_SHIFT 4 | ||
| 160 | #define SDIO_DTSx_SET_TYPE_B (0 << SDIO_DRIVE_DTSx_SHIFT) | ||
| 161 | #define SDIO_DTSx_SET_TYPE_A (1 << SDIO_DRIVE_DTSx_SHIFT) | ||
| 162 | #define SDIO_DTSx_SET_TYPE_C (2 << SDIO_DRIVE_DTSx_SHIFT) | ||
| 163 | #define SDIO_DTSx_SET_TYPE_D (3 << SDIO_DRIVE_DTSx_SHIFT) | ||
| 139 | /* | 164 | /* |
| 140 | * Function Basic Registers (FBR) | 165 | * Function Basic Registers (FBR) |
| 141 | */ | 166 | */ |
