Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932224AbbEULoy (ORCPT ); Thu, 21 May 2015 07:44:54 -0400 Received: from mail-wi0-f177.google.com ([209.85.212.177]:37212 "EHLO mail-wi0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752824AbbEULow (ORCPT ); Thu, 21 May 2015 07:44:52 -0400 Date: Thu, 21 May 2015 13:44:48 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Paul Walmsley Cc: linux-omap@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, Pavel Machek , Nishanth Menon , Ivaylo Dimitrov , Aaro Koskinen , Sebastian Reichel , =?utf-8?Q?Beno=C3=AEt?= Cousson , Tony Lindgren , Rob Herring , Russell King , Herbert Xu , "David S. Miller" Subject: Re: [PATCH 01/10] ARM: OMAP2+: Return correct error values from device and hwmod Message-ID: <20150521114448.GB8329@pali> References: <1424958600-18881-1-git-send-email-pali.rohar@gmail.com> <1424958600-18881-2-git-send-email-pali.rohar@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1424958600-18881-2-git-send-email-pali.rohar@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3988 Lines: 152 On Thursday 26 February 2015 14:49:51 Pali Rohár wrote: > Without this patch function pm_runtime_get_sync() returns 0 even when some > omap subfunction fails. This patch properly propagate error codes from omap > functions back to caller. > > This patch fix problem, when loading omap-aes driver in qemu cause kernel oops. > > Signed-off-by: Pali Rohár > --- > arch/arm/mach-omap2/omap_device.c | 30 +++++++++++++++++------------- > arch/arm/mach-omap2/omap_hwmod.c | 10 ++++++---- > 2 files changed, 23 insertions(+), 17 deletions(-) > > diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c > index be9541e..9fd47a9 100644 > --- a/arch/arm/mach-omap2/omap_device.c > +++ b/arch/arm/mach-omap2/omap_device.c > @@ -224,13 +224,13 @@ static int _omap_device_notifier_call(struct notifier_block *nb, > */ > static int _omap_device_enable_hwmods(struct omap_device *od) > { > + int ret = 0; > int i; > > for (i = 0; i < od->hwmods_cnt; i++) > - omap_hwmod_enable(od->hwmods[i]); > + ret |= omap_hwmod_enable(od->hwmods[i]); > > - /* XXX pass along return value here? */ > - return 0; > + return ret; > } > > /** > @@ -241,13 +241,13 @@ static int _omap_device_enable_hwmods(struct omap_device *od) > */ > static int _omap_device_idle_hwmods(struct omap_device *od) > { > + int ret = 0; > int i; > > for (i = 0; i < od->hwmods_cnt; i++) > - omap_hwmod_idle(od->hwmods[i]); > + ret |= omap_hwmod_idle(od->hwmods[i]); > > - /* XXX pass along return value here? */ > - return 0; > + return ret; > } > > /* Public functions for use by core code */ > @@ -595,18 +595,20 @@ static int _od_runtime_suspend(struct device *dev) > int ret; > > ret = pm_generic_runtime_suspend(dev); > + if (ret) > + return ret; > > - if (!ret) > - omap_device_idle(pdev); > - > - return ret; > + return omap_device_idle(pdev); > } > > static int _od_runtime_resume(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > + int ret; > > - omap_device_enable(pdev); > + ret = omap_device_enable(pdev); > + if (ret) > + return ret; > > return pm_generic_runtime_resume(dev); > } > @@ -740,7 +742,8 @@ int omap_device_enable(struct platform_device *pdev) > > ret = _omap_device_enable_hwmods(od); > > - od->_state = OMAP_DEVICE_STATE_ENABLED; > + if (ret == 0) > + od->_state = OMAP_DEVICE_STATE_ENABLED; > > return ret; > } > @@ -770,7 +773,8 @@ int omap_device_idle(struct platform_device *pdev) > > ret = _omap_device_idle_hwmods(od); > > - od->_state = OMAP_DEVICE_STATE_IDLE; > + if (ret == 0) > + od->_state = OMAP_DEVICE_STATE_IDLE; > > return ret; > } > diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c > index 92afb72..870e984 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -3350,16 +3350,17 @@ int omap_hwmod_enable(struct omap_hwmod *oh) > */ > int omap_hwmod_idle(struct omap_hwmod *oh) > { > + int r; > unsigned long flags; > > if (!oh) > return -EINVAL; > > spin_lock_irqsave(&oh->_lock, flags); > - _idle(oh); > + r = _idle(oh); > spin_unlock_irqrestore(&oh->_lock, flags); > > - return 0; > + return r; > } > > /** > @@ -3372,16 +3373,17 @@ int omap_hwmod_idle(struct omap_hwmod *oh) > */ > int omap_hwmod_shutdown(struct omap_hwmod *oh) > { > + int r; > unsigned long flags; > > if (!oh) > return -EINVAL; > > spin_lock_irqsave(&oh->_lock, flags); > - _shutdown(oh); > + r = _shutdown(oh); > spin_unlock_irqrestore(&oh->_lock, flags); > > - return 0; > + return r; > } > > /* Hello Paul, can you apply this patch? -- Pali Rohár pali.rohar@gmail.com -- 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/