* [PATCH v2 0/2] clk: implement a new managed helper and add first user
@ 2024-08-05 8:57 Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Bartosz Golaszewski @ 2024-08-05 8:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King, Marcel Holtmann,
Luiz Augusto von Dentz
Cc: linux-clk, linux-kernel, linux-bluetooth, Bartosz Golaszewski
I'm posting this as RFC to see if there's any interest. I noticed that
some drivers do: clk_get() -> clk_set_rate() -> clk_prepare_enable(). I
was wondering if it's worth factoring this out into dedicated helpers.
This series adds a new such helper for the "optional-enabled" use-case
and the first user. Let me know if this makes sense.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
Changes in v2:
- s/EXPORT_SYMBOL/EXPORT_SYMBOL_GPL/
- add a stub for !COMMON_CLK
- Link to v1: https://lore.kernel.org/r/20240801-clk-new-helper-v1-0-81e9338b7b17@linaro.org
---
Bartosz Golaszewski (2):
clk: provide devm_clk_get_optional_enabled_with_rate()
Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate()
drivers/bluetooth/hci_qca.c | 24 ++----------------------
drivers/clk/clk-devres.c | 28 ++++++++++++++++++++++++++++
include/linux/clk.h | 33 +++++++++++++++++++++++++++++++++
3 files changed, 63 insertions(+), 22 deletions(-)
---
base-commit: d6dbc9f56c3a70e915625b6f1887882c23dc5c91
change-id: 20240801-clk-new-helper-7853f662cda1
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate()
2024-08-05 8:57 [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
@ 2024-08-05 8:57 ` Bartosz Golaszewski
2024-09-05 21:42 ` Stephen Boyd
2024-08-05 8:57 ` [PATCH v2 2/2] Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
2024-09-02 8:33 ` [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
2 siblings, 1 reply; 6+ messages in thread
From: Bartosz Golaszewski @ 2024-08-05 8:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King, Marcel Holtmann,
Luiz Augusto von Dentz
Cc: linux-clk, linux-kernel, linux-bluetooth, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
There are clock users in the kernel that can't use
devm_clk_get_optional_enabled() as they need to set rate after getting
the clock and before enabling it. Provide a managed helper that wraps
these operations in the correct order.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/clk/clk-devres.c | 28 ++++++++++++++++++++++++++++
include/linux/clk.h | 33 +++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
index 90e6078fb6e1..82ae1f26e634 100644
--- a/drivers/clk/clk-devres.c
+++ b/drivers/clk/clk-devres.c
@@ -99,6 +99,34 @@ struct clk *devm_clk_get_optional_enabled(struct device *dev, const char *id)
}
EXPORT_SYMBOL_GPL(devm_clk_get_optional_enabled);
+struct clk *devm_clk_get_optional_enabled_with_rate(struct device *dev,
+ const char *id,
+ unsigned long rate)
+{
+ struct clk *clk;
+ int ret;
+
+ clk = __devm_clk_get(dev, id, clk_get_optional, NULL,
+ clk_disable_unprepare);
+ if (IS_ERR(clk))
+ return ERR_CAST(clk);
+
+ ret = clk_set_rate(clk, rate);
+ if (ret)
+ goto out_put_clk;
+
+ ret = clk_prepare_enable(clk);
+ if (ret)
+ goto out_put_clk;
+
+ return clk;
+
+out_put_clk:
+ devm_clk_put(dev, clk);
+ return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(devm_clk_get_optional_enabled_with_rate);
+
struct clk_bulk_devres {
struct clk_bulk_data *clks;
int num_clks;
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 0fa56d672532..851a0f2cf42c 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -640,6 +640,32 @@ struct clk *devm_clk_get_optional_prepared(struct device *dev, const char *id);
*/
struct clk *devm_clk_get_optional_enabled(struct device *dev, const char *id);
+/**
+ * devm_clk_get_optional_enabled_with_rate - devm_clk_get_optional() +
+ * clk_set_rate() +
+ * clk_prepare_enable()
+ * @dev: device for clock "consumer"
+ * @id: clock consumer ID
+ * @rate: new clock rate
+ *
+ * Context: May sleep.
+ *
+ * Return: a struct clk corresponding to the clock producer, or
+ * valid IS_ERR() condition containing errno. The implementation
+ * uses @dev and @id to determine the clock consumer, and thereby
+ * the clock producer. If no such clk is found, it returns NULL
+ * which serves as a dummy clk. That's the only difference compared
+ * to devm_clk_get_enabled().
+ *
+ * The returned clk (if valid) is prepared and enabled and rate was set.
+ *
+ * The clock will automatically be disabled, unprepared and freed
+ * when the device is unbound from the bus.
+ */
+struct clk *devm_clk_get_optional_enabled_with_rate(struct device *dev,
+ const char *id,
+ unsigned long rate);
+
/**
* devm_get_clk_from_child - lookup and obtain a managed reference to a
* clock producer from child node.
@@ -982,6 +1008,13 @@ static inline struct clk *devm_clk_get_optional_enabled(struct device *dev,
return NULL;
}
+static inline struct clk *
+devm_clk_get_optional_enabled_with_rate(struct device *dev, const char *id,
+ unsigned long rate)
+{
+ return NULL;
+}
+
static inline int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
struct clk_bulk_data *clks)
{
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate()
2024-08-05 8:57 [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
@ 2024-08-05 8:57 ` Bartosz Golaszewski
2024-09-02 8:33 ` [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
2 siblings, 0 replies; 6+ messages in thread
From: Bartosz Golaszewski @ 2024-08-05 8:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King, Marcel Holtmann,
Luiz Augusto von Dentz
Cc: linux-clk, linux-kernel, linux-bluetooth, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Use the new devm_clk_get_optional_enabled_with_rate() clock helper to
shrink the code a bit.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/bluetooth/hci_qca.c | 24 ++----------------------
1 file changed, 2 insertions(+), 22 deletions(-)
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 45adc1560d94..7bee8102caf8 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -2293,13 +2293,6 @@ static int qca_init_regulators(struct qca_power *qca,
return 0;
}
-static void qca_clk_disable_unprepare(void *data)
-{
- struct clk *clk = data;
-
- clk_disable_unprepare(clk);
-}
-
static int qca_serdev_probe(struct serdev_device *serdev)
{
struct qca_serdev *qcadev;
@@ -2432,25 +2425,12 @@ static int qca_serdev_probe(struct serdev_device *serdev)
if (!qcadev->bt_en)
power_ctrl_enabled = false;
- qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
+ qcadev->susclk = devm_clk_get_optional_enabled_with_rate(
+ &serdev->dev, NULL, SUSCLK_RATE_32KHZ);
if (IS_ERR(qcadev->susclk)) {
dev_warn(&serdev->dev, "failed to acquire clk\n");
return PTR_ERR(qcadev->susclk);
}
- err = clk_set_rate(qcadev->susclk, SUSCLK_RATE_32KHZ);
- if (err)
- return err;
-
- err = clk_prepare_enable(qcadev->susclk);
- if (err)
- return err;
-
- err = devm_add_action_or_reset(&serdev->dev,
- qca_clk_disable_unprepare,
- qcadev->susclk);
- if (err)
- return err;
-
}
err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto);
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/2] clk: implement a new managed helper and add first user
2024-08-05 8:57 [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 2/2] Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
@ 2024-09-02 8:33 ` Bartosz Golaszewski
2 siblings, 0 replies; 6+ messages in thread
From: Bartosz Golaszewski @ 2024-09-02 8:33 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Russell King, Marcel Holtmann,
Luiz Augusto von Dentz
Cc: linux-clk, linux-kernel, linux-bluetooth, Bartosz Golaszewski
On Mon, Aug 5, 2024 at 10:57 AM Bartosz Golaszewski <brgl@bgdev.pl> wrote:
>
> I'm posting this as RFC to see if there's any interest. I noticed that
> some drivers do: clk_get() -> clk_set_rate() -> clk_prepare_enable(). I
> was wondering if it's worth factoring this out into dedicated helpers.
>
> This series adds a new such helper for the "optional-enabled" use-case
> and the first user. Let me know if this makes sense.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> Changes in v2:
> - s/EXPORT_SYMBOL/EXPORT_SYMBOL_GPL/
> - add a stub for !COMMON_CLK
> - Link to v1: https://lore.kernel.org/r/20240801-clk-new-helper-v1-0-81e9338b7b17@linaro.org
>
> ---
> Bartosz Golaszewski (2):
> clk: provide devm_clk_get_optional_enabled_with_rate()
> Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate()
>
> drivers/bluetooth/hci_qca.c | 24 ++----------------------
> drivers/clk/clk-devres.c | 28 ++++++++++++++++++++++++++++
> include/linux/clk.h | 33 +++++++++++++++++++++++++++++++++
> 3 files changed, 63 insertions(+), 22 deletions(-)
> ---
> base-commit: d6dbc9f56c3a70e915625b6f1887882c23dc5c91
> change-id: 20240801-clk-new-helper-7853f662cda1
>
> Best regards,
> --
> Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
It's been a month. Any comments on this?
Bart
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate()
2024-08-05 8:57 ` [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
@ 2024-09-05 21:42 ` Stephen Boyd
2024-09-09 6:41 ` Bartosz Golaszewski
0 siblings, 1 reply; 6+ messages in thread
From: Stephen Boyd @ 2024-09-05 21:42 UTC (permalink / raw)
To: Bartosz Golaszewski, Luiz Augusto von Dentz, Marcel Holtmann,
Michael Turquette, Russell King
Cc: linux-clk, linux-kernel, linux-bluetooth, Bartosz Golaszewski
Quoting Bartosz Golaszewski (2024-08-05 01:57:31)
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> There are clock users in the kernel that can't use
> devm_clk_get_optional_enabled() as they need to set rate after getting
> the clock and before enabling it. Provide a managed helper that wraps
> these operations in the correct order.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
Applied to clk-next
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate()
2024-09-05 21:42 ` Stephen Boyd
@ 2024-09-09 6:41 ` Bartosz Golaszewski
0 siblings, 0 replies; 6+ messages in thread
From: Bartosz Golaszewski @ 2024-09-09 6:41 UTC (permalink / raw)
To: Stephen Boyd
Cc: Luiz Augusto von Dentz, Marcel Holtmann, Michael Turquette,
Russell King, linux-clk, linux-kernel, linux-bluetooth,
Bartosz Golaszewski
On Thu, Sep 5, 2024 at 11:42 PM Stephen Boyd <sboyd@kernel.org> wrote:
>
> Quoting Bartosz Golaszewski (2024-08-05 01:57:31)
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> >
> > There are clock users in the kernel that can't use
> > devm_clk_get_optional_enabled() as they need to set rate after getting
> > the clock and before enabling it. Provide a managed helper that wraps
> > these operations in the correct order.
> >
> > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > ---
>
> Applied to clk-next
Thanks, I will add some users in the next cycle. Unless Luiz really
wants to play with cross-tree merges again. :)
Bart
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-09-09 6:41 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-08-05 8:57 [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 1/2] clk: provide devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
2024-09-05 21:42 ` Stephen Boyd
2024-09-09 6:41 ` Bartosz Golaszewski
2024-08-05 8:57 ` [PATCH v2 2/2] Bluetooth: hci_qca: use devm_clk_get_optional_enabled_with_rate() Bartosz Golaszewski
2024-09-02 8:33 ` [PATCH v2 0/2] clk: implement a new managed helper and add first user Bartosz Golaszewski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®