[PATCH V3 13/19] OMAP3+: SR: Reuse sr_[start|stop]_vddautocomp functions

Kevin Hilman khilman at ti.com
Thu Mar 17 13:25:30 EDT 2011


Nishanth Menon <nm at ti.com> writes:

> From: Jarkko Nikula <jhnikula at gmail.com>
>
> sr_start_vddautocomp and sr_stop_autocomp functions can be reused from
> omap_sr_enable, omap_sr_disable and omap_sr_disable_reset_volt and by
> adding one additional argument sr_stop_autocomp. This allows us to have
> a single point where SR enable and disable operations are controlled from.
>
> [nm at ti.com: synced it up with class start/stop as well. autocomp flag
>  should only be disabled when SR is disabled for that domain]
> Signed-off-by: Nishanth Menon <nm at ti.com>
> Signed-off-by: Jarkko Nikula <jhnikula at gmail.com>
> ---
> Side note: Jarkko has'nt seen this rev as I just finished the rebase and tested
> but adding his signed-off anyways as he is primary contributor to the idea
> and the patch.

This one looks fine, but will wait to apply it since it depends on the
previous one which needs some minor fixups.

Kevin

>  arch/arm/mach-omap2/smartreflex.c |   66 +++++++++++++------------------------
>  1 files changed, 23 insertions(+), 43 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
> index 592e9a0..d839fa6 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -211,8 +211,12 @@ static void sr_set_regfields(struct omap_sr *sr)
>  	}
>  }
>  
> -static void sr_start_vddautocomp(struct omap_sr *sr)
> +static void sr_start_vddautocomp(struct omap_sr *sr, bool class_start)
>  {
> +	int r;
> +	if (sr->autocomp_active)
> +		return;
> +
>  	if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
>  		dev_warn(&sr->pdev->dev,
>  			"%s: smartreflex class driver not registered\n",
> @@ -220,19 +224,24 @@ static void sr_start_vddautocomp(struct omap_sr *sr)
>  		return;
>  	}
>  
> -	if (sr_class->start &&
> +	if (class_start && sr_class->start &&
>  	    sr_class->start(sr->voltdm, sr_class->class_priv_data)) {
>  		dev_err(&sr->pdev->dev,
>  			"%s: SRClass initialization failed\n", __func__);
>  		return;
>  	}
>  
> -	if (!sr_class->enable(sr->voltdm))
> +	r = sr_class->enable(sr->voltdm);
> +	if (!r && class_start)
>  		sr->autocomp_active = true;
>  }
>  
> -static void sr_stop_vddautocomp(struct omap_sr *sr)
> +static void sr_stop_vddautocomp(struct omap_sr *sr, bool class_stop,
> +		int is_volt_reset)
>  {
> +	if (!sr->autocomp_active)
> +		return;
> +
>  	if (!sr_class || !(sr_class->disable)) {
>  		dev_warn(&sr->pdev->dev,
>  			"%s: smartreflex class driver not registered\n",
> @@ -240,15 +249,13 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)
>  		return;
>  	}
>  
> -	if (sr->autocomp_active) {
> -		sr_class->disable(sr->voltdm, 1);
> +	sr_class->disable(sr->voltdm, is_volt_reset);
> +	if (class_stop) {
>  		if (sr_class->stop &&
> -		    sr_class->stop(sr->voltdm,
> -			    sr_class->class_priv_data)) {
> +		    sr_class->stop(sr->voltdm, sr_class->class_priv_data))
>  			dev_err(&sr->pdev->dev,
>  				"%s: SR[%d]Class deinitialization failed\n",
>  				__func__, sr->srid);
> -		}
>  		sr->autocomp_active = false;
>  	}
>  }
> @@ -285,7 +292,7 @@ static int sr_late_init(struct omap_sr *sr_info)
>  	}
>  
>  	if (pdata && pdata->enable_on_init)
> -		sr_start_vddautocomp(sr_info);
> +		sr_start_vddautocomp(sr_info, true);
>  
>  	return ret;
>  
> @@ -693,16 +700,7 @@ void omap_sr_enable(struct voltagedomain *voltdm)
>  		return;
>  	}
>  
> -	if (!sr->autocomp_active)
> -		return;
> -
> -	if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
> -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
> -			"registered\n", __func__);
> -		return;
> -	}
> -
> -	sr_class->enable(voltdm);
> +	sr_start_vddautocomp(sr, false);
>  }
>  
>  /**
> @@ -726,16 +724,7 @@ void omap_sr_disable(struct voltagedomain *voltdm)
>  		return;
>  	}
>  
> -	if (!sr->autocomp_active)
> -		return;
> -
> -	if (!sr_class || !(sr_class->disable)) {
> -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
> -			"registered\n", __func__);
> -		return;
> -	}
> -
> -	sr_class->disable(voltdm, 0);
> +	sr_stop_vddautocomp(sr, false, 0);
>  }
>  
>  /**
> @@ -759,16 +748,7 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)
>  		return;
>  	}
>  
> -	if (!sr->autocomp_active)
> -		return;
> -
> -	if (!sr_class || !(sr_class->disable)) {
> -		dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
> -			"registered\n", __func__);
> -		return;
> -	}
> -
> -	sr_class->disable(voltdm, 1);
> +	sr_stop_vddautocomp(sr, false, 1);
>  }
>  
>  /**
> @@ -823,9 +803,9 @@ static int omap_sr_autocomp_store(void *data, u64 val)
>  	/* control enable/disable only if there is a delta in value */
>  	if (sr_info->autocomp_active != val) {
>  		if (!val)
> -			sr_stop_vddautocomp(sr_info);
> +			sr_stop_vddautocomp(sr_info, true, 1);
>  		else
> -			sr_start_vddautocomp(sr_info);
> +			sr_start_vddautocomp(sr_info, true);
>  	}
>  
>  	return 0;
> @@ -987,7 +967,7 @@ static int __devexit omap_sr_remove(struct platform_device *pdev)
>  	}
>  
>  	if (sr_info->autocomp_active)
> -		sr_stop_vddautocomp(sr_info);
> +		sr_stop_vddautocomp(sr_info, true, 1);
>  
>  	list_del(&sr_info->node);
>  	iounmap(sr_info->base);



More information about the linux-arm-kernel mailing list