usb: dwc3: Use of_property_read_variable_u32_array() to read "power"
authorRob Herring (Arm) <robh@kernel.org>
Wed, 31 Jul 2024 20:14:00 +0000 (14:14 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 7 Aug 2024 10:51:20 +0000 (12:51 +0200)
There's no need to get the length of an DT array property before
parsing the array. of_property_read_variable_u32_array() takes a minimum
and maximum length and returns the actual length (or error code).

This is part of a larger effort to remove callers of of_find_property()
and similar functions. of_find_property() leaks the DT struct property
and data pointers which is a problem for dynamically allocated nodes
which may be freed.

Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20240731201407.1838385-5-robh@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/dwc3-octeon.c

index 6010135e1acce6b10221596e1d71dc74ae781986..1a3b205367fd55e1362827b4e754f15cb3b0afa1 100644 (file)
@@ -419,7 +419,7 @@ static int dwc3_octeon_probe(struct platform_device *pdev)
        int ref_clk_sel, ref_clk_fsel, mpll_mul;
        int power_active_low, power_gpio;
        int err, len;
-       u32 clock_rate;
+       u32 clock_rate, gpio_pwr[3];
 
        if (of_property_read_u32(node, "refclk-frequency", &clock_rate)) {
                dev_err(dev, "No UCTL \"refclk-frequency\"\n");
@@ -476,21 +476,10 @@ static int dwc3_octeon_probe(struct platform_device *pdev)
 
        power_gpio = DWC3_GPIO_POWER_NONE;
        power_active_low = 0;
-       if (of_find_property(node, "power", &len)) {
-               u32 gpio_pwr[3];
-
-               switch (len) {
-               case 8:
-                       of_property_read_u32_array(node, "power", gpio_pwr, 2);
-                       break;
-               case 12:
-                       of_property_read_u32_array(node, "power", gpio_pwr, 3);
+       len = of_property_read_variable_u32_array(node, "power", gpio_pwr, 2, 3);
+       if (len > 0) {
+               if (len == 3)
                        power_active_low = gpio_pwr[2] & 0x01;
-                       break;
-               default:
-                       dev_err(dev, "invalid power configuration\n");
-                       return -EINVAL;
-               }
                power_gpio = gpio_pwr[1];
        }