* [PATCH 0/2] clk: Add a devm variant of clk_rate_exclusive_get()
@ 2023-12-12 18:09 Uwe Kleine-König
2023-12-12 18:09 ` [PATCH 1/2] " Uwe Kleine-König
2023-12-12 18:09 ` [PATCH 2/2] pwm: xilinx: Simplify using devm functions Uwe Kleine-König
0 siblings, 2 replies; 8+ messages in thread
From: Uwe Kleine-König @ 2023-12-12 18:09 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King
Cc: linux-clk, kernel, Sean Anderson, Thierry Reding, Michal Simek,
linux-arm-kernel, linux-pwm
Hello,
patch #1 adds a new function devm_clk_rate_exclusive_get() that
simplifies usage of clk_rate_exclusive_get() in probe functions.
One downside is that a caller of clk_rate_exclusive_get() doesn't need
to check the return value, devm_clk_rate_exclusive_get() can fail
however. So to benefit from the new function you usually need to add a
check for devm_clk_rate_exclusive_get() failing in return to simplifying
error paths in .probe() and .remove().
Patch #2 shows an example conversion. Note that without
devm_clk_rate_exclusive_get() the pwm-xilinx driver cannot benefit from
devm_pwmchip_add().
This series bases on
https://lore.kernel.org/linux-clk/cover.1702400947.git.u.kleine-koenig@pengutronix.de/T/#t
. That's not a "hard" dependency, it can easily be rebased to next.
There is only a trivial context conflict in include/linux/clk.h.
Regarding how to merge this: I suggest to take patch #1 via clk. When
this is merged I will take care for the pwm-xilinx driver (and others
that might benefit).
Best regards
Uwe
Uwe Kleine-König (2):
clk: Add a devm variant of clk_rate_exclusive_get()
pwm: xilinx: Simplify using devm functions
drivers/clk/clk.c | 15 +++++++++++++++
drivers/pwm/pwm-xilinx.c | 25 ++++++-------------------
include/linux/clk.h | 12 ++++++++++++
3 files changed, 33 insertions(+), 19 deletions(-)
base-commit: bbd220ce4e29ed55ab079007cff0b550895258eb
prerequisite-patch-id: 5a986d744a054000998ce06e3dbaaedede71c8ac
prerequisite-patch-id: cdb26f72d1fbd7fef4a9ef4476e0218dd3fcba22
prerequisite-patch-id: 838e3cb639cf13c7b571d77c1dea3d4ec479465d
prerequisite-patch-id: d5059c23f752a4861e5bbfe70b8ab771727bf68d
prerequisite-patch-id: c7ca9e00334dabe41f39e006ceb2b7d1afddcaa5
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2023-12-12 18:09 [PATCH 0/2] clk: Add a devm variant of clk_rate_exclusive_get() Uwe Kleine-König
@ 2023-12-12 18:09 ` Uwe Kleine-König
2023-12-18 0:17 ` Stephen Boyd
2023-12-12 18:09 ` [PATCH 2/2] pwm: xilinx: Simplify using devm functions Uwe Kleine-König
1 sibling, 1 reply; 8+ messages in thread
From: Uwe Kleine-König @ 2023-12-12 18:09 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King
Cc: linux-clk, kernel, Sean Anderson, Thierry Reding, Michal Simek,
linux-arm-kernel, linux-pwm
This allows to simplify drivers that use clk_rate_exclusive_get()
in their probe routine as calling clk_rate_exclusive_put() is cared for
automatically.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
drivers/clk/clk.c | 15 +++++++++++++++
include/linux/clk.h | 12 ++++++++++++
2 files changed, 27 insertions(+)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index af2011c2a93b..78249ca2341c 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -937,6 +937,21 @@ void clk_rate_exclusive_get(struct clk *clk)
}
EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
+static void devm_clk_rate_exclusive_put(void *data)
+{
+ struct clk *clk = data;
+
+ clk_rate_exclusive_put(clk);
+}
+
+int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
+{
+ clk_rate_exclusive_get(clk);
+
+ return devm_add_action_or_reset(dev, devm_clk_rate_exclusive_put, clk);
+}
+EXPORT_SYMBOL_GPL(devm_clk_rate_exclusive_get);
+
static void clk_core_unprepare(struct clk_core *core)
{
lockdep_assert_held(&prepare_lock);
diff --git a/include/linux/clk.h b/include/linux/clk.h
index f88c407925f8..5a749459c3a3 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -199,6 +199,18 @@ bool clk_is_match(const struct clk *p, const struct clk *q);
*/
void clk_rate_exclusive_get(struct clk *clk);
+/**
+ * devm_clk_rate_exclusive_get - devm variant of clk_rate_exclusive_get
+ * @dev: device the exclusivity is bound to
+ * @clk: clock source
+ *
+ * Calls clk_rate_exclusive_get() on @clk and registers a devm cleanup handler
+ * on @dev to cal clk_rate_exclusive_put().
+ *
+ * Must not be called from within atomic context.
+ */
+int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk);
+
/**
* clk_rate_exclusive_put - release exclusivity over the rate control of a
* producer
--
2.42.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] pwm: xilinx: Simplify using devm functions
2023-12-12 18:09 [PATCH 0/2] clk: Add a devm variant of clk_rate_exclusive_get() Uwe Kleine-König
2023-12-12 18:09 ` [PATCH 1/2] " Uwe Kleine-König
@ 2023-12-12 18:09 ` Uwe Kleine-König
1 sibling, 0 replies; 8+ messages in thread
From: Uwe Kleine-König @ 2023-12-12 18:09 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King
Cc: linux-clk, kernel, Sean Anderson, Thierry Reding, Michal Simek,
linux-arm-kernel, linux-pwm
devm_clk_get() + clk_prepare_enable() can be simplified to
devm_clk_get_enabled(). Both clk_rate_exclusive_get() and pwmchip_add()
have devm variants.
This allows to completely drop the remove callback and the error path in
the probe function.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
drivers/pwm/pwm-xilinx.c | 25 ++++++-------------------
1 file changed, 6 insertions(+), 19 deletions(-)
diff --git a/drivers/pwm/pwm-xilinx.c b/drivers/pwm/pwm-xilinx.c
index 5f3c2a6fed11..19a2a496d555 100644
--- a/drivers/pwm/pwm-xilinx.c
+++ b/drivers/pwm/pwm-xilinx.c
@@ -268,38 +268,26 @@ static int xilinx_pwm_probe(struct platform_device *pdev)
* alas, such properties are not allowed to be used.
*/
- priv->clk = devm_clk_get(dev, "s_axi_aclk");
+ priv->clk = devm_clk_get_enabled(dev, "s_axi_aclk");
if (IS_ERR(priv->clk))
return dev_err_probe(dev, PTR_ERR(priv->clk),
"Could not get clock\n");
- ret = clk_prepare_enable(priv->clk);
+ ret = devm_clk_rate_exclusive_get(dev, priv->clk);
if (ret)
- return dev_err_probe(dev, ret, "Clock enable failed\n");
- clk_rate_exclusive_get(priv->clk);
+ return dev_err_probe(dev, ret,
+ "Could not get exclusive control over clock\n");
xilinx_pwm->chip.dev = dev;
xilinx_pwm->chip.ops = &xilinx_pwm_ops;
xilinx_pwm->chip.npwm = 1;
- ret = pwmchip_add(&xilinx_pwm->chip);
- if (ret) {
- clk_rate_exclusive_put(priv->clk);
- clk_disable_unprepare(priv->clk);
+ ret = devm_pwmchip_add(dev, &xilinx_pwm->chip);
+ if (ret)
return dev_err_probe(dev, ret, "Could not register PWM chip\n");
- }
return 0;
}
-static void xilinx_pwm_remove(struct platform_device *pdev)
-{
- struct xilinx_pwm_device *xilinx_pwm = platform_get_drvdata(pdev);
-
- pwmchip_remove(&xilinx_pwm->chip);
- clk_rate_exclusive_put(xilinx_pwm->priv.clk);
- clk_disable_unprepare(xilinx_pwm->priv.clk);
-}
-
static const struct of_device_id xilinx_pwm_of_match[] = {
{ .compatible = "xlnx,xps-timer-1.00.a", },
{},
@@ -308,7 +296,6 @@ MODULE_DEVICE_TABLE(of, xilinx_pwm_of_match);
static struct platform_driver xilinx_pwm_driver = {
.probe = xilinx_pwm_probe,
- .remove_new = xilinx_pwm_remove,
.driver = {
.name = "xilinx-pwm",
.of_match_table = of_match_ptr(xilinx_pwm_of_match),
--
2.42.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2023-12-12 18:09 ` [PATCH 1/2] " Uwe Kleine-König
@ 2023-12-18 0:17 ` Stephen Boyd
2023-12-18 13:01 ` Uwe Kleine-König
0 siblings, 1 reply; 8+ messages in thread
From: Stephen Boyd @ 2023-12-18 0:17 UTC (permalink / raw)
To: Michael Turquette, Russell King, Uwe Kleine-König
Cc: linux-clk, kernel, Sean Anderson, Thierry Reding, Michal Simek,
linux-arm-kernel, linux-pwm
Quoting Uwe Kleine-König (2023-12-12 10:09:42)
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index af2011c2a93b..78249ca2341c 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -937,6 +937,21 @@ void clk_rate_exclusive_get(struct clk *clk)
> }
> EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
>
> +static void devm_clk_rate_exclusive_put(void *data)
> +{
> + struct clk *clk = data;
> +
> + clk_rate_exclusive_put(clk);
> +}
> +
> +int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
> +{
> + clk_rate_exclusive_get(clk);
It seems the other thread wants this to return an error value.
> +
> + return devm_add_action_or_reset(dev, devm_clk_rate_exclusive_put, clk);
> +}
> +EXPORT_SYMBOL_GPL(devm_clk_rate_exclusive_get);
> +
> static void clk_core_unprepare(struct clk_core *core)
> {
> lockdep_assert_held(&prepare_lock);
> diff --git a/include/linux/clk.h b/include/linux/clk.h
> index f88c407925f8..5a749459c3a3 100644
> --- a/include/linux/clk.h
> +++ b/include/linux/clk.h
> @@ -199,6 +199,18 @@ bool clk_is_match(const struct clk *p, const struct clk *q);
> */
> void clk_rate_exclusive_get(struct clk *clk);
>
> +/**
> + * devm_clk_rate_exclusive_get - devm variant of clk_rate_exclusive_get
> + * @dev: device the exclusivity is bound to
> + * @clk: clock source
> + *
> + * Calls clk_rate_exclusive_get() on @clk and registers a devm cleanup handler
> + * on @dev to cal clk_rate_exclusive_put().
call
> + *
> + * Must not be called from within atomic context.
> + */
> +int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk);
> +
> /**
> * clk_rate_exclusive_put - release exclusivity over the rate control of a
> * producer
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2023-12-18 0:17 ` Stephen Boyd
@ 2023-12-18 13:01 ` Uwe Kleine-König
2024-01-04 18:06 ` Uwe Kleine-König
0 siblings, 1 reply; 8+ messages in thread
From: Uwe Kleine-König @ 2023-12-18 13:01 UTC (permalink / raw)
To: Stephen Boyd
Cc: Michael Turquette, Russell King, linux-pwm, Sean Anderson,
Thierry Reding, kernel, Michal Simek, linux-clk, linux-arm-kernel,
Maxime Ripard
[-- Attachment #1: Type: text/plain, Size: 1509 bytes --]
[Cc += Maxime]
Hello Stephen,
On Sun, Dec 17, 2023 at 04:17:41PM -0800, Stephen Boyd wrote:
> Quoting Uwe Kleine-König (2023-12-12 10:09:42)
> > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> > index af2011c2a93b..78249ca2341c 100644
> > --- a/drivers/clk/clk.c
> > +++ b/drivers/clk/clk.c
> > @@ -937,6 +937,21 @@ void clk_rate_exclusive_get(struct clk *clk)
> > }
> > EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
> >
> > +static void devm_clk_rate_exclusive_put(void *data)
> > +{
> > + struct clk *clk = data;
> > +
> > + clk_rate_exclusive_put(clk);
> > +}
> > +
> > +int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
> > +{
> > + clk_rate_exclusive_get(clk);
>
> It seems the other thread wants this to return an error value.
The status quo is that clk_rate_exclusive_get() always returns zero.
Some users do error handling (which is dead code until Maxime reworks
the call that it might return something non-zero), others just call it
without checking.
If you don't require to add something like:
ret = clk_rate_exclusive_get(clk);
if (ret)
return ret;
where we currently have just
clk_rate_exclusive_get(clk);
the patch can just be applied (using git am -3) not even hitting a merge
conflict without that other series.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2023-12-18 13:01 ` Uwe Kleine-König
@ 2024-01-04 18:06 ` Uwe Kleine-König
2024-01-04 21:38 ` Stephen Boyd
0 siblings, 1 reply; 8+ messages in thread
From: Uwe Kleine-König @ 2024-01-04 18:06 UTC (permalink / raw)
To: Stephen Boyd
Cc: linux-pwm, Sean Anderson, Michael Turquette, Russell King,
Maxime Ripard, Thierry Reding, kernel, Michal Simek, linux-clk,
linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 1910 bytes --]
Hello Stephen,
On Mon, Dec 18, 2023 at 02:01:41PM +0100, Uwe Kleine-König wrote:
> [Cc += Maxime]
>
> Hello Stephen,
>
> On Sun, Dec 17, 2023 at 04:17:41PM -0800, Stephen Boyd wrote:
> > Quoting Uwe Kleine-König (2023-12-12 10:09:42)
> > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> > > index af2011c2a93b..78249ca2341c 100644
> > > --- a/drivers/clk/clk.c
> > > +++ b/drivers/clk/clk.c
> > > @@ -937,6 +937,21 @@ void clk_rate_exclusive_get(struct clk *clk)
> > > }
> > > EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
> > >
> > > +static void devm_clk_rate_exclusive_put(void *data)
> > > +{
> > > + struct clk *clk = data;
> > > +
> > > + clk_rate_exclusive_put(clk);
> > > +}
> > > +
> > > +int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
> > > +{
> > > + clk_rate_exclusive_get(clk);
> >
> > It seems the other thread wants this to return an error value.
>
> The status quo is that clk_rate_exclusive_get() always returns zero.
> Some users do error handling (which is dead code until Maxime reworks
> the call that it might return something non-zero), others just call it
> without checking.
>
> If you don't require to add something like:
>
> ret = clk_rate_exclusive_get(clk);
> if (ret)
> return ret;
>
> where we currently have just
>
> clk_rate_exclusive_get(clk);
>
> the patch can just be applied (using git am -3) not even hitting a merge
> conflict without that other series.
I wonder what you think about this. This devm_clk_rate_exclusive_get()
would be very useful and simplify a few more drivers.
Do you intend to take the patch as is, or should I rework it to check
for the zero it returns?
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2024-01-04 18:06 ` Uwe Kleine-König
@ 2024-01-04 21:38 ` Stephen Boyd
2024-01-04 23:01 ` Uwe Kleine-König
0 siblings, 1 reply; 8+ messages in thread
From: Stephen Boyd @ 2024-01-04 21:38 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: linux-pwm, Sean Anderson, Michael Turquette, Russell King,
Maxime Ripard, Thierry Reding, kernel, Michal Simek, linux-clk,
linux-arm-kernel
Quoting Uwe Kleine-König (2024-01-04 10:06:29)
> Hello Stephen,
>
> On Mon, Dec 18, 2023 at 02:01:41PM +0100, Uwe Kleine-K�nig wrote:
> > [Cc += Maxime]
> >
> > Hello Stephen,
> >
> > On Sun, Dec 17, 2023 at 04:17:41PM -0800, Stephen Boyd wrote:
> > > Quoting Uwe Kleine-K�nig (2023-12-12 10:09:42)
> > > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> > > > index af2011c2a93b..78249ca2341c 100644
> > > > --- a/drivers/clk/clk.c
> > > > +++ b/drivers/clk/clk.c
> > > > @@ -937,6 +937,21 @@ void clk_rate_exclusive_get(struct clk *clk)
> > > > }
> > > > EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
> > > >
> > > > +static void devm_clk_rate_exclusive_put(void *data)
> > > > +{
> > > > + struct clk *clk = data;
> > > > +
> > > > + clk_rate_exclusive_put(clk);
> > > > +}
> > > > +
> > > > +int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
> > > > +{
> > > > + clk_rate_exclusive_get(clk);
> > >
> > > It seems the other thread wants this to return an error value.
> >
> > The status quo is that clk_rate_exclusive_get() always returns zero.
> > Some users do error handling (which is dead code until Maxime reworks
> > the call that it might return something non-zero), others just call it
> > without checking.
> >
> > If you don't require to add something like:
> >
> > ret = clk_rate_exclusive_get(clk);
> > if (ret)
> > return ret;
> >
> > where we currently have just
> >
> > clk_rate_exclusive_get(clk);
> >
> > the patch can just be applied (using git am -3) not even hitting a merge
> > conflict without that other series.
>
> I wonder what you think about this. This devm_clk_rate_exclusive_get()
> would be very useful and simplify a few more drivers.
>
> Do you intend to take the patch as is, or should I rework it to check
> for the zero it returns?
>
Please check the return value even if it is always zero. The discussion
about handling the return value can continue in parallel.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] clk: Add a devm variant of clk_rate_exclusive_get()
2024-01-04 21:38 ` Stephen Boyd
@ 2024-01-04 23:01 ` Uwe Kleine-König
0 siblings, 0 replies; 8+ messages in thread
From: Uwe Kleine-König @ 2024-01-04 23:01 UTC (permalink / raw)
To: Stephen Boyd
Cc: linux-pwm, Sean Anderson, Michael Turquette, Russell King,
Maxime Ripard, Thierry Reding, kernel, Michal Simek, linux-clk,
linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 1452 bytes --]
Hello Stephen,
On Thu, Jan 04, 2024 at 01:38:27PM -0800, Stephen Boyd wrote:
> Quoting Uwe Kleine-König (2024-01-04 10:06:29)
> > On Mon, Dec 18, 2023 at 02:01:41PM +0100, Uwe Kleine-K�nig wrote:
> > > If you don't require to add something like:
> > >
> > > ret = clk_rate_exclusive_get(clk);
> > > if (ret)
> > > return ret;
> > >
> > > where we currently have just
> > >
> > > clk_rate_exclusive_get(clk);
> > >
> > > the patch can just be applied (using git am -3) not even hitting a merge
> > > conflict without that other series.
> >
> > I wonder what you think about this. This devm_clk_rate_exclusive_get()
> > would be very useful and simplify a few more drivers.
> >
> > Do you intend to take the patch as is, or should I rework it to check
> > for the zero it returns?
>
> Please check the return value even if it is always zero. The discussion
> about handling the return value can continue in parallel.
The discussion in the other thread died, but maybe that's because of the
holidays. Anyhow, I sent a v2 that checks the return value and intend to
rebase and resend my series making clk_rate_exclusive_get() return void
if there is no further contribution by Maxime in a few months.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | https://www.pengutronix.de/ |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-01-04 23:01 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-12 18:09 [PATCH 0/2] clk: Add a devm variant of clk_rate_exclusive_get() Uwe Kleine-König
2023-12-12 18:09 ` [PATCH 1/2] " Uwe Kleine-König
2023-12-18 0:17 ` Stephen Boyd
2023-12-18 13:01 ` Uwe Kleine-König
2024-01-04 18:06 ` Uwe Kleine-König
2024-01-04 21:38 ` Stephen Boyd
2024-01-04 23:01 ` Uwe Kleine-König
2023-12-12 18:09 ` [PATCH 2/2] pwm: xilinx: Simplify using devm functions Uwe Kleine-König
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox