[PATCH v2 1/3] phy: at91: Add support for the USB 2.0 PHY's of SAMA7

Marek Vasut marex at denx.de
Tue Jan 3 18:58:15 CET 2023


On 1/3/23 17:54, Sergiu.Moga at microchip.com wrote:
> On 03.01.2023 17:31, Marek Vasut wrote:
>> On 1/3/23 15:30, Sergiu Moga wrote:
>>> In order to have USB functionality, drivers for SAMA7's
>>> USB 2.0 PHY's have been added. There is one driver
>>> for UTMI clock's SFR and RESET required functionalities and
>>> one for its three possible subclocks of the phy's themselves.
>>> In order for this layout to properly work in conjunction with
>>> CCF and DT, the former driver will also act as a clock provider
>>> for the three phy's with the help of a custom hook into the
>>> driver's of_xlate method.
>>
>> [...]
>>
>>> +static int sama7_utmi_probe(struct udevice *dev)
>>> +{
>>> +     struct clk *utmi_parent_clk, *utmi_clk;
>>> +     struct regmap *regmap_sfr;
>>> +     struct reset_ctl *phy_reset;
>>> +     int i;
>>> +     char name[16];
>>> +
>>> +     utmi_parent_clk = devm_clk_get(dev, "utmi_clk");
>>> +     if (IS_ERR(utmi_parent_clk))
>>> +             return PTR_ERR(utmi_parent_clk);
>>> +
>>> +     regmap_sfr = syscon_regmap_lookup_by_phandle(dev, "sfr-phandle");
>>> +     if (IS_ERR(regmap_sfr))
>>> +             return PTR_ERR(regmap_sfr);
>>> +
>>> +     for (i = 0; i < ARRAY_SIZE(sama7_utmick); i++) {
>>> +             snprintf(name, sizeof(name), "usb%d_reset", i);
>>> +             phy_reset = devm_reset_control_get(dev, name);
>>> +             if (IS_ERR(phy_reset))
>>> +                     return PTR_ERR(phy_reset);
>>> +
>>> +             utmi_clk = sama7_utmi_clk_register(regmap_sfr, phy_reset,
>>> +                                                sama7_utmick[i].n,
>>> +                                                sama7_utmick[i].p,
>>> +                                                sama7_utmick[i].id);
>>> +             if (IS_ERR(utmi_clk))
>>> +                     return PTR_ERR(utmi_clk);
>>
>> Isn't this going to leak memory if i>0 and a failure occurs ? I think it
>> will, since sama7_utmi_clk_register() calls kzalloc() .
> 
> Yes, you are right. Perhaps something like this should work better
> instead, wouldn't you agree?
> 
>    static int sama7_utmi_probe(struct udevice *dev)
>    {
> -	struct clk *utmi_parent_clk, *utmi_clk;
> +	struct clk *utmi_parent_clk, *utmi_clk[ARRAY_SIZE(sama7_utmick)];
> +	struct sama7_utmi_clk *uclk;
>    	struct regmap *regmap_sfr;
>    	struct reset_ctl *phy_reset;
> -	int i;
> +	int i, j;
>    	char name[16];
> 
>    	utmi_parent_clk = devm_clk_get(dev, "utmi_clk");
> @@ -153,12 +154,18 @@ static int sama7_utmi_probe(struct udevice *dev)
>    		if (IS_ERR(phy_reset))
>    			return PTR_ERR(phy_reset);
> 
> -		utmi_clk = sama7_utmi_clk_register(regmap_sfr, phy_reset,
> +		utmi_clk[i] = sama7_utmi_clk_register(regmap_sfr, phy_reset,
>    						   sama7_utmick[i].n,
>    						   sama7_utmick[i].p,
>    						   sama7_utmick[i].id);
> -		if (IS_ERR(utmi_clk))
> +		if (IS_ERR(utmi_clk)) {
> +			for (j = 0; j < i; j++) {
> +				uclk = to_sama7_utmi_clk(utmi_clk[j]);
> +				kfree(uclk);

Do the usual error handling path using goto:

{
...
if (IS_ERR(...))
   goto error_clk_register;
...

error_clk_register:
   kfree();
error_something_else:
   clean_up_other_stuff();
   return ret;
}


More information about the U-Boot mailing list