Lines Matching full:udc

3  * udc.c - Core UDC Framework
29 * @list: for use by the udc class driver
33 * This represents the internal data structure which is used by the UDC-class
34 * to hold information about udc driver and gadget together.
49 static int udc_bind_to_driver(struct usb_udc *udc,
59 * This function should be used only in UDC drivers to initialize endpoint
101 /* UDC drivers can't handle endpoints with maxpacket size 0 */ in usb_ep_enable()
267 * UDC are finished with the request. When the completion function is called,
705 * for the current gadget driver so that UDC drivers don't need to.
733 gadget->udc->driver->disconnect(gadget); in usb_gadget_disconnect()
1012 struct usb_udc *udc = gadget->udc; in usb_gadget_state_work() local
1014 if (udc) in usb_gadget_state_work()
1015 sysfs_notify(&udc->dev.kobj, NULL, "state"); in usb_gadget_state_work()
1028 static void usb_udc_connect_control(struct usb_udc *udc) in usb_udc_connect_control() argument
1030 if (udc->vbus) in usb_udc_connect_control()
1031 usb_gadget_connect(udc->gadget); in usb_udc_connect_control()
1033 usb_gadget_disconnect(udc->gadget); in usb_udc_connect_control()
1037 * usb_udc_vbus_handler - updates the udc core vbus status, and try to
1042 * The udc driver calls it when it wants to connect or disconnect gadget
1047 struct usb_udc *udc = gadget->udc; in usb_udc_vbus_handler() local
1049 if (udc) { in usb_udc_vbus_handler()
1050 udc->vbus = status; in usb_udc_vbus_handler()
1051 usb_udc_connect_control(udc); in usb_udc_vbus_handler()
1057 * usb_gadget_udc_reset - notifies the udc core that bus reset occurs
1061 * If the udc driver has bus reset handler, it needs to call this when the bus
1075 * @udc: The UDC to be started
1077 * This call is issued by the UDC Class driver when it's about
1086 static inline int usb_gadget_udc_start(struct usb_udc *udc) in usb_gadget_udc_start() argument
1088 return udc->gadget->ops->udc_start(udc->gadget, udc->driver); in usb_gadget_udc_start()
1093 * @udc: The UDC to be stopped
1095 * This call is issued by the UDC Class driver after calling
1099 * far as powering off UDC completely and disable its data
1102 static inline void usb_gadget_udc_stop(struct usb_udc *udc) in usb_gadget_udc_stop() argument
1104 udc->gadget->ops->udc_stop(udc->gadget); in usb_gadget_udc_stop()
1110 * @udc: The device we want to set maximum speed
1113 * This call is issued by the UDC Class driver before calling
1117 static inline void usb_gadget_udc_set_speed(struct usb_udc *udc, in usb_gadget_udc_set_speed() argument
1120 if (udc->gadget->ops->udc_set_speed) { in usb_gadget_udc_set_speed()
1123 s = min(speed, udc->gadget->max_speed); in usb_gadget_udc_set_speed()
1124 udc->gadget->ops->udc_set_speed(udc->gadget, s); in usb_gadget_udc_set_speed()
1137 struct usb_udc *udc; in usb_udc_release() local
1139 udc = container_of(dev, struct usb_udc, dev); in usb_udc_release()
1141 kfree(udc); in usb_udc_release()
1152 static int check_pending_gadget_drivers(struct usb_udc *udc) in check_pending_gadget_drivers() argument
1159 dev_name(&udc->dev)) == 0) { in check_pending_gadget_drivers()
1160 ret = udc_bind_to_driver(udc, driver); in check_pending_gadget_drivers()
1171 * @parent: the parent device to this udc. Usually the controller driver's
1196 * usb_add_gadget - adds a new gadget to the udc class driver list
1204 struct usb_udc *udc; in usb_add_gadget() local
1207 udc = kzalloc(sizeof(*udc), GFP_KERNEL); in usb_add_gadget()
1208 if (!udc) in usb_add_gadget()
1211 device_initialize(&udc->dev); in usb_add_gadget()
1212 udc->dev.release = usb_udc_release; in usb_add_gadget()
1213 udc->dev.class = udc_class; in usb_add_gadget()
1214 udc->dev.groups = usb_udc_attr_groups; in usb_add_gadget()
1215 udc->dev.parent = gadget->dev.parent; in usb_add_gadget()
1216 ret = dev_set_name(&udc->dev, "%s", in usb_add_gadget()
1225 udc->gadget = gadget; in usb_add_gadget()
1226 gadget->udc = udc; in usb_add_gadget()
1229 list_add_tail(&udc->list, &udc_list); in usb_add_gadget()
1231 ret = device_add(&udc->dev); in usb_add_gadget()
1236 udc->vbus = true; in usb_add_gadget()
1239 ret = check_pending_gadget_drivers(udc); in usb_add_gadget()
1249 device_del(&udc->dev); in usb_add_gadget()
1252 list_del(&udc->list); in usb_add_gadget()
1258 put_device(&udc->dev); in usb_add_gadget()
1266 * usb_add_gadget_udc_release - adds a new gadget to the udc class driver list
1267 * @parent: the parent device to this udc. Usually the controller driver's
1289 * usb_get_gadget_udc_name - get the name of the first UDC controller
1290 * This functions returns the name of the first UDC controller in the system.
1292 * assume that there is only one UDC controller in the system and they need to
1293 * get its name before initialization. There is no guarantee that the UDC
1297 * Returns pointer to string with UDC controller name on success, NULL
1302 struct usb_udc *udc; in usb_get_gadget_udc_name() local
1305 /* For now we take the first available UDC */ in usb_get_gadget_udc_name()
1307 list_for_each_entry(udc, &udc_list, list) { in usb_get_gadget_udc_name()
1308 if (!udc->driver) { in usb_get_gadget_udc_name()
1309 name = kstrdup(udc->gadget->name, GFP_KERNEL); in usb_get_gadget_udc_name()
1319 * usb_add_gadget_udc - adds a new gadget to the udc class driver list
1320 * @parent: the parent device to this udc. Usually the controller
1332 static void usb_gadget_remove_driver(struct usb_udc *udc) in usb_gadget_remove_driver() argument
1334 dev_dbg(&udc->dev, "unregistering UDC driver [%s]\n", in usb_gadget_remove_driver()
1335 udc->driver->function); in usb_gadget_remove_driver()
1337 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); in usb_gadget_remove_driver()
1339 usb_gadget_disconnect(udc->gadget); in usb_gadget_remove_driver()
1340 if (udc->gadget->irq) in usb_gadget_remove_driver()
1341 synchronize_irq(udc->gadget->irq); in usb_gadget_remove_driver()
1342 udc->driver->unbind(udc->gadget); in usb_gadget_remove_driver()
1343 usb_gadget_udc_stop(udc); in usb_gadget_remove_driver()
1345 udc->driver = NULL; in usb_gadget_remove_driver()
1346 udc->dev.driver = NULL; in usb_gadget_remove_driver()
1347 udc->gadget->dev.driver = NULL; in usb_gadget_remove_driver()
1351 * usb_del_gadget - deletes @udc from udc_list
1355 * the @udc is still busy.
1360 struct usb_udc *udc = gadget->udc; in usb_del_gadget() local
1362 if (!udc) in usb_del_gadget()
1368 list_del(&udc->list); in usb_del_gadget()
1370 if (udc->driver) { in usb_del_gadget()
1371 struct usb_gadget_driver *driver = udc->driver; in usb_del_gadget()
1373 usb_gadget_remove_driver(udc); in usb_del_gadget()
1378 kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE); in usb_del_gadget()
1380 device_unregister(&udc->dev); in usb_del_gadget()
1386 * usb_del_gadget_udc - deletes @udc from udc_list
1400 static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver) in udc_bind_to_driver() argument
1404 dev_dbg(&udc->dev, "registering UDC driver [%s]\n", in udc_bind_to_driver()
1407 udc->driver = driver; in udc_bind_to_driver()
1408 udc->dev.driver = &driver->driver; in udc_bind_to_driver()
1409 udc->gadget->dev.driver = &driver->driver; in udc_bind_to_driver()
1411 usb_gadget_udc_set_speed(udc, driver->max_speed); in udc_bind_to_driver()
1413 ret = driver->bind(udc->gadget, driver); in udc_bind_to_driver()
1416 ret = usb_gadget_udc_start(udc); in udc_bind_to_driver()
1418 driver->unbind(udc->gadget); in udc_bind_to_driver()
1421 usb_udc_connect_control(udc); in udc_bind_to_driver()
1423 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); in udc_bind_to_driver()
1427 dev_err(&udc->dev, "failed to start %s: %d\n", in udc_bind_to_driver()
1428 udc->driver->function, ret); in udc_bind_to_driver()
1429 udc->driver = NULL; in udc_bind_to_driver()
1430 udc->dev.driver = NULL; in udc_bind_to_driver()
1431 udc->gadget->dev.driver = NULL; in udc_bind_to_driver()
1437 struct usb_udc *udc = NULL; in usb_gadget_probe_driver() local
1445 list_for_each_entry(udc, &udc_list, list) { in usb_gadget_probe_driver()
1446 ret = strcmp(driver->udc_name, dev_name(&udc->dev)); in usb_gadget_probe_driver()
1452 else if (udc->driver) in usb_gadget_probe_driver()
1457 list_for_each_entry(udc, &udc_list, list) { in usb_gadget_probe_driver()
1459 if (!udc->driver) in usb_gadget_probe_driver()
1466 pr_info("udc-core: couldn't find an available UDC - added [%s] to list of pending drivers\n", in usb_gadget_probe_driver()
1473 pr_warn("udc-core: couldn't find an available UDC or it's busy\n"); in usb_gadget_probe_driver()
1476 ret = udc_bind_to_driver(udc, driver); in usb_gadget_probe_driver()
1484 struct usb_udc *udc = NULL; in usb_gadget_unregister_driver() local
1491 list_for_each_entry(udc, &udc_list, list) { in usb_gadget_unregister_driver()
1492 if (udc->driver == driver) { in usb_gadget_unregister_driver()
1493 usb_gadget_remove_driver(udc); in usb_gadget_unregister_driver()
1494 usb_gadget_set_state(udc->gadget, in usb_gadget_unregister_driver()
1497 /* Maybe there is someone waiting for this UDC? */ in usb_gadget_unregister_driver()
1498 check_pending_gadget_drivers(udc); in usb_gadget_unregister_driver()
1522 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); in srp_store() local
1525 usb_gadget_wakeup(udc->gadget); in srp_store()
1534 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); in soft_connect_store() local
1536 if (!udc->driver) { in soft_connect_store()
1542 usb_gadget_udc_start(udc); in soft_connect_store()
1543 usb_gadget_connect(udc->gadget); in soft_connect_store()
1545 usb_gadget_disconnect(udc->gadget); in soft_connect_store()
1546 usb_gadget_udc_stop(udc); in soft_connect_store()
1559 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); in state_show() local
1560 struct usb_gadget *gadget = udc->gadget; in state_show()
1569 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); in function_show() local
1570 struct usb_gadget_driver *drv = udc->driver; in function_show()
1582 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
1584 usb_speed_string(udc->gadget->param)); \
1595 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
1596 struct usb_gadget *gadget = udc->gadget; \
1637 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); in usb_udc_uevent() local
1640 ret = add_uevent_var(env, "USB_UDC_NAME=%s", udc->gadget->name); in usb_udc_uevent()
1646 if (udc->driver) { in usb_udc_uevent()
1648 udc->driver->function); in usb_udc_uevent()
1660 udc_class = class_create(THIS_MODULE, "udc"); in usb_udc_init()
1662 pr_err("failed to create udc class --> %ld\n", in usb_udc_init()
1678 MODULE_DESCRIPTION("UDC Framework");