linux-mmc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] mmc: usdhi6rol0: UHS support
@ 2016-04-20 14:53 Lars Persson
  2016-04-20 14:53 ` [PATCH v3 1/3] mmc: dt: usdhi6rol0: add optional pinctrl binding Lars Persson
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Lars Persson @ 2016-04-20 14:53 UTC (permalink / raw)
  To: linux-mmc, devicetree
  Cc: g.liakhovetski, ulf.hansson, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, Lars Persson

This patch set adds UHS support to the usdhi6rol0 driver, with control of the
regulator and pin state settings.

Changes since v2:
- dt: renamed pins_uhs to state_uhs.
- dt: made default optional in pinctrl-names.
- dt: document that use of state_uhs also requires a default pin state.
- add error handling for missing pin states.

Changes since v1:
- Use mmc_regulator_set_vqmmc().

Lars Persson (3):
  mmc: dt: usdhi6rol0: add optional pinctrl binding
  mmc: usdhi6rol0: add support for UHS modes
  mmc: usdhi6rol0: add pinctrl to set pin drive strength

 .../devicetree/bindings/mmc/usdhi6rol0.txt         |  6 +++
 drivers/mmc/host/usdhi6rol0.c                      | 62 ++++++++++++++++++++++
 2 files changed, 68 insertions(+)

-- 
2.1.4


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v3 1/3] mmc: dt: usdhi6rol0: add optional pinctrl binding
  2016-04-20 14:53 [PATCH v3 0/3] mmc: usdhi6rol0: UHS support Lars Persson
@ 2016-04-20 14:53 ` Lars Persson
  2016-04-20 14:53 ` [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes Lars Persson
  2016-04-20 14:53 ` [PATCH v3 3/3] mmc: usdhi6rol0: add pinctrl to set pin drive strength Lars Persson
  2 siblings, 0 replies; 9+ messages in thread
From: Lars Persson @ 2016-04-20 14:53 UTC (permalink / raw)
  To: linux-mmc, devicetree
  Cc: g.liakhovetski, ulf.hansson, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, Lars Persson

Add a pinctrl binding to specify different pin settings for high speed
modes and UHS modes.

Signed-off-by: Lars Persson <larper@axis.com>
---
 Documentation/devicetree/bindings/mmc/usdhi6rol0.txt | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/mmc/usdhi6rol0.txt b/Documentation/devicetree/bindings/mmc/usdhi6rol0.txt
index 8babdaa..6d1b797 100644
--- a/Documentation/devicetree/bindings/mmc/usdhi6rol0.txt
+++ b/Documentation/devicetree/bindings/mmc/usdhi6rol0.txt
@@ -12,6 +12,12 @@ Optional properties:
 
 - vmmc-supply:	a phandle of a regulator, supplying Vcc to the card
 - vqmmc-supply:	a phandle of a regulator, supplying VccQ to the card
+- pinctrl-names: Can contain a "default" entry and a "state_uhs"
+                 entry. The state_uhs entry is used together with the default
+                 entry when the board requires distinct settings for UHS speeds.
+
+- pinctrl-N: One property for each name listed in pinctrl-names, see
+             ../pinctrl/pinctrl-bindings.txt.
 
 Additionally any standard mmc bindings from mmc.txt can be used.
 
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-20 14:53 [PATCH v3 0/3] mmc: usdhi6rol0: UHS support Lars Persson
  2016-04-20 14:53 ` [PATCH v3 1/3] mmc: dt: usdhi6rol0: add optional pinctrl binding Lars Persson
@ 2016-04-20 14:53 ` Lars Persson
  2016-04-21  7:12   ` Lars Persson
  2016-04-20 14:53 ` [PATCH v3 3/3] mmc: usdhi6rol0: add pinctrl to set pin drive strength Lars Persson
  2 siblings, 1 reply; 9+ messages in thread
From: Lars Persson @ 2016-04-20 14:53 UTC (permalink / raw)
  To: linux-mmc, devicetree
  Cc: g.liakhovetski, ulf.hansson, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, Lars Persson

Add a start_signal_voltage_switch() operation to support enabling of
UHS modes.

Signed-off-by: Lars Persson <larper@axis.com>
---
 drivers/mmc/host/usdhi6rol0.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
index 807c06e..2585ea4 100644
--- a/drivers/mmc/host/usdhi6rol0.c
+++ b/drivers/mmc/host/usdhi6rol0.c
@@ -1147,12 +1147,25 @@ static void usdhi6_enable_sdio_irq(struct mmc_host *mmc, int enable)
 	}
 }
 
+static int usdhi6_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
+{
+	int ret;
+
+	ret = mmc_regulator_set_vqmmc(mmc, ios);
+
+	if (ret < 0)
+		dev_warn(mmc_dev(mmc), "Voltage switch failed: %d\n", ret);
+
+	return ret;
+}
+
 static struct mmc_host_ops usdhi6_ops = {
 	.request	= usdhi6_request,
 	.set_ios	= usdhi6_set_ios,
 	.get_cd		= usdhi6_get_cd,
 	.get_ro		= usdhi6_get_ro,
 	.enable_sdio_irq = usdhi6_enable_sdio_irq,
+	.start_signal_voltage_switch = usdhi6_sig_volt_switch,
 };
 
 /*			State machine handlers				*/
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 3/3] mmc: usdhi6rol0: add pinctrl to set pin drive strength
  2016-04-20 14:53 [PATCH v3 0/3] mmc: usdhi6rol0: UHS support Lars Persson
  2016-04-20 14:53 ` [PATCH v3 1/3] mmc: dt: usdhi6rol0: add optional pinctrl binding Lars Persson
  2016-04-20 14:53 ` [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes Lars Persson
@ 2016-04-20 14:53 ` Lars Persson
  2 siblings, 0 replies; 9+ messages in thread
From: Lars Persson @ 2016-04-20 14:53 UTC (permalink / raw)
  To: linux-mmc, devicetree
  Cc: g.liakhovetski, ulf.hansson, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, Lars Persson

Some boards need different pin drive strength for the UHS mode. Add an
optional pinctrl setting with two pin states covering UHS speeds and
other speeds.

Signed-off-by: Lars Persson <larper@axis.com>
---
 drivers/mmc/host/usdhi6rol0.c | 51 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
index 2585ea4..c4d923b 100644
--- a/drivers/mmc/host/usdhi6rol0.c
+++ b/drivers/mmc/host/usdhi6rol0.c
@@ -22,6 +22,7 @@
 #include <linux/mmc/sdio.h>
 #include <linux/module.h>
 #include <linux/pagemap.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/scatterlist.h>
 #include <linux/string.h>
@@ -198,6 +199,11 @@ struct usdhi6_host {
 	struct dma_chan *chan_rx;
 	struct dma_chan *chan_tx;
 	bool dma_active;
+
+	/* Pin control */
+	struct pinctrl *pinctrl;
+	struct pinctrl_state *pins_default;
+	struct pinctrl_state *pins_uhs;
 };
 
 /*			I/O primitives					*/
@@ -1147,14 +1153,38 @@ static void usdhi6_enable_sdio_irq(struct mmc_host *mmc, int enable)
 	}
 }
 
+static int usdhi6_set_pinstates(struct usdhi6_host *host, int voltage)
+{
+	if (IS_ERR(host->pins_uhs))
+		return 0;
+
+	switch (voltage) {
+	case MMC_SIGNAL_VOLTAGE_180:
+	case MMC_SIGNAL_VOLTAGE_120:
+		return pinctrl_select_state(host->pinctrl,
+					    host->pins_uhs);
+
+	default:
+		return pinctrl_select_state(host->pinctrl,
+					    host->pins_default);
+	}
+}
+
 static int usdhi6_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
 {
 	int ret;
 
 	ret = mmc_regulator_set_vqmmc(mmc, ios);
 
-	if (ret < 0)
+	if (ret < 0) {
 		dev_warn(mmc_dev(mmc), "Voltage switch failed: %d\n", ret);
+		return ret;
+	}
+
+	ret = usdhi6_set_pinstates(mmc_priv(mmc), ios->signal_voltage);
+	if (ret)
+		dev_warn_once(mmc_dev(mmc),
+			      "Failed to set pinstate err=%d\n", ret);
 
 	return ret;
 }
@@ -1743,6 +1773,25 @@ static int usdhi6_probe(struct platform_device *pdev)
 	host->wait	= USDHI6_WAIT_FOR_REQUEST;
 	host->timeout	= msecs_to_jiffies(4000);
 
+	host->pinctrl = devm_pinctrl_get(&pdev->dev);
+	if (IS_ERR(host->pinctrl)) {
+		ret = PTR_ERR(host->pinctrl);
+		goto e_free_mmc;
+	}
+
+	host->pins_uhs = pinctrl_lookup_state(host->pinctrl, "state_uhs");
+	if (!IS_ERR(host->pins_uhs)) {
+		host->pins_default = pinctrl_lookup_state(host->pinctrl,
+							  PINCTRL_STATE_DEFAULT);
+
+		if (IS_ERR(host->pins_default)) {
+			dev_err(dev,
+				"UHS pinctrl requires a default pin state.\n");
+			ret = PTR_ERR(host->pins_default);
+			goto e_free_mmc;
+		}
+	}
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	host->base = devm_ioremap_resource(dev, res);
 	if (IS_ERR(host->base)) {
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-20 14:53 ` [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes Lars Persson
@ 2016-04-21  7:12   ` Lars Persson
  2016-04-21  7:53     ` Arnd Bergmann
  0 siblings, 1 reply; 9+ messages in thread
From: Lars Persson @ 2016-04-21  7:12 UTC (permalink / raw)
  To: Lars Persson, linux-mmc, devicetree
  Cc: g.liakhovetski, ulf.hansson, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak



On 04/20/2016 04:53 PM, Lars Persson wrote:
> Add a start_signal_voltage_switch() operation to support enabling of
> UHS modes.
>
> Signed-off-by: Lars Persson <larper@axis.com>
> ---
>   drivers/mmc/host/usdhi6rol0.c | 13 +++++++++++++
>   1 file changed, 13 insertions(+)
>
> diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
> index 807c06e..2585ea4 100644
> --- a/drivers/mmc/host/usdhi6rol0.c
> +++ b/drivers/mmc/host/usdhi6rol0.c
> @@ -1147,12 +1147,25 @@ static void usdhi6_enable_sdio_irq(struct mmc_host *mmc, int enable)
>   	}
>   }
>
> +static int usdhi6_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
> +{
> +	int ret;
> +

To support boards without regulator we need to put a 
IS_ERR_OR_NULL(mmc->supply.vqmmc) check here and bail out with return 0. 
Missing vqmmc is OK according to our binding document, but treated as an 
error by mmc_regulator_set_vqmmc().


> +	ret = mmc_regulator_set_vqmmc(mmc, ios);
> +
> +	if (ret < 0)
> +		dev_warn(mmc_dev(mmc), "Voltage switch failed: %d\n", ret);
> +
> +	return ret;
> +}
> +
>   static struct mmc_host_ops usdhi6_ops = {
>   	.request	= usdhi6_request,
>   	.set_ios	= usdhi6_set_ios,
>   	.get_cd		= usdhi6_get_cd,
>   	.get_ro		= usdhi6_get_ro,
>   	.enable_sdio_irq = usdhi6_enable_sdio_irq,
> +	.start_signal_voltage_switch = usdhi6_sig_volt_switch,
>   };
>
>   /*			State machine handlers				*/
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-21  7:12   ` Lars Persson
@ 2016-04-21  7:53     ` Arnd Bergmann
  2016-04-21  8:26       ` Lars Persson
  0 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2016-04-21  7:53 UTC (permalink / raw)
  To: Lars Persson
  Cc: Lars Persson, linux-mmc, devicetree, g.liakhovetski, ulf.hansson,
	robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak

On Thursday 21 April 2016 09:12:52 Lars Persson wrote:
> On 04/20/2016 04:53 PM, Lars Persson wrote:
> > Add a start_signal_voltage_switch() operation to support enabling of
> > UHS modes.
> >
> > Signed-off-by: Lars Persson <larper@axis.com>
> > ---
> >   drivers/mmc/host/usdhi6rol0.c | 13 +++++++++++++
> >   1 file changed, 13 insertions(+)
> >
> > diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
> > index 807c06e..2585ea4 100644
> > --- a/drivers/mmc/host/usdhi6rol0.c
> > +++ b/drivers/mmc/host/usdhi6rol0.c
> > @@ -1147,12 +1147,25 @@ static void usdhi6_enable_sdio_irq(struct mmc_host *mmc, int enable)
> >       }
> >   }
> >
> > +static int usdhi6_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
> > +{
> > +     int ret;
> > +
> 
> To support boards without regulator we need to put a 
> IS_ERR_OR_NULL(mmc->supply.vqmmc) check here and bail out with return 0. 
> Missing vqmmc is OK according to our binding document, but treated as an 
> error by mmc_regulator_set_vqmmc().

mmc_regulator_set_vqmmc() should already take care of handling
all the those cases. In general, it's almost always a bug to use
IS_ERR_OR_NULL(): if you ever feel the need to use it, you should
either fix the code that made the pointer ambiguous or you have
misunderstood the interface.

	Arnd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-21  7:53     ` Arnd Bergmann
@ 2016-04-21  8:26       ` Lars Persson
  2016-04-21  9:52         ` Arnd Bergmann
  0 siblings, 1 reply; 9+ messages in thread
From: Lars Persson @ 2016-04-21  8:26 UTC (permalink / raw)
  To: Arnd Bergmann, Lars Persson
  Cc: linux-mmc-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA, g.liakhovetski-Mmb7MZpHnFY,
	ulf.hansson-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ



On 04/21/2016 09:53 AM, Arnd Bergmann wrote:
> On Thursday 21 April 2016 09:12:52 Lars Persson wrote:
>> On 04/20/2016 04:53 PM, Lars Persson wrote:
>>> Add a start_signal_voltage_switch() operation to support enabling of
>>> UHS modes.
>>>
>>> Signed-off-by: Lars Persson <larper-VrBV9hrLPhE@public.gmane.org>
>>> ---
>>>    drivers/mmc/host/usdhi6rol0.c | 13 +++++++++++++
>>>    1 file changed, 13 insertions(+)
>>>
>>> diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
>>> index 807c06e..2585ea4 100644
>>> --- a/drivers/mmc/host/usdhi6rol0.c
>>> +++ b/drivers/mmc/host/usdhi6rol0.c
>>> @@ -1147,12 +1147,25 @@ static void usdhi6_enable_sdio_irq(struct mmc_host *mmc, int enable)
>>>        }
>>>    }
>>>
>>> +static int usdhi6_sig_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
>>> +{
>>> +     int ret;
>>> +
>>
>> To support boards without regulator we need to put a
>> IS_ERR_OR_NULL(mmc->supply.vqmmc) check here and bail out with return 0.
>> Missing vqmmc is OK according to our binding document, but treated as an
>> error by mmc_regulator_set_vqmmc().
>
> mmc_regulator_set_vqmmc() should already take care of handling
> all the those cases. In general, it's almost always a bug to use
> IS_ERR_OR_NULL(): if you ever feel the need to use it, you should
> either fix the code that made the pointer ambiguous or you have
> misunderstood the interface.
>
> 	Arnd
>

Yes it should of course be IS_ERR() rather than IS_ERR_OR_NULL().

It is a common pattern in all upstream mmc drivers to not make the call 
to mmc_regulator_set_vqmmc() when a regulator is missing. We basically 
want to log errors except for the EINVAL returned in case of a missing 
regulator.


- Lars
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-21  8:26       ` Lars Persson
@ 2016-04-21  9:52         ` Arnd Bergmann
  2016-04-21 13:47           ` Lars Persson
  0 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2016-04-21  9:52 UTC (permalink / raw)
  To: Lars Persson
  Cc: Lars Persson, linux-mmc, devicetree, g.liakhovetski, ulf.hansson,
	robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak

On Thursday 21 April 2016 10:26:55 Lars Persson wrote:
> 
> It is a common pattern in all upstream mmc drivers to not make the call 
> to mmc_regulator_set_vqmmc() when a regulator is missing. We basically 
> want to log errors except for the EINVAL returned in case of a missing 
> regulator.
> 
> 

I see what you mean here: two out of four drivers calling
mmc_regulator_set_vqmmc() log errors to the console.

If we want all drivers to behave consistently here, how about
moving that error output into the mmc_regulator_set_vqmmc() function
itself?

	Arnd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes
  2016-04-21  9:52         ` Arnd Bergmann
@ 2016-04-21 13:47           ` Lars Persson
  0 siblings, 0 replies; 9+ messages in thread
From: Lars Persson @ 2016-04-21 13:47 UTC (permalink / raw)
  To: Arnd Bergmann, ulf.hansson
  Cc: linux-mmc, devicetree, g.liakhovetski, robh+dt, pawel.moll,
	mark.rutland, ijc+devicetree, galak



On 04/21/2016 11:52 AM, Arnd Bergmann wrote:
> On Thursday 21 April 2016 10:26:55 Lars Persson wrote:
>>
>> It is a common pattern in all upstream mmc drivers to not make the call
>> to mmc_regulator_set_vqmmc() when a regulator is missing. We basically
>> want to log errors except for the EINVAL returned in case of a missing
>> regulator.
>>
>>
>
> I see what you mean here: two out of four drivers calling
> mmc_regulator_set_vqmmc() log errors to the console.
>
> If we want all drivers to behave consistently here, how about
> moving that error output into the mmc_regulator_set_vqmmc() function
> itself?
>

I will make a v4 that skips the error output and if Ulf agrees with your 
proposal I will make another patch series to move the dev_dbg() into 
mmc_regulator_set_vqmmc().

- Lars

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-04-21 13:48 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-20 14:53 [PATCH v3 0/3] mmc: usdhi6rol0: UHS support Lars Persson
2016-04-20 14:53 ` [PATCH v3 1/3] mmc: dt: usdhi6rol0: add optional pinctrl binding Lars Persson
2016-04-20 14:53 ` [PATCH v3 2/3] mmc: usdhi6rol0: add support for UHS modes Lars Persson
2016-04-21  7:12   ` Lars Persson
2016-04-21  7:53     ` Arnd Bergmann
2016-04-21  8:26       ` Lars Persson
2016-04-21  9:52         ` Arnd Bergmann
2016-04-21 13:47           ` Lars Persson
2016-04-20 14:53 ` [PATCH v3 3/3] mmc: usdhi6rol0: add pinctrl to set pin drive strength Lars Persson

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