Merge tag 'mmc-merge-for-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc
Pull MMC updates from Chris Ball: Core: * Support for MMC 4.5 Data Tag feature -- we tag REQ_META, so devices that support Data Tag will provide increased throughput for metadata. * Faster detection of card removal on I/O errors. Drivers: * dw_mmc now supports eMMC Power Off Notify, has PCI support, and implements pre_req and post_req for asynchronous requests. * omap_hsmmc now supports device tree. * esdhc now has power management support. * sdhci-tegra now supports Tegra30 devices. * sdhci-spear now supports hibernation. * tmio_mmc now supports using a GPIO for card detection. * Intel PCH now supports 8-bit bus transfers. * tag 'mmc-merge-for-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc: (53 commits) mmc: sh_mmcif: simplify bitmask macros mmc: sh_mobile_sdhi: support modular mmc-core with non-standard hotplug mmc: sh_mobile_sdhi: add a callback for board specific init code mmc: tmio: cosmetic: prettify the tmio_mmc_set_ios() function mmc: sh_mobile_sdhi: do not manage PM clocks manually mmc: tmio_mmc: remove unused sdio_irq_enabled flag mmc: tmio_mmc: power status flag doesn't have to be exposed in platform data mmc: sh_mobile_sdhi: pass card hotplug GPIO number to TMIO MMC mmc: tmio_mmc: support the generic MMC GPIO card hotplug helper mmc: tmio: calculate the native hotplug condition only once mmc: simplify mmc_cd_gpio_request() by removing two parameters mmc: sdhci-pci: allow 8-bit bus width for Intel PCH mmc: sdhci: check interrupt flags in ISR again mmc: sdhci-pci: Add MSI support mmc: core: warn when card doesn't support HPI mmc: davinci: Poll status for small size transfers mmc: davinci: Eliminate spurious interrupts mmc: omap_hsmmc: Avoid a regulator voltage change with dt mmc: omap_hsmmc: Convert hsmmc driver to use device tree mmc: sdhci-pci: add SDHCI_QUIRK2_HOST_OFF_CARD_ON for Medfield SDIO ...
This commit is contained in:
@@ -72,6 +72,8 @@ struct mmc_ext_csd {
|
||||
bool hpi_en; /* HPI enablebit */
|
||||
bool hpi; /* HPI support bit */
|
||||
unsigned int hpi_cmd; /* cmd used as HPI */
|
||||
unsigned int data_sector_size; /* 512 bytes or 4KB */
|
||||
unsigned int data_tag_unit_size; /* DATA TAG UNIT size */
|
||||
unsigned int boot_ro_lock; /* ro lock support */
|
||||
bool boot_ro_lockable;
|
||||
u8 raw_partition_support; /* 160 */
|
||||
|
@@ -12,8 +12,7 @@
|
||||
#define MMC_CD_GPIO_H
|
||||
|
||||
struct mmc_host;
|
||||
int mmc_cd_gpio_request(struct mmc_host *host, unsigned int gpio,
|
||||
unsigned int irq, unsigned long flags);
|
||||
int mmc_cd_gpio_request(struct mmc_host *host, unsigned int gpio);
|
||||
void mmc_cd_gpio_free(struct mmc_host *host);
|
||||
|
||||
#endif
|
||||
|
@@ -175,7 +175,6 @@ extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int);
|
||||
|
||||
extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
|
||||
extern void mmc_release_host(struct mmc_host *host);
|
||||
extern void mmc_do_release_host(struct mmc_host *host);
|
||||
extern int mmc_try_claim_host(struct mmc_host *host);
|
||||
|
||||
extern int mmc_flush_cache(struct mmc_card *);
|
||||
|
@@ -76,7 +76,7 @@ struct mmc_data;
|
||||
* @num_slots: Number of slots available.
|
||||
* @verid: Denote Version ID.
|
||||
* @data_offset: Set the offset of DATA register according to VERID.
|
||||
* @pdev: Platform device associated with the MMC controller.
|
||||
* @dev: Device associated with the MMC controller.
|
||||
* @pdata: Platform data associated with the MMC controller.
|
||||
* @slot: Slots sharing this MMC controller.
|
||||
* @fifo_depth: depth of FIFO.
|
||||
@@ -87,6 +87,8 @@ struct mmc_data;
|
||||
* @push_data: Pointer to FIFO push function.
|
||||
* @pull_data: Pointer to FIFO pull function.
|
||||
* @quirks: Set of quirks that apply to specific versions of the IP.
|
||||
* @irq_flags: The flags to be passed to request_irq.
|
||||
* @irq: The irq value to be passed to request_irq.
|
||||
*
|
||||
* Locking
|
||||
* =======
|
||||
@@ -153,7 +155,7 @@ struct dw_mci {
|
||||
u32 fifoth_val;
|
||||
u16 verid;
|
||||
u16 data_offset;
|
||||
struct platform_device *pdev;
|
||||
struct device dev;
|
||||
struct dw_mci_board *pdata;
|
||||
struct dw_mci_slot *slot[MAX_MCI_SLOTS];
|
||||
|
||||
@@ -174,6 +176,8 @@ struct dw_mci {
|
||||
u32 quirks;
|
||||
|
||||
struct regulator *vmmc; /* Power regulator */
|
||||
unsigned long irq_flags; /* IRQ flags */
|
||||
unsigned int irq;
|
||||
};
|
||||
|
||||
/* DMA ops for Internal/External DMAC interface */
|
||||
|
@@ -81,34 +81,11 @@ struct mmc_ios {
|
||||
|
||||
struct mmc_host_ops {
|
||||
/*
|
||||
* Hosts that support power saving can use the 'enable' and 'disable'
|
||||
* methods to exit and enter power saving states. 'enable' is called
|
||||
* when the host is claimed and 'disable' is called (or scheduled with
|
||||
* a delay) when the host is released. The 'disable' is scheduled if
|
||||
* the disable delay set by 'mmc_set_disable_delay()' is non-zero,
|
||||
* otherwise 'disable' is called immediately. 'disable' may be
|
||||
* scheduled repeatedly, to permit ever greater power saving at the
|
||||
* expense of ever greater latency to re-enable. Rescheduling is
|
||||
* determined by the return value of the 'disable' method. A positive
|
||||
* value gives the delay in milliseconds.
|
||||
*
|
||||
* In the case where a host function (like set_ios) may be called
|
||||
* with or without the host claimed, enabling and disabling can be
|
||||
* done directly and will nest correctly. Call 'mmc_host_enable()' and
|
||||
* 'mmc_host_lazy_disable()' for this purpose, but note that these
|
||||
* functions must be paired.
|
||||
*
|
||||
* Alternatively, 'mmc_host_enable()' may be paired with
|
||||
* 'mmc_host_disable()' which calls 'disable' immediately. In this
|
||||
* case the 'disable' method will be called with 'lazy' set to 0.
|
||||
* This is mainly useful for error paths.
|
||||
*
|
||||
* Because lazy disable may be called from a work queue, the 'disable'
|
||||
* method must claim the host when 'lazy' != 0, which will work
|
||||
* correctly because recursion is detected and handled.
|
||||
* 'enable' is called when the host is claimed and 'disable' is called
|
||||
* when the host is released. 'enable' and 'disable' are deprecated.
|
||||
*/
|
||||
int (*enable)(struct mmc_host *host);
|
||||
int (*disable)(struct mmc_host *host, int lazy);
|
||||
int (*disable)(struct mmc_host *host);
|
||||
/*
|
||||
* It is optional for the host to implement pre_req and post_req in
|
||||
* order to support double buffering of requests (prepare one
|
||||
@@ -219,7 +196,7 @@ struct mmc_host {
|
||||
#define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */
|
||||
#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */
|
||||
#define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */
|
||||
#define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */
|
||||
|
||||
#define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */
|
||||
#define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */
|
||||
#define MMC_CAP_ERASE (1 << 10) /* Allow erase/trim commands */
|
||||
@@ -259,6 +236,8 @@ struct mmc_host {
|
||||
#define MMC_CAP2_HS200 (MMC_CAP2_HS200_1_8V_SDR | \
|
||||
MMC_CAP2_HS200_1_2V_SDR)
|
||||
#define MMC_CAP2_BROKEN_VOLTAGE (1 << 7) /* Use the broken voltage */
|
||||
#define MMC_CAP2_DETECT_ON_ERR (1 << 8) /* On I/O err check card removal */
|
||||
#define MMC_CAP2_HC_ERASE_SZ (1 << 9) /* High-capacity erase size */
|
||||
|
||||
mmc_pm_flag_t pm_caps; /* supported pm features */
|
||||
unsigned int power_notify_type;
|
||||
@@ -301,13 +280,7 @@ struct mmc_host {
|
||||
unsigned int removed:1; /* host is being removed */
|
||||
#endif
|
||||
|
||||
/* Only used with MMC_CAP_DISABLE */
|
||||
int enabled; /* host is enabled */
|
||||
int rescan_disable; /* disable card detection */
|
||||
int nesting_cnt; /* "enable" nesting count */
|
||||
int en_dis_recurs; /* detect recursion */
|
||||
unsigned int disable_delay; /* disable delay in msecs */
|
||||
struct delayed_work disable; /* disabling work */
|
||||
|
||||
struct mmc_card *card; /* device attached to this host */
|
||||
|
||||
@@ -407,17 +380,8 @@ int mmc_card_awake(struct mmc_host *host);
|
||||
int mmc_card_sleep(struct mmc_host *host);
|
||||
int mmc_card_can_sleep(struct mmc_host *host);
|
||||
|
||||
int mmc_host_enable(struct mmc_host *host);
|
||||
int mmc_host_disable(struct mmc_host *host);
|
||||
int mmc_host_lazy_disable(struct mmc_host *host);
|
||||
int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
|
||||
|
||||
static inline void mmc_set_disable_delay(struct mmc_host *host,
|
||||
unsigned int disable_delay)
|
||||
{
|
||||
host->disable_delay = disable_delay;
|
||||
}
|
||||
|
||||
/* Module parameter */
|
||||
extern bool mmc_assume_removable;
|
||||
|
||||
|
@@ -274,6 +274,7 @@ struct _mmc_csd {
|
||||
#define EXT_CSD_FLUSH_CACHE 32 /* W */
|
||||
#define EXT_CSD_CACHE_CTRL 33 /* R/W */
|
||||
#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
|
||||
#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
|
||||
#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
|
||||
#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
|
||||
#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
|
||||
@@ -315,6 +316,8 @@ struct _mmc_csd {
|
||||
#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
|
||||
#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
|
||||
#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
|
||||
#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
|
||||
#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
|
||||
#define EXT_CSD_HPI_FEATURES 503 /* RO */
|
||||
|
||||
/*
|
||||
|
@@ -90,6 +90,8 @@ struct sdhci_host {
|
||||
|
||||
unsigned int quirks2; /* More deviations from spec. */
|
||||
|
||||
#define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0)
|
||||
|
||||
int irq; /* Device IRQ */
|
||||
void __iomem *ioaddr; /* Mapped address */
|
||||
|
||||
|
@@ -77,18 +77,15 @@ struct sh_mmcif_plat_data {
|
||||
|
||||
/* CE_CLK_CTRL */
|
||||
#define CLK_ENABLE (1 << 24) /* 1: output mmc clock */
|
||||
#define CLK_CLEAR ((1 << 19) | (1 << 18) | (1 << 17) | (1 << 16))
|
||||
#define CLK_SUP_PCLK ((1 << 19) | (1 << 18) | (1 << 17) | (1 << 16))
|
||||
#define CLKDIV_4 (1<<16) /* mmc clock frequency.
|
||||
* n: bus clock/(2^(n+1)) */
|
||||
#define CLKDIV_256 (7<<16) /* mmc clock frequency. (see above) */
|
||||
#define SRSPTO_256 ((1 << 13) | (0 << 12)) /* resp timeout */
|
||||
#define SRBSYTO_29 ((1 << 11) | (1 << 10) | \
|
||||
(1 << 9) | (1 << 8)) /* resp busy timeout */
|
||||
#define SRWDTO_29 ((1 << 7) | (1 << 6) | \
|
||||
(1 << 5) | (1 << 4)) /* read/write timeout */
|
||||
#define SCCSTO_29 ((1 << 3) | (1 << 2) | \
|
||||
(1 << 1) | (1 << 0)) /* ccs timeout */
|
||||
#define CLK_CLEAR (0xf << 16)
|
||||
#define CLK_SUP_PCLK (0xf << 16)
|
||||
#define CLKDIV_4 (1 << 16) /* mmc clock frequency.
|
||||
* n: bus clock/(2^(n+1)) */
|
||||
#define CLKDIV_256 (7 << 16) /* mmc clock frequency. (see above) */
|
||||
#define SRSPTO_256 (2 << 12) /* resp timeout */
|
||||
#define SRBSYTO_29 (0xf << 8) /* resp busy timeout */
|
||||
#define SRWDTO_29 (0xf << 4) /* read/write timeout */
|
||||
#define SCCSTO_29 (0xf << 0) /* ccs timeout */
|
||||
|
||||
/* CE_VERSION */
|
||||
#define SOFT_RST_ON (1 << 31)
|
||||
|
@@ -10,15 +10,29 @@ struct tmio_mmc_data;
|
||||
#define SH_MOBILE_SDHI_IRQ_SDCARD "sdcard"
|
||||
#define SH_MOBILE_SDHI_IRQ_SDIO "sdio"
|
||||
|
||||
/**
|
||||
* struct sh_mobile_sdhi_ops - SDHI driver callbacks
|
||||
* @cd_wakeup: trigger a card-detection run
|
||||
*/
|
||||
struct sh_mobile_sdhi_ops {
|
||||
void (*cd_wakeup)(const struct platform_device *pdev);
|
||||
};
|
||||
|
||||
struct sh_mobile_sdhi_info {
|
||||
int dma_slave_tx;
|
||||
int dma_slave_rx;
|
||||
unsigned long tmio_flags;
|
||||
unsigned long tmio_caps;
|
||||
u32 tmio_ocr_mask; /* available MMC voltages */
|
||||
unsigned int cd_gpio;
|
||||
struct tmio_mmc_data *pdata;
|
||||
void (*set_pwr)(struct platform_device *pdev, int state);
|
||||
int (*get_cd)(struct platform_device *pdev);
|
||||
|
||||
/* callbacks for board specific setup code */
|
||||
int (*init)(struct platform_device *pdev,
|
||||
const struct sh_mobile_sdhi_ops *ops);
|
||||
void (*cleanup)(struct platform_device *pdev);
|
||||
};
|
||||
|
||||
#endif /* LINUX_MMC_SH_MOBILE_SDHI_H */
|
||||
|
Reference in New Issue
Block a user