diff options
Diffstat (limited to 'drivers/base/platform.c')
| -rw-r--r-- | drivers/base/platform.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 6d4736e89f1a..8827dafba945 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | 20 | ||
| 21 | #include "base.h" | 21 | #include "base.h" |
| 22 | 22 | ||
| 23 | #define to_platform_driver(drv) (container_of((drv), struct platform_driver, driver)) | ||
| 24 | |||
| 23 | struct device platform_bus = { | 25 | struct device platform_bus = { |
| 24 | .bus_id = "platform", | 26 | .bus_id = "platform", |
| 25 | }; | 27 | }; |
| @@ -354,6 +356,77 @@ error: | |||
| 354 | return ERR_PTR(retval); | 356 | return ERR_PTR(retval); |
| 355 | } | 357 | } |
| 356 | 358 | ||
| 359 | static int platform_drv_probe(struct device *_dev) | ||
| 360 | { | ||
| 361 | struct platform_driver *drv = to_platform_driver(_dev->driver); | ||
| 362 | struct platform_device *dev = to_platform_device(_dev); | ||
| 363 | |||
| 364 | return drv->probe(dev); | ||
| 365 | } | ||
| 366 | |||
| 367 | static int platform_drv_remove(struct device *_dev) | ||
| 368 | { | ||
| 369 | struct platform_driver *drv = to_platform_driver(_dev->driver); | ||
| 370 | struct platform_device *dev = to_platform_device(_dev); | ||
| 371 | |||
| 372 | return drv->remove(dev); | ||
| 373 | } | ||
| 374 | |||
| 375 | static void platform_drv_shutdown(struct device *_dev) | ||
| 376 | { | ||
| 377 | struct platform_driver *drv = to_platform_driver(_dev->driver); | ||
| 378 | struct platform_device *dev = to_platform_device(_dev); | ||
| 379 | |||
| 380 | drv->shutdown(dev); | ||
| 381 | } | ||
| 382 | |||
| 383 | static int platform_drv_suspend(struct device *_dev, pm_message_t state) | ||
| 384 | { | ||
| 385 | struct platform_driver *drv = to_platform_driver(_dev->driver); | ||
| 386 | struct platform_device *dev = to_platform_device(_dev); | ||
| 387 | |||
| 388 | return drv->suspend(dev, state); | ||
| 389 | } | ||
| 390 | |||
| 391 | static int platform_drv_resume(struct device *_dev) | ||
| 392 | { | ||
| 393 | struct platform_driver *drv = to_platform_driver(_dev->driver); | ||
| 394 | struct platform_device *dev = to_platform_device(_dev); | ||
| 395 | |||
| 396 | return drv->resume(dev); | ||
| 397 | } | ||
| 398 | |||
| 399 | /** | ||
| 400 | * platform_driver_register | ||
| 401 | * @drv: platform driver structure | ||
| 402 | */ | ||
| 403 | int platform_driver_register(struct platform_driver *drv) | ||
| 404 | { | ||
| 405 | drv->driver.bus = &platform_bus_type; | ||
| 406 | if (drv->probe) | ||
| 407 | drv->driver.probe = platform_drv_probe; | ||
| 408 | if (drv->remove) | ||
| 409 | drv->driver.remove = platform_drv_remove; | ||
| 410 | if (drv->shutdown) | ||
| 411 | drv->driver.shutdown = platform_drv_shutdown; | ||
| 412 | if (drv->suspend) | ||
| 413 | drv->driver.suspend = platform_drv_suspend; | ||
| 414 | if (drv->resume) | ||
| 415 | drv->driver.resume = platform_drv_resume; | ||
| 416 | return driver_register(&drv->driver); | ||
| 417 | } | ||
| 418 | EXPORT_SYMBOL_GPL(platform_driver_register); | ||
| 419 | |||
| 420 | /** | ||
| 421 | * platform_driver_unregister | ||
| 422 | * @drv: platform driver structure | ||
| 423 | */ | ||
| 424 | void platform_driver_unregister(struct platform_driver *drv) | ||
| 425 | { | ||
| 426 | driver_unregister(&drv->driver); | ||
| 427 | } | ||
| 428 | EXPORT_SYMBOL_GPL(platform_driver_unregister); | ||
| 429 | |||
| 357 | 430 | ||
| 358 | /** | 431 | /** |
| 359 | * platform_match - bind platform device to platform driver. | 432 | * platform_match - bind platform device to platform driver. |
