diff options
Diffstat (limited to 'drivers/base/platform.c')
-rw-r--r-- | drivers/base/platform.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 72c776f2a1f5..b2ee3bcd5a41 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
22 | #include <linux/pm_runtime.h> | 22 | #include <linux/pm_runtime.h> |
23 | #include <linux/idr.h> | 23 | #include <linux/idr.h> |
24 | #include <linux/acpi.h> | ||
24 | 25 | ||
25 | #include "base.h" | 26 | #include "base.h" |
26 | #include "power/power.h" | 27 | #include "power/power.h" |
@@ -436,6 +437,7 @@ struct platform_device *platform_device_register_full( | |||
436 | goto err_alloc; | 437 | goto err_alloc; |
437 | 438 | ||
438 | pdev->dev.parent = pdevinfo->parent; | 439 | pdev->dev.parent = pdevinfo->parent; |
440 | ACPI_HANDLE_SET(&pdev->dev, pdevinfo->acpi_node.handle); | ||
439 | 441 | ||
440 | if (pdevinfo->dma_mask) { | 442 | if (pdevinfo->dma_mask) { |
441 | /* | 443 | /* |
@@ -466,6 +468,7 @@ struct platform_device *platform_device_register_full( | |||
466 | ret = platform_device_add(pdev); | 468 | ret = platform_device_add(pdev); |
467 | if (ret) { | 469 | if (ret) { |
468 | err: | 470 | err: |
471 | ACPI_HANDLE_SET(&pdev->dev, NULL); | ||
469 | kfree(pdev->dev.dma_mask); | 472 | kfree(pdev->dev.dma_mask); |
470 | 473 | ||
471 | err_alloc: | 474 | err_alloc: |
@@ -481,8 +484,16 @@ static int platform_drv_probe(struct device *_dev) | |||
481 | { | 484 | { |
482 | struct platform_driver *drv = to_platform_driver(_dev->driver); | 485 | struct platform_driver *drv = to_platform_driver(_dev->driver); |
483 | struct platform_device *dev = to_platform_device(_dev); | 486 | struct platform_device *dev = to_platform_device(_dev); |
487 | int ret; | ||
484 | 488 | ||
485 | return drv->probe(dev); | 489 | if (ACPI_HANDLE(_dev)) |
490 | acpi_dev_pm_attach(_dev, true); | ||
491 | |||
492 | ret = drv->probe(dev); | ||
493 | if (ret && ACPI_HANDLE(_dev)) | ||
494 | acpi_dev_pm_detach(_dev, true); | ||
495 | |||
496 | return ret; | ||
486 | } | 497 | } |
487 | 498 | ||
488 | static int platform_drv_probe_fail(struct device *_dev) | 499 | static int platform_drv_probe_fail(struct device *_dev) |
@@ -494,8 +505,13 @@ static int platform_drv_remove(struct device *_dev) | |||
494 | { | 505 | { |
495 | struct platform_driver *drv = to_platform_driver(_dev->driver); | 506 | struct platform_driver *drv = to_platform_driver(_dev->driver); |
496 | struct platform_device *dev = to_platform_device(_dev); | 507 | struct platform_device *dev = to_platform_device(_dev); |
508 | int ret; | ||
509 | |||
510 | ret = drv->remove(dev); | ||
511 | if (ACPI_HANDLE(_dev)) | ||
512 | acpi_dev_pm_detach(_dev, true); | ||
497 | 513 | ||
498 | return drv->remove(dev); | 514 | return ret; |
499 | } | 515 | } |
500 | 516 | ||
501 | static void platform_drv_shutdown(struct device *_dev) | 517 | static void platform_drv_shutdown(struct device *_dev) |
@@ -504,6 +520,8 @@ static void platform_drv_shutdown(struct device *_dev) | |||
504 | struct platform_device *dev = to_platform_device(_dev); | 520 | struct platform_device *dev = to_platform_device(_dev); |
505 | 521 | ||
506 | drv->shutdown(dev); | 522 | drv->shutdown(dev); |
523 | if (ACPI_HANDLE(_dev)) | ||
524 | acpi_dev_pm_detach(_dev, true); | ||
507 | } | 525 | } |
508 | 526 | ||
509 | /** | 527 | /** |
@@ -709,6 +727,10 @@ static int platform_match(struct device *dev, struct device_driver *drv) | |||
709 | if (of_driver_match_device(dev, drv)) | 727 | if (of_driver_match_device(dev, drv)) |
710 | return 1; | 728 | return 1; |
711 | 729 | ||
730 | /* Then try ACPI style match */ | ||
731 | if (acpi_driver_match_device(dev, drv)) | ||
732 | return 1; | ||
733 | |||
712 | /* Then try to match against the id table */ | 734 | /* Then try to match against the id table */ |
713 | if (pdrv->id_table) | 735 | if (pdrv->id_table) |
714 | return platform_match_id(pdrv->id_table, pdev) != NULL; | 736 | return platform_match_id(pdrv->id_table, pdev) != NULL; |