Introducing enum for OPP types
PATCH v3 1/1 Introducing enum for OPP types
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.
---
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(-)
arch/arm/mach-omap2/pm34xx.c +4 -11
@@ -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 )
arch/arm/mach-omap2/resource34xx.c +36 -48
238 lines not on this page · raw message
arch/arm/mach-omap2/smartreflex.c +10 -23
@@ -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 );
arch/arm/plat-omap/common.c +0 -6
@@ -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 ;
arch/arm/plat-omap/cpu-omap.c +6 -6
@@ -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);
arch/arm/plat-omap/include/plat/opp.h +30 -30
142 lines not on this page · raw message
arch/arm/plat-omap/omap-pm-noop.c +0 -4
@@ -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) */
arch/arm/plat-omap/omap-pm-srf.c +0 -4
@@ -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
arch/arm/plat-omap/opp.c +86 -38
287 lines not on this page · raw message
Quoted 9 lines · Romit Dasgupta
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.
Quoted 5 lines
Currently, OMAP3 is the only silicon supporting the OPP layer, hence
mpu_opps,l3_oppsanddsp_oppsare deprecated and replaced withOPP_MPU,OPP_L3andOPP_DSPrespectively.Signed-off-by Romit Dasgupta <[email protected]>
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
Quoted 965 lines
---
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(-)arch/arm/mach-omap2/pm34xx.c +4
-11@@ -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 )arch/arm/mach-omap2/resource34xx.c +36
-48@@ -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 ; }arch/arm/mach-omap2/smartreflex.c +10
-23@@ -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 );arch/arm/plat-omap/common.c +0
-6@@ -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 ;arch/arm/plat-omap/cpu-omap.c +6
-6@@ -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);arch/arm/plat-omap/include/plat/opp.h +30
-30@@ -5,6 +5,8 @@* Nishanth Menon * Copyright (C) 2009 Deep Root Systems, LLC. * Kevin Hilman +* Copyright (C) 2010 Texas Instruments Incorporated +* Romit Dasgupta <[email protected]> * * 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);arch/arm/plat-omap/omap-pm-noop.c +0
-4@@ -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) */ arch/arm/plat-omap/omap-pm-srf.c +0
-4@@ -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 30arch/arm/plat-omap/opp.c +86
-38@@ -3,6 +3,8 @@* * Copyright (C) 2009 Texas Instruments Incorporated. * Nishanth Menon +* Copyright (C) 2010 Texas Instruments Incorportated. +* Romit Dasgupta <[email protected]> * * 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;