mmc: sdhci-esdhc: remove SDHCI_QUIRK_NO_CARD_NO_RESET from ESDHC_DEFAULT_QUIRKS
Subsystems (4)
PATCH v8 1/4 mmc: sdhci-esdhc: remove SDHCI_QUIRK_NO_CARD_NO_RESET from ESDHC_DEFAULT_QUIRKS
sdhci-esdhc-imx does not need SDHCI_QUIRK_NO_CARD_NO_RESET. Make it OF-specific.
--- drivers/mmc/host/sdhci-esdhc.h | 3 +-- drivers/mmc/host/sdhci-of-esdhc.c | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci-esdhc.h +1 -2
@@ -23,8 +23,7 @@ SDHCI_QUIRK_NONSTANDARD_CLOCK | \ SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | \ SDHCI_QUIRK_PIO_NEEDS_DELAY | \ - SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET | \ - SDHCI_QUIRK_NO_CARD_NO_RESET) + SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET)#define ESDHC_SYSTEM_CONTROL 0x2c#define ESDHC_CLOCK_MASK 0x0000fff0
drivers/mmc/host/sdhci-of-esdhc.c +2 -1
@@ -74,7 +74,8 @@ static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)struct sdhci_of_data sdhci_esdhc = {/* card detection could be handled via GPIO */ - .quirks =ESDHC_DEFAULT_QUIRKS |SDHCI_QUIRK_BROKEN_CARD_DETECTION , + .quirks =ESDHC_DEFAULT_QUIRKS |SDHCI_QUIRK_BROKEN_CARD_DETECTION + |SDHCI_QUIRK_NO_CARD_NO_RESET , .ops = { .read_l = sdhci_be32bs_readl, .read_w = esdhc_readw,
Signature · 1 line
1.7.1
PATCH v8 2/4 mmc: add the abort CMDTYE bits definition
Add the abort CMDTYPE bits definition of command register (offset 0xE)
--- drivers/mmc/host/sdhci.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/mmc/host/sdhci.h +1 -0
@@ -45,6 +45,7 @@#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
Signature · 1 line
1.7.1
PATCH v8 3/4 mmc: sdhci-esdhc: make the writel/readl as the general APIs
In reply to Richard ZhuAdd one flag to indicate the GPIO CD/WP is enabled or not on imx platforms, and reuse the writel/readl as the general APIs for imx SOCs.
--- drivers/mmc/host/sdhci-esdhc-imx.c | 44 ++++++++++++++++++++++++++++++----- drivers/mmc/host/sdhci-pltfm.h | 2 +- 2 files changed, 38 insertions(+), 8 deletions(-)
drivers/mmc/host/sdhci-esdhc-imx.c +37 -7
@@ -16,6 +16,7 @@#include <linux/err.h> #include <linux/clk.h> #include <linux/gpio.h> +#include <linux/slab.h> #include <linux/mmc/host.h> #include <linux/mmc/sdhci-pltfm.h> #include <mach/hardware.h>
@@ -24,6 +25,13 @@#include "sdhci-pltfm.h" #include "sdhci-esdhc.h" +#define ESDHC_FLAG_GPIO_FOR_CD_WP (1 << 0) + +struct pltfm_imx_data { +int flags; +u32 scratchpad; +}; +static inline void esdhc_clrset_le (struct sdhci_host *host,u32 mask,u32 val,int reg) {void __iomem *base = host->ioaddr + (reg & ~0x3 );
@@ -34,10 +42,14 @@ static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, istatic u32 esdhc_readl_le (struct sdhci_host *host,int reg) { +struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host); +struct pltfm_imx_data *imx_data = pltfm_host->priv; +/* fake CARD_PRESENT flag on mx25/35 */ u32 val =readl (host->ioaddr + reg); -if (unlikely (reg ==SDHCI_PRESENT_STATE )) { +if (unlikely ((reg ==SDHCI_PRESENT_STATE ) + && (imx_data->flags &ESDHC_FLAG_GPIO_FOR_CD_WP ))) {struct esdhc_platform_data *boarddata = host->mmc->parent->platform_data;
@@ -55,7 +67,11 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg)static void esdhc_writel_le (struct sdhci_host *host,u32 val,int reg) { -if (unlikely (reg ==SDHCI_INT_ENABLE || reg ==SDHCI_SIGNAL_ENABLE )) +struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host); +struct pltfm_imx_data *imx_data = pltfm_host->priv; + +if (unlikely ((reg ==SDHCI_INT_ENABLE || reg ==SDHCI_SIGNAL_ENABLE ) + && (imx_data->flags &ESDHC_FLAG_GPIO_FOR_CD_WP )))/* * these interrupts won't work with a custom card_detect gpio * (only applied to mx25/35)
@@ -76,6 +92,7 @@ static u16 esdhc_readw_le(struct sdhci_host *host, int reg)static void esdhc_writew_le (struct sdhci_host *host,u16 val,int reg) {struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host); +struct pltfm_imx_data *imx_data = pltfm_host->priv;switch (reg) {case SDHCI_TRANSFER_MODE :
@@ -83,10 +100,10 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)* Postpone this write, we must do it together with a * command write that is down below. */ - pltfm_host->scratchpad = val; + imx_data->scratchpad = val;return ;case SDHCI_COMMAND : -writel (val <<16 | pltfm_host->scratchpad, +writel (val <<16 | imx_data->scratchpad, host->ioaddr +SDHCI_TRANSFER_MODE );return ;case SDHCI_BLOCK_SIZE :
@@ -146,7 +163,9 @@ static unsigned int esdhc_pltfm_get_ro(struct sdhci_host *host) }static struct sdhci_ops sdhci_esdhc_ops = { + .read_l = esdhc_readl_le, .read_w = esdhc_readw_le, + .write_l = esdhc_writel_le, .write_w = esdhc_writew_le, .write_b = esdhc_writeb_le, .set_clock = esdhc_set_clock,
@@ -168,6 +187,7 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdstruct esdhc_platform_data *boarddata = host->mmc->parent->platform_data;struct clk *clk;int err; +struct pltfm_imx_data *imx_data; clk =clk_get (mmc_dev (host->mmc),NULL );if (IS_ERR (clk)) {
@@ -177,7 +197,15 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pdclk_enable (clk); pltfm_host->clk = clk; -if (cpu_is_mx35 () ||cpu_is_mx51 ()) + imx_data =kzalloc (sizeof (struct pltfm_imx_data ),GFP_KERNEL ); +if (!imx_data) { +clk_disable (pltfm_host->clk); +clk_put (pltfm_host->clk); +return -ENOMEM ; + } + pltfm_host->priv = imx_data; + +if (!cpu_is_mx25 ()) host->quirks |=SDHCI_QUIRK_BROKEN_TIMEOUT_VAL ;if (cpu_is_mx25 () ||cpu_is_mx35 ()) {
@@ -214,8 +242,7 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd goto no_card_detect_irq; } - sdhci_esdhc_ops.write_l = esdhc_writel_le; - sdhci_esdhc_ops.read_l = esdhc_readl_le; + imx_data->flags |=ESDHC_FLAG_GPIO_FOR_CD_WP ;/* Now we have a working card_detect again */ host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION ; }
@@ -227,6 +254,7 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd no_card_detect_pin: boarddata->cd_gpio = err; not_supported: +kfree (imx_data);return 0 ; }
@@ -234,6 +262,7 @@ static void esdhc_pltfm_exit(struct sdhci_host *host) {struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host);struct esdhc_platform_data *boarddata = host->mmc->parent->platform_data; +struct pltfm_imx_data *imx_data = pltfm_host->priv;if (boarddata &&gpio_is_valid (boarddata->wp_gpio))gpio_free (boarddata->wp_gpio);
@@ -247,6 +276,7 @@ static void esdhc_pltfm_exit(struct sdhci_host *host)clk_disable (pltfm_host->clk);clk_put (pltfm_host->clk); +kfree (imx_data); }struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
drivers/mmc/host/sdhci-pltfm.h +1 -1
@@ -17,7 +17,7 @@struct sdhci_pltfm_host {struct clk *clk; -u32 scratchpad;/* to handle quirks across io-accessor calls */ +void *priv;/* to handle quirks across io-accessor calls */ };extern struct sdhci_pltfm_data sdhci_cns3xxx_pdata;
Signature · 1 line
1.7.1
PATCH v8 3/4 mmc: sdhci-esdhc: make the writel/readl as the general APIs
Quoted 6 lines · Richard Zhu
Add one flag to indicate the GPIO CD/WP is enabled or not on imx platforms, and reuse the writel/readl as the general APIs for imx SOCs.
Signed-off-by Richard Zhu <[email protected]>---
Please provide something like "changes since last time" _below_ this dashed line "---" next time. Or use --cover-letter to introduce the changes.
Other than that
Regards,
Wolfram
Signature · 9 lines
Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 198 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110325/e576ce0d/attachment.sig>
PATCH v8 3/4 mmc: sdhci-esdhc: make the writel/readl as the general APIs
Hi Wolfram:
Got that.
Thanks for your reminder.
Would follow your advice in future.
Best Regards
Richard Zhu
Quoted 35 lines
-----Original Message-----
From: Wolfram Sang [mailto:w.sang at pengutronix.de]
Sent: Friday, March 25, 2011 4:53 PM
To: Zhu Richard-R65037
Cc: linux-arm-kernel at lists.infradead.org; kernel at pengutronix.de; linux- mmc at vger.kernel.org; cjb at laptop.org; avorontsov at ru.mvista.com; eric at eukrea.com; linuxzsc at gmail.com; eric.miao at linaro.org
Subject: Re: [PATCH V8 3/4] mmc: sdhci-esdhc: make the writel/readl as the general APIsQuoted 6 lines · Richard Zhu
Add one flag to indicate the GPIO CD/WP is enabled or not on imx platforms, and reuse the writel/readl as the general APIs for imx SOCs.
Signed-off-by Richard Zhu <[email protected]>---
Please provide something like "changes since last time" _below_ this dashed line "---" next time. Or use --cover-letter to introduce the changes.
Other than that
Reviewed-by Wolfram Sang <[email protected]>Regards,
Wolfram
--
Pengutronix e.K. | Wolfram Sang
|
Industrial Linux Solutions | http://www.pengutronix.de/
|
PATCH v8 4/4 mmc: sdhci-esdhc: enable esdhc on imx53
In reply to Richard ZhuFix the NO INT in the Multi-BLK IO in SD/MMC, and Multi-BLK read in SDIO on imx53.
The CMDTYPE of the CMD register (offset 0xE) should be set to "11" when the STOP CMD12 is issued on imx53 to abort one open ended multi-blk IO. Otherwise one the TC INT wouldn't be generated.
In exact block transfer, the controller doesn't complete the operations automatically as required at the end of the transfer and remains on hold if the abort command is not sent on imx53.
As a result, the TC flag is not asserted and SW received timeout exeception. set bit1 of Vendor Spec registor to fix it.
--- drivers/mmc/host/sdhci-esdhc-imx.c | 42 ++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+), 0 deletions(-)
drivers/mmc/host/sdhci-esdhc-imx.c +42 -0
@@ -19,13 +19,31 @@#include <linux/slab.h> #include <linux/mmc/host.h> #include <linux/mmc/sdhci-pltfm.h> +#include <linux/mmc/mmc.h> +#include <linux/mmc/sdio.h> #include <mach/hardware.h> #include <mach/esdhc.h> #include "sdhci.h" #include "sdhci-pltfm.h" #include "sdhci-esdhc.h" +/* VENDOR SPEC register */ +#define SDHCI_VENDOR_SPEC 0xC0 +#define SDHCI_VENDOR_SPEC_SDIO_QUIRK 0x00000002 +#define ESDHC_FLAG_GPIO_FOR_CD_WP (1 << 0) +/* +* The CMDTYPE of the CMD register (offset 0xE) should be set to +* "11" when the STOP CMD12 is issued on imx53 to abort one +* open ended multi-blk IO. Otherwise the TC INT wouldn't +* be generated. +* In exact block transfer, the controller doesn't complete the +* operations automatically as required@the end of the +* transfer and remains on hold if the abort command is not sent. +* As a result, the TC flag is not asserted and SW received timeout +* exeception. Bit1 of Vendor Spec registor is used to fix it. +*/ +#define ESDHC_FLAG_MULTIBLK_NO_INT (1 << 1)struct pltfm_imx_data {int flags;
@@ -78,6 +96,15 @@ static void esdhc_writel_le(struct sdhci_host *host, u32 val, int reg)*/ val &= ~(SDHCI_INT_CARD_REMOVE |SDHCI_INT_CARD_INSERT ); +if (unlikely ((imx_data->flags &ESDHC_FLAG_MULTIBLK_NO_INT ) + && (reg ==SDHCI_INT_STATUS ) + && (val &SDHCI_INT_DATA_END ))) { +u32 v; + v =readl (host->ioaddr +SDHCI_VENDOR_SPEC ); + v &= ~SDHCI_VENDOR_SPEC_SDIO_QUIRK ; +writel (v, host->ioaddr +SDHCI_VENDOR_SPEC ); + } +writel (val, host->ioaddr + reg); }
@@ -100,9 +127,21 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)* Postpone this write, we must do it together with a * command write that is down below. */ +if ((imx_data->flags &ESDHC_FLAG_MULTIBLK_NO_INT ) + && (host->cmd->opcode ==SD_IO_RW_EXTENDED ) + && (host->cmd->data->blocks >1 ) + && (host->cmd->data->flags &MMC_DATA_READ )) { +u32 v; + v =readl (host->ioaddr +SDHCI_VENDOR_SPEC ); + v |=SDHCI_VENDOR_SPEC_SDIO_QUIRK ; +writel (v, host->ioaddr +SDHCI_VENDOR_SPEC ); + } imx_data->scratchpad = val;return ;case SDHCI_COMMAND : +if ((host->cmd->opcode ==MMC_STOP_TRANSMISSION ) + && (imx_data->flags &ESDHC_FLAG_MULTIBLK_NO_INT )) + val |=SDHCI_CMD_ABORTCMD ;writel (val <<16 | imx_data->scratchpad, host->ioaddr +SDHCI_TRANSFER_MODE );return ;
@@ -215,6 +254,9 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd sdhci_esdhc_ops.get_ro = esdhc_pltfm_get_ro; } +if (!(cpu_is_mx25 () ||cpu_is_mx35 () ||cpu_is_mx51 ())) + imx_data->flags |=ESDHC_FLAG_MULTIBLK_NO_INT ; +if (boarddata) { err =gpio_request_one (boarddata->wp_gpio,GPIOF_IN ,"ESDHC_WP" );if (err) {
Signature · 1 line
1.7.1
PATCH v8 4/4 mmc: sdhci-esdhc: enable esdhc on imx53
Quoted 15 lines · Richard Zhu
Fix the NO INT in the Multi-BLK IO in SD/MMC, and Multi-BLK read in SDIO on imx53.
The CMDTYPE of the CMD register (offset
0xE) should be set to "11" when the STOP CMD12 is issued on imx53 to abort one open ended multi-blk IO. Otherwise one the TC INT wouldn't be generated.In exact block transfer, the controller doesn't complete the operations automatically as required at the end of the transfer and remains on hold if the abort command is not sent on imx53.
As a result, the TC flag is not asserted and SW received timeout exeception. set bit1 of Vendor Spec registor to fix it.
Quoted 2 lines
Signed-off-by Richard Zhu <[email protected]>Signed-off-by Richard Zhao <[email protected]>
Signature · 9 lines
Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 198 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110325/da650a72/attachment.sig>
PATCH v8 1/4 mmc: sdhci-esdhc: remove SDHCI_QUIRK_NO_CARD_NO_RESET from ESDHC_DEFAULT_QUIRKS
In reply to Richard ZhuHi Richard,
Thanks, I've pushed all four patches to mmc-next for .39-rc2.
- Chris.
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
PATCH v8 1/4 mmc: sdhci-esdhc: remove SDHCI_QUIRK_NO_CARD_NO_RESET from ESDHC_DEFAULT_QUIRKS
Hi Chris:
Thanks a lot.
Best Regards
Richard Zhu
Quoted 18 lines
-----Original Message-----
From: Chris Ball [mailto:cjb at laptop.org]
Sent: Friday, March 25, 2011 9:18 PM
To: Zhu Richard-R65037
Cc: linux-arm-kernel at lists.infradead.org; kernel at pengutronix.de; linux- mmc at vger.kernel.org; avorontsov at ru.mvista.com; eric at eukrea.com; w.sang at pengutronix.de; linuxzsc at gmail.com; eric.miao at linaro.org
Subject: Re: [PATCH V8 1/4] mmc: sdhci-esdhc: removeSDHCI_QUIRK_NO_CARD_NO_RESETfromESDHC_DEFAULT_QUIRKSHi Richard,
Thanks, I've pushed all four patches to mmc-next for .39-rc2.
- Chris.
--
Chris Ball <[email protected]> <http://printf.net/>
One Laptop Per Child