From: Kevin Hilman <khilman@ti.com>
To: Tarun Kanti DebBarma <tarun.kanti@ti.com>
Cc: linux-omap@vger.kernel.org, Partha Basak <p-basak2@ti.com>
Subject: Re: [PATCH v11 7/8] OMAP: dmtimer: pm_runtime support
Date: Thu, 03 Mar 2011 17:22:44 -0800 [thread overview]
Message-ID: <878vwvn0gr.fsf@ti.com> (raw)
In-Reply-To: <1298546811-27055-8-git-send-email-tarun.kanti@ti.com> (Tarun Kanti DebBarma's message of "Thu, 24 Feb 2011 16:56:50 +0530")
Tarun Kanti DebBarma <tarun.kanti@ti.com> writes:
> Add pm_runtime support to dmtimer. Since dmtimer is used during
> early boot before pm_runtime is initialized completely there are
> provisions to enable/disable clocks directly in the code during
> early boot.
I'm still not crazy about the duplicate logic (both early & normal) in
all the enable/disable functions.
As I've suggested in the past, why not just do a clk_get, clk_enable in
when the early timers are initialized, then do a clk_disable, clk_put()
as soon as the "normal" device is ready and PM runtime is enabled.
That will greatly simplify the code and eliminate the unnecessary checks
for ->is_early_device which will always be false except for in early
boot (when these functions are not likely to be called anyways.)
> Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com>
> [p-basak2@ti.com: added pm_runtime logic in probe()]
> Signed-off-by: Partha Basak <p-basak2@ti.com>
> Reviewed-by: Varadarajan, Charulatha <charu@ti.com>
> Acked-by: Cousson, Benoit <b-cousson@ti.com>
> ---
> arch/arm/plat-omap/dmtimer.c | 63 ++++++++++++++++++++++++++++++++++++------
> 1 files changed, 54 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
> index 53f5205..fcac422 100644
> --- a/arch/arm/plat-omap/dmtimer.c
> +++ b/arch/arm/plat-omap/dmtimer.c
> @@ -39,6 +39,7 @@
> #include <linux/delay.h>
> #include <linux/io.h>
> #include <linux/slab.h>
> +#include <linux/pm_runtime.h>
> #include <linux/err.h>
> #include <linux/platform_device.h>
> #include <plat/dmtimer.h>
> @@ -211,13 +212,16 @@ static void omap_dm_timer_prepare(struct omap_dm_timer *timer)
> {
> struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data;
>
> - timer->fclk = clk_get(&timer->pdev->dev, "fck");
> - if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) {
> - dev_err(&timer->pdev->dev, ": No fclk handle.\n");
> - return;
> + if (!pdata->is_omap16xx) {
Is this 'is_omap16xx' really needed here? If the clk_get fails, set
timer->fclk to NULL, and any other users of fclk should just check the
validity of timer->fclk.
> + timer->fclk = clk_get(&timer->pdev->dev, "fck");
> + if (WARN_ON_ONCE(IS_ERR_OR_NULL(timer->fclk))) {
> + dev_err(&timer->pdev->dev, ": No fclk handle.\n");
> + return;
> + }
> }
>
> - omap_dm_timer_enable(timer);
> + if (!pdata->is_omap16xx)
> + omap_dm_timer_enable(timer);
I don't think this if is needed, as runtime PM calls will essentially be
nops on OMAP1 anyways.
> if (pdata->dm_timer_reset)
> pdata->dm_timer_reset(timer);
> @@ -292,10 +296,22 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_free);
>
> void omap_dm_timer_enable(struct omap_dm_timer *timer)
> {
> + struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data;
> +
> if (timer->enabled)
> return;
>
> - clk_enable(timer->fclk);
> + if (unlikely(pdata->is_early_init)) {
> + clk_enable(timer->fclk);
> + timer->enabled = 1;
> + return;
> + }
> +
> + if (pm_runtime_get_sync(&timer->pdev->dev) < 0) {
> + dev_err(&timer->pdev->dev, "%s: pm_runtime_get_sync() FAILED\n",
> + __func__);
> + return;
> + }
>
> timer->enabled = 1;
> }
Taking my above suggestion, this can be simplified to:
void omap_dm_timer_enable(struct omap_dm_timer *timer)
{
pm_runtime_get_sync(&timer->pdev->dev);
}
Note that with runtime PM, the ->enabled flag is no longer needed
either, as you can simply check pm_runtime_suspended(dev) instead.
> @@ -303,10 +319,22 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable);
>
> void omap_dm_timer_disable(struct omap_dm_timer *timer)
> {
> + struct dmtimer_platform_data *pdata = timer->pdev->dev.platform_data;
> +
> if (!timer->enabled)
> return;
>
> - clk_disable(timer->fclk);
> + if (unlikely(pdata->is_early_init)) {
> + clk_disable(timer->fclk);
> + timer->enabled = 0;
> + return;
> + }
> +
> + if (pm_runtime_put_sync(&timer->pdev->dev) < 0) {
> + dev_err(&timer->pdev->dev, "%s: pm_runtime_put_sync() FAILED\n",
> + __func__);
> + return;
> + }
>
> timer->enabled = 0;
> }
Likewise, this becomes
void omap_dm_timer_disable(struct omap_dm_timer *timer)
{
pm_runtime_put_sync(&timer->pdev->dev);
}
> @@ -425,10 +453,12 @@ int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
> if (source < 0 || source >= 3)
> return -EINVAL;
>
> - omap_dm_timer_disable(timer);
> + if (!pdata->is_omap16xx)
drop the if
> + omap_dm_timer_disable(timer);
> /* change the timer clock source */
> ret = pdata->set_timer_src(timer->pdev, source);
> - omap_dm_timer_enable(timer);
> + if (!pdata->is_omap16xx)
and this one,
and with that, there are no users of is_omap16xx in this patch.
Kevin
> + omap_dm_timer_enable(timer);
>
> /*
> * When the functional clock disappears, too quick writes seem
> @@ -600,11 +630,26 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)
> return -ENODEV;
> }
>
> + /*
> + * OMAP2+
> + * Early timers are already registered and in list.
> + * What we need to do during second phase of probe
> + * is to assign the newly allocated/configured pdev
> + * to timer->pdev. We also call pm_runtime_enable()
> + * for each device because it could not be called
> + * during early boot because pm_runtime framework
> + * was not yet up and running.
> + */
> spin_lock_irqsave(&dm_timer_lock, flags);
> list_for_each_entry(timer, &omap_timer_list, node)
> if (!pdata->is_early_init && timer->id == pdev->id) {
> timer->pdev = pdev;
> spin_unlock_irqrestore(&dm_timer_lock, flags);
> + pm_runtime_enable(&pdev->dev);
> + /* update PM runtime for active early timers */
> + if (timer->reserved)
> + pm_runtime_get_sync(&pdev->dev);
> +
> dev_dbg(&pdev->dev, "Regular Probed\n");
> return 0;
> }
next prev parent reply other threads:[~2011-03-04 1:24 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-24 11:26 [PATCH v11 0/8] dmtimer adaptation to platform_driver Tarun Kanti DebBarma
2011-02-24 11:26 ` [PATCH v11 1/8] OMAP2+: dmtimer: add device names to flck nodes Tarun Kanti DebBarma
2011-02-24 11:26 ` [PATCH v11 2/8] OMAP4: hwmod data: add dmtimer version information Tarun Kanti DebBarma
2011-03-04 0:24 ` Kevin Hilman
2011-03-04 5:49 ` DebBarma, Tarun Kanti
2011-03-04 11:16 ` Cousson, Benoit
2011-03-07 11:19 ` DebBarma, Tarun Kanti
2011-02-24 11:26 ` [PATCH v11 3/8] OMAP1: dmtimer: conversion to platform devices Tarun Kanti DebBarma
2011-02-24 11:26 ` [PATCH v11 4/8] OMAP2+: dmtimer: convert " Tarun Kanti DebBarma
2011-03-04 1:01 ` Kevin Hilman
2011-03-04 6:34 ` DebBarma, Tarun Kanti
2011-03-04 17:25 ` Kevin Hilman
2011-03-04 19:24 ` DebBarma, Tarun Kanti
2011-02-24 11:26 ` [PATCH v11 5/8] OMAP: dmtimer: platform driver Tarun Kanti DebBarma
2011-03-04 0:35 ` Kevin Hilman
2011-03-04 9:07 ` DebBarma, Tarun Kanti
2011-03-04 1:29 ` Kevin Hilman
2011-03-04 6:56 ` DebBarma, Tarun Kanti
2011-03-04 16:53 ` Kevin Hilman
2011-03-04 19:07 ` DebBarma, Tarun Kanti
2011-02-24 11:26 ` [PATCH v11 6/8] dmtimer: switch-over to platform device driver Tarun Kanti DebBarma
2011-03-04 1:25 ` Kevin Hilman
2011-03-04 6:57 ` DebBarma, Tarun Kanti
2011-03-04 17:23 ` Tony Lindgren
2011-03-04 18:52 ` DebBarma, Tarun Kanti
2011-03-04 19:37 ` Tony Lindgren
2011-03-04 19:41 ` DebBarma, Tarun Kanti
2011-03-05 7:54 ` Santosh Shilimkar
2011-03-07 12:54 ` DebBarma, Tarun Kanti
2011-03-08 0:07 ` Tony Lindgren
2011-03-08 0:11 ` DebBarma, Tarun Kanti
2011-02-24 11:26 ` [PATCH v11 7/8] OMAP: dmtimer: pm_runtime support Tarun Kanti DebBarma
2011-03-04 1:22 ` Kevin Hilman [this message]
2011-03-04 9:18 ` DebBarma, Tarun Kanti
2011-03-04 17:28 ` Tony Lindgren
2011-03-04 18:57 ` DebBarma, Tarun Kanti
2011-03-04 19:37 ` Tony Lindgren
2011-03-04 19:52 ` DebBarma, Tarun Kanti
2011-03-05 0:01 ` Tony Lindgren
2011-03-05 0:22 ` DebBarma, Tarun Kanti
2011-03-08 0:10 ` Tony Lindgren
2011-03-08 0:13 ` DebBarma, Tarun Kanti
2011-02-24 11:26 ` [PATCH v11 8/8] OMAP: dmtimer: add timeout to low-level routines Tarun Kanti DebBarma
2011-02-25 14:08 ` [PATCH v11 0/8] dmtimer adaptation to platform_driver DebBarma, Tarun Kanti
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=878vwvn0gr.fsf@ti.com \
--to=khilman@ti.com \
--cc=linux-omap@vger.kernel.org \
--cc=p-basak2@ti.com \
--cc=tarun.kanti@ti.com \
/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.