On 02/28/2012 02:32 PM, Dongjin Kim wrote:

> Hello,
> 
> I encountered the problem that my hardware is frozen while switching clock 
> from 
> 400kHz to others. This is caused that hardware locked error was triggered 
> when 
> CMD register was written and interrupt was pended. Tested IP version is 2.10a
> 

Hi Dongjin.

It seems like this problem. Can you check this patch?
http://www.spinics.net/lists/linux-mmc/msg09895.html

Best Regards,
Jaehoon Chung

> Cheers,
> Dongjin.
> 
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 2f7f5ee..05ccee8 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -520,15 +520,33 @@ static void mci_send_cmd(struct dw_mci_slot *slot, u32 
> cmd, u32 arg)
>       struct dw_mci *host = slot->host;
>       unsigned long timeout = jiffies + msecs_to_jiffies(500);
>       unsigned int cmd_status = 0;
> +     u32 ctrl;
>  
> +resend:
>       mci_writel(host, CMDARG, arg);
>       wmb();
>       mci_writel(host, CMD, SDMMC_CMD_START | cmd);
> +
>       while (time_before(jiffies, timeout)) {
>               cmd_status = mci_readl(host, CMD);
>               if (!(cmd_status & SDMMC_CMD_START))
>                       return;
> +
> +             if (host->cmd_status & SDMMC_INT_HLE) {
> +                     dev_err(&slot->mmc->class_dev,
> +                             "Hardware locked error (cmd %#x arg %#x)\n",
> +                             cmd, arg);
> +
> +                     ctrl = mci_readl(host, CTRL);
> +                     ctrl |= SDMMC_CTRL_RESET;
> +                     mci_writel(host, CTRL, ctrl);
> +
> +                     host->cmd_status &= ~SDMMC_INT_HLE;
> +
> +                     goto resend;
> +             }
>       }
> +
>       dev_err(&slot->mmc->class_dev,
>               "Timeout sending command (cmd %#x arg %#x status %#x)\n",
>               cmd, arg, cmd_status);
> @@ -1429,6 +1447,12 @@ static irqreturn_t dw_mci_interrupt(int irq, void 
> *dev_id)
>               if (!pending)
>                       break;
>  
> +             if (pending & SDMMC_INT_HLE) {
> +                     mci_writel(host, RINTSTS, SDMMC_INT_HLE);
> +                     host->cmd_status = status;
> +                     smp_wmb();
> +             }
> +
>               if (pending & DW_MCI_CMD_ERROR_FLAGS) {
>                       mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS);
>                       host->cmd_status = status;
> 
> --
> 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
> 


--
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