* [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
* 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
* [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