On 2/1/21 8:38 AM, Greg Kroah-Hartman wrote: > On Mon, Feb 01, 2021 at 06:09:25PM +0200, Heikki Krogerus wrote: >> On Mon, Feb 01, 2021 at 04:19:38PM +0100, Greg Kroah-Hartman wrote: >>> On Mon, Feb 01, 2021 at 05:12:53PM +0200, Heikki Krogerus wrote: >>>> On Mon, Feb 01, 2021 at 01:53:07AM -0800, Badhri Jagan Sridharan wrote: >>>>> The USB Communications Capable bit indicates if port >>>>> partner is capable of communication over the USB data lines >>>>> (e.g. D+/- or SS Tx/Rx). Notify the status of the bit to low >>>>> level drivers to perform chip specific operation. >>>>> For instance, low level driver enables USB switches on D+/D- >>>>> lines to set up data path when the bit is set. >>>>> >>>>> Refactored from patch initially authored by >>>>> Kyle Tso <kyletso@xxxxxxxxxx> >>>>> >>>>> Signed-off-by: Badhri Jagan Sridharan <badhri@xxxxxxxxxx> >>>>> --- >>>>> drivers/usb/typec/tcpm/tcpm.c | 16 ++++++++++++++++ >>>>> include/linux/usb/tcpm.h | 5 +++++ >>>>> 2 files changed, 21 insertions(+) >>>> >>>> ... >>>> >>>>> diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h >>>>> index 3af99f85e8b9..42fcfbe10590 100644 >>>>> --- a/include/linux/usb/tcpm.h >>>>> +++ b/include/linux/usb/tcpm.h >>>>> @@ -108,6 +108,10 @@ enum tcpm_transmit_type { >>>>> * is supported by TCPC, set this callback for TCPM to query >>>>> * whether vbus is at VSAFE0V when needed. >>>>> * Returns true when vbus is at VSAFE0V, false otherwise. >>>>> + * @set_partner_usb_comm_capable: >>>>> + * Optional; The USB Communications Capable bit indicates if port >>>>> + * partner is capable of communication over the USB data lines >>>>> + * (e.g. D+/- or SS Tx/Rx). Called to notify the status of the bit. >>>>> */ >>>>> struct tcpc_dev { >>>>> struct fwnode_handle *fwnode; >>>>> @@ -139,6 +143,7 @@ struct tcpc_dev { >>>>> int (*set_auto_vbus_discharge_threshold)(struct tcpc_dev *dev, enum typec_pwr_opmode mode, >>>>> bool pps_active, u32 requested_vbus_voltage); >>>>> bool (*is_vbus_vsafe0v)(struct tcpc_dev *dev); >>>>> + void (*set_partner_usb_comm_capable)(struct tcpc_dev *dev, bool enable); >>>>> }; >>>>> >>>>> struct tcpm_port; >>>> >>>> There start to be a lot of callback there, separate for each function. >>>> And I guess flags too... Would it be possible to have a single >>>> notification callback instead, that would take the type of the >>>> notification as a parameter (we could have an enum for those), and >>>> then the specific object(s) for each type as another paramter (RDO I >>>> guess in this case)? >>>> >>>> It would then be up to the TCPC driver to extract the detail it needs >>>> from that object. That would somehow feel more cleaner to me, but what >>>> do you guys think? >>> >>> It's pretty much the same thing, a "mux" function vs. individual >>> function calls. Personally, individual callbacks are much more >>> explicit, and I think make it easier to determine what is really going >>> on in each driver. >>> >>> But it all does the same thing, if there's going to be loads of >>> callbacks needed, then a single one makes it easier to maintain over >>> time. >>> >>> So it's up to the maintainer what they want to see :) >> >> I understand your point, and I guess a "generic" notification callback >> for all that would not be a good idea. However, right now it looks >> like we are picking individual bits from various PD objects with those >> callbacks, and that does not feel ideal to me either. After all, each of >> those bits has its own flag now, even though the details is just >> extracted from some PD object that we should also have access to. >> >> I think there are ways we can improve this for example by attempting >> to create the notifications per transaction instead of for each >> individual result of those transactions. That way we would not need to >> store the flags at least because we could deliver the entire object >> that was the result of the specific transaction. >> >> So basically, I fear that dealing with these individual bits will in >> many case only serve individual device drivers, and in the worst case >> start making the tcpm.c a bit more difficult to manage if we start to >> have more and more of these bit callbacks. >> >> But on the other hand, I guess we are nowhere near that point, so >> let's forget about this for now. > > If it gets unwieldy, we can always change it in the future, there's no > reason these types of in-kernel apis can not be modified and cleaned up > over time. > Agreed. Thanks, Guenter