From: Kevin Hilman <khilman@deeprootsystems.com>
To: romit@ti.com
Cc: nm@ti.com, linux-omap@vger.kernel.org
Subject: Re: [PM-WIP-OPP] [PATCH v3 1/1] Introducing enum for OPP types
Date: Wed, 27 Jan 2010 09:43:44 -0800 [thread overview]
Message-ID: <873a1rxx2n.fsf@deeprootsystems.com> (raw)
In-Reply-To: <1264081521.8266.10.camel@boson> (Romit Dasgupta's message of "Thu\, 21 Jan 2010 19\:15\:21 +0530")
Romit Dasgupta <romit@ti.com> writes:
> Using omap_opp * to refer to domain types entails opp implementation
> into maintaining pointers outside the opp layer.
> as:
>
> Since all we need is an identifier to a specific domain for
> query/operational purposes, we introduce enum for identifying
> OPP types instead of using opp layer's internal data structure
> pointer.
>
> Currently, OMAP3 is the only silicon supporting the OPP layer, hence
> mpu_opps, l3_opps and dsp_opps are deprecated and replaced with
> OPP_MPU, OPP_L3 and OPP_DSP respectively.
>
> Signed-off-by: Romit Dasgupta <romit@ti.com>
Romit, can you update this one more time on top of current pm-wip-opp
branch which has Eduardo's change to move things around?
Thanks,
Kevin
> ---
>
> arch/arm/mach-omap2/pm34xx.c | 15 --
> arch/arm/mach-omap2/resource34xx.c | 84 ++++++----------
> arch/arm/mach-omap2/smartreflex.c | 33 +-----
> arch/arm/plat-omap/common.c | 6 -
> arch/arm/plat-omap/cpu-omap.c | 12 +-
> arch/arm/plat-omap/include/plat/opp.h | 60 +++++------
> arch/arm/plat-omap/omap-pm-noop.c | 4
> arch/arm/plat-omap/omap-pm-srf.c | 4
> arch/arm/plat-omap/opp.c | 124 ++++++++++++++++--------
> 9 files changed, 172 insertions(+), 170 deletions(-)
>
>
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index 5c751c1..0930aef 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -1347,7 +1347,6 @@ static void __init configure_vc(void)
>
> void __init omap3_pm_init_opp_table(void)
> {
> - int i;
> struct omap_opp_def **omap3_opp_def_list;
> struct omap_opp_def *omap34xx_opp_def_list[] = {
> omap34xx_mpu_rate_table,
> @@ -1359,19 +1358,13 @@ void __init omap3_pm_init_opp_table(void)
> omap36xx_l3_rate_table,
> omap36xx_dsp_rate_table
> };
> - struct omap_opp **omap3_rate_tables[] = {
> - &mpu_opps,
> - &l3_opps,
> - &dsp_opps
> - };
>
> omap3_opp_def_list = cpu_is_omap3630() ? omap36xx_opp_def_list :
> omap34xx_opp_def_list;
> - for (i = 0; i < ARRAY_SIZE(omap3_rate_tables); i++) {
> - *omap3_rate_tables[i] = opp_init_list(omap3_opp_def_list[i]);
> - /* We dont want half configured system at the moment */
> - BUG_ON(IS_ERR(omap3_rate_tables[i]));
> - }
> +
> + BUG_ON(opp_init_list(OPP_MPU, omap3_opp_def_list[0]));
> + BUG_ON(opp_init_list(OPP_L3, omap3_opp_def_list[1]));
> + BUG_ON(opp_init_list(OPP_DSP, omap3_opp_def_list[2]));
> }
>
> static int __init omap3_pm_early_init(void)
> diff --git a/arch/arm/mach-omap2/resource34xx.c b/arch/arm/mach-omap2/resource34xx.c
> index 157b38e..3604a38 100644
> --- a/arch/arm/mach-omap2/resource34xx.c
> +++ b/arch/arm/mach-omap2/resource34xx.c
> @@ -161,7 +161,7 @@ static DEFINE_MUTEX(dvfs_mutex);
> /**
> * opp_to_freq - convert OPPID to frequency (DEPRECATED)
> * @freq: return frequency back to caller
> - * @opps: opp list
> + * @opp_type: OPP type where we need to look.
> * @opp_id: OPP ID we are searching for
> *
> * return 0 and freq is populated if we find the opp_id, else,
> @@ -169,14 +169,14 @@ static DEFINE_MUTEX(dvfs_mutex);
> *
> * NOTE: this function is a standin for the timebeing as opp_id is deprecated
> */
> -static int __deprecated opp_to_freq(unsigned long *freq,
> - const struct omap_opp *opps, u8 opp_id)
> +static int __deprecated opp_to_freq(unsigned long *freq, enum opp_t opp_type,
> + u8 opp_id)
> {
> struct omap_opp *opp;
>
> - BUG_ON(!freq || !opps);
> + BUG_ON(!freq || opp_type >= OPP_TYPES_MAX);
>
> - opp = opp_find_by_opp_id(opps, opp_id);
> + opp = opp_find_by_opp_id(opp_type, opp_id);
> if (!opp)
> return -EINVAL;
>
> @@ -188,20 +188,20 @@ static int __deprecated opp_to_freq(unsigned long *freq,
> /**
> * freq_to_opp - convert a frequency back to OPP ID (DEPRECATED)
> * @opp_id: opp ID returned back to caller
> - * @opps: opp list
> + * @opp_type: OPP type where we need to look.
> * @freq: frequency we are searching for
> *
> * return 0 and opp_id is populated if we find the freq, else, we return error
> *
> * NOTE: this function is a standin for the timebeing as opp_id is deprecated
> */
> -static int __deprecated freq_to_opp(u8 *opp_id, struct omap_opp *opps,
> +static int __deprecated freq_to_opp(u8 *opp_id, enum opp_t opp_type,
> unsigned long freq)
> {
> struct omap_opp *opp;
>
> - BUG_ON(!opp_id || !opps);
> - opp = opp_find_freq_ceil(opps, &freq);
> + BUG_ON(opp_type >= OPP_TYPES_MAX);
> + opp = opp_find_freq_ceil(opp_type, &freq);
> if (IS_ERR(opp))
> return -EINVAL;
> *opp_id = opp_get_opp_id(opp);
> @@ -218,9 +218,6 @@ void init_opp(struct shared_resource *resp)
> u8 opp_id;
> resp->no_of_users = 0;
>
> - if (!mpu_opps || !dsp_opps || !l3_opps)
> - return;
> -
> /* Initialize the current level of the OPP resource
> * to the opp set by u-boot.
> */
> @@ -228,14 +225,14 @@ void init_opp(struct shared_resource *resp)
> vdd1_resp = resp;
> dpll1_clk = clk_get(NULL, "dpll1_ck");
> dpll2_clk = clk_get(NULL, "dpll2_ck");
> - ret = freq_to_opp(&opp_id, mpu_opps, dpll1_clk->rate);
> + ret = freq_to_opp(&opp_id, OPP_MPU, dpll1_clk->rate);
> BUG_ON(ret); /* TBD Cleanup handling */
> curr_vdd1_opp = opp_id;
> } else if (strcmp(resp->name, "vdd2_opp") == 0) {
> vdd2_resp = resp;
> dpll3_clk = clk_get(NULL, "dpll3_m2_ck");
> l3_clk = clk_get(NULL, "l3_ick");
> - ret = freq_to_opp(&opp_id, l3_opps, l3_clk->rate);
> + ret = freq_to_opp(&opp_id, OPP_L3, l3_clk->rate);
> BUG_ON(ret); /* TBD Cleanup handling */
> curr_vdd2_opp = opp_id;
> }
> @@ -288,13 +285,13 @@ static int program_opp_freq(int res, int target_level, int current_level)
>
> /* Check if I can actually switch or not */
> if (res == VDD1_OPP) {
> - ret = opp_to_freq(&mpu_freq, mpu_opps, target_level);
> - ret |= opp_to_freq(&dsp_freq, dsp_opps, target_level);
> + ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
> + ret |= opp_to_freq(&dsp_freq, OPP_DSP, target_level);
> #ifndef CONFIG_CPU_FREQ
> - ret |= opp_to_freq(&mpu_cur_freq, mpu_opps, current_level);
> + ret |= opp_to_freq(&mpu_cur_freq, OPP_MPU, current_level);
> #endif
> } else {
> - ret = opp_to_freq(&l3_freq, l3_opps, target_level);
> + ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
> }
> /* we would have caught all bad levels earlier.. */
> if (unlikely(ret))
> @@ -329,7 +326,7 @@ static int program_opp_freq(int res, int target_level, int current_level)
> return target_level;
> }
>
> -static int program_opp(int res, struct omap_opp *opp, int target_level,
> +static int program_opp(int res, enum opp_t opp_type, int target_level,
> int current_level)
> {
> int i, ret = 0, raise;
> @@ -342,7 +339,7 @@ static int program_opp(int res, struct omap_opp *opp, int target_level,
> #endif
>
> /* See if have a freq associated, if not, invalid opp */
> - ret = opp_to_freq(&freq, opp, target_level);
> + ret = opp_to_freq(&freq, opp_type, target_level);
> if (unlikely(ret))
> return ret;
>
> @@ -365,13 +362,13 @@ static int program_opp(int res, struct omap_opp *opp, int target_level,
> * transitioning from good to good OPP
> * none of the following should fail..
> */
> - oppx = opp_find_freq_exact(opp, freq, true);
> + oppx = opp_find_freq_exact(opp_type, freq, true);
> BUG_ON(IS_ERR(oppx));
> uvdc = opp_get_voltage(oppx);
> vt = omap_twl_uv_to_vsel(uvdc);
>
> - BUG_ON(opp_to_freq(&freq, opp, current_level));
> - oppx = opp_find_freq_exact(opp, freq, true);
> + BUG_ON(opp_to_freq(&freq, opp_type, current_level));
> + oppx = opp_find_freq_exact(opp_type, freq, true);
> BUG_ON(IS_ERR(oppx));
> uvdc = opp_get_voltage(oppx);
> vc = omap_twl_uv_to_vsel(uvdc);
> @@ -404,15 +401,12 @@ int resource_set_opp_level(int res, u32 target_level, int flags)
> if (resp->curr_level == target_level)
> return 0;
>
> - if (!mpu_opps || !dsp_opps || !l3_opps)
> - return 0;
> -
> /* Check if I can actually switch or not */
> if (res == VDD1_OPP) {
> - ret = opp_to_freq(&mpu_freq, mpu_opps, target_level);
> - ret |= opp_to_freq(&mpu_old_freq, mpu_opps, resp->curr_level);
> + ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
> + ret |= opp_to_freq(&mpu_old_freq, OPP_MPU, resp->curr_level);
> } else {
> - ret = opp_to_freq(&l3_freq, l3_opps, target_level);
> + ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
> }
> if (ret)
> return ret;
> @@ -431,7 +425,7 @@ int resource_set_opp_level(int res, u32 target_level, int flags)
> /* Send pre notification to CPUFreq */
> cpufreq_notify_transition(&freqs_notify, CPUFREQ_PRECHANGE);
> #endif
> - resp->curr_level = program_opp(res, mpu_opps, target_level,
> + resp->curr_level = program_opp(res, OPP_MPU, target_level,
> resp->curr_level);
> #ifdef CONFIG_CPU_FREQ
> /* Send a post notification to CPUFreq */
> @@ -442,7 +436,7 @@ int resource_set_opp_level(int res, u32 target_level, int flags)
> mutex_unlock(&dvfs_mutex);
> return 0;
> }
> - resp->curr_level = program_opp(res, l3_opps, target_level,
> + resp->curr_level = program_opp(res, OPP_L3, target_level,
> resp->curr_level);
> }
> mutex_unlock(&dvfs_mutex);
> @@ -474,17 +468,17 @@ int set_opp(struct shared_resource *resp, u32 target_level)
> req_l3_freq = (target_level * 1000)/4;
>
> /* Do I have a best match? */
> - oppx = opp_find_freq_ceil(l3_opps, &req_l3_freq);
> + oppx = opp_find_freq_ceil(OPP_L3, &req_l3_freq);
> if (IS_ERR(oppx)) {
> /* Give me the best we got */
> req_l3_freq = ULONG_MAX;
> - oppx = opp_find_freq_floor(l3_opps, &req_l3_freq);
> + oppx = opp_find_freq_floor(OPP_L3, &req_l3_freq);
> }
>
> /* uh uh.. no OPPs?? */
> BUG_ON(IS_ERR(oppx));
>
> - ret = freq_to_opp((u8 *)&target_level, l3_opps, req_l3_freq);
> + ret = freq_to_opp((u8 *)&target_level, OPP_L3, req_l3_freq);
> /* we dont expect this to fail */
> BUG_ON(ret);
>
> @@ -503,9 +497,9 @@ int validate_opp(struct shared_resource *resp, u32 target_level)
> {
> unsigned long x;
> if (strcmp(resp->name, "mpu_freq") == 0)
> - return opp_to_freq(&x, mpu_opps, target_level);
> + return opp_to_freq(&x, OPP_MPU, target_level);
> else if (strcmp(resp->name, "dsp_freq") == 0)
> - return opp_to_freq(&x, dsp_opps, target_level);
> + return opp_to_freq(&x, OPP_DSP, target_level);
> return 0;
> }
>
> @@ -519,19 +513,16 @@ void init_freq(struct shared_resource *resp)
> unsigned long freq;
> resp->no_of_users = 0;
>
> - if (!mpu_opps || !dsp_opps)
> - return;
> -
> linked_res_name = (char *)resp->resource_data;
> /* Initialize the current level of the Freq resource
> * to the frequency set by u-boot.
> */
> if (strcmp(resp->name, "mpu_freq") == 0)
> /* MPU freq in Mhz */
> - ret = opp_to_freq(&freq, mpu_opps, curr_vdd1_opp);
> + ret = opp_to_freq(&freq, OPP_MPU, curr_vdd1_opp);
> else if (strcmp(resp->name, "dsp_freq") == 0)
> /* DSP freq in Mhz */
> - ret = opp_to_freq(&freq, dsp_opps, curr_vdd1_opp);
> + ret = opp_to_freq(&freq, OPP_DSP, curr_vdd1_opp);
> BUG_ON(ret);
>
> resp->curr_level = freq;
> @@ -543,16 +534,13 @@ int set_freq(struct shared_resource *resp, u32 target_level)
> u8 vdd1_opp;
> int ret = -EINVAL;
>
> - if (!mpu_opps || !dsp_opps)
> - return 0;
> -
> if (strcmp(resp->name, "mpu_freq") == 0) {
> - ret = freq_to_opp(&vdd1_opp, mpu_opps, target_level);
> + ret = freq_to_opp(&vdd1_opp, OPP_MPU, target_level);
> if (!ret)
> ret = resource_request("vdd1_opp", &dummy_mpu_dev,
> vdd1_opp);
> } else if (strcmp(resp->name, "dsp_freq") == 0) {
> - ret = freq_to_opp(&vdd1_opp, dsp_opps, target_level);
> + ret = freq_to_opp(&vdd1_opp, OPP_DSP, target_level);
> if (!ret)
> ret = resource_request("vdd1_opp", &dummy_dsp_dev,
> vdd1_opp);
> @@ -566,8 +554,8 @@ int validate_freq(struct shared_resource *resp, u32 target_level)
> {
> u8 x;
> if (strcmp(resp->name, "mpu_freq") == 0)
> - return freq_to_opp(&x, mpu_opps, target_level);
> + return freq_to_opp(&x, OPP_MPU, target_level);
> else if (strcmp(resp->name, "dsp_freq") == 0)
> - return freq_to_opp(&x, dsp_opps, target_level);
> + return freq_to_opp(&x, OPP_DSP, target_level);
> return 0;
> }
> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
> index 3c37837..1c5ec37 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -152,12 +152,11 @@ static u8 get_vdd1_opp(void)
> struct omap_opp *opp;
> unsigned long freq;
>
> - if (sr1.vdd_opp_clk == NULL || IS_ERR(sr1.vdd_opp_clk) ||
> - mpu_opps == NULL)
> + if (sr1.vdd_opp_clk == NULL || IS_ERR(sr1.vdd_opp_clk))
> return 0;
>
> freq = sr1.vdd_opp_clk->rate;
> - opp = opp_find_freq_ceil(mpu_opps, &freq);
> + opp = opp_find_freq_ceil(OPP_MPU, &freq);
> if (IS_ERR(opp))
> return 0;
> /*
> @@ -176,12 +175,11 @@ static u8 get_vdd2_opp(void)
> struct omap_opp *opp;
> unsigned long freq;
>
> - if (sr2.vdd_opp_clk == NULL || IS_ERR(sr2.vdd_opp_clk) ||
> - l3_opps == NULL)
> + if (sr2.vdd_opp_clk == NULL || IS_ERR(sr2.vdd_opp_clk))
> return 0;
>
> freq = sr2.vdd_opp_clk->rate;
> - opp = opp_find_freq_ceil(l3_opps, &freq);
> + opp = opp_find_freq_ceil(OPP_L3, &freq);
> if (IS_ERR(opp))
> return 0;
>
> @@ -310,7 +308,7 @@ static void sr_configure_vp(int srid)
> if (!target_opp_no)
> target_opp_no = VDD1_OPP3;
>
> - opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
> BUG_ON(!opp); /* XXX ugh */
>
> uvdc = opp_get_voltage(opp);
> @@ -359,7 +357,7 @@ static void sr_configure_vp(int srid)
> if (!target_opp_no)
> target_opp_no = VDD2_OPP3;
>
> - opp = opp_find_by_opp_id(l3_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
> BUG_ON(!opp); /* XXX ugh */
>
> uvdc = opp_get_voltage(opp);
> @@ -472,7 +470,7 @@ static int sr_reset_voltage(int srid)
> return 1;
> }
>
> - opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
> if (!opp)
> return 1;
>
> @@ -490,7 +488,7 @@ static int sr_reset_voltage(int srid)
> return 1;
> }
>
> - opp = opp_find_by_opp_id(l3_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
> if (!opp)
> return 1;
>
> @@ -546,11 +544,6 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
> int uvdc;
> char vsel;
>
> - if (!(mpu_opps && l3_opps)) {
> - pr_notice("VSEL values not found\n");
> - return false;
> - }
> -
> sr->req_opp_no = target_opp_no;
>
> if (sr->srid == SR1) {
> @@ -575,7 +568,7 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
> break;
> }
>
> - opp = opp_find_by_opp_id(mpu_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_MPU, target_opp_no);
> if (!opp)
> return false;
> } else {
> @@ -594,7 +587,7 @@ static int sr_enable(struct omap_sr *sr, u32 target_opp_no)
> break;
> }
>
> - opp = opp_find_by_opp_id(l3_opps, target_opp_no);
> + opp = opp_find_by_opp_id(OPP_L3, target_opp_no);
> if (!opp)
> return false;
> }
> @@ -1010,12 +1003,6 @@ static int __init omap3_sr_init(void)
> int ret = 0;
> u8 RdReg;
>
> - /* Exit if OPP tables are not defined */
> - if (!(mpu_opps && l3_opps)) {
> - pr_err("SR: OPP rate tables not defined for platform, not enabling SmartReflex\n");
> - return -ENODEV;
> - }
> -
> /* Enable SR on T2 */
> ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &RdReg,
> R_DCDC_GLOBAL_CFG);
> diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c
> index 6bd62ea..dddc027 100644
> --- a/arch/arm/plat-omap/common.c
> +++ b/arch/arm/plat-omap/common.c
> @@ -52,12 +52,6 @@ int omap_board_config_size;
> /* used by omap-smp.c and board-4430sdp.c */
> void __iomem *gic_cpu_base_addr;
>
> -#ifdef CONFIG_OMAP_PM_NONE
> -struct omap_opp *mpu_opps;
> -struct omap_opp *dsp_opps;
> -struct omap_opp *l3_opps;
> -#endif
> -
> static const void *get_config(u16 tag, size_t len, int skip, size_t *len_out)
> {
> struct omap_board_config_kernel *kinfo = NULL;
> diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c
> index 109203e..a69b557 100644
> --- a/arch/arm/plat-omap/cpu-omap.c
> +++ b/arch/arm/plat-omap/cpu-omap.c
> @@ -87,6 +87,9 @@ static int omap_target(struct cpufreq_policy *policy,
> #ifdef CONFIG_ARCH_OMAP1
> struct cpufreq_freqs freqs;
> #endif
> +#if defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE)
> + unsigned long freq = target_freq * 1000;
> +#endif
> int ret = 0;
>
> /* Ensure desired rate is within allowed range. Some govenors
> @@ -111,11 +114,8 @@ static int omap_target(struct cpufreq_policy *policy,
> ret = clk_set_rate(mpu_clk, freqs.new * 1000);
> cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> #elif defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE)
> - if (mpu_opps) {
> - unsigned long freq = target_freq * 1000;
> - if (!IS_ERR(opp_find_freq_ceil(mpu_opps, &freq)))
> - omap_pm_cpu_set_freq(freq);
> - }
> + if (opp_find_freq_ceil(OPP_MPU, &freq))
> + omap_pm_cpu_set_freq(freq);
> #endif
> return ret;
> }
> @@ -136,7 +136,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
> if (!cpu_is_omap34xx())
> clk_init_cpufreq_table(&freq_table);
> else
> - opp_init_cpufreq_table(mpu_opps, &freq_table);
> + opp_init_cpufreq_table(OPP_MPU, &freq_table);
>
> if (freq_table) {
> result = cpufreq_frequency_table_cpuinfo(policy, freq_table);
> diff --git a/arch/arm/plat-omap/include/plat/opp.h b/arch/arm/plat-omap/include/plat/opp.h
> index 9f91ad3..c3dc9fc 100644
> --- a/arch/arm/plat-omap/include/plat/opp.h
> +++ b/arch/arm/plat-omap/include/plat/opp.h
> @@ -5,6 +5,8 @@
> * Nishanth Menon
> * Copyright (C) 2009 Deep Root Systems, LLC.
> * Kevin Hilman
> + * Copyright (C) 2010 Texas Instruments Incorporated
> + * Romit Dasgupta <romit@ti.com>
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License version 2 as
> @@ -13,9 +15,16 @@
> #ifndef __ASM_ARM_OMAP_OPP_H
> #define __ASM_ARM_OMAP_OPP_H
>
> -extern struct omap_opp *mpu_opps;
> -extern struct omap_opp *dsp_opps;
> -extern struct omap_opp *l3_opps;
> +#ifdef CONFIG_ARCH_OMAP3
> +enum opp_t {
> + OPP_MPU,
> + OPP_L3,
> + OPP_DSP,
> + OPP_TYPES_MAX
> +};
> +#else
> +#error "You need to populate the OPP types for OMAP chip type."
> +#endif
>
> struct omap_opp;
>
> @@ -40,16 +49,16 @@ unsigned long opp_get_freq(const struct omap_opp *opp);
> /**
> * opp_get_opp_count() - Get number of opps enabled in the opp list
> * @num: returns the number of opps
> - * @oppl: opp list
> + * @opp_type: OPP type we want to count
> *
> * This functions returns the number of opps if there are any OPPs enabled,
> * else returns corresponding error value.
> */
> -int opp_get_opp_count(struct omap_opp *oppl);
> +int opp_get_opp_count(enum opp_t opp_type);
>
> /**
> * opp_find_freq_exact() - search for an exact frequency
> - * @oppl: OPP list
> + * @opp_type: OPP type we want to search in.
> * @freq: frequency to search for
> * @enabled: enabled/disabled OPP to search for
> *
> @@ -61,14 +70,14 @@ int opp_get_opp_count(struct omap_opp *oppl);
> * for exact matching frequency and is enabled. if true, the match is for exact
> * frequency which is disabled.
> */
> -struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
> +struct omap_opp *opp_find_freq_exact(enum opp_t opp_type,
> unsigned long freq, bool enabled);
>
> /* XXX This documentation needs fixing */
>
> /**
> * opp_find_freq_floor() - Search for an rounded freq
> - * @oppl: Starting list
> + * @opp_type: OPP type we want to search in
> * @freq: Start frequency
> *
> * Search for the lower *enabled* OPP from a starting freq
> @@ -97,14 +106,13 @@ struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
> * NOTE: if we set freq as ULONG_MAX and search low, we get the
> * highest enabled frequency
> */
> -struct omap_opp *opp_find_freq_floor(struct omap_opp *oppl,
> - unsigned long *freq);
> +struct omap_opp *opp_find_freq_floor(enum opp_t opp_type, unsigned long *freq);
>
> /* XXX This documentation needs fixing */
>
> /**
> * opp_find_freq_ceil() - Search for an rounded freq
> - * @oppl: Starting list
> + * @opp_type: OPP type where we want to search in
> * @freq: Start frequency
> *
> * Search for the higher *enabled* OPP from a starting freq
> @@ -130,7 +138,7 @@ struct omap_opp *opp_find_freq_floor(struct omap_opp *oppl,
> * freq++; * for next higher match *
> * }
> */
> -struct omap_opp *opp_find_freq_ceil(struct omap_opp *oppl, unsigned long *freq);
> +struct omap_opp *opp_find_freq_ceil(enum opp_t opp_type, unsigned long *freq);
>
>
> /**
> @@ -170,35 +178,27 @@ struct omap_opp_def {
>
> /**
> * opp_init_list() - Initialize an opp list from the opp definitions
> + * @opp_type: OPP type to initialize this list for.
> * @opp_defs: Initial opp definitions to create the list.
> *
> - * This function creates a list of opp definitions and returns a handle.
> + * This function creates a list of opp definitions and returns status.
> * This list can be used to further validation/search/modifications. New
> * opp entries can be added to this list by using opp_add().
> *
> - * In the case of error, ERR_PTR is returned to the caller and should be
> - * appropriately handled with IS_ERR.
> + * In the case of error, suitable error code is returned.
> */
> -struct omap_opp __init *opp_init_list(const struct omap_opp_def *opp_defs);
> +int __init opp_init_list(enum opp_t opp_type,
> + const struct omap_opp_def *opp_defs);
>
> /**
> * opp_add() - Add an OPP table from a table definitions
> - * @oppl: List to add the OPP to
> + * @opp_type: OPP type under which we want to add our new OPP.
> * @opp_def: omap_opp_def to describe the OPP which we want to add to list.
> *
> - * This function adds an opp definition to the opp list and returns
> - * a handle representing the new OPP list. This handle is then used for further
> - * validation, search, modification operations on the OPP list.
> - *
> - * This function returns the pointer to the allocated list through oppl if
> - * success, else corresponding ERR_PTR value. Caller should NOT free the oppl.
> - * opps_defs can be freed after use.
> + * This function adds an opp definition to the opp list and returns status.
> *
> - * NOTE: caller should assume that on success, oppl is probably populated with
> - * a new handle and the new handle should be used for further referencing
> */
> -struct omap_opp *opp_add(struct omap_opp *oppl,
> - const struct omap_opp_def *opp_def);
> +int opp_add(enum opp_t opp_type, const struct omap_opp_def *opp_def);
>
> /**
> * opp_enable() - Enable a specific OPP
> @@ -224,11 +224,11 @@ int opp_enable(struct omap_opp *opp);
> */
> int opp_disable(struct omap_opp *opp);
>
> -struct omap_opp * __deprecated opp_find_by_opp_id(struct omap_opp *opps,
> +struct omap_opp * __deprecated opp_find_by_opp_id(enum opp_t opp_type,
> u8 opp_id);
> u8 __deprecated opp_get_opp_id(struct omap_opp *opp);
>
> -void opp_init_cpufreq_table(struct omap_opp *opps,
> +void opp_init_cpufreq_table(enum opp_t opp_type,
> struct cpufreq_frequency_table **table);
>
>
> diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c
> index aeb372e..713a59f 100644
> --- a/arch/arm/plat-omap/omap-pm-noop.c
> +++ b/arch/arm/plat-omap/omap-pm-noop.c
> @@ -26,10 +26,6 @@
>
> #include <plat/powerdomain.h>
>
> -struct omap_opp *dsp_opps;
> -struct omap_opp *mpu_opps;
> -struct omap_opp *l3_opps;
> -
> /*
> * Device-driver-originated constraints (via board-*.c files)
> */
> diff --git a/arch/arm/plat-omap/omap-pm-srf.c b/arch/arm/plat-omap/omap-pm-srf.c
> index f7bf353..9b4cf7f 100644
> --- a/arch/arm/plat-omap/omap-pm-srf.c
> +++ b/arch/arm/plat-omap/omap-pm-srf.c
> @@ -25,10 +25,6 @@
> #include <plat/resource.h>
> #include <plat/omap_device.h>
>
> -struct omap_opp *dsp_opps;
> -struct omap_opp *mpu_opps;
> -struct omap_opp *l3_opps;
> -
> #define LAT_RES_POSTAMBLE "_latency"
> #define MAX_LATENCY_RES_NAME 30
>
> diff --git a/arch/arm/plat-omap/opp.c b/arch/arm/plat-omap/opp.c
> index 4fe1933..faaff70 100644
> --- a/arch/arm/plat-omap/opp.c
> +++ b/arch/arm/plat-omap/opp.c
> @@ -3,6 +3,8 @@
> *
> * Copyright (C) 2009 Texas Instruments Incorporated.
> * Nishanth Menon
> + * Copyright (C) 2010 Texas Instruments Incorportated.
> + * Romit Dasgupta <romit@ti.com>
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License version 2 as
> @@ -39,6 +41,11 @@ struct omap_opp {
> };
>
> /*
> + * This maintains pointers to the start of each OPP array.
> + */
> +
> +static struct omap_opp *_opp_list[OPP_TYPES_MAX];
> +/*
> * DEPRECATED: Meant to detect end of opp array
> * This is meant to help co-exist with current SRF etc
> * TODO: REMOVE!
> @@ -65,18 +72,23 @@ unsigned long opp_get_freq(const struct omap_opp *opp)
>
> /**
> * opp_find_by_opp_id - look up OPP by OPP ID (deprecated)
> - * @opps: pointer to an array of struct omap_opp
> + * @opp_type: OPP type where we want the look up to happen.
> *
> * Returns the struct omap_opp pointer corresponding to the given OPP
> * ID @opp_id, or returns NULL on error.
> */
> -struct omap_opp * __deprecated opp_find_by_opp_id(struct omap_opp *opps,
> +struct omap_opp * __deprecated opp_find_by_opp_id(enum opp_t opp_type,
> u8 opp_id)
> {
> + struct omap_opp *opps;
> int i = 0;
>
> - if (!opps || !opp_id)
> - return NULL;
> + if (unlikely(opp_type >= OPP_TYPES_MAX || !opp_id))
> + return ERR_PTR(-EINVAL);
> + opps = _opp_list[opp_type];
> +
> + if (!opps)
> + return ERR_PTR(-ENOENT);
>
> while (!OPP_TERM(&opps[i])) {
> if (opps[i].enabled && (opps[i].opp_id == opp_id))
> @@ -85,7 +97,7 @@ struct omap_opp * __deprecated opp_find_by_opp_id(struct omap_opp *opps,
> i++;
> }
>
> - return NULL;
> + return ERR_PTR(-ENOENT);
> }
>
> u8 __deprecated opp_get_opp_id(struct omap_opp *opp)
> @@ -93,14 +105,20 @@ u8 __deprecated opp_get_opp_id(struct omap_opp *opp)
> return opp->opp_id;
> }
>
> -int opp_get_opp_count(struct omap_opp *oppl)
> +int opp_get_opp_count(enum opp_t opp_type)
> {
> u8 n = 0;
> + struct omap_opp *oppl;
>
> - if (unlikely(!oppl || IS_ERR(oppl))) {
> + if (unlikely(opp_type >= OPP_TYPES_MAX)) {
> pr_err("%s: Invalid parameters being passed\n", __func__);
> return -EINVAL;
> }
> +
> + oppl = _opp_list[opp_type];
> + if (!oppl)
> + return -ENOENT;
> +
> while (!OPP_TERM(oppl)) {
> if (oppl->enabled)
> n++;
> @@ -109,14 +127,21 @@ int opp_get_opp_count(struct omap_opp *oppl)
> return n;
> }
>
> -struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
> +struct omap_opp *opp_find_freq_exact(enum opp_t opp_type,
> unsigned long freq, bool enabled)
> {
> - if (unlikely(!oppl || IS_ERR(oppl))) {
> + struct omap_opp *oppl;
> +
> + if (unlikely(opp_type >= OPP_TYPES_MAX)) {
> pr_err("%s: Invalid parameters being passed\n", __func__);
> return ERR_PTR(-EINVAL);
> }
>
> + oppl = _opp_list[opp_type];
> +
> + if (!oppl)
> + return ERR_PTR(-ENOENT);
> +
> while (!OPP_TERM(oppl)) {
> if ((oppl->rate == freq) && (oppl->enabled == enabled))
> break;
> @@ -126,13 +151,21 @@ struct omap_opp *opp_find_freq_exact(struct omap_opp *oppl,
> return OPP_TERM(oppl) ? ERR_PTR(-ENOENT) : oppl;
> }
>
> -struct omap_opp *opp_find_freq_ceil(struct omap_opp *oppl, unsigned long *freq)
> +struct omap_opp *opp_find_freq_ceil(enum opp_t opp_type, unsigned long *freq)
> {
> - if (unlikely(!oppl || IS_ERR(oppl) || !freq || IS_ERR(freq))) {
> + struct omap_opp *oppl;
> +
> + if (unlikely(opp_type >= OPP_TYPES_MAX || !freq ||
> + IS_ERR(freq))) {
> pr_err("%s: Invalid parameters being passed\n", __func__);
> return ERR_PTR(-EINVAL);
> }
>
> + oppl = _opp_list[opp_type];
> +
> + if (!oppl)
> + return ERR_PTR(-ENOENT);
> +
> while (!OPP_TERM(oppl)) {
> if (oppl->enabled && oppl->rate >= *freq)
> break;
> @@ -148,14 +181,19 @@ struct omap_opp *opp_find_freq_ceil(struct omap_opp *oppl, unsigned long *freq)
> return oppl;
> }
>
> -struct omap_opp *opp_find_freq_floor(struct omap_opp *oppl, unsigned long *freq)
> +struct omap_opp *opp_find_freq_floor(enum opp_t opp_type, unsigned long *freq)
> {
> - struct omap_opp *prev_opp = oppl;
> + struct omap_opp *prev_opp, *oppl;
>
> - if (unlikely(!oppl || IS_ERR(oppl) || !freq || IS_ERR(freq))) {
> + if (unlikely(opp_type >= OPP_TYPES_MAX || !freq ||
> + IS_ERR(freq))) {
> pr_err("%s: Invalid parameters being passed\n", __func__);
> return ERR_PTR(-EINVAL);
> }
> + oppl = prev_opp = _opp_list[opp_type];
> +
> + if (!oppl)
> + return ERR_PTR(-ENOENT);
>
> while (!OPP_TERM(oppl)) {
> if (oppl->enabled) {
> @@ -185,19 +223,23 @@ static void omap_opp_populate(struct omap_opp *opp,
> opp->u_volt = opp_def->u_volt;
> }
>
> -struct omap_opp *opp_add(struct omap_opp *oppl,
> - const struct omap_opp_def *opp_def)
> +int opp_add(enum opp_t opp_type, const struct omap_opp_def *opp_def)
> {
> - struct omap_opp *opp, *oppt, *oppr;
> + struct omap_opp *opp, *oppt, *oppr, *oppl;
> u8 n, i, ins;
>
> - if (unlikely(!oppl || IS_ERR(oppl) || !opp_def || IS_ERR(opp_def))) {
> + if (unlikely(opp_type >= OPP_TYPES_MAX || !opp_def ||
> + IS_ERR(opp_def))) {
> pr_err("%s: Invalid params being passed\n", __func__);
> - return ERR_PTR(-EINVAL);
> + return -EINVAL;
> }
>
> n = 0;
> - opp = oppl;
> + oppl = opp = _opp_list[opp_type];
> +
> + if (!oppl)
> + return -ENOENT;
> +
> while (!OPP_TERM(opp)) {
> n++;
> opp++;
> @@ -210,11 +252,11 @@ struct omap_opp *opp_add(struct omap_opp *oppl,
> oppr = kzalloc(sizeof(struct omap_opp) * (n + 2), GFP_KERNEL);
> if (!oppr) {
> pr_err("%s: No memory for new opp array\n", __func__);
> - return ERR_PTR(-ENOMEM);
> + return -ENOMEM;
> }
>
> /* Simple insertion sort */
> - opp = oppl;
> + opp = _opp_list[opp_type];
> oppt = oppr;
> ins = 0;
> i = 1;
> @@ -238,23 +280,27 @@ struct omap_opp *opp_add(struct omap_opp *oppl,
> oppt++;
> }
>
> + _opp_list[opp_type] = oppr;
> +
> /* Terminator implicitly added by kzalloc() */
>
> /* Free the old list */
> kfree(oppl);
>
> - return oppr;
> + return 0;
> }
>
> -struct omap_opp __init *opp_init_list(const struct omap_opp_def *opp_defs)
> +int __init opp_init_list(enum opp_t opp_type,
> + const struct omap_opp_def *opp_defs)
> {
> struct omap_opp_def *t = (struct omap_opp_def *)opp_defs;
> - struct omap_opp *opp, *oppl;
> + struct omap_opp *oppl;
> u8 n = 0, i = 1;
>
> - if (unlikely(!opp_defs || IS_ERR(opp_defs))) {
> + if (unlikely(opp_type >= OPP_TYPES_MAX || !opp_defs ||
> + IS_ERR(opp_defs))) {
> pr_err("%s: Invalid params being passed\n", __func__);
> - return ERR_PTR(-EINVAL);
> + return -EINVAL;
> }
> /* Grab a count */
> while (t->enabled || t->freq || t->u_volt) {
> @@ -269,22 +315,23 @@ struct omap_opp __init *opp_init_list(const struct omap_opp_def *opp_defs)
> oppl = kzalloc(sizeof(struct omap_opp) * (n + 1), GFP_KERNEL);
> if (!oppl) {
> pr_err("%s: No memory for opp array\n", __func__);
> - return ERR_PTR(-ENOMEM);
> + return -ENOMEM;
> }
>
> - opp = oppl;
> +
> + _opp_list[opp_type] = oppl;
> while (n) {
> - omap_opp_populate(opp, opp_defs);
> - opp->opp_id = i;
> + omap_opp_populate(oppl, opp_defs);
> + oppl->opp_id = i;
> n--;
> - opp++;
> + oppl++;
> opp_defs++;
> i++;
> }
>
> /* Terminator implicitly added by kzalloc() */
>
> - return oppl;
> + return 0;
> }
>
> int opp_enable(struct omap_opp *opp)
> @@ -308,20 +355,21 @@ int opp_disable(struct omap_opp *opp)
> }
>
> /* XXX document */
> -void opp_init_cpufreq_table(struct omap_opp *opps,
> +void opp_init_cpufreq_table(enum opp_t opp_type,
> struct cpufreq_frequency_table **table)
> {
> int i = 0, j;
> int opp_num;
> struct cpufreq_frequency_table *freq_table;
> + struct omap_opp *opp;
>
> - if (!opps) {
> + if (opp_type >= OPP_TYPES_MAX) {
> pr_warning("%s: failed to initialize frequency"
> "table\n", __func__);
> return;
> }
>
> - opp_num = opp_get_opp_count(opps);
> + opp_num = opp_get_opp_count(opp_type);
> if (opp_num < 0) {
> pr_err("%s: no opp table?\n", __func__);
> return;
> @@ -335,14 +383,14 @@ void opp_init_cpufreq_table(struct omap_opp *opps,
> return;
> }
>
> + opp = _opp_list[opp_type];
> for (j = opp_num; j >= 0; j--) {
> - struct omap_opp *opp = &opps[j];
> -
> if (opp->enabled) {
> freq_table[i].index = i;
> freq_table[i].frequency = opp->rate / 1000;
> i++;
> }
> + opp++;
> }
>
> freq_table[i].index = i;
prev parent reply other threads:[~2010-01-27 17:43 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-21 13:45 [PM-WIP-OPP] [PATCH v3 1/1] Introducing enum for OPP types Romit Dasgupta
2010-01-27 17:43 ` Kevin Hilman [this message]
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=873a1rxx2n.fsf@deeprootsystems.com \
--to=khilman@deeprootsystems.com \
--cc=linux-omap@vger.kernel.org \
--cc=nm@ti.com \
--cc=romit@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