[PATCH v2 1/3] phy: at91: Add support for the USB 2.0 PHY's of SAMA7
Sergiu.Moga at microchip.com
Sergiu.Moga at microchip.com
Tue Jan 3 17:54:29 CET 2023
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);
+ }
+
return PTR_ERR(utmi_clk);
+ }
}
return 0;
More information about the U-Boot
mailing list