diff options
| author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2009-01-13 01:32:17 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-01-13 01:32:50 -0500 |
| commit | 840207edfa8b5e5b46e0d268bf33efe71fecea20 (patch) | |
| tree | 9ac3268056b4b36d9947b03863f609923b3f5e0a /drivers/input | |
| parent | f2d8dc75a14479f8803a70cf637b5d79a3bb87f1 (diff) | |
Input: corgi_ts - mark probe function as __devinit
A pointer to corgits_probe is passed to the core via
platform_driver_register and so the function must not disappear when the
.init sections are discarded. Otherwise (if also having HOTPLUG=y)
unbinding and binding a device to the driver via sysfs will result in an
oops as does a device being registered late.
An alternative to this patch is using platform_driver_probe instead of
platform_driver_register plus removing the pointer to the probe function
from the struct platform_driver.
[dtor@mail.ru: fixed some more section markups]
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/touchscreen/corgi_ts.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/input/touchscreen/corgi_ts.c b/drivers/input/touchscreen/corgi_ts.c index 65202c9f63ff..3fb51b54fe61 100644 --- a/drivers/input/touchscreen/corgi_ts.c +++ b/drivers/input/touchscreen/corgi_ts.c | |||
| @@ -268,7 +268,7 @@ static int corgits_resume(struct platform_device *dev) | |||
| 268 | #define corgits_resume NULL | 268 | #define corgits_resume NULL |
| 269 | #endif | 269 | #endif |
| 270 | 270 | ||
| 271 | static int __init corgits_probe(struct platform_device *pdev) | 271 | static int __devinit corgits_probe(struct platform_device *pdev) |
| 272 | { | 272 | { |
| 273 | struct corgi_ts *corgi_ts; | 273 | struct corgi_ts *corgi_ts; |
| 274 | struct input_dev *input_dev; | 274 | struct input_dev *input_dev; |
| @@ -343,7 +343,7 @@ static int __init corgits_probe(struct platform_device *pdev) | |||
| 343 | return err; | 343 | return err; |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | static int corgits_remove(struct platform_device *pdev) | 346 | static int __devexit corgits_remove(struct platform_device *pdev) |
| 347 | { | 347 | { |
| 348 | struct corgi_ts *corgi_ts = platform_get_drvdata(pdev); | 348 | struct corgi_ts *corgi_ts = platform_get_drvdata(pdev); |
| 349 | 349 | ||
| @@ -352,12 +352,13 @@ static int corgits_remove(struct platform_device *pdev) | |||
| 352 | corgi_ts->machinfo->put_hsync(); | 352 | corgi_ts->machinfo->put_hsync(); |
| 353 | input_unregister_device(corgi_ts->input); | 353 | input_unregister_device(corgi_ts->input); |
| 354 | kfree(corgi_ts); | 354 | kfree(corgi_ts); |
| 355 | |||
| 355 | return 0; | 356 | return 0; |
| 356 | } | 357 | } |
| 357 | 358 | ||
| 358 | static struct platform_driver corgits_driver = { | 359 | static struct platform_driver corgits_driver = { |
| 359 | .probe = corgits_probe, | 360 | .probe = corgits_probe, |
| 360 | .remove = corgits_remove, | 361 | .remove = __devexit_p(corgits_remove), |
| 361 | .suspend = corgits_suspend, | 362 | .suspend = corgits_suspend, |
| 362 | .resume = corgits_resume, | 363 | .resume = corgits_resume, |
| 363 | .driver = { | 364 | .driver = { |
| @@ -366,7 +367,7 @@ static struct platform_driver corgits_driver = { | |||
| 366 | }, | 367 | }, |
| 367 | }; | 368 | }; |
| 368 | 369 | ||
| 369 | static int __devinit corgits_init(void) | 370 | static int __init corgits_init(void) |
| 370 | { | 371 | { |
| 371 | return platform_driver_register(&corgits_driver); | 372 | return platform_driver_register(&corgits_driver); |
| 372 | } | 373 | } |
