[PATCH 1/4] clk: scmi: Bulk allocate all sub-driver instance data

Peng Fan peng.fan at nxp.com
Tue Nov 4 09:05:53 CET 2025


Hi Marek, Tom,

> Subject: [PATCH 1/4] clk: scmi: Bulk allocate all sub-driver instance
> data

I just see this patchset was delegated to me in patchwork. But
there is no scmi repo, could I use the u-boot-fsl-qoriq.git repo
for managing the scmi patches?

Thanks,
Peng. 

> 
> Allocate all sub-driver instance data at once. The amount of data that
> have to be allocated is known up front, so is the size of the data, so
> there is no need to call malloc() in a loop, mallocate all data at once.
> 
> The upside is, less heap fragmentation and fewer malloc() calls overall,
> and a faster boot time.
> 
> The downside is, if some of the clock fail to register, then the clock
> driver cannot free parts of the bulk allocated sub-driver instance data.
> Such a failure can only occur if clk_register() were to fail, and if that
> happens, the system has more significant problems. Worse, if a core
> clock driver fails to probe, the system has even bigger problem.
> 
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Alice Guo <alice.guo at nxp.com>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Sean Anderson <seanga2 at gmail.com>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Valentin Caron <valentin.caron at foss.st.com>
> Cc: Vinh Nguyen <vinh.nguyen.xz at renesas.com>
> Cc: u-boot at lists.denx.de
> ---
>  drivers/clk/clk_scmi.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c index
> f9e17c38cad..0b64c73a61d 100644
> --- a/drivers/clk/clk_scmi.c
> +++ b/drivers/clk/clk_scmi.c
> @@ -283,7 +283,7 @@ static ulong scmi_clk_set_rate(struct clk *clk,
> ulong rate)
> 
>  static int scmi_clk_probe(struct udevice *dev)  {
> -	struct clk_scmi *clk_scmi;
> +	struct clk_scmi *clk_scmi_bulk, *clk_scmi;
>  	struct scmi_clock_priv *priv = dev_get_priv(dev);
>  	size_t num_clocks, i;
>  	int ret;
> @@ -312,20 +312,23 @@ static int scmi_clk_probe(struct udevice
> *dev)
>  		return ret;
>  	}
> 
> +	clk_scmi_bulk = kzalloc(num_clocks * sizeof(*clk_scmi),
> GFP_KERNEL);
> +	if (!clk_scmi_bulk)
> +		return -ENOMEM;
> +
>  	for (i = 0; i < num_clocks; i++) {
>  		char *clock_name;
>  		u32 attributes;
> 
>  		if (!scmi_clk_get_attibute(dev, i, &clock_name,
> &attributes)) {
> -			clk_scmi = kzalloc(sizeof(*clk_scmi),
> GFP_KERNEL);
> -			if (!clk_scmi || !clock_name)
> +			clk_scmi = clk_scmi_bulk + i;
> +			if (!clock_name)
>  				ret = -ENOMEM;
>  			else
>  				ret = clk_register(&clk_scmi->clk,
> dev->driver->name,
>  						   clock_name, dev-
> >name);
> 
>  			if (ret) {
> -				free(clk_scmi);
>  				free(clock_name);
>  				return ret;
>  			}
> --
> 2.51.0



More information about the U-Boot mailing list