[PATCH v5 04/19] clk: at91: pmc: export clock setup to pmc
Sean Anderson
seanga2 at gmail.com
Wed Jan 4 18:52:05 CET 2023
On 12/22/22 05:53, Sergiu Moga wrote:
> From: Claudiu Beznea <claudiu.beznea at microchip.com>
>
> Clock setup was intended for setting clocks at boot time on SAMA7G5,
> e.g. for root clocks like PLLs, that were used to feed IPs needed alive
> in u-boot (e.g. Ethernet clock feed by a PLL). Export this functionality
> to all at91 clocks as it may be necessary on other SoCs.
>
> Signed-off-by: Claudiu Beznea <claudiu.beznea at microchip.com>
> Signed-off-by: Sergiu Moga <sergiu.moga at microchip.com>
> ---
>
>
>
> v1 -> v2:
> - Additional patch, this was not here in v1
>
>
> v2 -> v5:
> - No change
>
>
>
> drivers/clk/at91/pmc.c | 42 +++++++++++++++++++++++++++++++++
> drivers/clk/at91/pmc.h | 16 +++++++++++++
> drivers/clk/at91/sama7g5.c | 48 +++++---------------------------------
> 3 files changed, 64 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/clk/at91/pmc.c b/drivers/clk/at91/pmc.c
> index 270892517a..87d2069d89 100644
> --- a/drivers/clk/at91/pmc.c
> +++ b/drivers/clk/at91/pmc.c
> @@ -120,3 +120,45 @@ int at91_clk_mux_index_to_val(const u32 *table, u32 num_parents, u32 index)
>
> return table[index];
> }
> +
> +int at91_clk_setup(const struct pmc_clk_setup *setup, int size)
> +{
> + struct clk *c, *parent;
> + int i, ret;
> +
> + if (!size)
> + return 0;
> +
> + if (!setup)
> + return -EINVAL;
> +
> + for (i = 0; i < size; i++) {
> + ret = clk_get_by_id(setup[i].cid, &c);
> + if (ret)
> + return ret;
> +
> + if (setup[i].pid) {
> + ret = clk_get_by_id(setup[i].pid, &parent);
> + if (ret)
> + return ret;
> +
> + ret = clk_set_parent(c, parent);
> + if (ret)
> + return ret;
> +
> + if (setup[i].prate) {
> + ret = clk_set_rate(parent, setup[i].prate);
> + if (ret < 0)
> + return ret;
> + }
> + }
> +
> + if (setup[i].rate) {
> + ret = clk_set_rate(c, setup[i].rate);
> + if (ret < 0)
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
> diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h
> index 17793b8802..ff464522aa 100644
> --- a/drivers/clk/at91/pmc.h
> +++ b/drivers/clk/at91/pmc.h
> @@ -77,6 +77,20 @@ struct clk_usbck_layout {
> u32 usbdiv_mask;
> };
>
> +/**
> + * Clock setup description
> + * @cid: clock id corresponding to clock subsystem
> + * @pid: parent clock id corresponding to clock subsystem
> + * @rate: clock rate
> + * @prate: parent rate
> + */
> +struct pmc_clk_setup {
> + unsigned int cid;
> + unsigned int pid;
> + unsigned long rate;
> + unsigned long prate;
> +};
> +
> extern const struct clk_programmable_layout at91rm9200_programmable_layout;
> extern const struct clk_programmable_layout at91sam9g45_programmable_layout;
> extern const struct clk_programmable_layout at91sam9x5_programmable_layout;
> @@ -160,4 +174,6 @@ void pmc_write(void __iomem *base, unsigned int off, unsigned int val);
> void pmc_update_bits(void __iomem *base, unsigned int off, unsigned int mask,
> unsigned int bits);
>
> +int at91_clk_setup(const struct pmc_clk_setup *setup, int size);
> +
> #endif
> diff --git a/drivers/clk/at91/sama7g5.c b/drivers/clk/at91/sama7g5.c
> index d1ec3c82b5..8bd9c14156 100644
> --- a/drivers/clk/at91/sama7g5.c
> +++ b/drivers/clk/at91/sama7g5.c
> @@ -1070,19 +1070,8 @@ static const struct {
> },
> };
>
> -/**
> - * Clock setup description
> - * @cid: clock id corresponding to clock subsystem
> - * @pid: parent clock id corresponding to clock subsystem
> - * @rate: clock rate
> - * @prate: parent rate
> - */
> -static const struct pmc_clk_setup {
> - unsigned int cid;
> - unsigned int pid;
> - unsigned long rate;
> - unsigned long prate;
> -} sama7g5_clk_setup[] = {
> +/* Clock setup description */
> +static const struct pmc_clk_setup sama7g5_clk_setup[] = {
> {
> .cid = AT91_TO_CLK_ID(PMC_TYPE_CORE, ID_PLL_ETH_FRAC),
> .rate = 625000000,
> @@ -1119,7 +1108,7 @@ static int sama7g5_clk_probe(struct udevice *dev)
> unsigned int *muxallocs[SAMA7G5_MAX_MUX_ALLOCS];
> const char *p[10];
> unsigned int cm[10], m[10], *tmpclkmux, *tmpmux;
> - struct clk clk, *c, *parent;
> + struct clk clk, *c;
> bool main_osc_bypass;
> int ret, muxallocindex = 0, clkmuxallocindex = 0, i, j;
>
> @@ -1353,34 +1342,9 @@ static int sama7g5_clk_probe(struct udevice *dev)
> }
>
> /* Setup clocks. */
> - for (i = 0; i < ARRAY_SIZE(sama7g5_clk_setup); i++) {
> - ret = clk_get_by_id(sama7g5_clk_setup[i].cid, &c);
> - if (ret)
> - goto fail;
> -
> - if (sama7g5_clk_setup[i].pid) {
> - ret = clk_get_by_id(sama7g5_clk_setup[i].pid, &parent);
> - if (ret)
> - goto fail;
> -
> - ret = clk_set_parent(c, parent);
> - if (ret)
> - goto fail;
> -
> - if (sama7g5_clk_setup[i].prate) {
> - ret = clk_set_rate(parent,
> - sama7g5_clk_setup[i].prate);
> - if (ret < 0)
> - goto fail;
> - }
> - }
> -
> - if (sama7g5_clk_setup[i].rate) {
> - ret = clk_set_rate(c, sama7g5_clk_setup[i].rate);
> - if (ret < 0)
> - goto fail;
> - }
> - }
> + ret = at91_clk_setup(sama7g5_clk_setup, ARRAY_SIZE(sama7g5_clk_setup));
> + if (ret)
> + goto fail;
>
> return 0;
>
Reviewed-by: Sean Anderson <seanga2 at gmail.com>
More information about the U-Boot
mailing list