Lines Matching +full:usb +full:- +full:switch
1 // SPDX-License-Identifier: GPL-2.0
3 * USB Role Switch Support
10 #include <linux/usb/role.h>
37 * usb_role_switch_set_role - Set USB role for a switch
38 * @sw: USB role switch
39 * @role: USB role to be switched to
41 * Set USB role @role for @sw.
50 mutex_lock(&sw->lock); in usb_role_switch_set_role()
52 ret = sw->set(sw, role); in usb_role_switch_set_role()
54 sw->role = role; in usb_role_switch_set_role()
55 kobject_uevent(&sw->dev.kobj, KOBJ_CHANGE); in usb_role_switch_set_role()
58 mutex_unlock(&sw->lock); in usb_role_switch_set_role()
65 * usb_role_switch_get_role - Get the USB role for a switch
66 * @sw: USB role switch
68 * Depending on the role-switch-driver this function returns either a cached
78 mutex_lock(&sw->lock); in usb_role_switch_get_role()
80 if (sw->get) in usb_role_switch_get_role()
81 role = sw->get(sw); in usb_role_switch_get_role()
83 role = sw->role; in usb_role_switch_get_role()
85 mutex_unlock(&sw->lock); in usb_role_switch_get_role()
101 return dev ? to_role_switch(dev) : ERR_PTR(-EPROBE_DEFER); in usb_role_switch_match()
110 if (!fwnode_property_present(parent, "usb-role-switch")) { in usb_role_switch_is_parent()
117 return dev ? to_role_switch(dev) : ERR_PTR(-EPROBE_DEFER); in usb_role_switch_is_parent()
121 * usb_role_switch_get - Find USB role switch linked with the caller
124 * Finds and returns role switch linked with @dev. The reference count for the
125 * found switch is incremented.
133 sw = device_connection_find_match(dev, "usb-role-switch", NULL, in usb_role_switch_get()
137 WARN_ON(!try_module_get(sw->module)); in usb_role_switch_get()
144 * fwnode_usb_role_switch_get - Find USB role switch linked with the caller
148 * the switch using fwnode instead of device entry.
156 sw = fwnode_connection_find_match(fwnode, "usb-role-switch", in fwnode_usb_role_switch_get()
159 WARN_ON(!try_module_get(sw->module)); in fwnode_usb_role_switch_get()
166 * usb_role_switch_put - Release handle to a switch
167 * @sw: USB Role Switch
174 module_put(sw->module); in usb_role_switch_put()
175 put_device(&sw->dev); in usb_role_switch_put()
181 * usb_role_switch_find_by_fwnode - Find USB role switch with its fwnode
182 * @fwnode: fwnode of the USB Role Switch
184 * Finds and returns role switch with @fwnode. The reference count for the
185 * found switch is incremented.
199 WARN_ON(!try_module_get(sw->module)); in usb_role_switch_find_by_fwnode()
212 if (sw->allow_userspace_control) in usb_role_switch_is_visible()
213 return attr->mode; in usb_role_switch_is_visible()
243 /* Extra check if the user wants to disable the switch */ in role_store()
246 return -EINVAL; in role_store()
299 * usb_role_switch_register - Register USB Role Switch
300 * @parent: Parent device for the switch
301 * @desc: Description of the switch
303 * USB Role Switch is a device capable or choosing the role for USB connector.
304 * On platforms where the USB controller is dual-role capable, the controller
305 * driver will need to register the switch. On platforms where the USB host and
306 * USB device controllers behind the connector are separate, there will be a
307 * mux, and the driver for that mux will need to register the switch.
309 * Returns handle to a new role switch or ERR_PTR. The content of @desc is
319 if (!desc || !desc->set) in usb_role_switch_register()
320 return ERR_PTR(-EINVAL); in usb_role_switch_register()
324 return ERR_PTR(-ENOMEM); in usb_role_switch_register()
326 mutex_init(&sw->lock); in usb_role_switch_register()
328 sw->allow_userspace_control = desc->allow_userspace_control; in usb_role_switch_register()
329 sw->usb2_port = desc->usb2_port; in usb_role_switch_register()
330 sw->usb3_port = desc->usb3_port; in usb_role_switch_register()
331 sw->udc = desc->udc; in usb_role_switch_register()
332 sw->set = desc->set; in usb_role_switch_register()
333 sw->get = desc->get; in usb_role_switch_register()
335 sw->module = parent->driver->owner; in usb_role_switch_register()
336 sw->dev.parent = parent; in usb_role_switch_register()
337 sw->dev.fwnode = desc->fwnode; in usb_role_switch_register()
338 sw->dev.class = role_class; in usb_role_switch_register()
339 sw->dev.type = &usb_role_dev_type; in usb_role_switch_register()
340 dev_set_drvdata(&sw->dev, desc->driver_data); in usb_role_switch_register()
341 dev_set_name(&sw->dev, "%s-role-switch", in usb_role_switch_register()
342 desc->name ? desc->name : dev_name(parent)); in usb_role_switch_register()
344 ret = device_register(&sw->dev); in usb_role_switch_register()
346 put_device(&sw->dev); in usb_role_switch_register()
357 * usb_role_switch_unregister - Unregsiter USB Role Switch
358 * @sw: USB Role Switch
360 * Unregister switch that was registered with usb_role_switch_register().
365 device_unregister(&sw->dev); in usb_role_switch_unregister()
370 * usb_role_switch_set_drvdata - Assign private data pointer to a switch
371 * @sw: USB Role Switch
376 dev_set_drvdata(&sw->dev, data); in usb_role_switch_set_drvdata()
381 * usb_role_switch_get_drvdata - Get the private data pointer of a switch
382 * @sw: USB Role Switch
386 return dev_get_drvdata(&sw->dev); in usb_role_switch_get_drvdata()
406 MODULE_DESCRIPTION("USB Role Class");