On Fri 04 Mar 07:54 CST 2022, Andy Shevchenko wrote: > 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--) > > ? fwnode_connection_find_matches() "returned" count number of sw_devs, we need to put_device() them all. So that form could have been while (count--) but as it's not the typical "unrolling" I think the untypical form is more useful. > > > + if (!IS_ERR(sw_devs[i])) > > We may get rid of this check if we guarantee that the device is NULL. > In the event that the USB Type-C controller probes before some of the muxes, this array might contain one or more entries of EPROBE_DEFER. So we need to either put this conditional here, or we need to loop through all entries to turn IS_ERR() into NULL, for the sake of not having it here. So to me this looks cleaner... Regards, Bjorn > > + 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 > >