aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/platform.c')
-rw-r--r--drivers/base/platform.c26
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) {
468err: 470err:
471 ACPI_HANDLE_SET(&pdev->dev, NULL);
469 kfree(pdev->dev.dma_mask); 472 kfree(pdev->dev.dma_mask);
470 473
471err_alloc: 474err_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
488static int platform_drv_probe_fail(struct device *_dev) 499static 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
501static void platform_drv_shutdown(struct device *_dev) 517static 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;