linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nishanth Menon <menon.nishanth@gmail.com>
To: "Gopinath, Thara" <thara@ti.com>
Cc: "Menon, Nishanth" <nm@ti.com>,
	linux-omap <linux-omap@vger.kernel.org>,
	Kevin Hilman <khilman@deeprootsystems.com>
Subject: Re: [PM-SR][PATCH 09/12] omap3: sr: enable/disable sr only if required
Date: Fri, 06 Aug 2010 05:54:45 -0500	[thread overview]
Message-ID: <4C5BE9F5.6090509@gmail.com> (raw)
In-Reply-To: <5A47E75E594F054BAF48C5E4FC4B92AB032401CD1B@dbde02.ent.ti.com>

On 08/05/2010 11:51 PM, Gopinath, Thara wrote:
>
>
>>> -----Original Message-----
>>> From: Menon, Nishanth
>>> Sent: Friday, August 06, 2010 3:54 AM
>>> To: linux-omap
>>> Cc: Menon, Nishanth; Kevin Hilman; Gopinath, Thara
>>> Subject: [PM-SR][PATCH 09/12] omap3: sr: enable/disable sr only if required
>>>
>>> We dont need to go down the path of enabling/disabling the SR
>>> if we dont need to. do some sanity check and trigger if needed
>>>
>>> Cc: Kevin Hilman<khilman@deeprootsystems.com>
>>> Cc: Thara Gopinath<thara@ti.com>
>>>
>>> Signed-off-by: Nishanth Menon<nm@ti.com>
>>> ---
>>> arch/arm/mach-omap2/smartreflex.c |   19 +++++++++++++++----
>>> 1 files changed, 15 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
>>> index d63691b..9b5a10e 100644
>>> --- a/arch/arm/mach-omap2/smartreflex.c
>>> +++ b/arch/arm/mach-omap2/smartreflex.c
>>> @@ -778,15 +778,26 @@ static int omap_sr_autocomp_show(void *data, u64 *val)
>>> static int omap_sr_autocomp_store(void *data, u64 val)
>>> {
>>> 	struct omap_sr *sr_info = (struct omap_sr *) data;
>>> +	u32 value = (u32) val;
>>>
>>> 	if (!sr_info) {
>>> 		pr_warning("%s: omap_sr struct for SR not found\n", __func__);
>>> 		return -EINVAL;
>>> 	}
>>> -	if (!val)
>>> -		sr_stop_vddautocomp(sr_info);
>>> -	else
>>> -		sr_start_vddautocomp(sr_info);
>>> +
>>> +	/* Sanity check */
>>> +	if (value&&  (value != 1)) {
>>> +		pr_err("%s: invalid value %d\n", __func__, value);
>>> +		return -EINVAL;
>>> +	}
> Will take this in.
>
>>> +
>>> +	/* change only if needed */
>>> +	if (sr_info->is_autocomp_active ^ value) {
>
> I do not think this is necessary. sr_start_vddautocomp and sr_stop_vddautocomp will take care of
> enabling and disabling intelligently.

hypothesis 1: helper level code is intelligent:
So, lets see where that intelligence exists:
in start autocomp:
static void sr_start_vddautocomp(struct omap_sr *sr) 

{
         if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
                 dev_warn(&sr->pdev->dev,
                         "%s: smartreflex class driver not registered\n",
                         __func__);
                 return;
         }
[NM - Till here we ensured we have an SR class]
         sr->is_autocomp_active = 1;
[NM - aha, we already enabled autocomp]
         if (sr_class->enable(sr->srid))
[NM - this is where the intelligence is -> Class drivers should be now 
intelligent to know if autocomp was previously enabled]
                 sr->is_autocomp_active = 0;
[NM - if we failed we set it then we disable autocomp_active]
}

ok now, lets dig a little further into class3 enable function -> how 
intelligent it really is:
static int sr_class3_enable(int id)
{
         unsigned long volt = 0;

         volt = get_curr_voltage(id);
         if (!volt) {
                 pr_warning("%s: Current voltage unknown.Cannot enable 
SR%d\n",
                                 __func__, id);
                 return -ENODATA;
         }
[NM - so far no intelligence]
         omap_voltageprocessor_enable(id);
[NM - woops we renable voltage processor if we were already enabled]
         return sr_enable(id, volt);
[NM - aha so we are back to Smartreflex core driver for intelligence]
}

digging futher into sr_enable for "intelligent check":
int sr_enable(int srid, unsigned long volt)
{
	u32 nvalue_reciprocal;
	struct omap_volt_data *volt_data;
	struct omap_sr *sr = _sr_lookup(srid);
	int ret;

	if (!sr) {
		pr_warning("%s: omap_sr struct for SR%d not found\n",
			__func__, srid + 1);
		return -EINVAL;
	}

	volt_data = omap_get_volt_data(sr->srid, volt);

	if (IS_ERR(volt_data)) {
		dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table"
			" for nominal voltage %ld\n", __func__, volt);
		return -ENODATA;
	}

	nvalue_reciprocal = volt_data->sr_nvalue;

	if (!nvalue_reciprocal) {
		dev_warn(&sr->pdev->dev, "%s: NVALUE = 0 at voltage %ld\n",
			__func__, volt);
		return -ENODATA;
	}
[NM: So far no intelligence]
	/*
	 * errminlimit is opp dependent and hence linked to voltage
	 * if the debug option is enabled, the user might have over ridden
	 * this parameter so do not get it from voltage table
	 */
	if (!enable_sr_vp_debug)
		sr->err_minlimit = volt_data->sr_errminlimit;

	/* Enable the clocks */
	if (!sr->is_sr_enable) {
		struct omap_sr_data *pdata =
				sr->pdev->dev.platform_data;
		if (pdata->device_enable) {
			ret = pdata->device_enable(sr->pdev);
			if (ret)
				return ret;
		} else {
			dev_warn(&sr->pdev->dev, "%s: Not able to turn on SR"
				"clocks during enable. So returning\n",
				__func__);
			return -EPERM;
		}
		sr->is_sr_enable = 1;
	}
[NM: Dont think this matters too much but yeah, we do set is_sr_enable 
to 1 - the fact that we came to this depth implies something is horribly 
screwed up we are in our normal enable flow!!!]
	/* Check if SR is already enabled. If yes do nothing */
	if (sr_read_reg(sr, SRCONFIG) & SRCONFIG_SRENABLE)
		return 0;

[NM - this is where the real "intelligence" is - since we already have 
sr_enable set in previous operation in Class3, it will detect and return.

HOWEVER, this "intelligence" will fail miserably in the case of class 2 
or class 1.5]


Hypothesis 2: it is a good practice to do verification of parameters in 
helper functions.

as I show in the previous example, there actual verification is 3 
functions deep and not really a good way of "intelligent" check - for as 
far as I think,
a)  I dont even care to have to pay a single function call penalty that 
I can check with a single if statement
b) as a caller of a function, i make every effort to ensure that the 
parameters that I call the function with are correct and I call it only 
when needed

in short, I dont think your analysis is right, we dont have that 
intelligence there, and my suggestion - it is better to do the check 
before calling a helper function.

Regards,
Nishanth Menon

  reply	other threads:[~2010-08-06 10:54 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-05 22:24 [PM-SR][PATCH 00/12 v2] omap3: sr: janitor series Nishanth Menon
2010-08-05 22:24 ` [PM-SR][PATCH 01/12] omap3: voltage: cleanup pr_xxxx Nishanth Menon
2010-08-06  7:42   ` Gopinath, Thara
2010-08-06 11:08     ` Nishanth Menon
2010-08-06 12:18       ` Mark Brown
2010-08-06 13:10         ` Nishanth Menon
2010-08-06 13:32           ` Mark Brown
2010-08-06 13:37             ` Nishanth Menon
2010-08-06 13:50               ` Mark Brown
2010-08-13 10:39       ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 02/12] omap3: voltage: make required variables static Nishanth Menon
2010-08-06  7:39   ` Gopinath, Thara
2010-08-06 11:02     ` Nishanth Menon
2010-08-05 22:24 ` [PM-SR][PATCH 03/12] omap3: voltage: expose omap_change_voltscale_method Nishanth Menon
2010-08-06  7:07   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 04/12] omap3: sr: device: cleanup pr_xxx Nishanth Menon
2010-08-06  7:11   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 05/12] omap3: sr: device: check for dev_attr Nishanth Menon
2010-08-06  7:27   ` Gopinath, Thara
2010-08-06 11:00     ` Nishanth Menon
2010-08-05 22:24 ` [PM-SR][PATCH 06/12] omap3: sr: device: fail sr_dev_init should return error Nishanth Menon
2010-08-06  7:24   ` Gopinath, Thara
2010-08-06 10:59     ` Nishanth Menon
2010-08-13 10:31       ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 07/12] omap3: sr: device: make omap_sr_latency static Nishanth Menon
2010-08-06  7:24   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 08/12] omap3: sr: cleanup pr_xxx Nishanth Menon
2010-08-06  4:38   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 09/12] omap3: sr: enable/disable sr only if required Nishanth Menon
2010-08-06  4:51   ` Gopinath, Thara
2010-08-06 10:54     ` Nishanth Menon [this message]
2010-08-05 22:24 ` [PM-SR][PATCH 10/12] omap3: sr: export sr_dbg_dir Nishanth Menon
2010-08-06  4:56   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 11/12] omap3: sr: sr_exit should be static Nishanth Menon
2010-08-06  4:57   ` Gopinath, Thara
2010-08-05 22:24 ` [PM-SR][PATCH 12/12] omap3: sr: class3: make class3_data static Nishanth Menon
2010-08-06  7:32   ` Gopinath, Thara

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=4C5BE9F5.6090509@gmail.com \
    --to=menon.nishanth@gmail.com \
    --cc=khilman@deeprootsystems.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=thara@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).