linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Daniel Willmann <daniel@totalueberwachung.de>
Cc: Chris Ball <chris@printf.net>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	Shawn Guo <shawn.guo@linaro.org>
Subject: Re: [PATCH] mmc: mxs: fix card detection function for broken card detect
Date: Mon, 28 Apr 2014 11:13:41 +0200	[thread overview]
Message-ID: <20140428091341.GA5918@pengutronix.de> (raw)
In-Reply-To: <dec3cef26b7470cabfc11a83750a88db5b545a41.1397944151.git.daniel@totalueberwachung.de>

On Sat, Apr 19, 2014 at 11:59:18PM +0200, Daniel Willmann wrote:
> Return -ENOSYS in get_cd if broken-cd is specified in the device tree.
> 
> Commit a91fe279ae75 (mmc: mxs: use standard flag for broken card
> detection) sets MMC_CAP_NEEDS_POLL when broken-cd is specified. This
> driver sets this flag unconditionally as it does not support a card
> detect interrupt. Instead, broken-cd means that there is no card detect
> signal connected.
> 
> The mmc core checks the get_cd function return value to determine if a
> card is present. Only for a non-zero return value it will attempt to
> initialize the card. So retuning -ENOSYS will allow the card to be
> initialized.
> For comparison, mmc_gpio_get_cd in slot-gpio.c also returns -ENOSYS if
> the card detect GPIO is not valid.

Short answer for fixing this regression:

Acked-by: Sascha Hauer <s.hauer@pengutronix.de>

Long answer:

This is broken in the MMC OF parser. When the parser finds the
'broken-cd' property it just sets the MMC_CAP_NEEDS_POLL flag. This is
wrong.  broken-cd means that we cannot rely on any card detection, but
instead have to talk to the card to find out if it's available.
Currently there is no flag to signal this situation, so the host driver
has to handle this by returning true in the get_cd callback, just like
the patch below does.

IMO the correct solution would be to add a MMC_CAP_CD_NEEDS_TALK_TO_CARD
flag to the core.

Sascha

> 
> Signed-off-by: Daniel Willmann <daniel@totalueberwachung.de>
> ---
> This might be relevant for stable kernels. The patch was tested with 3.14.1 on
> olinuxino nano.
> 
>  drivers/mmc/host/mxs-mmc.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
> index 073e871a0fc8..babfea03ba8a 100644
> --- a/drivers/mmc/host/mxs-mmc.c
> +++ b/drivers/mmc/host/mxs-mmc.c
> @@ -70,6 +70,7 @@ struct mxs_mmc_host {
>  	unsigned char			bus_width;
>  	spinlock_t			lock;
>  	int				sdio_irq_en;
> +	bool				broken_cd;
>  };
>  
>  static int mxs_mmc_get_cd(struct mmc_host *mmc)
> @@ -78,6 +79,9 @@ static int mxs_mmc_get_cd(struct mmc_host *mmc)
>  	struct mxs_ssp *ssp = &host->ssp;
>  	int present, ret;
>  
> +	if (host->broken_cd)
> +		return -ENOSYS;
> +
>  	ret = mmc_gpio_get_cd(mmc);
>  	if (ret >= 0)
>  		return ret;
> @@ -568,6 +572,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
>  {
>  	const struct of_device_id *of_id =
>  			of_match_device(mxs_mmc_dt_ids, &pdev->dev);
> +	struct device_node *np = pdev->dev.of_node;
>  	struct mxs_mmc_host *host;
>  	struct mmc_host *mmc;
>  	struct resource *iores;
> @@ -634,6 +639,8 @@ static int mxs_mmc_probe(struct platform_device *pdev)
>  	mmc->caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED |
>  		    MMC_CAP_SDIO_IRQ | MMC_CAP_NEEDS_POLL;
>  
> +	host->broken_cd = of_property_read_bool(np, "broken-cd");
> +
>  	mmc->f_min = 400000;
>  	mmc->f_max = 288000000;
>  
> -- 
> 1.8.4.2
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

  reply	other threads:[~2014-04-28  9:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-19 21:59 [PATCH] mmc: mxs: fix card detection function for broken card detect Daniel Willmann
2014-04-28  9:13 ` Sascha Hauer [this message]
2014-04-28  9:31   ` Ulf Hansson
2014-04-28  9:36     ` Sascha Hauer
2014-05-05  9:14       ` 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=20140428091341.GA5918@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=chris@printf.net \
    --cc=daniel@totalueberwachung.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=shawn.guo@linaro.org \
    --cc=ulf.hansson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).