Commit f3586024 authored by Rob Herring (Arm)'s avatar Rob Herring (Arm) Committed by Greg Kroah-Hartman
Browse files

usb: dwc3: Use of_property_read_variable_u32_array() to read "power"



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: default avatarRob Herring (Arm) <robh@kernel.org>
Acked-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20240731201407.1838385-5-robh@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 89b75391
Loading
Loading
Loading
Loading
+4 −15
Original line number Diff line number Diff line
@@ -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];
	}