@@ -45,6 +45,10 @@ static bool i8042_unlock;
45
45
module_param_named (unlock , i8042_unlock , bool , 0 );
46
46
MODULE_PARM_DESC (unlock , "Ignore keyboard lock." );
47
47
48
+ static bool i8042_probe_defer ;
49
+ module_param_named (probe_defer , i8042_probe_defer , bool , 0 );
50
+ MODULE_PARM_DESC (probe_defer , "Allow deferred probing." );
51
+
48
52
enum i8042_controller_reset_mode {
49
53
I8042_RESET_NEVER ,
50
54
I8042_RESET_ALWAYS ,
@@ -711,7 +715,7 @@ static int i8042_set_mux_mode(bool multiplex, unsigned char *mux_version)
711
715
* LCS/Telegraphics.
712
716
*/
713
717
714
- static int __init i8042_check_mux (void )
718
+ static int i8042_check_mux (void )
715
719
{
716
720
unsigned char mux_version ;
717
721
@@ -740,10 +744,10 @@ static int __init i8042_check_mux(void)
740
744
/*
741
745
* The following is used to test AUX IRQ delivery.
742
746
*/
743
- static struct completion i8042_aux_irq_delivered __initdata ;
744
- static bool i8042_irq_being_tested __initdata ;
747
+ static struct completion i8042_aux_irq_delivered ;
748
+ static bool i8042_irq_being_tested ;
745
749
746
- static irqreturn_t __init i8042_aux_test_irq (int irq , void * dev_id )
750
+ static irqreturn_t i8042_aux_test_irq (int irq , void * dev_id )
747
751
{
748
752
unsigned long flags ;
749
753
unsigned char str , data ;
@@ -770,7 +774,7 @@ static irqreturn_t __init i8042_aux_test_irq(int irq, void *dev_id)
770
774
* verifies success by readinng CTR. Used when testing for presence of AUX
771
775
* port.
772
776
*/
773
- static int __init i8042_toggle_aux (bool on )
777
+ static int i8042_toggle_aux (bool on )
774
778
{
775
779
unsigned char param ;
776
780
int i ;
@@ -798,7 +802,7 @@ static int __init i8042_toggle_aux(bool on)
798
802
* the presence of an AUX interface.
799
803
*/
800
804
801
- static int __init i8042_check_aux (void )
805
+ static int i8042_check_aux (void )
802
806
{
803
807
int retval = -1 ;
804
808
bool irq_registered = false;
@@ -1005,7 +1009,7 @@ static int i8042_controller_init(void)
1005
1009
1006
1010
if (i8042_command (& ctr [n ++ % 2 ], I8042_CMD_CTL_RCTR )) {
1007
1011
pr_err ("Can't read CTR while initializing i8042\n" );
1008
- return - EIO ;
1012
+ return i8042_probe_defer ? - EPROBE_DEFER : - EIO ;
1009
1013
}
1010
1014
1011
1015
} while (n < 2 || ctr [0 ] != ctr [1 ]);
@@ -1320,7 +1324,7 @@ static void i8042_shutdown(struct platform_device *dev)
1320
1324
i8042_controller_reset (false);
1321
1325
}
1322
1326
1323
- static int __init i8042_create_kbd_port (void )
1327
+ static int i8042_create_kbd_port (void )
1324
1328
{
1325
1329
struct serio * serio ;
1326
1330
struct i8042_port * port = & i8042_ports [I8042_KBD_PORT_NO ];
@@ -1349,7 +1353,7 @@ static int __init i8042_create_kbd_port(void)
1349
1353
return 0 ;
1350
1354
}
1351
1355
1352
- static int __init i8042_create_aux_port (int idx )
1356
+ static int i8042_create_aux_port (int idx )
1353
1357
{
1354
1358
struct serio * serio ;
1355
1359
int port_no = idx < 0 ? I8042_AUX_PORT_NO : I8042_MUX_PORT_NO + idx ;
@@ -1386,13 +1390,13 @@ static int __init i8042_create_aux_port(int idx)
1386
1390
return 0 ;
1387
1391
}
1388
1392
1389
- static void __init i8042_free_kbd_port (void )
1393
+ static void i8042_free_kbd_port (void )
1390
1394
{
1391
1395
kfree (i8042_ports [I8042_KBD_PORT_NO ].serio );
1392
1396
i8042_ports [I8042_KBD_PORT_NO ].serio = NULL ;
1393
1397
}
1394
1398
1395
- static void __init i8042_free_aux_ports (void )
1399
+ static void i8042_free_aux_ports (void )
1396
1400
{
1397
1401
int i ;
1398
1402
@@ -1402,7 +1406,7 @@ static void __init i8042_free_aux_ports(void)
1402
1406
}
1403
1407
}
1404
1408
1405
- static void __init i8042_register_ports (void )
1409
+ static void i8042_register_ports (void )
1406
1410
{
1407
1411
int i ;
1408
1412
@@ -1443,7 +1447,7 @@ static void i8042_free_irqs(void)
1443
1447
i8042_aux_irq_registered = i8042_kbd_irq_registered = false;
1444
1448
}
1445
1449
1446
- static int __init i8042_setup_aux (void )
1450
+ static int i8042_setup_aux (void )
1447
1451
{
1448
1452
int (* aux_enable )(void );
1449
1453
int error ;
@@ -1485,7 +1489,7 @@ static int __init i8042_setup_aux(void)
1485
1489
return error ;
1486
1490
}
1487
1491
1488
- static int __init i8042_setup_kbd (void )
1492
+ static int i8042_setup_kbd (void )
1489
1493
{
1490
1494
int error ;
1491
1495
@@ -1535,7 +1539,7 @@ static int i8042_kbd_bind_notifier(struct notifier_block *nb,
1535
1539
return 0 ;
1536
1540
}
1537
1541
1538
- static int __init i8042_probe (struct platform_device * dev )
1542
+ static int i8042_probe (struct platform_device * dev )
1539
1543
{
1540
1544
int error ;
1541
1545
@@ -1600,6 +1604,7 @@ static struct platform_driver i8042_driver = {
1600
1604
.pm = & i8042_pm_ops ,
1601
1605
#endif
1602
1606
},
1607
+ .probe = i8042_probe ,
1603
1608
.remove = i8042_remove ,
1604
1609
.shutdown = i8042_shutdown ,
1605
1610
};
@@ -1610,7 +1615,6 @@ static struct notifier_block i8042_kbd_bind_notifier_block = {
1610
1615
1611
1616
static int __init i8042_init (void )
1612
1617
{
1613
- struct platform_device * pdev ;
1614
1618
int err ;
1615
1619
1616
1620
dbg_init ();
@@ -1626,17 +1630,29 @@ static int __init i8042_init(void)
1626
1630
/* Set this before creating the dev to allow i8042_command to work right away */
1627
1631
i8042_present = true;
1628
1632
1629
- pdev = platform_create_bundle (& i8042_driver , i8042_probe , NULL , 0 , NULL , 0 );
1630
- if (IS_ERR (pdev )) {
1631
- err = PTR_ERR (pdev );
1633
+ err = platform_driver_register (& i8042_driver );
1634
+ if (err )
1632
1635
goto err_platform_exit ;
1636
+
1637
+ i8042_platform_device = platform_device_alloc ("i8042" , -1 );
1638
+ if (!i8042_platform_device ) {
1639
+ err = - ENOMEM ;
1640
+ goto err_unregister_driver ;
1633
1641
}
1634
1642
1643
+ err = platform_device_add (i8042_platform_device );
1644
+ if (err )
1645
+ goto err_free_device ;
1646
+
1635
1647
bus_register_notifier (& serio_bus , & i8042_kbd_bind_notifier_block );
1636
1648
panic_blink = i8042_panic_blink ;
1637
1649
1638
1650
return 0 ;
1639
1651
1652
+ err_free_device :
1653
+ platform_device_put (i8042_platform_device );
1654
+ err_unregister_driver :
1655
+ platform_driver_unregister (& i8042_driver );
1640
1656
err_platform_exit :
1641
1657
i8042_platform_exit ();
1642
1658
return err ;
0 commit comments