diff mbox

OMAP3: SR: Fix SR driver to check for omap-pm return values

Message ID 1240988319-30282-1-git-send-email-rnayak@ti.com (mailing list archive)
State Accepted
Delegated to: Kevin Hilman
Headers show

Commit Message

Rajendra Nayak April 29, 2009, 6:58 a.m. UTC
This patch checks for the return values of omap_pm_vddx_get_opp()
in SR driver and acts accordingly. With no SRF layer enabled the OMAP-PM layer
api is unable to return the current OPP.

Signed-off-by: Rajendra Nayak <rnayak@ti.com>
---
 arch/arm/mach-omap2/smartreflex.c |   42 +++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 4 deletions(-)

Comments

Roger Quadros April 29, 2009, 7:49 a.m. UTC | #1
ext Rajendra Nayak wrote:
> This patch checks for the return values of omap_pm_vddx_get_opp()
> in SR driver and acts accordingly. With no SRF layer enabled the OMAP-PM layer
> api is unable to return the current OPP.
> 
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> ---
>  arch/arm/mach-omap2/smartreflex.c |   42 +++++++++++++++++++++++++++++++++---
>  1 files changed, 38 insertions(+), 4 deletions(-)
> 

> +		if (!omap_pm_vdd1_get_opp())
> +			/* Assume Nominal OPP as current OPP unknown */
> +			vsel = mpu_opps[VDD1_OPP3].vsel;
> +		else
> +			vsel = mpu_opps[omap_pm_vdd1_get_opp()].vsel;
> +

Hi Rajendra,

   By this approach, what will be the implications if the bootloader had set the 
OPP to something different than your assumption?
   I think the best approach would be to modify the PM layer to at least return 
correct OPP and Frequency values. What do you think?
   We should not expect every driver using X_get_opp to assume the OPP if it 
returns error.

Please see this thread to see the alternative solution.
http://www.mail-archive.com/linux-omap@vger.kernel.org/msg12021.html

I know it uses resource framework even if we set PM_NONE or PM_NOOP, but only 
for getting the correct OPP/frequency values.

regards,
-roger
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rajendra Nayak April 29, 2009, 11:45 a.m. UTC | #2
> -----Original Message-----
> From: Roger Quadros [mailto:ext-roger.quadros@nokia.com] 
> Sent: Wednesday, April 29, 2009 1:20 PM
> To: Nayak, Rajendra
> Cc: linux-omap@vger.kernel.org
> Subject: Re: [PATCH] OMAP3: SR: Fix SR driver to check for 
> omap-pm return values
> 
> ext Rajendra Nayak wrote:
> > This patch checks for the return values of omap_pm_vddx_get_opp()
> > in SR driver and acts accordingly. With no SRF layer 
> enabled the OMAP-PM layer
> > api is unable to return the current OPP.
> > 
> > Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> > ---
> >  arch/arm/mach-omap2/smartreflex.c |   42 
> +++++++++++++++++++++++++++++++++---
> >  1 files changed, 38 insertions(+), 4 deletions(-)
> > 
> 
> > +		if (!omap_pm_vdd1_get_opp())
> > +			/* Assume Nominal OPP as current OPP unknown */
> > +			vsel = mpu_opps[VDD1_OPP3].vsel;
> > +		else
> > +			vsel = mpu_opps[omap_pm_vdd1_get_opp()].vsel;
> > +
> 
> Hi Rajendra,
> 
>    By this approach, what will be the implications if the 
> bootloader had set the 
> OPP to something different than your assumption?
>    I think the best approach would be to modify the PM layer 
> to at least return 
> correct OPP and Frequency values. What do you think?

The PM layer was designed to be just a thin wrapper layer, which
on its own does not have any way to return the right OPP.
It relies on SRF or something else below to provide the right info.

The assumption of OPP comes in only with SRF disabled and nothing
else present to replace the functionality. 
Any reason why SRF is disabled in Nokia builds?

>    We should not expect every driver using X_get_opp to 
> assume the OPP if it 
> returns error.
> 
> Please see this thread to see the alternative solution.
> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg12021.html
> 
> I know it uses resource framework even if we set PM_NONE or 
> PM_NOOP, but only 
> for getting the correct OPP/frequency values.
> 
> regards,
> -roger
> 
> --
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kevin Hilman May 13, 2009, 2:52 p.m. UTC | #3
Rajendra Nayak <rnayak@ti.com> writes:

> This patch checks for the return values of omap_pm_vddx_get_opp()
> in SR driver and acts accordingly. With no SRF layer enabled the OMAP-PM layer
> api is unable to return the current OPP.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>

Thanks, pushing to the PM branch.

I preferred this approach to Roger's approach as I don't currently
like the idea of making PM_NONE and PM_NOOP dependent on SRF, even for
just OPPs.

Kevin


> ---
>  arch/arm/mach-omap2/smartreflex.c |   42 +++++++++++++++++++++++++++++++++---
>  1 files changed, 38 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
> index ae5c336..04baa8e 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -247,13 +247,19 @@ static void sr_set_nvalues(struct omap_sr *sr)
>  static void sr_configure_vp(int srid)
>  {
>  	u32 vpconfig;
> +	u32 vsel;
>  
>  	if (srid == SR1) {
> +		if (!omap_pm_vdd1_get_opp())
> +			/* Assume Nominal OPP as current OPP unknown */
> +			vsel = mpu_opps[VDD1_OPP3].vsel;
> +		else
> +			vsel = mpu_opps[omap_pm_vdd1_get_opp()].vsel;
> +
>  		vpconfig = PRM_VP1_CONFIG_ERROROFFSET |
>  			PRM_VP1_CONFIG_ERRORGAIN |
>  			PRM_VP1_CONFIG_TIMEOUTEN |
> -			mpu_opps[omap_pm_vdd1_get_opp()].vsel <<
> -			OMAP3430_INITVOLTAGE_SHIFT;
> +			vsel << OMAP3430_INITVOLTAGE_SHIFT;
>  
>  		prm_write_mod_reg(vpconfig, OMAP3430_GR_MOD,
>  					OMAP3_PRM_VP1_CONFIG_OFFSET);
> @@ -289,11 +295,16 @@ static void sr_configure_vp(int srid)
>  				       OMAP3_PRM_VP1_CONFIG_OFFSET);
>  
>  	} else if (srid == SR2) {
> +		if (!omap_pm_vdd2_get_opp())
> +			/* Assume Nominal OPP */
> +			vsel = l3_opps[VDD2_OPP3].vsel;
> +		else
> +			vsel = l3_opps[omap_pm_vdd2_get_opp()].vsel;
> +
>  		vpconfig = PRM_VP2_CONFIG_ERROROFFSET |
>  			PRM_VP2_CONFIG_ERRORGAIN |
>  			PRM_VP2_CONFIG_TIMEOUTEN |
> -			l3_opps[omap_pm_vdd2_get_opp()].vsel <<
> -			OMAP3430_INITVOLTAGE_SHIFT;
> +			vsel << OMAP3430_INITVOLTAGE_SHIFT;
>  
>  		prm_write_mod_reg(vpconfig, OMAP3430_GR_MOD,
>  					OMAP3_PRM_VP2_CONFIG_OFFSET);
> @@ -387,10 +398,18 @@ static int sr_reset_voltage(int srid)
>  
>  	if (srid == SR1) {
>  		target_opp_no = omap_pm_vdd1_get_opp();
> +		if (!target_opp_no) {
> +			pr_info("Current OPP unknown: Cannot reset voltage\n");
> +			return 1;
> +		}
>  		vsel = mpu_opps[target_opp_no].vsel;
>  		reg_addr = R_VDD1_SR_CONTROL;
>  	} else if (srid == SR2) {
>  		target_opp_no = omap_pm_vdd2_get_opp();
> +		if (!target_opp_no) {
> +			pr_info("Current OPP unknown: Cannot reset voltage\n");
> +			return 1;
> +		}
>  		vsel = l3_opps[target_opp_no].vsel;
>  		reg_addr = R_VDD2_SR_CONTROL;
>  	}
> @@ -620,6 +639,11 @@ void enable_smartreflex(int srid)
>  			else if (srid == SR2)
>  				target_opp_no = omap_pm_vdd2_get_opp();
>  
> +			if (!target_opp_no) {
> +				pr_info("Current OPP unknown \
> +						 Cannot configure SR\n");
> +			}
> +
>  			sr_configure(sr);
>  
>  			if (!sr_enable(sr, target_opp_no))
> @@ -754,6 +778,11 @@ static ssize_t omap_sr_vdd1_autocomp_store(struct kobject *kobj,
>  
>  	current_vdd1opp_no = omap_pm_vdd1_get_opp();
>  
> +	if (!current_vdd1opp_no) {
> +		pr_err("sr_vdd1_autocomp: Current VDD1 opp unknown\n");
> +		return -EINVAL;
> +	}
> +
>  	if (value == 0)
>  		sr_stop_vddautocomap(SR1);
>  	else
> @@ -792,6 +821,11 @@ static ssize_t omap_sr_vdd2_autocomp_store(struct kobject *kobj,
>  
>  	current_vdd2opp_no = omap_pm_vdd2_get_opp();
>  
> +	if (!current_vdd2opp_no) {
> +		pr_err("sr_vdd2_autocomp: Current VDD2 opp unknown\n");
> +		return -EINVAL;
> +	}
> +
>  	if (value == 0)
>  		sr_stop_vddautocomap(SR2);
>  	else
> -- 
> 1.5.4.7
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
index ae5c336..04baa8e 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -247,13 +247,19 @@  static void sr_set_nvalues(struct omap_sr *sr)
 static void sr_configure_vp(int srid)
 {
 	u32 vpconfig;
+	u32 vsel;
 
 	if (srid == SR1) {
+		if (!omap_pm_vdd1_get_opp())
+			/* Assume Nominal OPP as current OPP unknown */
+			vsel = mpu_opps[VDD1_OPP3].vsel;
+		else
+			vsel = mpu_opps[omap_pm_vdd1_get_opp()].vsel;
+
 		vpconfig = PRM_VP1_CONFIG_ERROROFFSET |
 			PRM_VP1_CONFIG_ERRORGAIN |
 			PRM_VP1_CONFIG_TIMEOUTEN |
-			mpu_opps[omap_pm_vdd1_get_opp()].vsel <<
-			OMAP3430_INITVOLTAGE_SHIFT;
+			vsel << OMAP3430_INITVOLTAGE_SHIFT;
 
 		prm_write_mod_reg(vpconfig, OMAP3430_GR_MOD,
 					OMAP3_PRM_VP1_CONFIG_OFFSET);
@@ -289,11 +295,16 @@  static void sr_configure_vp(int srid)
 				       OMAP3_PRM_VP1_CONFIG_OFFSET);
 
 	} else if (srid == SR2) {
+		if (!omap_pm_vdd2_get_opp())
+			/* Assume Nominal OPP */
+			vsel = l3_opps[VDD2_OPP3].vsel;
+		else
+			vsel = l3_opps[omap_pm_vdd2_get_opp()].vsel;
+
 		vpconfig = PRM_VP2_CONFIG_ERROROFFSET |
 			PRM_VP2_CONFIG_ERRORGAIN |
 			PRM_VP2_CONFIG_TIMEOUTEN |
-			l3_opps[omap_pm_vdd2_get_opp()].vsel <<
-			OMAP3430_INITVOLTAGE_SHIFT;
+			vsel << OMAP3430_INITVOLTAGE_SHIFT;
 
 		prm_write_mod_reg(vpconfig, OMAP3430_GR_MOD,
 					OMAP3_PRM_VP2_CONFIG_OFFSET);
@@ -387,10 +398,18 @@  static int sr_reset_voltage(int srid)
 
 	if (srid == SR1) {
 		target_opp_no = omap_pm_vdd1_get_opp();
+		if (!target_opp_no) {
+			pr_info("Current OPP unknown: Cannot reset voltage\n");
+			return 1;
+		}
 		vsel = mpu_opps[target_opp_no].vsel;
 		reg_addr = R_VDD1_SR_CONTROL;
 	} else if (srid == SR2) {
 		target_opp_no = omap_pm_vdd2_get_opp();
+		if (!target_opp_no) {
+			pr_info("Current OPP unknown: Cannot reset voltage\n");
+			return 1;
+		}
 		vsel = l3_opps[target_opp_no].vsel;
 		reg_addr = R_VDD2_SR_CONTROL;
 	}
@@ -620,6 +639,11 @@  void enable_smartreflex(int srid)
 			else if (srid == SR2)
 				target_opp_no = omap_pm_vdd2_get_opp();
 
+			if (!target_opp_no) {
+				pr_info("Current OPP unknown \
+						 Cannot configure SR\n");
+			}
+
 			sr_configure(sr);
 
 			if (!sr_enable(sr, target_opp_no))
@@ -754,6 +778,11 @@  static ssize_t omap_sr_vdd1_autocomp_store(struct kobject *kobj,
 
 	current_vdd1opp_no = omap_pm_vdd1_get_opp();
 
+	if (!current_vdd1opp_no) {
+		pr_err("sr_vdd1_autocomp: Current VDD1 opp unknown\n");
+		return -EINVAL;
+	}
+
 	if (value == 0)
 		sr_stop_vddautocomap(SR1);
 	else
@@ -792,6 +821,11 @@  static ssize_t omap_sr_vdd2_autocomp_store(struct kobject *kobj,
 
 	current_vdd2opp_no = omap_pm_vdd2_get_opp();
 
+	if (!current_vdd2opp_no) {
+		pr_err("sr_vdd2_autocomp: Current VDD2 opp unknown\n");
+		return -EINVAL;
+	}
+
 	if (value == 0)
 		sr_stop_vddautocomap(SR2);
 	else