On Thursday 06 August 2009, PhaneendraKumar A wrote:
> Observed some issues during  the initialization of SDIO cards. The
> initialization sequence for SDIO card is not according to the SDIO
> specification. Hence the card is not getting initialized during module
> reload with card always present in the slot. This patch fixes the
> issue.

This needs to go to LKML and merge to mainline ... 


> Signed-off-by: [email protected]
> ---
>  drivers/mmc/core/core.c     |    1 +
>  drivers/mmc/core/sdio_ops.c |   22 ++++++++++++++++++++++
>  drivers/mmc/core/sdio_ops.h |    1 +
>  3 files changed, 24 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index d84c880..5ec7e75 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -890,6 +890,7 @@ void mmc_rescan(struct work_struct *work)
>       mmc_claim_host(host);
> 
>       mmc_power_up(host);
> +     mmc_reset_sdio(host);
>       mmc_go_idle(host);
> 
>       mmc_send_if_cond(host, host->ocr_avail);
> diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c
> index 4eb7825..2e77ab8 100644
> --- a/drivers/mmc/core/sdio_ops.c
> +++ b/drivers/mmc/core/sdio_ops.c
> @@ -19,6 +19,28 @@
>  #include "core.h"
>  #include "sdio_ops.h"
> 
> +int mmc_reset_sdio(struct mmc_host *host)
> +{
> +     struct mmc_command cmd;
> +     int err = 0;
> +
> +     BUG_ON(!host);
> +
> +     memset(&cmd, 0, sizeof(struct mmc_command));
> +
> +     cmd.opcode = SD_IO_RW_DIRECT;
> +     cmd.arg = 0x80000000;
> +     cmd.arg |= (SDIO_CCCR_ABORT) << 9;
> +     cmd.arg |= (1<<3);
> +     cmd.flags = MMC_RSP_R5 | MMC_CMD_AC;
> +
> +     err = mmc_wait_for_cmd(host, &cmd, 0);
> +     if (err)
> +             return err;
> +
> +     return 0;
> +}
> +
>  int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
>  {
>       struct mmc_command cmd;
> diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h
> index e2e74b0..2ef70b8 100644
> --- a/drivers/mmc/core/sdio_ops.h
> +++ b/drivers/mmc/core/sdio_ops.h
> @@ -17,6 +17,7 @@ int mmc_io_rw_direct(struct mmc_card *card, int
> write, unsigned fn,
>       unsigned addr, u8 in, u8* out);
>  int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,
>       unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz);
> +int mmc_reset_sdio(struct mmc_host *host);
> 
>  #endif
> 
> -- 
> 1.6.0.4
> 

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to