diff options
author | Robert Jarzmik <robert.jarzmik@free.fr> | 2012-01-20 21:17:24 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-01-23 09:45:56 +0100 |
commit | 8d6bfdaec7c3ce44969ca0930b84442ff93cd80b (patch) | |
tree | 11d07806a8708932c3c0ffb99622c0a32df15517 | |
parent | 3874b16997d3c0219a9baab3578ba27ec084282b (diff) | |
download | barebox-8d6bfdaec7c3ce44969ca0930b84442ff93cd80b.tar.gz barebox-8d6bfdaec7c3ce44969ca0930b84442ff93cd80b.tar.xz |
usb/gadget: fix poller NPE in early polling
The timings of the poller calling have changed, digging out
a latent bug in pxa27x udc controller.
The polling routine is called before the probe function is
called, and the driver internal are not initialized at that
time. This triggers a NULL pointer exception.
Fix it by moving poller registration after driver probe.
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/usb/gadget/pxa27x_udc.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index d0dbee9824..56525559f6 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c @@ -1473,6 +1473,14 @@ static struct pxa_udc memory = { } }; +static int pxa27x_udc_poller(struct poller_struct *poller) +{ + return usb_gadget_poll(); +} +static struct poller_struct poller = { + .func = pxa27x_udc_poller +}; + static int __init pxa_udc_probe(struct device_d *dev) { struct pxa_udc *udc = &memory; @@ -1496,6 +1504,8 @@ static int __init pxa_udc_probe(struct device_d *dev) the_controller = udc; udc_init_data(udc); pxa_eps_setup(udc); + poller_register(&poller); + return 0; } @@ -1506,18 +1516,9 @@ static struct driver_d udc_driver = { .probe = pxa_udc_probe, }; -static int pxa27x_udc_poller(struct poller_struct *poller) -{ - return usb_gadget_poll(); -} -static struct poller_struct poller = { - .func = pxa27x_udc_poller -}; - static int __init pxa27x_udc_init(void) { register_driver(&udc_driver); - poller_register(&poller); return 0; } |