All of lore.kernel.org
 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:47 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 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.