All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Hogan <james.hogan@imgtec.com>
To: Jaehoon Chung <jh80.chung@samsung.com>
Cc: Yuvaraj Kumar <yuvaraj.cd@gmail.com>,
	linux-mmc <linux-mmc@vger.kernel.org>,
	linux-samsung-soc@vger.kernel.org,
	"Chris Ball (laptop.org)" <cjb@laptop.org>,
	Will <will.newton@imgtec.com>,
	kgene.kim@samsung.com,
	"Girish K S (Linaro)" <girish.shivananjappa@linaro.org>,
	"Thomas Abraham (Linaro)" <thomas.abraham@linaro.org>,
	patches@linaro.org, Yuvaraj CD <yuvaraj.cd@samsung.com>,
	Seungwon Jeon <tgih.jun@samsung.com>
Subject: Re: [PATCH] mmc: dw_mmc: enable controller interrupt before calling mmc_start_host
Date: Fri, 23 Nov 2012 13:21:20 +0000	[thread overview]
Message-ID: <50AF7850.3020203@imgtec.com> (raw)
In-Reply-To: <50AC489C.7070002@samsung.com>

Hi,

I looked at the clock thing, and it appears that there's an extra divide
by two in hardware (the TRM says "Clock division is 2*n"), so those
numbers do appear to be correct.

>From some experimentation the other day, it appeared to be a race
condition which is affected by the position of the dev_info (I have a
JTAG console enabled which adds multi-millisecond delays every time
something is printed). So I think the race was always there, but is only
now showing up.

More information:
* it usually alternates between working and not working (works on first
boot), I'm just hard resetting rather than shutting down cleanly.
* unplugging the SD card between boots prevents it going wrong (I don't
believe our board has power control over SD card).
* using old kernel first and then new kernel, failure can still happen,
so the card could always get into the funny state, but it's only now
causing problems.
* forcing a GPIO bitbanging reset on probe to unlock the card stops it
failing (usually this sequence is only initiated if the card is locked
up - i.e. busy. It's our own quirk to the driver).

I'll have another look at it sometime and report back if I find the root
cause.

Thanks
James


On 21/11/12 03:21, Jaehoon Chung wrote:
> Hi All,
> 
> Well, i didn't find the James's error message.
> But i confused about the clock value.
> 
> Bus speed : 99840000Hz
> request   : 200000Hz
> Div : 250
> 
> If bus_speed is divided with div, then actual value should be 399360Hz.
> But this log is produced 199680Hz. What's wrong?
> 
> I think this message can be confused to debug.
> 
> Best Regards,
> Jaehoon Chung
> 
> On 11/20/2012 06:39 PM, James Hogan wrote:
>> Hi Yuvaraj,
>>
>> On 20/11/12 05:35, Yuvaraj Kumar wrote:
>>> Its not sufficient.In my case, sdio_reset command was submitted to
>>> dw_mmc controller before interrupts are enabled.
>>> By looking at your log,it seems something wrong with frequency set by
>>> your U-boot.
>>
>> I'm not using U-boot, I'm booting with JTAG. In any case it works if I
>> revert your patch so I think the clocks are fine. I'll continue
>> debugging it and see if I can figure out what's happening.
>>
>> Cheers
>> James
>>
>>>
>>> Best Regards
>>> Yuvaraj
>>>
>>> On Mon, Nov 19, 2012 at 6:50 PM, James Hogan <james.hogan@imgtec.com> wrote:
>>>> On 19/11/12 13:01, Yuvaraj CD wrote:
>>>>> As mmc_start_host is getting called before enabling the dw_mmc controller
>>>>> interrupt, there is a problem of missing the SDMMC_INT_CMD_DONE for the
>>>>> very first command sent by the sdio_reset.
>>>>> This problem occurs only when we disable MMC debugging i.e, MMC_DEBUG [=n].
>>>>> Hence this patch enables the dw_mmc controller interrupt before mmc_start_host.
>>>>>
>>>>> Signed-off-by: Yuvaraj CD <yuvaraj.cd@samsung.com>
>>>>
>>>> Hi Yuvaraj,
>>>>
>>>> I get the following errors after this patch is applied
>>>> (2da1d7f2948900cd50d38643db39f790edb3cc96, merged in v3.7-rc5) and the
>>>> driver doesn't work as a result. Reverting it fixes the problem.
>>>>
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 300000Hz, actual 298922HZ div = 167)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 200000Hz, actual 199680HZ div = 250)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 195765Hz, actual 195764HZ div = 255)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 400000Hz, actual 399360HZ div = 125)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 300000Hz, actual 298922HZ div = 167)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 200000Hz, actual 199680HZ div = 250)
>>>> mmc0: error -110 whilst initialising SD card
>>>> mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 195765Hz, actual 195764HZ div = 255)
>>>> mmc0: error -110 whilst initialising SD card
>>>>
>>>> The interrupts are already cleared and disabled at the beginning of the
>>>> probe function, so is the following sufficient (after reverting your
>>>> patch) to fix the problem you've been observing?
>>>>
>>>> Thanks
>>>> James
>>>>
>>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>>> index ec9b5a8..2be9899 100644
>>>> --- a/drivers/mmc/host/dw_mmc.c
>>>> +++ b/drivers/mmc/host/dw_mmc.c
>>>> @@ -2266,7 +2266,6 @@ int dw_mci_probe(struct dw_mci *host)
>>>>          * Enable interrupts for command done, data over, data empty, card det,
>>>>          * receive ready and error such as transmit, receive timeout, crc error
>>>>          */
>>>> -       mci_writel(host, RINTSTS, 0xFFFFFFFF);
>>>>         mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER |
>>>>                    SDMMC_INT_TXDR | SDMMC_INT_RXDR |
>>>>                    DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
>>>>
>>>>
>>>>> ---
>>>>>  drivers/mmc/host/dw_mmc.c |   29 +++++++++++++++--------------
>>>>>  1 file changed, 15 insertions(+), 14 deletions(-)
>>>>>
>>>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>>>> index a23af77..729c031 100644
>>>>> --- a/drivers/mmc/host/dw_mmc.c
>>>>> +++ b/drivers/mmc/host/dw_mmc.c
>>>>> @@ -2233,6 +2233,21 @@ int dw_mci_probe(struct dw_mci *host)
>>>>>         else
>>>>>                 host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1;
>>>>>
>>>>> +       /*
>>>>> +        * Enable interrupts for command done, data over, data empty, card det,
>>>>> +        * receive ready and error such as transmit, receive timeout, crc error
>>>>> +        */
>>>>> +       mci_writel(host, RINTSTS, 0xFFFFFFFF);
>>>>> +       mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER |
>>>>> +                  SDMMC_INT_TXDR | SDMMC_INT_RXDR |
>>>>> +                  DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
>>>>> +       mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci
>>>>> interrupt */
>>>>> +
>>>>> +       dev_info(host->dev, "DW MMC controller at irq %d, "
>>>>> +                "%d bit host data width, "
>>>>> +                "%u deep fifo\n",
>>>>> +                host->irq, width, fifo_size);
>>>>> +
>>>>>         /* We need at least one slot to succeed */
>>>>>         for (i = 0; i < host->num_slots; i++) {
>>>>>                 ret = dw_mci_init_slot(host, i);
>>>>> @@ -2262,20 +2277,6 @@ int dw_mci_probe(struct dw_mci *host)
>>>>>         else
>>>>>                 host->data_offset = DATA_240A_OFFSET;
>>>>>
>>>>> -       /*
>>>>> -        * Enable interrupts for command done, data over, data empty, card det,
>>>>> -        * receive ready and error such as transmit, receive timeout, crc error
>>>>> -        */
>>>>> -       mci_writel(host, RINTSTS, 0xFFFFFFFF);
>>>>> -       mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER |
>>>>> -                  SDMMC_INT_TXDR | SDMMC_INT_RXDR |
>>>>> -                  DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
>>>>> -       mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci
>>>>> interrupt */
>>>>> -
>>>>> -       dev_info(host->dev, "DW MMC controller at irq %d, "
>>>>> -                "%d bit host data width, "
>>>>> -                "%u deep fifo\n",
>>>>> -                host->irq, width, fifo_size);
>>>>>         if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO)
>>>>>                 dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n");
>>>>>
>>>>> --
>>>>> 1.7.9.5
>>>>>
>>>>> --
>>>>> 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
>>>>>
>>>>>
>>>>> --
>>>>> James Hogan
>>>>>
>>>>
>>
>>
> 


      reply	other threads:[~2012-11-23 13:21 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-08  8:59 [PATCH] mmc: dw_mmc: enable controller interrupt before calling mmc_start_host Yuvaraj CD
2012-10-08 12:55 ` Girish K S
2012-10-08 12:58 ` Will Newton
2012-10-23 21:19 ` Chris Ball
2012-10-25 10:09   ` Yuvaraj CD
2012-10-25 12:43     ` Chris Ball
     [not found] ` <CAAG0J9_ngZm7uGopaW6rdBUDQZhQWqt6gd=y1i5BifsGrZg-hg@mail.gmail.com>
2012-11-19 13:20   ` James Hogan
2012-11-20  5:35     ` Yuvaraj Kumar
2012-11-20  9:39       ` James Hogan
2012-11-21  3:21         ` Jaehoon Chung
2012-11-23 13:21           ` James Hogan [this message]

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=50AF7850.3020203@imgtec.com \
    --to=james.hogan@imgtec.com \
    --cc=cjb@laptop.org \
    --cc=girish.shivananjappa@linaro.org \
    --cc=jh80.chung@samsung.com \
    --cc=kgene.kim@samsung.com \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=patches@linaro.org \
    --cc=tgih.jun@samsung.com \
    --cc=thomas.abraham@linaro.org \
    --cc=will.newton@imgtec.com \
    --cc=yuvaraj.cd@gmail.com \
    --cc=yuvaraj.cd@samsung.com \
    /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.