* [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups
@ 2010-03-30 18:31 Daniel Mack
2010-03-30 18:32 ` [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations Daniel Mack
` (3 more replies)
0 siblings, 4 replies; 13+ messages in thread
From: Daniel Mack @ 2010-03-30 18:31 UTC (permalink / raw)
To: linux-arm-kernel
Add some more debug information and fix a couple of coding style things
in mxcmmc.c.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Volker Ernst <volker.ernst@txtr.com>
Cc: Jiri Kosina <jkosina@suse.cz>
---
drivers/mmc/host/mxcmmc.c | 28 +++++++++++++++++-----------
1 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c
index 2df9041..21037ff 100644
--- a/drivers/mmc/host/mxcmmc.c
+++ b/drivers/mmc/host/mxcmmc.c
@@ -151,6 +151,8 @@ static void mxcmci_softreset(struct mxcmci_host *host)
{
int i;
+ dev_dbg(mmc_dev(host->mmc), "mxcmci_softreset\n");
+
/* reset sequence */
writew(STR_STP_CLK_RESET, host->base + MMC_REG_STR_STP_CLK);
writew(STR_STP_CLK_RESET | STR_STP_CLK_START_CLK,
@@ -290,21 +292,29 @@ static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat)
dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n",
stat);
if (stat & STATUS_CRC_READ_ERR) {
+ dev_err(mmc_dev(host->mmc), "%s: -EILSEQ\n", __func__);
data->error = -EILSEQ;
} else if (stat & STATUS_CRC_WRITE_ERR) {
u32 err_code = (stat >> 9) & 0x3;
- if (err_code == 2) /* No CRC response */
+ if (err_code == 2) { /* No CRC response */
+ dev_err(mmc_dev(host->mmc),
+ "%s: No CRC -ETIMEDOUT\n", __func__);
data->error = -ETIMEDOUT;
- else
+ } else {
+ dev_err(mmc_dev(host->mmc),
+ "%s: -EILSEQ\n", __func__);
data->error = -EILSEQ;
+ }
} else if (stat & STATUS_TIME_OUT_READ) {
+ dev_err(mmc_dev(host->mmc),
+ "%s: read -ETIMEDOUT\n", __func__);
data->error = -ETIMEDOUT;
} else {
+ dev_err(mmc_dev(host->mmc), "%s: -EIO\n", __func__);
data->error = -EIO;
}
- } else {
+ } else
data->bytes_xfered = host->datasize;
- }
data_error = data->error;
@@ -433,8 +443,6 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)
struct scatterlist *sg;
int stat, i;
- host->datasize = 0;
-
host->data = data;
host->datasize = 0;
@@ -471,9 +479,8 @@ static void mxcmci_datawork(struct work_struct *work)
mxcmci_finish_request(host, host->req);
return;
}
- } else {
+ } else
mxcmci_finish_request(host, host->req);
- }
}
#ifdef HAS_DMA
@@ -495,9 +502,8 @@ static void mxcmci_data_done(struct mxcmci_host *host, unsigned int stat)
mxcmci_finish_request(host, host->req);
return;
}
- } else {
+ } else
mxcmci_finish_request(host, host->req);
- }
}
#endif /* HAS_DMA */
@@ -512,7 +518,7 @@ static void mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat)
}
/* For the DMA case the DMA engine handles the data transfer
- * automatically. For non DMA we have to do it ourselves.
+ * automatically. For non DMA we have to to it ourselves.
* Don't do it in interrupt context though.
*/
if (!mxcmci_use_dma(host) && host->data)
--
1.7.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-30 18:31 [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Daniel Mack @ 2010-03-30 18:32 ` Daniel Mack 2010-03-31 13:03 ` Sascha Hauer 2010-03-30 18:32 ` [PATCH 3/3] ARM: MXC: mxcmmc: work around a bug in the SDHC busy line handling Daniel Mack ` (2 subsequent siblings) 3 siblings, 1 reply; 13+ messages in thread From: Daniel Mack @ 2010-03-30 18:32 UTC (permalink / raw) To: linux-arm-kernel Successfully tested on MX31 hardware using libertas SDIO peripherals. Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Volker Ernst <volker.ernst@txtr.com> Cc: Jiri Kosina <jkosina@suse.cz> --- drivers/mmc/host/mxcmmc.c | 55 ++++++++++++++++++++++++++++++++++++-------- 1 files changed, 45 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 21037ff..83a4545 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -119,6 +119,7 @@ struct mxcmci_host { int detect_irq; int dma; int do_dma; + int use_sdio; unsigned int power_mode; struct imxmmc_platform_data *pdata; @@ -138,6 +139,7 @@ struct mxcmci_host { int clock; struct work_struct datawork; + spinlock_t lock; }; static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios); @@ -226,6 +228,8 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data) static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, unsigned int cmdat) { + u32 int_cntr; + WARN_ON(host->cmd != NULL); host->cmd = cmd; @@ -249,13 +253,15 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, return -EINVAL; } + int_cntr = INT_END_CMD_RES_EN; + if (mxcmci_use_dma(host)) - writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN | - INT_END_CMD_RES_EN, - host->base + MMC_REG_INT_CNTR); - else - writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR); + int_cntr |= INT_READ_OP_EN | INT_WRITE_OP_DONE_EN; + + if (host->use_sdio) + int_cntr |= INT_SDIO_IRQ_EN; + writel(int_cntr, host->base + MMC_REG_INT_CNTR); writew(cmd->opcode, host->base + MMC_REG_CMD); writel(cmd->arg, host->base + MMC_REG_ARG); writew(cmdat, host->base + MMC_REG_CMD_DAT_CONT); @@ -266,7 +272,12 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, static void mxcmci_finish_request(struct mxcmci_host *host, struct mmc_request *req) { - writel(0, host->base + MMC_REG_INT_CNTR); + u32 int_cntr = 0; + + if (host->use_sdio) + int_cntr |= INT_SDIO_IRQ_EN; + + writel(int_cntr, host->base + MMC_REG_INT_CNTR); host->req = NULL; host->cmd = NULL; @@ -536,8 +547,12 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); + if ((stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio) + mmc_signal_sdio_irq(host->mmc); + if (stat & STATUS_END_CMD_RESP) mxcmci_cmd_done(host, stat); + #ifdef HAS_DMA if (mxcmci_use_dma(host) && (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) @@ -674,11 +689,30 @@ static int mxcmci_get_ro(struct mmc_host *mmc) return -ENOSYS; } +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) +{ + struct mxcmci_host *host = mmc_priv(mmc); + unsigned long flags; + u32 int_cntr; + + spin_lock_irqsave(&host->lock, flags); + host->use_sdio = enable; + int_cntr = readl(host->base + MMC_REG_INT_CNTR); + + if (enable) + int_cntr |= INT_SDIO_IRQ_EN; + else + int_cntr &= ~INT_SDIO_IRQ_EN; + + writel(int_cntr, host->base + MMC_REG_INT_CNTR); + spin_unlock_irqrestore(&host->lock, flags); +} static const struct mmc_host_ops mxcmci_ops = { - .request = mxcmci_request, - .set_ios = mxcmci_set_ios, - .get_ro = mxcmci_get_ro, + .request = mxcmci_request, + .set_ios = mxcmci_set_ios, + .get_ro = mxcmci_get_ro, + .enable_sdio_irq = mxcmci_enable_sdio_irq, }; static int mxcmci_probe(struct platform_device *pdev) @@ -706,7 +740,7 @@ static int mxcmci_probe(struct platform_device *pdev) } mmc->ops = &mxcmci_ops; - mmc->caps = MMC_CAP_4_BIT_DATA; + mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; /* MMC core transfer sizes tunable parameters */ mmc->max_hw_segs = 64; @@ -725,6 +759,7 @@ static int mxcmci_probe(struct platform_device *pdev) host->mmc = mmc; host->pdata = pdev->dev.platform_data; + spin_lock_init(&host->lock); if (host->pdata && host->pdata->ocr_avail) mmc->ocr_avail = host->pdata->ocr_avail; -- 1.7.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-30 18:32 ` [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations Daniel Mack @ 2010-03-31 13:03 ` Sascha Hauer 2010-03-31 13:29 ` Daniel Mack 0 siblings, 1 reply; 13+ messages in thread From: Sascha Hauer @ 2010-03-31 13:03 UTC (permalink / raw) To: linux-arm-kernel On Tue, Mar 30, 2010 at 08:32:00PM +0200, Daniel Mack wrote: > Successfully tested on MX31 hardware using libertas SDIO peripherals. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > Cc: Sascha Hauer <s.hauer@pengutronix.de> > Cc: Dan Williams <dan.j.williams@intel.com> > Cc: Volker Ernst <volker.ernst@txtr.com> > Cc: Jiri Kosina <jkosina@suse.cz> > --- > drivers/mmc/host/mxcmmc.c | 55 ++++++++++++++++++++++++++++++++++++-------- > 1 files changed, 45 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > index 21037ff..83a4545 100644 > --- a/drivers/mmc/host/mxcmmc.c > +++ b/drivers/mmc/host/mxcmmc.c > @@ -119,6 +119,7 @@ struct mxcmci_host { > int detect_irq; > int dma; > int do_dma; > + int use_sdio; > unsigned int power_mode; > struct imxmmc_platform_data *pdata; > > @@ -138,6 +139,7 @@ struct mxcmci_host { > int clock; > > struct work_struct datawork; > + spinlock_t lock; > }; > > static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios); > @@ -226,6 +228,8 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data) > static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > unsigned int cmdat) > { > + u32 int_cntr; > + > WARN_ON(host->cmd != NULL); > host->cmd = cmd; > > @@ -249,13 +253,15 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > return -EINVAL; > } > > + int_cntr = INT_END_CMD_RES_EN; > + > if (mxcmci_use_dma(host)) > - writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN | > - INT_END_CMD_RES_EN, > - host->base + MMC_REG_INT_CNTR); > - else > - writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR); > + int_cntr |= INT_READ_OP_EN | INT_WRITE_OP_DONE_EN; > + > + if (host->use_sdio) > + int_cntr |= INT_SDIO_IRQ_EN; > > + writel(int_cntr, host->base + MMC_REG_INT_CNTR); > writew(cmd->opcode, host->base + MMC_REG_CMD); > writel(cmd->arg, host->base + MMC_REG_ARG); > writew(cmdat, host->base + MMC_REG_CMD_DAT_CONT); > @@ -266,7 +272,12 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > static void mxcmci_finish_request(struct mxcmci_host *host, > struct mmc_request *req) > { > - writel(0, host->base + MMC_REG_INT_CNTR); > + u32 int_cntr = 0; > + > + if (host->use_sdio) > + int_cntr |= INT_SDIO_IRQ_EN; > + > + writel(int_cntr, host->base + MMC_REG_INT_CNTR); > > host->req = NULL; > host->cmd = NULL; > @@ -536,8 +547,12 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) > > dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); > > + if ((stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio) > + mmc_signal_sdio_irq(host->mmc); > + > if (stat & STATUS_END_CMD_RESP) > mxcmci_cmd_done(host, stat); > + > #ifdef HAS_DMA > if (mxcmci_use_dma(host) && > (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) > @@ -674,11 +689,30 @@ static int mxcmci_get_ro(struct mmc_host *mmc) > return -ENOSYS; > } > > +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) > +{ > + struct mxcmci_host *host = mmc_priv(mmc); > + unsigned long flags; > + u32 int_cntr; > + > + spin_lock_irqsave(&host->lock, flags); > + host->use_sdio = enable; > + int_cntr = readl(host->base + MMC_REG_INT_CNTR); > + > + if (enable) > + int_cntr |= INT_SDIO_IRQ_EN; > + else > + int_cntr &= ~INT_SDIO_IRQ_EN; > + > + writel(int_cntr, host->base + MMC_REG_INT_CNTR); > + spin_unlock_irqrestore(&host->lock, flags); The other places where MMC_REG_INT_CNTR is touched should be protected by this spinlock aswell. Sascha > +} > > static const struct mmc_host_ops mxcmci_ops = { > - .request = mxcmci_request, > - .set_ios = mxcmci_set_ios, > - .get_ro = mxcmci_get_ro, > + .request = mxcmci_request, > + .set_ios = mxcmci_set_ios, > + .get_ro = mxcmci_get_ro, > + .enable_sdio_irq = mxcmci_enable_sdio_irq, > }; > > static int mxcmci_probe(struct platform_device *pdev) > @@ -706,7 +740,7 @@ static int mxcmci_probe(struct platform_device *pdev) > } > > mmc->ops = &mxcmci_ops; > - mmc->caps = MMC_CAP_4_BIT_DATA; > + mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; > > /* MMC core transfer sizes tunable parameters */ > mmc->max_hw_segs = 64; > @@ -725,6 +759,7 @@ static int mxcmci_probe(struct platform_device *pdev) > > host->mmc = mmc; > host->pdata = pdev->dev.platform_data; > + spin_lock_init(&host->lock); > > if (host->pdata && host->pdata->ocr_avail) > mmc->ocr_avail = host->pdata->ocr_avail; > -- > 1.7.0 > > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-31 13:03 ` Sascha Hauer @ 2010-03-31 13:29 ` Daniel Mack 2010-03-31 16:41 ` Michał Mirosław 0 siblings, 1 reply; 13+ messages in thread From: Daniel Mack @ 2010-03-31 13:29 UTC (permalink / raw) To: linux-arm-kernel On Wed, Mar 31, 2010 at 03:03:39PM +0200, Sascha Hauer wrote: > On Tue, Mar 30, 2010 at 08:32:00PM +0200, Daniel Mack wrote: > > +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) > > +{ > > + struct mxcmci_host *host = mmc_priv(mmc); > > + unsigned long flags; > > + u32 int_cntr; > > + > > + spin_lock_irqsave(&host->lock, flags); > > + host->use_sdio = enable; > > + int_cntr = readl(host->base + MMC_REG_INT_CNTR); > > + > > + if (enable) > > + int_cntr |= INT_SDIO_IRQ_EN; > > + else > > + int_cntr &= ~INT_SDIO_IRQ_EN; > > + > > + writel(int_cntr, host->base + MMC_REG_INT_CNTR); > > + spin_unlock_irqrestore(&host->lock, flags); > > The other places where MMC_REG_INT_CNTR is touched should be protected > by this spinlock aswell. Hmm, all other place don't do a read/modify/write cycle, so I'd say the don't need protection? Daniel ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-31 13:29 ` Daniel Mack @ 2010-03-31 16:41 ` Michał Mirosław 2010-03-31 17:04 ` [PATCH] " Daniel Mack 0 siblings, 1 reply; 13+ messages in thread From: Michał Mirosław @ 2010-03-31 16:41 UTC (permalink / raw) To: linux-arm-kernel 2010/3/31 Daniel Mack <daniel@caiaq.de>: > On Wed, Mar 31, 2010 at 03:03:39PM +0200, Sascha Hauer wrote: >> On Tue, Mar 30, 2010 at 08:32:00PM +0200, Daniel Mack wrote: >> > +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) >> > +{ >> > + ? struct mxcmci_host *host = mmc_priv(mmc); >> > + ? unsigned long flags; >> > + ? u32 int_cntr; >> > + >> > + ? spin_lock_irqsave(&host->lock, flags); >> > + ? host->use_sdio = enable; >> > + ? int_cntr = readl(host->base + MMC_REG_INT_CNTR); >> > + >> > + ? if (enable) >> > + ? ? ? ? ? int_cntr |= INT_SDIO_IRQ_EN; >> > + ? else >> > + ? ? ? ? ? int_cntr &= ~INT_SDIO_IRQ_EN; >> > + >> > + ? writel(int_cntr, host->base + MMC_REG_INT_CNTR); >> > + ? spin_unlock_irqrestore(&host->lock, flags); >> >> The other places where MMC_REG_INT_CNTR is touched should be protected >> by this spinlock aswell. > Hmm, all other place don't do a read/modify/write cycle, so I'd say the > don't need protection? If you miss spinlocks around the unconditional writes they might happen between your readl() and writel(). Best Regards, Micha? Miros?aw ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-31 16:41 ` Michał Mirosław @ 2010-03-31 17:04 ` Daniel Mack 2010-03-31 17:34 ` Michał Mirosław 0 siblings, 1 reply; 13+ messages in thread From: Daniel Mack @ 2010-03-31 17:04 UTC (permalink / raw) To: linux-arm-kernel Successfully tested on MX31 hardware using libertas SDIO peripherals. Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Volker Ernst <volker.ernst@txtr.com> Cc: Jiri Kosina <jkosina@suse.cz> --- drivers/mmc/host/mxcmmc.c | 62 +++++++++++++++++++++++++++++++++++++------- 1 files changed, 52 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 44a53ee..f91a2c3 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -119,6 +119,7 @@ struct mxcmci_host { int detect_irq; int dma; int do_dma; + int use_sdio; unsigned int power_mode; struct imxmmc_platform_data *pdata; @@ -138,6 +139,7 @@ struct mxcmci_host { int clock; struct work_struct datawork; + spinlock_t lock; }; static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios); @@ -226,6 +228,9 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data) static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, unsigned int cmdat) { + u32 int_cntr; + unsigned long flags; + WARN_ON(host->cmd != NULL); host->cmd = cmd; @@ -249,12 +254,17 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, return -EINVAL; } + int_cntr = INT_END_CMD_RES_EN; + if (mxcmci_use_dma(host)) - writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN | - INT_END_CMD_RES_EN, - host->base + MMC_REG_INT_CNTR); - else - writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR); + int_cntr |= INT_READ_OP_EN | INT_WRITE_OP_DONE_EN; + + if (host->use_sdio) + int_cntr |= INT_SDIO_IRQ_EN; + + spin_lock_irqsave(&host->lock, flags); + writel(int_cntr, host->base + MMC_REG_INT_CNTR); + spin_unlock_irqrestore(&host->lock, flags); writew(cmd->opcode, host->base + MMC_REG_CMD); writel(cmd->arg, host->base + MMC_REG_ARG); @@ -266,7 +276,15 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, static void mxcmci_finish_request(struct mxcmci_host *host, struct mmc_request *req) { - writel(0, host->base + MMC_REG_INT_CNTR); + u32 int_cntr = 0; + unsigned long flags; + + if (host->use_sdio) + int_cntr |= INT_SDIO_IRQ_EN; + + spin_lock_irqsave(&host->lock, flags); + writel(int_cntr, host->base + MMC_REG_INT_CNTR); + spin_unlock_irqrestore(&host->lock, flags); host->req = NULL; host->cmd = NULL; @@ -539,8 +557,12 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); + if ((stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio) + mmc_signal_sdio_irq(host->mmc); + if (stat & STATUS_END_CMD_RESP) mxcmci_cmd_done(host, stat); + #ifdef HAS_DMA if (mxcmci_use_dma(host) && (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) @@ -677,11 +699,30 @@ static int mxcmci_get_ro(struct mmc_host *mmc) return -ENOSYS; } +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) +{ + struct mxcmci_host *host = mmc_priv(mmc); + unsigned long flags; + u32 int_cntr; + + spin_lock_irqsave(&host->lock, flags); + host->use_sdio = enable; + int_cntr = readl(host->base + MMC_REG_INT_CNTR); + + if (enable) + int_cntr |= INT_SDIO_IRQ_EN; + else + int_cntr &= ~INT_SDIO_IRQ_EN; + + writel(int_cntr, host->base + MMC_REG_INT_CNTR); + spin_unlock_irqrestore(&host->lock, flags); +} static const struct mmc_host_ops mxcmci_ops = { - .request = mxcmci_request, - .set_ios = mxcmci_set_ios, - .get_ro = mxcmci_get_ro, + .request = mxcmci_request, + .set_ios = mxcmci_set_ios, + .get_ro = mxcmci_get_ro, + .enable_sdio_irq = mxcmci_enable_sdio_irq, }; static int mxcmci_probe(struct platform_device *pdev) @@ -709,7 +750,7 @@ static int mxcmci_probe(struct platform_device *pdev) } mmc->ops = &mxcmci_ops; - mmc->caps = MMC_CAP_4_BIT_DATA; + mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; /* MMC core transfer sizes tunable parameters */ mmc->max_hw_segs = 64; @@ -728,6 +769,7 @@ static int mxcmci_probe(struct platform_device *pdev) host->mmc = mmc; host->pdata = pdev->dev.platform_data; + spin_lock_init(&host->lock); if (host->pdata && host->pdata->ocr_avail) mmc->ocr_avail = host->pdata->ocr_avail; -- 1.7.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-31 17:04 ` [PATCH] " Daniel Mack @ 2010-03-31 17:34 ` Michał Mirosław 2010-04-01 8:02 ` Daniel Mack 0 siblings, 1 reply; 13+ messages in thread From: Michał Mirosław @ 2010-03-31 17:34 UTC (permalink / raw) To: linux-arm-kernel 2010/3/31 Daniel Mack <daniel@caiaq.de>: > Successfully tested on MX31 hardware using libertas SDIO peripherals. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > Cc: Sascha Hauer <s.hauer@pengutronix.de> > Cc: Dan Williams <dan.j.williams@intel.com> > Cc: Volker Ernst <volker.ernst@txtr.com> > Cc: Jiri Kosina <jkosina@suse.cz> > --- > ?drivers/mmc/host/mxcmmc.c | ? 62 +++++++++++++++++++++++++++++++++++++------- > ?1 files changed, 52 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > index 44a53ee..f91a2c3 100644 > --- a/drivers/mmc/host/mxcmmc.c > +++ b/drivers/mmc/host/mxcmmc.c > @@ -119,6 +119,7 @@ struct mxcmci_host { > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? detect_irq; > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? dma; > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? do_dma; > + ? ? ? int ? ? ? ? ? ? ? ? ? ? use_sdio; > ? ? ? ?unsigned int ? ? ? ? ? ?power_mode; > ? ? ? ?struct imxmmc_platform_data *pdata; > This field should be protected by the same spinlock as it is used to set the reg's value. > @@ -138,6 +139,7 @@ struct mxcmci_host { > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? clock; > > ? ? ? ?struct work_struct ? ? ?datawork; > + ? ? ? spinlock_t ? ? ? ? ? ? ?lock; > ?}; > > ?static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios); > @@ -226,6 +228,9 @@ static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data) > ?static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > ? ? ? ? ? ? ? ?unsigned int cmdat) > ?{ > + ? ? ? u32 int_cntr; > + ? ? ? unsigned long flags; > + > ? ? ? ?WARN_ON(host->cmd != NULL); > ? ? ? ?host->cmd = cmd; > > @@ -249,12 +254,17 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > ? ? ? ? ? ? ? ?return -EINVAL; > ? ? ? ?} > > + ? ? ? int_cntr = INT_END_CMD_RES_EN; > + > ? ? ? ?if (mxcmci_use_dma(host)) > - ? ? ? ? ? ? ? writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN | > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INT_END_CMD_RES_EN, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? host->base + MMC_REG_INT_CNTR); > - ? ? ? else > - ? ? ? ? ? ? ? writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR); > + ? ? ? ? ? ? ? int_cntr |= INT_READ_OP_EN | INT_WRITE_OP_DONE_EN; > + > + ? ? ? if (host->use_sdio) > + ? ? ? ? ? ? ? int_cntr |= INT_SDIO_IRQ_EN; > + > + ? ? ? spin_lock_irqsave(&host->lock, flags); > + ? ? ? writel(int_cntr, host->base + MMC_REG_INT_CNTR); > + ? ? ? spin_unlock_irqrestore(&host->lock, flags); Here. > > ? ? ? ?writew(cmd->opcode, host->base + MMC_REG_CMD); > ? ? ? ?writel(cmd->arg, host->base + MMC_REG_ARG); > @@ -266,7 +276,15 @@ static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd, > ?static void mxcmci_finish_request(struct mxcmci_host *host, > ? ? ? ? ? ? ? ?struct mmc_request *req) > ?{ > - ? ? ? writel(0, host->base + MMC_REG_INT_CNTR); > + ? ? ? u32 int_cntr = 0; > + ? ? ? unsigned long flags; > + > + ? ? ? if (host->use_sdio) > + ? ? ? ? ? ? ? int_cntr |= INT_SDIO_IRQ_EN; > + > + ? ? ? spin_lock_irqsave(&host->lock, flags); > + ? ? ? writel(int_cntr, host->base + MMC_REG_INT_CNTR); > + ? ? ? spin_unlock_irqrestore(&host->lock, flags); And here. > > ? ? ? ?host->req = NULL; > ? ? ? ?host->cmd = NULL; > @@ -539,8 +557,12 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) > > ? ? ? ?dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); > > + ? ? ? if ((stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio) > + ? ? ? ? ? ? ? mmc_signal_sdio_irq(host->mmc); > + And here. > ? ? ? ?if (stat & STATUS_END_CMD_RESP) > ? ? ? ? ? ? ? ?mxcmci_cmd_done(host, stat); > + > ?#ifdef HAS_DMA > ? ? ? ?if (mxcmci_use_dma(host) && > ? ? ? ? ? ? ? ? ?(stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) > @@ -677,11 +699,30 @@ static int mxcmci_get_ro(struct mmc_host *mmc) > ? ? ? ?return -ENOSYS; > ?} > > +static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) > +{ > + ? ? ? struct mxcmci_host *host = mmc_priv(mmc); > + ? ? ? unsigned long flags; > + ? ? ? u32 int_cntr; > + > + ? ? ? spin_lock_irqsave(&host->lock, flags); > + ? ? ? host->use_sdio = enable; > + ? ? ? int_cntr = readl(host->base + MMC_REG_INT_CNTR); > + > + ? ? ? if (enable) > + ? ? ? ? ? ? ? int_cntr |= INT_SDIO_IRQ_EN; > + ? ? ? else > + ? ? ? ? ? ? ? int_cntr &= ~INT_SDIO_IRQ_EN; > + > + ? ? ? writel(int_cntr, host->base + MMC_REG_INT_CNTR); > + ? ? ? spin_unlock_irqrestore(&host->lock, flags); > +} This one is good. [...] Best Regards, Micha? Miros?aw ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] ARM: MXC: mxcmmc: Teach the driver SDIO operations 2010-03-31 17:34 ` Michał Mirosław @ 2010-04-01 8:02 ` Daniel Mack 0 siblings, 0 replies; 13+ messages in thread From: Daniel Mack @ 2010-04-01 8:02 UTC (permalink / raw) To: linux-arm-kernel On Wed, Mar 31, 2010 at 07:34:14PM +0200, Micha? Miros?aw wrote: > 2010/3/31 Daniel Mack <daniel@caiaq.de>: > > Successfully tested on MX31 hardware using libertas SDIO peripherals. > > > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > > Cc: Sascha Hauer <s.hauer@pengutronix.de> > > Cc: Dan Williams <dan.j.williams@intel.com> > > Cc: Volker Ernst <volker.ernst@txtr.com> > > Cc: Jiri Kosina <jkosina@suse.cz> > > --- > > ?drivers/mmc/host/mxcmmc.c | ? 62 +++++++++++++++++++++++++++++++++++++------- > > ?1 files changed, 52 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > > index 44a53ee..f91a2c3 100644 > > --- a/drivers/mmc/host/mxcmmc.c > > +++ b/drivers/mmc/host/mxcmmc.c > > @@ -119,6 +119,7 @@ struct mxcmci_host { > > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? detect_irq; > > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? dma; > > ? ? ? ?int ? ? ? ? ? ? ? ? ? ? do_dma; > > + ? ? ? int ? ? ? ? ? ? ? ? ? ? use_sdio; > > ? ? ? ?unsigned int ? ? ? ? ? ?power_mode; > > ? ? ? ?struct imxmmc_platform_data *pdata; > > > > This field should be protected by the same spinlock as it is used to > set the reg's value. Ok - I'll repost all three patches. Again, thanks for your review. Daniel ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/3] ARM: MXC: mxcmmc: work around a bug in the SDHC busy line handling 2010-03-30 18:31 [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Daniel Mack 2010-03-30 18:32 ` [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations Daniel Mack @ 2010-03-30 18:32 ` Daniel Mack 2010-03-31 12:38 ` [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Sascha Hauer 2010-03-31 13:17 ` [PATCH 1/3] " Julien Boibessot 3 siblings, 0 replies; 13+ messages in thread From: Daniel Mack @ 2010-03-30 18:32 UTC (permalink / raw) To: linux-arm-kernel MX3 SoCs have a silicon bug which corrupts CRC calculation of multi-block transfers when connected SDIO peripheral doesn't drive the BUSY line as required by the specs. One way to prevent this is to only allow 1-bit transfers. Another way is playing tricks with the DMA engine, but this isn't mainline yet. So for now, we live with the performance drawback of 1-bit transfers until a nicer solution is found. This patch introduces a new host controller callback 'init_card' which is for now only called from mmc_sdio_init_card(). Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Volker Ernst <volker.ernst@txtr.com> Cc: Jiri Kosina <jkosina@suse.cz> --- drivers/mmc/core/sdio.c | 6 ++++++ drivers/mmc/host/mxcmmc.c | 14 ++++++++++++++ include/linux/mmc/host.h | 3 +++ 3 files changed, 23 insertions(+), 0 deletions(-) diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 2dd4cfe..b9dee28 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -296,6 +296,12 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, card->type = MMC_TYPE_SDIO; /* + * Call the optional HC's init_card function to handle quirks. + */ + if (host->ops->init_card) + host->ops->init_card(host, card); + + /* * For native busses: set card RCA and quit open drain mode. */ if (!powered_resume && !mmc_host_is_spi(host)) { diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 83a4545..f584c1b 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -708,11 +708,25 @@ static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) spin_unlock_irqrestore(&host->lock, flags); } +static void mxcmci_init_card(struct mmc_host *host, struct mmc_card *card) +{ + /* + * MX3 SoCs have a silicon bug which corrupts CRC calculation of + * multi-block transfers when connected SDIO peripheral doesn't + * drive the BUSY line as required by the specs. + * One way to prevent this is to only allow 1-bit transfers. + */ + + if (cpu_is_mx3() && card->type == MMC_TYPE_SDIO) + host->caps &= ~MMC_CAP_4_BIT_DATA; +} + static const struct mmc_host_ops mxcmci_ops = { .request = mxcmci_request, .set_ios = mxcmci_set_ios, .get_ro = mxcmci_get_ro, .enable_sdio_irq = mxcmci_enable_sdio_irq, + .init_card = mxcmci_init_card, }; static int mxcmci_probe(struct platform_device *pdev) diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 43eaf5c..3196c84 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -108,6 +108,9 @@ struct mmc_host_ops { int (*get_cd)(struct mmc_host *host); void (*enable_sdio_irq)(struct mmc_host *host, int enable); + + /* optional callback for HC quirks */ + void (*init_card)(struct mmc_host *host, struct mmc_card *card); }; struct mmc_card; -- 1.7.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups 2010-03-30 18:31 [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Daniel Mack 2010-03-30 18:32 ` [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations Daniel Mack 2010-03-30 18:32 ` [PATCH 3/3] ARM: MXC: mxcmmc: work around a bug in the SDHC busy line handling Daniel Mack @ 2010-03-31 12:38 ` Sascha Hauer 2010-03-31 13:02 ` Daniel Mack 2010-03-31 13:35 ` [PATCH] " Daniel Mack 2010-03-31 13:17 ` [PATCH 1/3] " Julien Boibessot 3 siblings, 2 replies; 13+ messages in thread From: Sascha Hauer @ 2010-03-31 12:38 UTC (permalink / raw) To: linux-arm-kernel Hi Daniel, On Tue, Mar 30, 2010 at 08:31:59PM +0200, Daniel Mack wrote: > Add some more debug information and fix a couple of coding style things > in mxcmmc.c. > > Signed-off-by: Daniel Mack <daniel@caiaq.de> > Cc: Sascha Hauer <s.hauer@pengutronix.de> > Cc: Dan Williams <dan.j.williams@intel.com> > Cc: Volker Ernst <volker.ernst@txtr.com> > Cc: Jiri Kosina <jkosina@suse.cz> > --- > drivers/mmc/host/mxcmmc.c | 28 +++++++++++++++++----------- > 1 files changed, 17 insertions(+), 11 deletions(-) > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > index 2df9041..21037ff 100644 > --- a/drivers/mmc/host/mxcmmc.c > +++ b/drivers/mmc/host/mxcmmc.c > @@ -151,6 +151,8 @@ static void mxcmci_softreset(struct mxcmci_host *host) > { > int i; > > + dev_dbg(mmc_dev(host->mmc), "mxcmci_softreset\n"); > + > /* reset sequence */ > writew(STR_STP_CLK_RESET, host->base + MMC_REG_STR_STP_CLK); > writew(STR_STP_CLK_RESET | STR_STP_CLK_START_CLK, > @@ -290,21 +292,29 @@ static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat) > dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n", > stat); > if (stat & STATUS_CRC_READ_ERR) { > + dev_err(mmc_dev(host->mmc), "%s: -EILSEQ\n", __func__); > data->error = -EILSEQ; > } else if (stat & STATUS_CRC_WRITE_ERR) { > u32 err_code = (stat >> 9) & 0x3; > - if (err_code == 2) /* No CRC response */ > + if (err_code == 2) { /* No CRC response */ > + dev_err(mmc_dev(host->mmc), > + "%s: No CRC -ETIMEDOUT\n", __func__); > data->error = -ETIMEDOUT; > - else > + } else { > + dev_err(mmc_dev(host->mmc), > + "%s: -EILSEQ\n", __func__); > data->error = -EILSEQ; > + } > } else if (stat & STATUS_TIME_OUT_READ) { > + dev_err(mmc_dev(host->mmc), > + "%s: read -ETIMEDOUT\n", __func__); > data->error = -ETIMEDOUT; > } else { > + dev_err(mmc_dev(host->mmc), "%s: -EIO\n", __func__); Do we really want to have these messages with dev_err? In the subject you are talking about debug output. > data->error = -EIO; > } > - } else { > + } else > data->bytes_xfered = host->datasize; > - } Documentation/CodingStyle says that if braces are used in one branch of a conditional then they should be used in both branches. I personally don't care much about this statement but I think we should leave it as is. Otherwise some day someone wants to change it back according to the coding style. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups 2010-03-31 12:38 ` [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Sascha Hauer @ 2010-03-31 13:02 ` Daniel Mack 2010-03-31 13:35 ` [PATCH] " Daniel Mack 1 sibling, 0 replies; 13+ messages in thread From: Daniel Mack @ 2010-03-31 13:02 UTC (permalink / raw) To: linux-arm-kernel On Wed, Mar 31, 2010 at 02:38:56PM +0200, Sascha Hauer wrote: > On Tue, Mar 30, 2010 at 08:31:59PM +0200, Daniel Mack wrote: > > + dev_err(mmc_dev(host->mmc), > > + "%s: read -ETIMEDOUT\n", __func__); > > data->error = -ETIMEDOUT; > > } else { > > + dev_err(mmc_dev(host->mmc), "%s: -EIO\n", __func__); > > Do we really want to have these messages with dev_err? In the subject > you are talking about debug output. This _is_ definitely an error if get there, so I'll rather change the commit message ;) > > > data->error = -EIO; > > } > > - } else { > > + } else > > data->bytes_xfered = host->datasize; > > - } > > Documentation/CodingStyle says that if braces are used in one branch of > a conditional then they should be used in both branches. > I personally don't care much about this statement but I think we should > leave it as is. Otherwise some day someone wants to change it back > according to the coding style. Ok, true. I'll fix this (and the commit message) and resend. Thanks, Daniel ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] ARM: MXC: mxcmmc: misc cleanups 2010-03-31 12:38 ` [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Sascha Hauer 2010-03-31 13:02 ` Daniel Mack @ 2010-03-31 13:35 ` Daniel Mack 1 sibling, 0 replies; 13+ messages in thread From: Daniel Mack @ 2010-03-31 13:35 UTC (permalink / raw) To: linux-arm-kernel Be more verbose on error messages and add one debug message. Signed-off-by: Daniel Mack <daniel@caiaq.de> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Volker Ernst <volker.ernst@txtr.com> Cc: Jiri Kosina <jkosina@suse.cz> --- drivers/mmc/host/mxcmmc.c | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 2df9041..44a53ee 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -151,6 +151,8 @@ static void mxcmci_softreset(struct mxcmci_host *host) { int i; + dev_dbg(mmc_dev(host->mmc), "mxcmci_softreset\n"); + /* reset sequence */ writew(STR_STP_CLK_RESET, host->base + MMC_REG_STR_STP_CLK); writew(STR_STP_CLK_RESET | STR_STP_CLK_START_CLK, @@ -290,16 +292,25 @@ static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat) dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n", stat); if (stat & STATUS_CRC_READ_ERR) { + dev_err(mmc_dev(host->mmc), "%s: -EILSEQ\n", __func__); data->error = -EILSEQ; } else if (stat & STATUS_CRC_WRITE_ERR) { u32 err_code = (stat >> 9) & 0x3; - if (err_code == 2) /* No CRC response */ + if (err_code == 2) { /* No CRC response */ + dev_err(mmc_dev(host->mmc), + "%s: No CRC -ETIMEDOUT\n", __func__); data->error = -ETIMEDOUT; - else + } else { + dev_err(mmc_dev(host->mmc), + "%s: -EILSEQ\n", __func__); data->error = -EILSEQ; + } } else if (stat & STATUS_TIME_OUT_READ) { + dev_err(mmc_dev(host->mmc), + "%s: read -ETIMEDOUT\n", __func__); data->error = -ETIMEDOUT; } else { + dev_err(mmc_dev(host->mmc), "%s: -EIO\n", __func__); data->error = -EIO; } } else { @@ -433,8 +444,6 @@ static int mxcmci_transfer_data(struct mxcmci_host *host) struct scatterlist *sg; int stat, i; - host->datasize = 0; - host->data = data; host->datasize = 0; -- 1.7.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups 2010-03-30 18:31 [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Daniel Mack ` (2 preceding siblings ...) 2010-03-31 12:38 ` [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Sascha Hauer @ 2010-03-31 13:17 ` Julien Boibessot 3 siblings, 0 replies; 13+ messages in thread From: Julien Boibessot @ 2010-03-31 13:17 UTC (permalink / raw) To: linux-arm-kernel Hi Daniel, Daniel Mack a ?crit : > Add some more debug information and fix a couple of coding style things > in mxcmmc.c. > > ... > > @@ -512,7 +518,7 @@ static void mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat) > } > > /* For the DMA case the DMA engine handles the data transfer > - * automatically. For non DMA we have to do it ourselves. > + * automatically. For non DMA we have to to it ourselves. > I think you introduced a typo here ("to to")... Regards, Julien ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2010-04-01 8:02 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-03-30 18:31 [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Daniel Mack 2010-03-30 18:32 ` [PATCH 2/3] ARM: MXC: mxcmmc: Teach the driver SDIO operations Daniel Mack 2010-03-31 13:03 ` Sascha Hauer 2010-03-31 13:29 ` Daniel Mack 2010-03-31 16:41 ` Michał Mirosław 2010-03-31 17:04 ` [PATCH] " Daniel Mack 2010-03-31 17:34 ` Michał Mirosław 2010-04-01 8:02 ` Daniel Mack 2010-03-30 18:32 ` [PATCH 3/3] ARM: MXC: mxcmmc: work around a bug in the SDHC busy line handling Daniel Mack 2010-03-31 12:38 ` [PATCH 1/3] ARM: MXC: mxcmmc: misc cleanups Sascha Hauer 2010-03-31 13:02 ` Daniel Mack 2010-03-31 13:35 ` [PATCH] " Daniel Mack 2010-03-31 13:17 ` [PATCH 1/3] " Julien Boibessot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).