> -----Original Message-----
> From: [email protected] 
> [mailto:[email protected]] On Behalf Of Tanmay Upadhyay
> Sent: Monday, March 18, 2013 2:20 AM
> To: Zhangfei Gao; [email protected]; [email protected]; Qiming Wu; 
> [email protected]
> Cc: [email protected]; [email protected]; 
> [email protected]; Tanmay Upadhyay
> Subject: [PATCH v2 3/4] mmc: sdhci-pxa: Add SDHCI driver for PXA16x
>
> PXA16x devices uses SDHCI controller v1. As it's not much different
> than v2 controller, v1 driver is merged with sdhci-pxav2 driver
>
> v2 - instead of having separate file sdhci-pxav1, merge code with
>      sdhci-pxav2 driver code as suggested by Chris Ball
>
> Signed-off-by: Philip Rakity <[email protected]>
> Signed-off-by: Tanmay Upadhyay <[email protected]>
> ---
>  drivers/mmc/host/Kconfig                |    7 ++++---
>  drivers/mmc/host/sdhci-pxav2.c          |   30 +++++++++++++++++++++++++++++-
>  drivers/mmc/host/sdhci.c                |    3 +++
>  drivers/mmc/host/sdhci.h                |    1 +
>  include/linux/platform_data/pxa_sdhci.h |    2 ++
>  5 files changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
> index e5faed8..875e2475 100644
> --- a/drivers/mmc/host/Kconfig
> +++ b/drivers/mmc/host/Kconfig
> @@ -207,14 +207,15 @@ config MMC_SDHCI_PXAV3
>           If unsure, say N.
>
>  config MMC_SDHCI_PXAV2
> -       tristate "Marvell PXA9XX SD Host Controller support (PXAV2)"
> +       tristate "Marvell PXA16X/PXA9XX SD Host Controller support (PXAV1/V2)"
>         depends on CLKDEV_LOOKUP
>         select MMC_SDHCI
>         select MMC_SDHCI_PLTFM
>         default y if CPU_PXA910
> +       default y if CPU_PXA168
>         help
> -         This selects the Marvell(R) PXAV2 SD Host Controller.
> -         If you have a PXA9XX platform with SD Host Controller
> +         This selects the Marvell(R) PXAV1/V2 SD Host Controller.
> +         If you have a PXA16X or PXA9XX platform with SD Host Controller
>           and a card slot, say Y or M here.
>
>           If unsure, say N.
> diff --git a/drivers/mmc/host/sdhci-pxav2.c b/drivers/mmc/host/sdhci-pxav2.c
> index ac854aa..5af7d46 100644
> --- a/drivers/mmc/host/sdhci-pxav2.c
> +++ b/drivers/mmc/host/sdhci-pxav2.c
> @@ -30,6 +30,7 @@
>  #include <linux/slab.h>
>  #include <linux/of.h>
>  #include <linux/of_device.h>
> +#include <linux/delay.h>
>
>  #include "sdhci.h"
>  #include "sdhci-pltfm.h"
> @@ -75,7 +76,13 @@ static void pxav2_set_private_registers(struct sdhci_host 
> *host, u8 mask)
>                         writew(tmp, host->ioaddr + SD_CLOCK_BURST_SIZE_SETUP);
>                 }
>
> -               if (pdata && (pdata->flags & PXA_FLAG_ENABLE_CLOCK_GATING)) {
> +               if (pdata && pdata->pxav1_controller) {
> +                       /* no clock gating */
> +                       tmp = readw(host->ioaddr + SD_FIFO_PARAM);
> +                       tmp |= DIS_PAD_SD_CLK_GATE;
> +                       writew(tmp, host->ioaddr + SD_FIFO_PARAM);

Why above code needed? And why just disable bit DIS_PAD_SD_CLK_GATE?
Below code when PXA_FLAG_ENABLE_CLOCK_GATING is not set can disable
clock gating.

> +               } else if (pdata && (pdata->flags
> +                               & PXA_FLAG_ENABLE_CLOCK_GATING)) {
>                         tmp = readw(host->ioaddr + SD_FIFO_PARAM);
>                         tmp &= ~CLK_GATE_SETTING_BITS;
>                         writew(tmp, host->ioaddr + SD_FIFO_PARAM);
> @@ -118,6 +125,20 @@ static u32 pxav2_get_max_clock(struct sdhci_host *host)
>         return clk_get_rate(pltfm_host->clk);
>  }
>
> +/*
> + * we cannot talk to controller for 8 bus cycles according to sdio spec
> + * at lowest speed this is 100,000 HZ per cycle or 800,000 cycles
> + * which is quite a LONG TIME on a fast cpu -- so delay if needed
> + */
> +static void platform_specific_completion(struct sdhci_host *host)
> +{
> +       struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc));
> +       struct sdhci_pxa_platdata *pdata = pdev->dev.platform_data;
> +
> +       if (host->clock < 3200000 && pdata && pdata->delay_in_ms)
> +               mdelay(pdata->delay_in_ms);
> +}

Do we need this? Can you point out the spec?
And Why 3200000?
And I think it's better to delay according to host->clock.

> +
>  static struct sdhci_ops pxav2_sdhci_ops = {
>         .get_max_clock = pxav2_get_max_clock,
>         .platform_reset_exit = pxav2_set_private_registers,
> @@ -218,6 +239,13 @@ static int sdhci_pxav2_probe(struct platform_device 
> *pdev)
>                 if (pdata->flags & PXA_FLAG_SD_8_BIT_CAPABLE_SLOT)
>                         host->mmc->caps |= MMC_CAP_8_BIT_DATA;
>
> +               if (pdata->pxav1_controller) {
> +                       host->quirks |= SDHCI_QUIRK_NO_BUSY_IRQ
> +                                       | SDHCI_QUIRK_32BIT_DMA_SIZE;
> +                       pxav2_sdhci_ops.platform_specific_completion
> +                               = platform_specific_completion;
> +               }
> +
>                 if (pdata->quirks)
>                         host->quirks |= pdata->quirks;
>                 if (pdata->host_caps)
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 6f0bfc0..430eabd 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1001,6 +1001,9 @@ static void sdhci_send_command(struct sdhci_host *host, 
> struct mmc_command *cmd)
>                 mdelay(1);
>         }
>
> +       if (host->ops->platform_specific_completion)
> +               host->ops->platform_specific_completion(host);
> +
>         mod_timer(&host->timer, jiffies + 10 * HZ);
>
>         host->cmd = cmd;
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index a6d69b7..ef2efd3 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -282,6 +282,7 @@ struct sdhci_ops {
>         void    (*platform_resume)(struct sdhci_host *host);
>         void    (*adma_workaround)(struct sdhci_host *host, u32 intmask);
>         void    (*platform_init)(struct sdhci_host *host);
> +       void    (*platform_specific_completion)(struct sdhci_host *host);
>  };
>
>  #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
> diff --git a/include/linux/platform_data/pxa_sdhci.h 
> b/include/linux/platform_data/pxa_sdhci.h
> index 27d3156..865a578 100644
> --- a/include/linux/platform_data/pxa_sdhci.h
> +++ b/include/linux/platform_data/pxa_sdhci.h
> @@ -54,6 +54,8 @@ struct sdhci_pxa_platdata {
>         unsigned int    quirks;
>         unsigned int    quirks2;
>         unsigned int    pm_caps;
> +       bool            pxav1_controller;  /* set if pxa168 */
> +       unsigned int    delay_in_ms;
>  };
>
>  struct sdhci_pxa {
> --
> 1.7.9.5
>
> *************************************************************************************************************************************************************
> eInfochips Business Disclaimer : This e-mail message and all attachments 
> transmitted with it are intended solely for the use of the addressee and may 
> contain legally privileged and confidential information. If the reader of 
> this message is not the intended recipient, or an employee or agent 
> responsible for delivering this message to the intended recipient, you are 
> hereby notified that any dissemination, distribution, copying, or other use 
> of this message or its attachments is strictly prohibited. If you have 
> received this message in error, please notify the sender immediately by 
> replying to this message and please delete it from your computer. Any views 
> expressed in this message are those of the individual sender unless otherwise 
> stated. Company has taken enough precautions to prevent the spread of 
> viruses. However the company accepts no liability for any damage caused by 
> any virus transmitted by this email.
> *************************************************************************************************************************************************************
>
>
> ---------------------------------------------------------------------------------------------
> Notice:
> This message has been scanned by Trend Micro Mail Security scanner and is 
> believed to be clean
> ---------------------------------------------------------------------------------------------
>  èº{.nÇ+‰·Ÿ®‰­†+%ŠËlzwm…éb ë§²æìr¸›zX§» ¦r)í…æèw*jg¬±¨ ¶‰šŽŠÝ¢j/ 
> êäz¹Þ–Šà2ŠÞ™¨è­Ú&¢)ß¡«a¶Ú þø ®G« éh® æj:+v‰¨Šwè†Ù¥
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to