Re: [PATCH v3 4/6] typec: mux: Allow multiple mux_devs per mux

Andy Shevchenko
2022-03-04T13:55:43Z

On Thu, Mar 03, 2022 at 02:33:49PM -0800, Bjorn Andersson wrote:
> In the Qualcomm platforms the USB/DP PHY handles muxing and orientation
> switching of the SuperSpeed lines, but the SBU lines needs to be
> connected and switched by external (to the SoC) hardware.
>
> It's therefor necessary to be able to have the TypeC controller operate
> multiple TypeC muxes and switches. Use the newly introduced indirection
> object to handle this, to avoid having to taint the TypeC controllers
> with knowledge about the downstream hardware configuration.
>
> The max number of devs per indirection is set to 3, which account for
> being able to mux/switch the USB HS, SS and SBU lines, as per defined
> defined in the usb-c-connector binding. This number could be grown if
> need arrises at a later point in time.

...

> + for (i = 0; i < count; i++) {
> + if (IS_ERR(sw_devs[i])) {
> + err = PTR_ERR(sw_devs[i]);
> + goto put_sw_devs;
> + }
> + }
>
> - sw->sw_dev = sw_dev;
> + for (i = 0; i < count; i++) {
> + WARN_ON(!try_module_get(sw_devs[i]->dev.parent->driver->owner));
> + sw->sw_devs[i] = sw_devs[i];
> + }
> +
> + sw->num_sw_devs = count;
>
> return sw;
> +
> +put_sw_devs:
> + for (i = 0; i < count; i++) {

Shouldn't it be

while (i--)

?

> + if (!IS_ERR(sw_devs[i]))

We may get rid of this check if we guarantee that the device is NULL.

> + put_device(&sw_devs[i]->dev);
> + }
> +
> + kfree(sw);
> +
> + return ERR_PTR(err);
> }

...

> + for (i = 0; i < count; i++) {
> + if (IS_ERR(mux_devs[i])) {
> + err = PTR_ERR(mux_devs[i]);
> + goto put_mux_devs;
> + }

Ditto.

> + }

...

> +put_mux_devs:
> + for (i = 0; i < count; i++) {
> + if (!IS_ERR(mux_devs[i]))
> + put_device(&mux_devs[i]->dev);
> + }

Ditto.

--
With Best Regards,
Andy Shevchenko