Re: [PATCH v1 1/3] usb: typec: tcpm: Add Callback to Usb Communication capable partner

From: Guenter Roeck
Date: Mon Feb 01 2021 - 14:48:20 EST


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