Message ID | 20121107214603.GA74000@crg |
---|---|
State | RFC |
Delegated to: | Andy Fleming |
Headers | show |
Hi Rommel, Looks good to me. Thank you. Acked-by: Jaehoon Chung <jh80.chung@samsung.com> On 11/08/2012 06:46 AM, Rommel G Custodio wrote: > modification for commit 804c7f422169212e92530e1ddaf74bf1ca9ebfa1 > > The original patch contained a bug. > Using a char with sdhci_readl/sdhci_writel operation. > The adjacent bytes to SDHCI_HOST_CONTROL (specially SDHCI_POWER_CONTROL) > get mangled and can result in the controller entering an unstable state. > > This patch also moves the process inside sdhci_init(). > > Signed-off-by: Rommel G Custodio <sessyargc@gmail.com> > --- > drivers/mmc/sdhci.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c > index 7845f87..fae2169 100644 > --- a/drivers/mmc/sdhci.c > +++ b/drivers/mmc/sdhci.c > @@ -82,13 +82,6 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data, > unsigned int start_addr) > { > unsigned int stat, rdy, mask, timeout, block = 0; > -#ifdef CONFIG_MMC_SDMA > - unsigned char ctrl; > - ctrl = sdhci_readl(host, SDHCI_HOST_CONTROL); > - ctrl &= ~SDHCI_CTRL_DMA_MASK; > - ctrl |= SDHCI_CTRL_SDMA; > - sdhci_writel(host, ctrl, SDHCI_HOST_CONTROL); > -#endif > > timeout = 1000000; > rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL; > @@ -386,6 +379,14 @@ int sdhci_init(struct mmc *mmc) > { > struct sdhci_host *host = (struct sdhci_host *)mmc->priv; > > +#ifdef CONFIG_MMC_SDMA > + unsigned int ctrl; > + ctrl = sdhci_readl(host, SDHCI_HOST_CONTROL); > + ctrl &= ~SDHCI_CTRL_DMA_MASK; > + ctrl |= SDHCI_CTRL_SDMA; > + sdhci_writel(host, ctrl, SDHCI_HOST_CONTROL); > +#endif > + > if ((host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR) && !aligned_buffer) { > aligned_buffer = memalign(8, 512*1024); > if (!aligned_buffer) { >
diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 7845f87..fae2169 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -82,13 +82,6 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data, unsigned int start_addr) { unsigned int stat, rdy, mask, timeout, block = 0; -#ifdef CONFIG_MMC_SDMA - unsigned char ctrl; - ctrl = sdhci_readl(host, SDHCI_HOST_CONTROL); - ctrl &= ~SDHCI_CTRL_DMA_MASK; - ctrl |= SDHCI_CTRL_SDMA; - sdhci_writel(host, ctrl, SDHCI_HOST_CONTROL); -#endif timeout = 1000000; rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL; @@ -386,6 +379,14 @@ int sdhci_init(struct mmc *mmc) { struct sdhci_host *host = (struct sdhci_host *)mmc->priv; +#ifdef CONFIG_MMC_SDMA + unsigned int ctrl; + ctrl = sdhci_readl(host, SDHCI_HOST_CONTROL); + ctrl &= ~SDHCI_CTRL_DMA_MASK; + ctrl |= SDHCI_CTRL_SDMA; + sdhci_writel(host, ctrl, SDHCI_HOST_CONTROL); +#endif + if ((host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR) && !aligned_buffer) { aligned_buffer = memalign(8, 512*1024); if (!aligned_buffer) {
modification for commit 804c7f422169212e92530e1ddaf74bf1ca9ebfa1 The original patch contained a bug. Using a char with sdhci_readl/sdhci_writel operation. The adjacent bytes to SDHCI_HOST_CONTROL (specially SDHCI_POWER_CONTROL) get mangled and can result in the controller entering an unstable state. This patch also moves the process inside sdhci_init(). Signed-off-by: Rommel G Custodio <sessyargc@gmail.com> --- drivers/mmc/sdhci.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)