summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2012-01-20 21:17:24 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-01-23 09:45:56 +0100
commit8d6bfdaec7c3ce44969ca0930b84442ff93cd80b (patch)
tree11d07806a8708932c3c0ffb99622c0a32df15517
parent3874b16997d3c0219a9baab3578ba27ec084282b (diff)
downloadbarebox-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.c19
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;
}