2020-01-13 13:17:33

by Fabrice Gasnier

[permalink] [raw]
Subject: [PATCH 0/2] iio: dac: stm32-dac: improve reset controller use

This patch series does some cleanup on driver private struct (precursor patch).
Then it better uses the reset controller API to propagate errors to the caller.

Etienne Carriere (2):
iio: dac: stm32-dac: use reset controller only at probe time
iio: dac: stm32-dac: better handle reset controller failures

drivers/iio/dac/stm32-dac-core.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)

--
2.7.4


2020-01-13 13:17:45

by Fabrice Gasnier

[permalink] [raw]
Subject: [PATCH 1/2] iio: dac: stm32-dac: use reset controller only at probe time

From: Etienne Carriere <[email protected]>

This change removes the reset controller reference from the local
DAC instance since it is used only at probe time.

Signed-off-by: Etienne Carriere <[email protected]>
Signed-off-by: Fabrice Gasnier <[email protected]>
---
drivers/iio/dac/stm32-dac-core.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/iio/dac/stm32-dac-core.c b/drivers/iio/dac/stm32-dac-core.c
index 9e6b4cd..4d93446 100644
--- a/drivers/iio/dac/stm32-dac-core.c
+++ b/drivers/iio/dac/stm32-dac-core.c
@@ -20,13 +20,11 @@
/**
* struct stm32_dac_priv - stm32 DAC core private data
* @pclk: peripheral clock common for all DACs
- * @rst: peripheral reset control
* @vref: regulator reference
* @common: Common data for all DAC instances
*/
struct stm32_dac_priv {
struct clk *pclk;
- struct reset_control *rst;
struct regulator *vref;
struct stm32_dac_common common;
};
@@ -94,6 +92,7 @@ static int stm32_dac_probe(struct platform_device *pdev)
struct regmap *regmap;
struct resource *res;
void __iomem *mmio;
+ struct reset_control *rst;
int ret;

if (!dev->of_node)
@@ -148,11 +147,11 @@ static int stm32_dac_probe(struct platform_device *pdev)
priv->common.vref_mv = ret / 1000;
dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv);

- priv->rst = devm_reset_control_get_exclusive(dev, NULL);
- if (!IS_ERR(priv->rst)) {
- reset_control_assert(priv->rst);
+ rst = devm_reset_control_get_exclusive(dev, NULL);
+ if (!IS_ERR(rst)) {
+ reset_control_assert(rst);
udelay(2);
- reset_control_deassert(priv->rst);
+ reset_control_deassert(rst);
}

if (cfg && cfg->has_hfsel) {
--
2.7.4

2020-01-13 13:18:20

by Fabrice Gasnier

[permalink] [raw]
Subject: [PATCH 2/2] iio: dac: stm32-dac: better handle reset controller failures

From: Etienne Carriere <[email protected]>

Use devm_reset_control_get_optional_exclusive() instead of
devm_reset_control_get_exclusive() as reset controller is optional.

Nevertheless if reset controller is expected but reports an
error, propagate the error code to the caller. In such case
a nice error trace is emitted unless we're deferring the probe
operation.

Signed-off-by: Etienne Carriere <[email protected]>
Signed-off-by: Fabrice Gasnier <[email protected]>
---
drivers/iio/dac/stm32-dac-core.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/dac/stm32-dac-core.c b/drivers/iio/dac/stm32-dac-core.c
index 4d93446..7e5809b 100644
--- a/drivers/iio/dac/stm32-dac-core.c
+++ b/drivers/iio/dac/stm32-dac-core.c
@@ -147,8 +147,16 @@ static int stm32_dac_probe(struct platform_device *pdev)
priv->common.vref_mv = ret / 1000;
dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv);

- rst = devm_reset_control_get_exclusive(dev, NULL);
- if (!IS_ERR(rst)) {
+ rst = devm_reset_control_get_optional_exclusive(dev, NULL);
+ if (rst) {
+ if (IS_ERR(rst)) {
+ ret = PTR_ERR(rst);
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "reset get failed, %d\n", ret);
+
+ goto err_hw_stop;
+ }
+
reset_control_assert(rst);
udelay(2);
reset_control_deassert(rst);
--
2.7.4

2020-01-18 14:31:57

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 1/2] iio: dac: stm32-dac: use reset controller only at probe time

On Mon, 13 Jan 2020 14:14:25 +0100
Fabrice Gasnier <[email protected]> wrote:

> From: Etienne Carriere <[email protected]>
>
> This change removes the reset controller reference from the local
> DAC instance since it is used only at probe time.
>
> Signed-off-by: Etienne Carriere <[email protected]>
> Signed-off-by: Fabrice Gasnier <[email protected]>
Makes sense.

Applied to the togreg branch of iio.git and pushed out as testing
to let those autobuilders poke at it for a few hours.

Thanks,

Jonathan

> ---
> drivers/iio/dac/stm32-dac-core.c | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iio/dac/stm32-dac-core.c b/drivers/iio/dac/stm32-dac-core.c
> index 9e6b4cd..4d93446 100644
> --- a/drivers/iio/dac/stm32-dac-core.c
> +++ b/drivers/iio/dac/stm32-dac-core.c
> @@ -20,13 +20,11 @@
> /**
> * struct stm32_dac_priv - stm32 DAC core private data
> * @pclk: peripheral clock common for all DACs
> - * @rst: peripheral reset control
> * @vref: regulator reference
> * @common: Common data for all DAC instances
> */
> struct stm32_dac_priv {
> struct clk *pclk;
> - struct reset_control *rst;
> struct regulator *vref;
> struct stm32_dac_common common;
> };
> @@ -94,6 +92,7 @@ static int stm32_dac_probe(struct platform_device *pdev)
> struct regmap *regmap;
> struct resource *res;
> void __iomem *mmio;
> + struct reset_control *rst;
> int ret;
>
> if (!dev->of_node)
> @@ -148,11 +147,11 @@ static int stm32_dac_probe(struct platform_device *pdev)
> priv->common.vref_mv = ret / 1000;
> dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv);
>
> - priv->rst = devm_reset_control_get_exclusive(dev, NULL);
> - if (!IS_ERR(priv->rst)) {
> - reset_control_assert(priv->rst);
> + rst = devm_reset_control_get_exclusive(dev, NULL);
> + if (!IS_ERR(rst)) {
> + reset_control_assert(rst);
> udelay(2);
> - reset_control_deassert(priv->rst);
> + reset_control_deassert(rst);
> }
>
> if (cfg && cfg->has_hfsel) {

2020-01-18 14:33:50

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 2/2] iio: dac: stm32-dac: better handle reset controller failures

On Mon, 13 Jan 2020 14:14:26 +0100
Fabrice Gasnier <[email protected]> wrote:

> From: Etienne Carriere <[email protected]>
>
> Use devm_reset_control_get_optional_exclusive() instead of
> devm_reset_control_get_exclusive() as reset controller is optional.
>
> Nevertheless if reset controller is expected but reports an
> error, propagate the error code to the caller. In such case
> a nice error trace is emitted unless we're deferring the probe
> operation.
>
> Signed-off-by: Etienne Carriere <[email protected]>
> Signed-off-by: Fabrice Gasnier <[email protected]>
Applied to the togreg branch of iio.git and pushed out as testing.

Thanks,

Jonathan

> ---
> drivers/iio/dac/stm32-dac-core.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/dac/stm32-dac-core.c b/drivers/iio/dac/stm32-dac-core.c
> index 4d93446..7e5809b 100644
> --- a/drivers/iio/dac/stm32-dac-core.c
> +++ b/drivers/iio/dac/stm32-dac-core.c
> @@ -147,8 +147,16 @@ static int stm32_dac_probe(struct platform_device *pdev)
> priv->common.vref_mv = ret / 1000;
> dev_dbg(dev, "vref+=%dmV\n", priv->common.vref_mv);
>
> - rst = devm_reset_control_get_exclusive(dev, NULL);
> - if (!IS_ERR(rst)) {
> + rst = devm_reset_control_get_optional_exclusive(dev, NULL);
> + if (rst) {
> + if (IS_ERR(rst)) {
> + ret = PTR_ERR(rst);
> + if (ret != -EPROBE_DEFER)
> + dev_err(dev, "reset get failed, %d\n", ret);
> +
> + goto err_hw_stop;
> + }
> +
> reset_control_assert(rst);
> udelay(2);
> reset_control_deassert(rst);