23
23
24
24
#include "trace.h"
25
25
26
+ static struct bus_type gadget_bus_type ;
27
+
26
28
/**
27
29
* struct usb_udc - describes one usb device controller
28
30
* @driver: the gadget driver pointer. For use by the class code
@@ -47,11 +49,9 @@ struct usb_udc {
47
49
48
50
static struct class * udc_class ;
49
51
static LIST_HEAD (udc_list );
50
- static LIST_HEAD (gadget_driver_pending_list );
51
- static DEFINE_MUTEX (udc_lock );
52
52
53
- static int udc_bind_to_driver ( struct usb_udc * udc ,
54
- struct usb_gadget_driver * driver );
53
+ /* Protects udc_list, udc->driver, driver->is_bound, and related calls */
54
+ static DEFINE_MUTEX ( udc_lock );
55
55
56
56
/* ------------------------------------------------------------------------- */
57
57
@@ -1238,24 +1238,6 @@ static void usb_udc_nop_release(struct device *dev)
1238
1238
dev_vdbg (dev , "%s\n" , __func__ );
1239
1239
}
1240
1240
1241
- /* should be called with udc_lock held */
1242
- static int check_pending_gadget_drivers (struct usb_udc * udc )
1243
- {
1244
- struct usb_gadget_driver * driver ;
1245
- int ret = 0 ;
1246
-
1247
- list_for_each_entry (driver , & gadget_driver_pending_list , pending )
1248
- if (!driver -> udc_name || strcmp (driver -> udc_name ,
1249
- dev_name (& udc -> dev )) == 0 ) {
1250
- ret = udc_bind_to_driver (udc , driver );
1251
- if (ret != - EPROBE_DEFER )
1252
- list_del_init (& driver -> pending );
1253
- break ;
1254
- }
1255
-
1256
- return ret ;
1257
- }
1258
-
1259
1241
/**
1260
1242
* usb_initialize_gadget - initialize a gadget and its embedded struct device
1261
1243
* @parent: the parent device to this udc. Usually the controller driver's
@@ -1276,6 +1258,7 @@ void usb_initialize_gadget(struct device *parent, struct usb_gadget *gadget,
1276
1258
gadget -> dev .release = usb_udc_nop_release ;
1277
1259
1278
1260
device_initialize (& gadget -> dev );
1261
+ gadget -> dev .bus = & gadget_bus_type ;
1279
1262
}
1280
1263
EXPORT_SYMBOL_GPL (usb_initialize_gadget );
1281
1264
@@ -1312,6 +1295,7 @@ int usb_add_gadget(struct usb_gadget *gadget)
1312
1295
1313
1296
mutex_lock (& udc_lock );
1314
1297
list_add_tail (& udc -> list , & udc_list );
1298
+ mutex_unlock (& udc_lock );
1315
1299
1316
1300
ret = device_add (& udc -> dev );
1317
1301
if (ret )
@@ -1324,23 +1308,14 @@ int usb_add_gadget(struct usb_gadget *gadget)
1324
1308
if (ret )
1325
1309
goto err_del_udc ;
1326
1310
1327
- /* pick up one of pending gadget drivers */
1328
- ret = check_pending_gadget_drivers (udc );
1329
- if (ret )
1330
- goto err_del_gadget ;
1331
-
1332
- mutex_unlock (& udc_lock );
1333
-
1334
1311
return 0 ;
1335
1312
1336
- err_del_gadget :
1337
- device_del (& gadget -> dev );
1338
-
1339
1313
err_del_udc :
1340
1314
flush_work (& gadget -> work );
1341
1315
device_del (& udc -> dev );
1342
1316
1343
1317
err_unlist_udc :
1318
+ mutex_lock (& udc_lock );
1344
1319
list_del (& udc -> list );
1345
1320
mutex_unlock (& udc_lock );
1346
1321
@@ -1419,24 +1394,6 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
1419
1394
}
1420
1395
EXPORT_SYMBOL_GPL (usb_add_gadget_udc );
1421
1396
1422
- static void usb_gadget_remove_driver (struct usb_udc * udc )
1423
- {
1424
- dev_dbg (& udc -> dev , "unregistering UDC driver [%s]\n" ,
1425
- udc -> driver -> function );
1426
-
1427
- kobject_uevent (& udc -> dev .kobj , KOBJ_CHANGE );
1428
-
1429
- usb_gadget_disconnect (udc -> gadget );
1430
- usb_gadget_disable_async_callbacks (udc );
1431
- if (udc -> gadget -> irq )
1432
- synchronize_irq (udc -> gadget -> irq );
1433
- udc -> driver -> unbind (udc -> gadget );
1434
- usb_gadget_udc_stop (udc );
1435
-
1436
- udc -> driver = NULL ;
1437
- udc -> gadget -> dev .driver = NULL ;
1438
- }
1439
-
1440
1397
/**
1441
1398
* usb_del_gadget - deletes a gadget and unregisters its udc
1442
1399
* @gadget: the gadget to be deleted.
@@ -1455,13 +1412,6 @@ void usb_del_gadget(struct usb_gadget *gadget)
1455
1412
1456
1413
mutex_lock (& udc_lock );
1457
1414
list_del (& udc -> list );
1458
-
1459
- if (udc -> driver ) {
1460
- struct usb_gadget_driver * driver = udc -> driver ;
1461
-
1462
- usb_gadget_remove_driver (udc );
1463
- list_add (& driver -> pending , & gadget_driver_pending_list );
1464
- }
1465
1415
mutex_unlock (& udc_lock );
1466
1416
1467
1417
kobject_uevent (& udc -> dev .kobj , KOBJ_REMOVE );
@@ -1486,123 +1436,147 @@ EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
1486
1436
1487
1437
/* ------------------------------------------------------------------------- */
1488
1438
1489
- static int udc_bind_to_driver (struct usb_udc * udc , struct usb_gadget_driver * driver )
1439
+ static int gadget_match_driver (struct device * dev , struct device_driver * drv )
1490
1440
{
1491
- int ret ;
1441
+ struct usb_gadget * gadget = dev_to_usb_gadget (dev );
1442
+ struct usb_udc * udc = gadget -> udc ;
1443
+ struct usb_gadget_driver * driver = container_of (drv ,
1444
+ struct usb_gadget_driver , driver );
1445
+
1446
+ /* If the driver specifies a udc_name, it must match the UDC's name */
1447
+ if (driver -> udc_name &&
1448
+ strcmp (driver -> udc_name , dev_name (& udc -> dev )) != 0 )
1449
+ return 0 ;
1450
+
1451
+ /* If the driver is already bound to a gadget, it doesn't match */
1452
+ if (driver -> is_bound )
1453
+ return 0 ;
1454
+
1455
+ /* Otherwise any gadget driver matches any UDC */
1456
+ return 1 ;
1457
+ }
1492
1458
1493
- dev_dbg (& udc -> dev , "registering UDC driver [%s]\n" ,
1494
- driver -> function );
1459
+ static int gadget_bind_driver (struct device * dev )
1460
+ {
1461
+ struct usb_gadget * gadget = dev_to_usb_gadget (dev );
1462
+ struct usb_udc * udc = gadget -> udc ;
1463
+ struct usb_gadget_driver * driver = container_of (dev -> driver ,
1464
+ struct usb_gadget_driver , driver );
1465
+ int ret = 0 ;
1495
1466
1467
+ mutex_lock (& udc_lock );
1468
+ if (driver -> is_bound ) {
1469
+ mutex_unlock (& udc_lock );
1470
+ return - ENXIO ; /* Driver binds to only one gadget */
1471
+ }
1472
+ driver -> is_bound = true;
1496
1473
udc -> driver = driver ;
1497
- udc -> gadget -> dev .driver = & driver -> driver ;
1474
+ mutex_unlock (& udc_lock );
1475
+
1476
+ dev_dbg (& udc -> dev , "binding gadget driver [%s]\n" , driver -> function );
1498
1477
1499
1478
usb_gadget_udc_set_speed (udc , driver -> max_speed );
1500
1479
1480
+ mutex_lock (& udc_lock );
1501
1481
ret = driver -> bind (udc -> gadget , driver );
1502
1482
if (ret )
1503
- goto err1 ;
1483
+ goto err_bind ;
1484
+
1504
1485
ret = usb_gadget_udc_start (udc );
1505
- if (ret ) {
1506
- driver -> unbind (udc -> gadget );
1507
- goto err1 ;
1508
- }
1486
+ if (ret )
1487
+ goto err_start ;
1509
1488
usb_gadget_enable_async_callbacks (udc );
1510
1489
usb_udc_connect_control (udc );
1490
+ mutex_unlock (& udc_lock );
1511
1491
1512
1492
kobject_uevent (& udc -> dev .kobj , KOBJ_CHANGE );
1513
1493
return 0 ;
1514
- err1 :
1494
+
1495
+ err_start :
1496
+ driver -> unbind (udc -> gadget );
1497
+
1498
+ err_bind :
1515
1499
if (ret != - EISNAM )
1516
1500
dev_err (& udc -> dev , "failed to start %s: %d\n" ,
1517
- udc -> driver -> function , ret );
1501
+ driver -> function , ret );
1502
+
1518
1503
udc -> driver = NULL ;
1519
- udc -> gadget -> dev .driver = NULL ;
1504
+ driver -> is_bound = false;
1505
+ mutex_unlock (& udc_lock );
1506
+
1520
1507
return ret ;
1521
1508
}
1522
1509
1523
- int usb_gadget_register_driver (struct usb_gadget_driver * driver )
1510
+ static void gadget_unbind_driver (struct device * dev )
1511
+ {
1512
+ struct usb_gadget * gadget = dev_to_usb_gadget (dev );
1513
+ struct usb_udc * udc = gadget -> udc ;
1514
+ struct usb_gadget_driver * driver = udc -> driver ;
1515
+
1516
+ dev_dbg (& udc -> dev , "unbinding gadget driver [%s]\n" , driver -> function );
1517
+
1518
+ kobject_uevent (& udc -> dev .kobj , KOBJ_CHANGE );
1519
+
1520
+ mutex_lock (& udc_lock );
1521
+ usb_gadget_disconnect (gadget );
1522
+ usb_gadget_disable_async_callbacks (udc );
1523
+ if (gadget -> irq )
1524
+ synchronize_irq (gadget -> irq );
1525
+ udc -> driver -> unbind (gadget );
1526
+ usb_gadget_udc_stop (udc );
1527
+
1528
+ driver -> is_bound = false;
1529
+ udc -> driver = NULL ;
1530
+ mutex_unlock (& udc_lock );
1531
+ }
1532
+
1533
+ /* ------------------------------------------------------------------------- */
1534
+
1535
+ int usb_gadget_register_driver_owner (struct usb_gadget_driver * driver ,
1536
+ struct module * owner , const char * mod_name )
1524
1537
{
1525
- struct usb_udc * udc = NULL , * iter ;
1526
- int ret = - ENODEV ;
1538
+ int ret ;
1527
1539
1528
1540
if (!driver || !driver -> bind || !driver -> setup )
1529
1541
return - EINVAL ;
1530
1542
1543
+ driver -> driver .bus = & gadget_bus_type ;
1544
+ driver -> driver .owner = owner ;
1545
+ driver -> driver .mod_name = mod_name ;
1546
+ ret = driver_register (& driver -> driver );
1547
+ if (ret ) {
1548
+ pr_warn ("%s: driver registration failed: %d\n" ,
1549
+ driver -> function , ret );
1550
+ return ret ;
1551
+ }
1552
+
1531
1553
mutex_lock (& udc_lock );
1532
- if (driver -> udc_name ) {
1533
- list_for_each_entry (iter , & udc_list , list ) {
1534
- ret = strcmp (driver -> udc_name , dev_name (& iter -> dev ));
1535
- if (ret )
1536
- continue ;
1537
- udc = iter ;
1538
- break ;
1539
- }
1540
- if (ret )
1541
- ret = - ENODEV ;
1542
- else if (udc -> driver )
1554
+ if (!driver -> is_bound ) {
1555
+ if (driver -> match_existing_only ) {
1556
+ pr_warn ("%s: couldn't find an available UDC or it's busy\n" ,
1557
+ driver -> function );
1543
1558
ret = - EBUSY ;
1544
- else
1545
- goto found ;
1546
- } else {
1547
- list_for_each_entry (iter , & udc_list , list ) {
1548
- /* For now we take the first one */
1549
- if (iter -> driver )
1550
- continue ;
1551
- udc = iter ;
1552
- goto found ;
1559
+ } else {
1560
+ pr_info ("%s: couldn't find an available UDC\n" ,
1561
+ driver -> function );
1553
1562
}
1554
- }
1555
-
1556
- if (!driver -> match_existing_only ) {
1557
- list_add_tail (& driver -> pending , & gadget_driver_pending_list );
1558
- pr_info ("couldn't find an available UDC - added [%s] to list of pending drivers\n" ,
1559
- driver -> function );
1560
1563
ret = 0 ;
1561
1564
}
1562
-
1563
1565
mutex_unlock (& udc_lock );
1566
+
1564
1567
if (ret )
1565
- pr_warn ("couldn't find an available UDC or it's busy: %d\n" , ret );
1566
- return ret ;
1567
- found :
1568
- ret = udc_bind_to_driver (udc , driver );
1569
- mutex_unlock (& udc_lock );
1568
+ driver_unregister (& driver -> driver );
1570
1569
return ret ;
1571
1570
}
1572
- EXPORT_SYMBOL_GPL (usb_gadget_register_driver );
1571
+ EXPORT_SYMBOL_GPL (usb_gadget_register_driver_owner );
1573
1572
1574
1573
int usb_gadget_unregister_driver (struct usb_gadget_driver * driver )
1575
1574
{
1576
- struct usb_udc * udc = NULL ;
1577
- int ret = - ENODEV ;
1578
-
1579
1575
if (!driver || !driver -> unbind )
1580
1576
return - EINVAL ;
1581
1577
1582
- mutex_lock (& udc_lock );
1583
- list_for_each_entry (udc , & udc_list , list ) {
1584
- if (udc -> driver == driver ) {
1585
- usb_gadget_remove_driver (udc );
1586
- usb_gadget_set_state (udc -> gadget ,
1587
- USB_STATE_NOTATTACHED );
1588
-
1589
- /* Maybe there is someone waiting for this UDC? */
1590
- check_pending_gadget_drivers (udc );
1591
- /*
1592
- * For now we ignore bind errors as probably it's
1593
- * not a valid reason to fail other's gadget unbind
1594
- */
1595
- ret = 0 ;
1596
- break ;
1597
- }
1598
- }
1599
-
1600
- if (ret ) {
1601
- list_del (& driver -> pending );
1602
- ret = 0 ;
1603
- }
1604
- mutex_unlock (& udc_lock );
1605
- return ret ;
1578
+ driver_unregister (& driver -> driver );
1579
+ return 0 ;
1606
1580
}
1607
1581
EXPORT_SYMBOL_GPL (usb_gadget_unregister_driver );
1608
1582
@@ -1754,8 +1728,17 @@ static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env)
1754
1728
return 0 ;
1755
1729
}
1756
1730
1731
+ static struct bus_type gadget_bus_type = {
1732
+ .name = "gadget" ,
1733
+ .probe = gadget_bind_driver ,
1734
+ .remove = gadget_unbind_driver ,
1735
+ .match = gadget_match_driver ,
1736
+ };
1737
+
1757
1738
static int __init usb_udc_init (void )
1758
1739
{
1740
+ int rc ;
1741
+
1759
1742
udc_class = class_create (THIS_MODULE , "udc" );
1760
1743
if (IS_ERR (udc_class )) {
1761
1744
pr_err ("failed to create udc class --> %ld\n" ,
@@ -1764,12 +1747,17 @@ static int __init usb_udc_init(void)
1764
1747
}
1765
1748
1766
1749
udc_class -> dev_uevent = usb_udc_uevent ;
1767
- return 0 ;
1750
+
1751
+ rc = bus_register (& gadget_bus_type );
1752
+ if (rc )
1753
+ class_destroy (udc_class );
1754
+ return rc ;
1768
1755
}
1769
1756
subsys_initcall (usb_udc_init );
1770
1757
1771
1758
static void __exit usb_udc_exit (void )
1772
1759
{
1760
+ bus_unregister (& gadget_bus_type );
1773
1761
class_destroy (udc_class );
1774
1762
}
1775
1763
module_exit (usb_udc_exit );
0 commit comments