From: Jaehoon Chung <jh80.chung@samsung.com>
To: Sonny Rao <sonnyrao@chromium.org>,
Jaehoon Chung <jh80.chung@samsung.com>
Cc: Yuvaraj Kumar <yuvaraj.cd@gmail.com>,
Grant Grundler <grundler@chromium.org>,
"linux-samsung-soc@vger.kernel.org"
<linux-samsung-soc@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Chris Ball <cjb@laptop.org>, Seungwon Jeon <tgih.jun@samsung.com>,
linux-mmc <linux-mmc@vger.kernel.org>,
"kgene.kim@samsung.com" <kgene.kim@samsung.com>,
sunil joshi <joshi@samsung.com>, Tomasz Figa <t.figa@samsung.com>,
Yuvaraj Kumar C D <yuvaraj.cd@samsung.org>
Subject: Re: [PATCH] mmc: dw_mmc: change to use recommended reset procedure
Date: Fri, 09 May 2014 13:27:54 +0900 [thread overview]
Message-ID: <536C594A.5080107@samsung.com> (raw)
In-Reply-To: <CAPz6YkXGH96mjeePwUSRmPX4Y1YXYif+N+BRKsTwtNxtRq3xoQ@mail.gmail.com>
Hi, Sonny.
I have checked the Synopsys TRM..
On 05/09/2014 10:34 AM, Sonny Rao wrote:
> On Thu, May 8, 2014 at 6:15 PM, Jaehoon Chung <jh80.chung@samsung.com> wrote:
>> On 05/08/2014 06:40 PM, Yuvaraj Kumar wrote:
>>> Any comments on this patch?
>>>
>>> On Wed, Mar 26, 2014 at 5:16 PM, Yuvaraj Kumar C D <yuvaraj.cd@gmail.com> wrote:
>>>> From: Sonny Rao <sonnyrao@chromium.org>
>>>>
>>>> This patch changes the fifo reset code to follow the reset procedure
>>>> outlined in the documentation of Synopsys Mobile storage host databook
>>>> 7.2.13.
>>>> Without this patch, we could able to see eMMC was not detected after
>>>> multiple reboots due to driver hangs while eMMC tuning for HS200.
>>>>
>>>> Signed-off-by: Sonny Rao <sonnyrao@chromium.org>
>>>> Signed-off-by: Yuvaraj Kumar C D <yuvaraj.cd@samsung.org>
>>>> ---
>>>> drivers/mmc/host/dw_mmc.c | 48 ++++++++++++++++++++++++++++++++++++++++++++-
>>>> drivers/mmc/host/dw_mmc.h | 1 +
>>>> 2 files changed, 48 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>>> index 32dd81d..1d77431 100644
>>>> --- a/drivers/mmc/host/dw_mmc.c
>>>> +++ b/drivers/mmc/host/dw_mmc.c
>>>> @@ -2220,7 +2220,53 @@ static inline bool dw_mci_fifo_reset(struct dw_mci *host)
>>>> host->sg = NULL;
>>>> }
>>>>
>>>> - return dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET);
>>>> + /*
>>>> + * The recommended method for resetting is to always reset the
>>>> + * controller and the fifo, but differs slightly depending on the mode.
>>>> + * Note that this doesn't handle the "generic DMA" (not IDMAC) case.
>>>> + */
>>
>> "not IDMAC" is confused..
>>
>
> The documentation describes three different possible modes. There's a
> mode that doesn't use IDMAC but still does DMA. But as far as I can
> tell this driver doesn't support that way. We can just remove that
> wording if it's confusing.
>
>>>> + if (dw_mci_ctrl_reset(host, SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET)) {
>>>> + unsigned long timeout = jiffies + msecs_to_jiffies(500);
>>>> + u32 status, rint;
>>>> +
>>>> + /* if using dma we wait for dma_req to clear */
>>>> + if (host->using_dma) {
>>>> + do {
>>>> + status = mci_readl(host, STATUS);
>>>> + if (!(status & SDMMC_STATUS_DMA_REQ))
>>>> + break;
>>>> + cpu_relax();
>>>> + } while (time_before(jiffies, timeout));
>>>> +
>>>> + if (status & SDMMC_STATUS_DMA_REQ)
>>>> + dev_err(host->dev,
>>>> + "%s: Timeout waiting for dma_req to "
>>>> + "clear during reset", __func__);
>>>> +
>>>> + /* when using DMA next we reset the fifo again */
>>>> + dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET);
>>>> + }
>>>> + /*
>>>> + * In all cases we clear the RAWINTS register to clear any
>>>> + * interrupts.
>>>> + */
>>>> + rint = mci_readl(host, RINTSTS);
>>>> + rint = rint & (~mci_readl(host, MINTSTS));
you use the "status or temp" instead of rint. (you can reuse the variable.)
And can use "status &= ~mci_readl(host,MINTSTS);"
>>
>> Just clear the RINTSTS register? why do you add these?
>>
>
> This will look at what is not masked, and only clear those bits.
Well, i known if clear the RINTSTS register,
recommended to use "0xfffffff" and set the value for interrupt.
>
>>>> + if (rint)
>>>> + mci_writel(host, RINTSTS, rint);
>>>> +
>>>> + } else
>>>> + dev_err(host->dev, "%s: Reset bits didn't clear", __func__);
>>
>> Just display the error log? I didn't understand this.
>> If you displayed the error log, then it needs to return the error value.
>>
>>>> +
>>>> + #ifdef CONFIG_MMC_DW_IDMAC
>>>> + /* It is also recommended that we reset and reprogram idmac */
>>>> + dw_mci_idmac_reset(host);
>>>> + #endif
>>>> +
>>>> + /* After a CTRL reset we need to have CIU set clock registers */
>>>> + mci_send_cmd(host->cur_slot, SDMMC_CMD_UPD_CLK, 0);
Well, why do you send the clock update command?
I didn't see that update the value related with clock.
Best Regards,
Jaehoon Chung
>>>> +
>>>> + return true;
>>>> }
>>>>
>>>> static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host)
>>>> diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h
>>>> index 738fa24..037e47a 100644
>>>> --- a/drivers/mmc/host/dw_mmc.h
>>>> +++ b/drivers/mmc/host/dw_mmc.h
>>>> @@ -129,6 +129,7 @@
>>>> #define SDMMC_CMD_INDX(n) ((n) & 0x1F)
>>>> /* Status register defines */
>>>> #define SDMMC_GET_FCNT(x) (((x)>>17) & 0x1FFF)
>>>> +#define SDMMC_STATUS_DMA_REQ BIT(31)
>>>> /* FIFOTH register defines */
>>>> #define SDMMC_SET_FIFOTH(m, r, t) (((m) & 0x7) << 28 | \
>>>> ((r) & 0xFFF) << 16 | \
>>>> --
>>>> 1.7.10.4
>>>>
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
WARNING: multiple messages have this Message-ID (diff)
From: jh80.chung@samsung.com (Jaehoon Chung)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] mmc: dw_mmc: change to use recommended reset procedure
Date: Fri, 09 May 2014 13:27:54 +0900 [thread overview]
Message-ID: <536C594A.5080107@samsung.com> (raw)
In-Reply-To: <CAPz6YkXGH96mjeePwUSRmPX4Y1YXYif+N+BRKsTwtNxtRq3xoQ@mail.gmail.com>
Hi, Sonny.
I have checked the Synopsys TRM..
On 05/09/2014 10:34 AM, Sonny Rao wrote:
> On Thu, May 8, 2014 at 6:15 PM, Jaehoon Chung <jh80.chung@samsung.com> wrote:
>> On 05/08/2014 06:40 PM, Yuvaraj Kumar wrote:
>>> Any comments on this patch?
>>>
>>> On Wed, Mar 26, 2014 at 5:16 PM, Yuvaraj Kumar C D <yuvaraj.cd@gmail.com> wrote:
>>>> From: Sonny Rao <sonnyrao@chromium.org>
>>>>
>>>> This patch changes the fifo reset code to follow the reset procedure
>>>> outlined in the documentation of Synopsys Mobile storage host databook
>>>> 7.2.13.
>>>> Without this patch, we could able to see eMMC was not detected after
>>>> multiple reboots due to driver hangs while eMMC tuning for HS200.
>>>>
>>>> Signed-off-by: Sonny Rao <sonnyrao@chromium.org>
>>>> Signed-off-by: Yuvaraj Kumar C D <yuvaraj.cd@samsung.org>
>>>> ---
>>>> drivers/mmc/host/dw_mmc.c | 48 ++++++++++++++++++++++++++++++++++++++++++++-
>>>> drivers/mmc/host/dw_mmc.h | 1 +
>>>> 2 files changed, 48 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>>> index 32dd81d..1d77431 100644
>>>> --- a/drivers/mmc/host/dw_mmc.c
>>>> +++ b/drivers/mmc/host/dw_mmc.c
>>>> @@ -2220,7 +2220,53 @@ static inline bool dw_mci_fifo_reset(struct dw_mci *host)
>>>> host->sg = NULL;
>>>> }
>>>>
>>>> - return dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET);
>>>> + /*
>>>> + * The recommended method for resetting is to always reset the
>>>> + * controller and the fifo, but differs slightly depending on the mode.
>>>> + * Note that this doesn't handle the "generic DMA" (not IDMAC) case.
>>>> + */
>>
>> "not IDMAC" is confused..
>>
>
> The documentation describes three different possible modes. There's a
> mode that doesn't use IDMAC but still does DMA. But as far as I can
> tell this driver doesn't support that way. We can just remove that
> wording if it's confusing.
>
>>>> + if (dw_mci_ctrl_reset(host, SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET)) {
>>>> + unsigned long timeout = jiffies + msecs_to_jiffies(500);
>>>> + u32 status, rint;
>>>> +
>>>> + /* if using dma we wait for dma_req to clear */
>>>> + if (host->using_dma) {
>>>> + do {
>>>> + status = mci_readl(host, STATUS);
>>>> + if (!(status & SDMMC_STATUS_DMA_REQ))
>>>> + break;
>>>> + cpu_relax();
>>>> + } while (time_before(jiffies, timeout));
>>>> +
>>>> + if (status & SDMMC_STATUS_DMA_REQ)
>>>> + dev_err(host->dev,
>>>> + "%s: Timeout waiting for dma_req to "
>>>> + "clear during reset", __func__);
>>>> +
>>>> + /* when using DMA next we reset the fifo again */
>>>> + dw_mci_ctrl_reset(host, SDMMC_CTRL_FIFO_RESET);
>>>> + }
>>>> + /*
>>>> + * In all cases we clear the RAWINTS register to clear any
>>>> + * interrupts.
>>>> + */
>>>> + rint = mci_readl(host, RINTSTS);
>>>> + rint = rint & (~mci_readl(host, MINTSTS));
you use the "status or temp" instead of rint. (you can reuse the variable.)
And can use "status &= ~mci_readl(host,MINTSTS);"
>>
>> Just clear the RINTSTS register? why do you add these?
>>
>
> This will look at what is not masked, and only clear those bits.
Well, i known if clear the RINTSTS register,
recommended to use "0xfffffff" and set the value for interrupt.
>
>>>> + if (rint)
>>>> + mci_writel(host, RINTSTS, rint);
>>>> +
>>>> + } else
>>>> + dev_err(host->dev, "%s: Reset bits didn't clear", __func__);
>>
>> Just display the error log? I didn't understand this.
>> If you displayed the error log, then it needs to return the error value.
>>
>>>> +
>>>> + #ifdef CONFIG_MMC_DW_IDMAC
>>>> + /* It is also recommended that we reset and reprogram idmac */
>>>> + dw_mci_idmac_reset(host);
>>>> + #endif
>>>> +
>>>> + /* After a CTRL reset we need to have CIU set clock registers */
>>>> + mci_send_cmd(host->cur_slot, SDMMC_CMD_UPD_CLK, 0);
Well, why do you send the clock update command?
I didn't see that update the value related with clock.
Best Regards,
Jaehoon Chung
>>>> +
>>>> + return true;
>>>> }
>>>>
>>>> static inline bool dw_mci_ctrl_all_reset(struct dw_mci *host)
>>>> diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h
>>>> index 738fa24..037e47a 100644
>>>> --- a/drivers/mmc/host/dw_mmc.h
>>>> +++ b/drivers/mmc/host/dw_mmc.h
>>>> @@ -129,6 +129,7 @@
>>>> #define SDMMC_CMD_INDX(n) ((n) & 0x1F)
>>>> /* Status register defines */
>>>> #define SDMMC_GET_FCNT(x) (((x)>>17) & 0x1FFF)
>>>> +#define SDMMC_STATUS_DMA_REQ BIT(31)
>>>> /* FIFOTH register defines */
>>>> #define SDMMC_SET_FIFOTH(m, r, t) (((m) & 0x7) << 28 | \
>>>> ((r) & 0xFFF) << 16 | \
>>>> --
>>>> 1.7.10.4
>>>>
>>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2014-05-09 4:27 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-26 11:46 [PATCH] mmc: dw_mmc: change to use recommended reset procedure Yuvaraj Kumar C D
2014-03-26 11:46 ` Yuvaraj Kumar C D
2014-05-08 9:40 ` Yuvaraj Kumar
2014-05-08 9:40 ` Yuvaraj Kumar
2014-05-09 1:15 ` Jaehoon Chung
2014-05-09 1:15 ` Jaehoon Chung
2014-05-09 1:34 ` Sonny Rao
2014-05-09 1:34 ` Sonny Rao
2014-05-09 4:27 ` Jaehoon Chung [this message]
2014-05-09 4:27 ` Jaehoon Chung
2014-05-09 7:32 ` Jaehoon Chung
2014-05-09 7:32 ` Jaehoon Chung
2014-05-10 3:36 ` Sonny Rao
2014-05-10 3:36 ` Sonny Rao
2014-05-10 14:08 ` Seungwon Jeon
2014-05-10 14:08 ` Seungwon Jeon
2014-05-12 21:14 ` Sonny Rao
2014-05-12 21:14 ` Sonny Rao
2014-05-12 21:44 ` Sonny Rao
2014-05-12 21:44 ` Sonny Rao
2014-05-13 0:40 ` Sonny Rao
2014-05-13 0:40 ` Sonny Rao
2014-05-13 10:13 ` James Hogan
2014-05-13 10:13 ` James Hogan
-- strict thread matches above, loose matches on Subject: below --
2014-05-22 18:54 [PATCHv2] " Sonny Rao
2014-05-29 0:35 ` [PATCH] " Sonny Rao
2014-05-29 0:35 ` Sonny Rao
2014-05-29 5:17 ` Jaehoon Chung
2014-05-29 5:17 ` Jaehoon Chung
2014-06-09 21:35 ` Sonny Rao
2014-06-09 21:35 ` Sonny Rao
2014-06-09 22:00 ` Sonny Rao
2014-06-09 22:00 ` Sonny Rao
2014-07-10 12:28 ` Seungwon Jeon
2014-07-10 12:28 ` Seungwon Jeon
2014-07-10 22:35 ` Sonny Rao
2014-07-10 22:35 ` Sonny Rao
2014-07-11 10:20 ` Seungwon Jeon
2014-07-11 10:20 ` Seungwon Jeon
2014-07-11 19:48 ` Sonny Rao
2014-07-11 19:48 ` Sonny Rao
2014-08-04 13:44 linux-next: build failure after merge of the mmc-uh tree Ulf Hansson
2014-08-05 1:19 ` [PATCH] mmc: dw_mmc: change to use recommended reset procedure Sonny Rao
2014-08-05 1:19 ` Sonny Rao
2014-08-07 8:40 ` Jaehoon Chung
2014-08-07 8:40 ` Jaehoon Chung
2014-08-11 7:55 ` Ulf Hansson
2014-08-11 7:55 ` Ulf Hansson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=536C594A.5080107@samsung.com \
--to=jh80.chung@samsung.com \
--cc=cjb@laptop.org \
--cc=grundler@chromium.org \
--cc=joshi@samsung.com \
--cc=kgene.kim@samsung.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=sonnyrao@chromium.org \
--cc=t.figa@samsung.com \
--cc=tgih.jun@samsung.com \
--cc=yuvaraj.cd@gmail.com \
--cc=yuvaraj.cd@samsung.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.