[PATCH v3] clk: ti: Notify AVS driver upon setting clock rate
Nishanth Menon
nm at ti.com
Wed Sep 20 14:20:25 CEST 2023
On 17:32-20230920, Udit Kumar wrote:
> AVS is enabled at R5 SPL stage, on few platforms like J721E
> and J7200 clk-k3 is used instead if clk-sci driver.
>
> Add support in clk-k3 driver as well to notify AVS driver
> on setting clock rate so that voltage is changed accordingly.
>
> Also add support in clk-sci driver to do AVS notification
> before or after clock setting based upon current rate and new clock
> rate.
>
> Cc: Keerthy <j-keerthy at ti.com>
> Signed-off-by: Udit Kumar <u-kumar1 at ti.com>
> ---
> Boot logs with v3:
> https://gist.github.com/uditkumarti/12a753a822c0aec9ca3028648c29dfa8
>
> Change log:
> Change in v3:
> - Updated AVS notification before/after clock setting based upon
> new and current rate
> - Added modifed notification in clk-sci driver as well
> - v2 link
> https://lore.kernel.org/all/20230919140408.2608521-1-u-kumar1@ti.com/
>
> Changes in v2:
> - Kept clk-sci.c as is because this is used by
> AM64 and AM65 platforms
> - v1 link
> https://lore.kernel.org/all/20230919060649.2518147-1-u-kumar1@ti.com
>
> drivers/clk/ti/clk-k3.c | 11 +++++++++++
> drivers/clk/ti/clk-sci.c | 11 ++++++++---
> 2 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/clk/ti/clk-k3.c b/drivers/clk/ti/clk-k3.c
> index ba925fa3c4..e8d8f8adf3 100644
> --- a/drivers/clk/ti/clk-k3.c
> +++ b/drivers/clk/ti/clk-k3.c
> @@ -11,6 +11,7 @@
> #include <errno.h>
> #include <soc.h>
> #include <clk-uclass.h>
> +#include <k3-avs.h>
> #include "k3-clk.h"
>
> #define PLL_MIN_FREQ 800000000
> @@ -242,7 +243,13 @@ static ulong ti_clk_set_rate(struct clk *clk, ulong rate)
> const struct clk_ops *ops;
> ulong new_rate, rem;
> ulong diff, new_diff;
> + int set_avs_after_clock = 1;
int freq_scale_up = rate >= ti_clk_get_rate(clk) ? 1 : 0;
>
> + if (rate >= ti_clk_get_rate(clk) && IS_ENABLED(CONFIG_K3_AVS0)) {
I think it is better to put IS_ENABLED() as the first check.
See other usage:
$ git grep IS_ENABLED . |grep if|grep '&&'
> + k3_avs_notify_freq(data->map[clk->id].dev_id,
> + data->map[clk->id].clk_id, rate);
> + set_avs_after_clock = 0;
> + }
> /*
> * We must propagate rate change to parent if current clock type
> * does not allow setting it.
> @@ -339,6 +346,10 @@ static ulong ti_clk_set_rate(struct clk *clk, ulong rate)
> }
> }
>
> + if (set_avs_after_clock && IS_ENABLED(CONFIG_K3_AVS0))
> + k3_avs_notify_freq(data->map[clk->id].dev_id,
> + data->map[clk->id].clk_id, rate);
> +
> return new_rate;
> }
>
> diff --git a/drivers/clk/ti/clk-sci.c b/drivers/clk/ti/clk-sci.c
> index 74df5a397b..1926843dcc 100644
> --- a/drivers/clk/ti/clk-sci.c
> +++ b/drivers/clk/ti/clk-sci.c
> @@ -91,12 +91,14 @@ static ulong ti_sci_clk_set_rate(struct clk *clk, ulong rate)
> const struct ti_sci_handle *sci = data->sci;
> const struct ti_sci_clk_ops *cops = &sci->ops.clk_ops;
> int ret;
> + u8 set_avs_after_clock = 1;
>
> debug("%s(clk=%p, rate=%lu)\n", __func__, clk, rate);
>
> -#ifdef CONFIG_K3_AVS0
> - k3_avs_notify_freq(clk->id, clk->data, rate);
> -#endif
> + if (rate >= ti_sci_clk_get_rate(clk) && IS_ENABLED(CONFIG_K3_AVS0)) {
> + k3_avs_notify_freq(clk->id, clk->data, rate);
> + set_avs_after_clock = 0;
> + }
>
> ret = cops->set_freq(sci, clk->id, clk->data, 0, rate, ULONG_MAX);
> if (ret) {
> @@ -104,6 +106,9 @@ static ulong ti_sci_clk_set_rate(struct clk *clk, ulong rate)
> return ret;
> }
>
> + if (set_avs_after_clock && IS_ENABLED(CONFIG_K3_AVS0))
> + k3_avs_notify_freq(clk->id, clk->data, rate);
> +
> return rate;
> }
>
> --
> 2.34.1
>
First look - it looks fine, but note: these are two different patches.
the clk-sci.c is a fix for an existing implementation and clk-k3.c is a
new feature addition. please don't mix the two.
--
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D
More information about the U-Boot
mailing list