Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1263829 authored by Jack Pham's avatar Jack Pham Committed by Gerrit - the friendly Code Review server
Browse files

usb: phy: dual-role: update sysfs attrs when changed



dual_role_instance_changed() is called by drivers when updating
the state of the dual_role port device. In some cases a driver
may wish to dynamically update the visibility, in particular the
write permissions of some of its attributes. For instance,
'data_role' and 'power_role' can be writeable if they can be
changed independently, as in the case of a USB PD capable device,
but may need to be set back to non-writeable when a non-PD device
is attached.

Add a call to sysfs_update_group() in dual_role_changed_work()
which updates the attributes by calling the .is_visible() callback
again, which in turn calls dual_role_property_is_writeable() to
re-check whether write permission should be set or not. Move
dual_role_changed_work() toward the end of the file as it now
needs the definition of dual_role_attr_group.

Change-Id: Ie58b37b63f052aced24db00b91e87deff9ffed7e
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 285dbc85
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -70,15 +70,7 @@ static char *kstrdupcase(const char *str, gfp_t gfp, bool to_upper)
	return ret;
}

static void dual_role_changed_work(struct work_struct *work)
{
	struct dual_role_phy_instance *dual_role =
	    container_of(work, struct dual_role_phy_instance,
			 changed_work);

	dev_dbg(&dual_role->dev, "%s\n", __func__);
	kobject_uevent(&dual_role->dev.kobj, KOBJ_CHANGE);
}
static void dual_role_changed_work(struct work_struct *work);

void dual_role_instance_changed(struct dual_role_phy_instance *dual_role)
{
@@ -505,6 +497,17 @@ int dual_role_uevent(struct device *dev, struct kobj_uevent_env *env)
	return ret;
}

static void dual_role_changed_work(struct work_struct *work)
{
	struct dual_role_phy_instance *dual_role =
	    container_of(work, struct dual_role_phy_instance,
			 changed_work);

	dev_dbg(&dual_role->dev, "%s\n", __func__);
	sysfs_update_group(&dual_role->dev.kobj, &dual_role_attr_group);
	kobject_uevent(&dual_role->dev.kobj, KOBJ_CHANGE);
}

/******************* Module Init ***********************************/

static int __init dual_role_class_init(void)