On Thu, Sep 28, 2023 at 01:59:44PM +0300, Heikki Krogerus wrote: > Exposing the value of the field as is. > > The Peak Current value has to be interpreted as described > in Table 6-10 (Fixed Power Source Peak Current Capability) > of the USB Power Delivery Specification, but that > interpretation will be done in user space, not in kernel. > > Suggested-by: Douglas Gilbert <dgilbert@xxxxxxxxxxxx> > Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > v2: Include ABI documentation. > > --- > .../testing/sysfs-class-usb_power_delivery | 31 +++++++++++++++++++ > drivers/usb/typec/pd.c | 10 +++--- > include/linux/usb/pd.h | 1 + > 3 files changed, 36 insertions(+), 6 deletions(-) > > diff --git a/Documentation/ABI/testing/sysfs-class-usb_power_delivery b/Documentation/ABI/testing/sysfs-class-usb_power_delivery > index 1bf9d1d7902c..4b0708af4a41 100644 > --- a/Documentation/ABI/testing/sysfs-class-usb_power_delivery > +++ b/Documentation/ABI/testing/sysfs-class-usb_power_delivery > @@ -124,6 +124,37 @@ Contact: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > Description: > The voltage the supply supports in millivolts. > > +What: /sys/class/usb_power_delivery/.../source-capabilities/<position>:fixed_supply/peak_current > +Date: October 2023 > +Contact: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > +Description: > + Fixed Power Source Peak Current Capability > + (IOC: Negotiated current as defined in IEC 63002): > + == =========================================================== > + 0 Peak current equals IOC (default) > + 1 Overload Capabilities: > + 1. Peak current equals 150% IOC for 1ms @ 5% duty cycle > + (low current equals 97% IOC for 19ms) > + 2. Peak current equals 125% IOC for 2ms @ 10% duty cycle > + (low current equals 97% IOC for 18ms) > + 3. Peak current equals 110% IOC for 10ms @ 50% duty cycle > + (low current equals 90% IOC for 10ms) > + 2 Overload Capabilities: > + 1. Peak current equals 200% IOC for 1ms @ 5% duty cycle > + (low current equals 95% IOC for 19ms) > + 2. Peak current equals 150% IOC for 2ms @ 10% duty cycle > + (low current equals 94% IOC for 18ms) > + 3. Peak current equals 125% IOC for 10ms @ 50% duty cycle > + (low current equals 75% IOC for 10ms) > + 3 Overload Capabilities: > + 1. Peak current equals 200% IOC for 1ms @ 5% duty cycle > + (low current equals 95% IOC for 19ms) > + 2. Peak current equals 175% IOC for 2ms @ 10% duty cycle > + (low current equals 92% IOC for 18ms) > + 3. Peak current equals 150% IOC for 10ms @ 50% duty cycle > + (low current equals 50% IOC for 10ms) > + == =========================================================== > + > What: /sys/class/usb_power_delivery/.../source-capabilities/<position>:fixed_supply/maximum_current > Date: May 2022 > Contact: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > diff --git a/drivers/usb/typec/pd.c b/drivers/usb/typec/pd.c > index 8cc66e4467c4..85d015cdbe1f 100644 > --- a/drivers/usb/typec/pd.c > +++ b/drivers/usb/typec/pd.c > @@ -83,14 +83,12 @@ unchunked_extended_messages_supported_show(struct device *dev, > } > static DEVICE_ATTR_RO(unchunked_extended_messages_supported); > > -/* > - * REVISIT: Peak Current requires access also to the RDO. > static ssize_t > peak_current_show(struct device *dev, struct device_attribute *attr, char *buf) > { > - ... > + return sysfs_emit(buf, "%u\n", (to_pdo(dev)->pdo >> PDO_FIXED_PEAK_CURR_SHIFT) & 3); > } > -*/ > +static DEVICE_ATTR_RO(peak_current); > > static ssize_t > fast_role_swap_current_show(struct device *dev, struct device_attribute *attr, char *buf) > @@ -135,7 +133,7 @@ static struct attribute *source_fixed_supply_attrs[] = { > &dev_attr_usb_communication_capable.attr, > &dev_attr_dual_role_data.attr, > &dev_attr_unchunked_extended_messages_supported.attr, > - /*&dev_attr_peak_current.attr,*/ > + &dev_attr_peak_current.attr, > &dev_attr_voltage.attr, > &maximum_current_attr.attr, > NULL > @@ -144,7 +142,7 @@ static struct attribute *source_fixed_supply_attrs[] = { > static umode_t fixed_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n) > { > if (to_pdo(kobj_to_dev(kobj))->object_position && > - /*attr != &dev_attr_peak_current.attr &&*/ > + attr != &dev_attr_peak_current.attr && > attr != &dev_attr_voltage.attr && > attr != &maximum_current_attr.attr && > attr != &operational_current_attr.attr) > diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h > index c59fb79a42e8..eb626af0e4e7 100644 > --- a/include/linux/usb/pd.h > +++ b/include/linux/usb/pd.h > @@ -228,6 +228,7 @@ enum pd_pdo_type { > #define PDO_FIXED_UNCHUNK_EXT BIT(24) /* Unchunked Extended Message supported (Source) */ > #define PDO_FIXED_FRS_CURR_MASK (BIT(24) | BIT(23)) /* FR_Swap Current (Sink) */ > #define PDO_FIXED_FRS_CURR_SHIFT 23 > +#define PDO_FIXED_PEAK_CURR_SHIFT 20 > #define PDO_FIXED_VOLT_SHIFT 10 /* 50mV units */ > #define PDO_FIXED_CURR_SHIFT 0 /* 10mA units */ > > -- > 2.40.1 >