Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751446AbbEYQLh (ORCPT ); Mon, 25 May 2015 12:11:37 -0400 Received: from mga14.intel.com ([192.55.52.115]:40509 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750945AbbEYQJm (ORCPT ); Mon, 25 May 2015 12:09:42 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,492,1427785200"; d="scan'208";a="715324636" From: Andy Shevchenko To: "Rafael J. Wysocki" , linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org, Greg Kroah-Hartman , Vinod Koul , Lee Jones , Andrew Morton , Mika Westerberg , linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, Heikki Krogerus , Jarkko Nikula Cc: Andy Shevchenko Subject: [PATCH v2 3/8] core: platform: wakeup the parent before trying any driver operations Date: Mon, 25 May 2015 19:09:27 +0300 Message-Id: <1432570172-86963-4-git-send-email-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1432570172-86963-1-git-send-email-andriy.shevchenko@linux.intel.com> References: <1432570172-86963-1-git-send-email-andriy.shevchenko@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2346 Lines: 79 From: Heikki Krogerus If the parent is still suspended when a driver probe, remove or shutdown is attempted, the result may be a failure. For example, if the parent is a PCI MFD device that has been suspended when we try to probe our device, any register reads will return 0xffffffff. To fix the problem, making sure the parent is always awake before using driver probe, remove or shutdown. Signed-off-by: Heikki Krogerus Signed-off-by: Andy Shevchenko --- drivers/base/platform.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index ebf034b..59fcda5 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -518,9 +518,15 @@ static int platform_drv_probe(struct device *_dev) ret = dev_pm_domain_attach(_dev, true); if (ret != -EPROBE_DEFER) { + if (_dev->parent != &platform_bus) + pm_runtime_get_sync(_dev->parent); + ret = drv->probe(dev); if (ret) dev_pm_domain_detach(_dev, true); + + if (_dev->parent != &platform_bus) + pm_runtime_put(_dev->parent); } if (drv->prevent_deferred_probe && ret == -EPROBE_DEFER) { @@ -542,9 +548,15 @@ static int platform_drv_remove(struct device *_dev) struct platform_device *dev = to_platform_device(_dev); int ret; + if (_dev->parent != &platform_bus) + pm_runtime_get_sync(_dev->parent); + ret = drv->remove(dev); - dev_pm_domain_detach(_dev, true); + if (_dev->parent != &platform_bus) + pm_runtime_put(_dev->parent); + + dev_pm_domain_detach(_dev, true); return ret; } @@ -553,7 +565,14 @@ static void platform_drv_shutdown(struct device *_dev) struct platform_driver *drv = to_platform_driver(_dev->driver); struct platform_device *dev = to_platform_device(_dev); + if (_dev->parent != &platform_bus) + pm_runtime_get_sync(_dev->parent); + drv->shutdown(dev); + + if (_dev->parent != &platform_bus) + pm_runtime_put(_dev->parent); + dev_pm_domain_detach(_dev, true); } -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/