usb: typec: Add typec_partner_set_pd_revision
The partner's PD revision may be resolved later than the port partner registration since the port partner creation may take place once Type-C detects the port has changed state, but before PD communication is completed. Add a setter so that the partner's PD revision can be attached to it once it becomes available. If the revision is set to a valid version (not 0), the setter will also refresh the partner's usb_pd flag and notify on "supports_usb_power_delivery" sysfs property as well. Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Benson Leung <bleung@chromium.org> Link: https://lore.kernel.org/r/20210129061406.2680146-4-bleung@chromium.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f5030e2526
commit
29b01295a8
2 changed files with 31 additions and 0 deletions
|
@ -748,6 +748,36 @@ int typec_partner_set_identity(struct typec_partner *partner)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(typec_partner_set_identity);
|
EXPORT_SYMBOL_GPL(typec_partner_set_identity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* typec_partner_set_pd_revision - Set the PD revision supported by the partner
|
||||||
|
* @partner: The partner to be updated.
|
||||||
|
* @pd_revision: USB Power Delivery Specification Revision supported by partner
|
||||||
|
*
|
||||||
|
* This routine is used to report that the PD revision of the port partner has
|
||||||
|
* become available.
|
||||||
|
*
|
||||||
|
* Returns 0 on success or negative error number on failure.
|
||||||
|
*/
|
||||||
|
int typec_partner_set_pd_revision(struct typec_partner *partner, u16 pd_revision)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (partner->pd_revision == pd_revision)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
partner->pd_revision = pd_revision;
|
||||||
|
sysfs_notify(&partner->dev.kobj, NULL, "usb_power_delivery_revision");
|
||||||
|
if (pd_revision != 0 && !partner->usb_pd) {
|
||||||
|
partner->usb_pd = 1;
|
||||||
|
sysfs_notify(&partner->dev.kobj, NULL,
|
||||||
|
"supports_usb_power_delivery");
|
||||||
|
}
|
||||||
|
kobject_uevent(&partner->dev.kobj, KOBJ_CHANGE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(typec_partner_set_pd_revision);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* typec_partner_set_num_altmodes - Set the number of available partner altmodes
|
* typec_partner_set_num_altmodes - Set the number of available partner altmodes
|
||||||
* @partner: The partner to be updated.
|
* @partner: The partner to be updated.
|
||||||
|
|
|
@ -126,6 +126,7 @@ struct typec_altmode_desc {
|
||||||
enum typec_port_data roles;
|
enum typec_port_data roles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int typec_partner_set_pd_revision(struct typec_partner *partner, u16 pd_revision);
|
||||||
int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmodes);
|
int typec_partner_set_num_altmodes(struct typec_partner *partner, int num_altmodes);
|
||||||
struct typec_altmode
|
struct typec_altmode
|
||||||
*typec_partner_register_altmode(struct typec_partner *partner,
|
*typec_partner_register_altmode(struct typec_partner *partner,
|
||||||
|
|
Loading…
Add table
Reference in a new issue