From: Tony Lindgren <tony@atomide.com>
To: Nishanth Menon <nm@ti.com>
Cc: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
Tobias Jakobi <tjakobi@math.uni-bielefeld.de>,
Joel F <joelf@ti.com>, Kevin Hilman <khilman@linaro.org>
Subject: Re: [PATCH] ARM: OMAP2+: omap_device: add fail hook for runtime_pm when bad data is detected
Date: Thu, 5 Dec 2013 11:03:43 -0800 [thread overview]
Message-ID: <20131205190343.GI26766@atomide.com> (raw)
In-Reply-To: <1386121153-32351-1-git-send-email-nm@ti.com>
* Nishanth Menon <nm@ti.com> [131203 17:40]:
> Due to the cross dependencies between hwmod for automanaged device
> information for OMAP and dts node definitions, we can run into scenarios
> where the dts node is defined, however it's hwmod entry is yet to be
> added. In these cases:
> a) omap_device does not register a pm_domain (since it cannot find
> hwmod entry).
> b) driver does not know about (a), does a pm_runtime_get_sync which
> never fails
> c) It then tries to do some operation on the device (such as read the
> revision register (as part of probe) without clock or adequate OMAP
> generic PM operation performed for enabling the module.
>
> This causes a crash such as that reported in:
> https://bugzilla.kernel.org/show_bug.cgi?id=66441
>
> When 'ti,hwmod' is provided in dt node, it is expected that the device
> will not function without the OMAP's power automanagement. Hence, when
> we hit a fail condition (due to hwmod entries not present or other
> similar scenario), fail at pm_domain level due to lack of data, provide
> enough information for it to be fixed, however, it allows for the driver
> to take appropriate measures to prevent crash.
Kevin, any comments on this one?
Regards,
Tony
> Reported-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> Signed-off-by: Nishanth Menon <nm@ti.com>
> ---
> arch/arm/mach-omap2/omap_device.c | 24 ++++++++++++++++++++++++
> arch/arm/mach-omap2/omap_device.h | 1 +
> 2 files changed, 25 insertions(+)
>
> diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c
> index 53f0735..e0a398c 100644
> --- a/arch/arm/mach-omap2/omap_device.c
> +++ b/arch/arm/mach-omap2/omap_device.c
> @@ -183,6 +183,10 @@ static int omap_device_build_from_dt(struct platform_device *pdev)
> odbfd_exit1:
> kfree(hwmods);
> odbfd_exit:
> + /* if data/we are at fault.. load up a fail handler */
> + if (ret)
> + pdev->dev.pm_domain = &omap_device_fail_pm_domain;
> +
> return ret;
> }
>
> @@ -604,6 +608,19 @@ static int _od_runtime_resume(struct device *dev)
>
> return pm_generic_runtime_resume(dev);
> }
> +
> +static int _od_fail_runtime_suspend(struct device *dev)
> +{
> + dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__);
> + return -ENODEV;
> +}
> +
> +static int _od_fail_runtime_resume(struct device *dev)
> +{
> + dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__);
> + return -ENODEV;
> +}
> +
> #endif
>
> #ifdef CONFIG_SUSPEND
> @@ -657,6 +674,13 @@ static int _od_resume_noirq(struct device *dev)
> #define _od_resume_noirq NULL
> #endif
>
> +struct dev_pm_domain omap_device_fail_pm_domain = {
> + .ops = {
> + SET_RUNTIME_PM_OPS(_od_fail_runtime_suspend,
> + _od_fail_runtime_resume, NULL)
> + }
> +};
> +
> struct dev_pm_domain omap_device_pm_domain = {
> .ops = {
> SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
> diff --git a/arch/arm/mach-omap2/omap_device.h b/arch/arm/mach-omap2/omap_device.h
> index 17ca1ae..78c02b3 100644
> --- a/arch/arm/mach-omap2/omap_device.h
> +++ b/arch/arm/mach-omap2/omap_device.h
> @@ -29,6 +29,7 @@
> #include "omap_hwmod.h"
>
> extern struct dev_pm_domain omap_device_pm_domain;
> +extern struct dev_pm_domain omap_device_fail_pm_domain;
>
> /* omap_device._state values */
> #define OMAP_DEVICE_STATE_UNKNOWN 0
> --
> 1.7.9.5
>
WARNING: multiple messages have this Message-ID (diff)
From: tony@atomide.com (Tony Lindgren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM: OMAP2+: omap_device: add fail hook for runtime_pm when bad data is detected
Date: Thu, 5 Dec 2013 11:03:43 -0800 [thread overview]
Message-ID: <20131205190343.GI26766@atomide.com> (raw)
In-Reply-To: <1386121153-32351-1-git-send-email-nm@ti.com>
* Nishanth Menon <nm@ti.com> [131203 17:40]:
> Due to the cross dependencies between hwmod for automanaged device
> information for OMAP and dts node definitions, we can run into scenarios
> where the dts node is defined, however it's hwmod entry is yet to be
> added. In these cases:
> a) omap_device does not register a pm_domain (since it cannot find
> hwmod entry).
> b) driver does not know about (a), does a pm_runtime_get_sync which
> never fails
> c) It then tries to do some operation on the device (such as read the
> revision register (as part of probe) without clock or adequate OMAP
> generic PM operation performed for enabling the module.
>
> This causes a crash such as that reported in:
> https://bugzilla.kernel.org/show_bug.cgi?id=66441
>
> When 'ti,hwmod' is provided in dt node, it is expected that the device
> will not function without the OMAP's power automanagement. Hence, when
> we hit a fail condition (due to hwmod entries not present or other
> similar scenario), fail at pm_domain level due to lack of data, provide
> enough information for it to be fixed, however, it allows for the driver
> to take appropriate measures to prevent crash.
Kevin, any comments on this one?
Regards,
Tony
> Reported-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> Signed-off-by: Nishanth Menon <nm@ti.com>
> ---
> arch/arm/mach-omap2/omap_device.c | 24 ++++++++++++++++++++++++
> arch/arm/mach-omap2/omap_device.h | 1 +
> 2 files changed, 25 insertions(+)
>
> diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c
> index 53f0735..e0a398c 100644
> --- a/arch/arm/mach-omap2/omap_device.c
> +++ b/arch/arm/mach-omap2/omap_device.c
> @@ -183,6 +183,10 @@ static int omap_device_build_from_dt(struct platform_device *pdev)
> odbfd_exit1:
> kfree(hwmods);
> odbfd_exit:
> + /* if data/we are at fault.. load up a fail handler */
> + if (ret)
> + pdev->dev.pm_domain = &omap_device_fail_pm_domain;
> +
> return ret;
> }
>
> @@ -604,6 +608,19 @@ static int _od_runtime_resume(struct device *dev)
>
> return pm_generic_runtime_resume(dev);
> }
> +
> +static int _od_fail_runtime_suspend(struct device *dev)
> +{
> + dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__);
> + return -ENODEV;
> +}
> +
> +static int _od_fail_runtime_resume(struct device *dev)
> +{
> + dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__);
> + return -ENODEV;
> +}
> +
> #endif
>
> #ifdef CONFIG_SUSPEND
> @@ -657,6 +674,13 @@ static int _od_resume_noirq(struct device *dev)
> #define _od_resume_noirq NULL
> #endif
>
> +struct dev_pm_domain omap_device_fail_pm_domain = {
> + .ops = {
> + SET_RUNTIME_PM_OPS(_od_fail_runtime_suspend,
> + _od_fail_runtime_resume, NULL)
> + }
> +};
> +
> struct dev_pm_domain omap_device_pm_domain = {
> .ops = {
> SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
> diff --git a/arch/arm/mach-omap2/omap_device.h b/arch/arm/mach-omap2/omap_device.h
> index 17ca1ae..78c02b3 100644
> --- a/arch/arm/mach-omap2/omap_device.h
> +++ b/arch/arm/mach-omap2/omap_device.h
> @@ -29,6 +29,7 @@
> #include "omap_hwmod.h"
>
> extern struct dev_pm_domain omap_device_pm_domain;
> +extern struct dev_pm_domain omap_device_fail_pm_domain;
>
> /* omap_device._state values */
> #define OMAP_DEVICE_STATE_UNKNOWN 0
> --
> 1.7.9.5
>
next prev parent reply other threads:[~2013-12-05 19:03 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-04 1:39 [PATCH] ARM: OMAP2+: omap_device: add fail hook for runtime_pm when bad data is detected Nishanth Menon
2013-12-04 1:39 ` Nishanth Menon
2013-12-04 1:39 ` Nishanth Menon
2013-12-04 8:08 ` Joel Fernandes
2013-12-04 8:08 ` Joel Fernandes
2013-12-04 8:08 ` Joel Fernandes
2013-12-04 11:33 ` Nishanth Menon
2013-12-04 11:33 ` Nishanth Menon
2013-12-04 12:44 ` Joel Fernandes
2013-12-04 12:44 ` Joel Fernandes
2013-12-04 12:44 ` Joel Fernandes
2013-12-04 13:37 ` Nishanth Menon
2013-12-04 13:37 ` Nishanth Menon
2013-12-04 13:37 ` Nishanth Menon
2013-12-05 9:36 ` Joel Fernandes
2013-12-05 9:36 ` Joel Fernandes
2013-12-05 9:36 ` Joel Fernandes
2013-12-05 19:03 ` Tony Lindgren [this message]
2013-12-05 19:03 ` Tony Lindgren
2013-12-09 16:06 ` Kevin Hilman
2013-12-09 16:06 ` Kevin Hilman
2013-12-10 17:30 ` Tony Lindgren
2013-12-10 17:30 ` Tony Lindgren
2013-12-10 17:41 ` Kevin Hilman
2013-12-10 17:41 ` Kevin Hilman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131205190343.GI26766@atomide.com \
--to=tony@atomide.com \
--cc=joelf@ti.com \
--cc=khilman@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=nm@ti.com \
--cc=tjakobi@math.uni-bielefeld.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.