Signed-off-by: Kevin Hilman <khil...@deeprootsystems.com>
---
 arch/arm/mach-omap2/resource34xx.c |   95 ++++++++++++++++++++++-------------
 1 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/arch/arm/mach-omap2/resource34xx.c 
b/arch/arm/mach-omap2/resource34xx.c
index 7f39fc3..70b41bc 100644
--- a/arch/arm/mach-omap2/resource34xx.c
+++ b/arch/arm/mach-omap2/resource34xx.c
@@ -170,14 +170,15 @@ 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, enum opp_t opp_type,
+static int __deprecated opp_to_freq(unsigned long *freq, struct device *dev,
                                 u8 opp_id)
 {
        struct omap_opp *opp;
 
-       BUG_ON(!freq || opp_type >= OPP_TYPES_MAX);
+       if (WARN_ON(!freq))
+               return -EINVAL;
 
-       opp = opp_find_by_opp_id(opp_type, opp_id);
+       opp = opp_find_by_opp_id(dev, opp_id);
        if (IS_ERR(opp))
                return -EINVAL;
 
@@ -189,20 +190,19 @@ static int __deprecated opp_to_freq(unsigned long *freq, 
enum opp_t opp_type,
 /**
  * freq_to_opp - convert a frequency back to OPP ID (DEPRECATED)
  * @opp_id: opp ID returned back to caller
- * @opp_type: OPP type where we need to look.
+ * @opp_dev: device where we need to look for OPPs
  * @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, enum opp_t opp_type,
+static int __deprecated freq_to_opp(u8 *opp_id, struct device *dev,
                unsigned long freq)
 {
        struct omap_opp *opp;
 
-       BUG_ON(opp_type >= OPP_TYPES_MAX);
-       opp = opp_find_freq_ceil(opp_type, &freq);
+       opp = opp_find_freq_ceil(dev, &freq);
        if (IS_ERR(opp))
                return -EINVAL;
        *opp_id = opp_get_opp_id(opp);
@@ -223,10 +223,12 @@ void init_opp(struct shared_resource *resp)
        * to the  opp set by u-boot.
        */
        if (strcmp(resp->name, "vdd1_opp") == 0) {
+               struct device *dev = omap_get_mpu_device();
+
                vdd1_resp = resp;
                dpll1_clk = clk_get(NULL, "dpll1_ck");
                dpll2_clk = clk_get(NULL, "dpll2_ck");
-               ret = freq_to_opp(&opp_id, OPP_MPU, dpll1_clk->rate);
+               ret = freq_to_opp(&opp_id, dev, dpll1_clk->rate);
                if (ret) {
                        pr_err("%s: initializing %s failed! !match for %ld\n",
                                __func__, resp->name, dpll1_clk->rate);
@@ -241,10 +243,12 @@ void init_opp(struct shared_resource *resp)
                }
                curr_vdd1_opp = opp_id;
        } else if (strcmp(resp->name, "vdd2_opp") == 0) {
+               struct device *dev = omap_get_l3_device();
+
                vdd2_resp = resp;
                dpll3_clk = clk_get(NULL, "dpll3_m2_ck");
                l3_clk = clk_get(NULL, "l3_ick");
-               ret = freq_to_opp(&opp_id, OPP_L3, l3_clk->rate);
+               ret = freq_to_opp(&opp_id, dev, l3_clk->rate);
                if (ret) {
                        pr_err("%s: initializing %s failed! !match for %ld\n",
                                __func__, resp->name, l3_clk->rate);
@@ -305,16 +309,20 @@ static int program_opp_freq(int res, int target_level, 
int current_level)
 #ifndef CONFIG_CPU_FREQ
        unsigned long mpu_cur_freq;
 #endif
+       struct device *l3_dev = omap_get_l3_device();
 
        /* Check if I can actually switch or not */
        if (res == VDD1_OPP) {
-               ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
-               ret |= opp_to_freq(&dsp_freq, OPP_DSP, target_level);
+               struct device *mpu_dev = omap_get_mpu_device();
+               struct device *dsp_dev = omap_get_dsp_device();
+
+               ret = opp_to_freq(&mpu_freq, mpu_dev, target_level);
+               ret |= opp_to_freq(&dsp_freq, dsp_dev, target_level);
 #ifndef CONFIG_CPU_FREQ
-               ret |= opp_to_freq(&mpu_cur_freq, OPP_MPU, current_level);
+               ret |= opp_to_freq(&mpu_cur_freq, mpu_dev, current_level);
 #endif
        } else {
-               ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
+               ret = opp_to_freq(&l3_freq, l3_dev, target_level);
        }
        /* we would have caught all bad levels earlier.. */
        if (unlikely(ret))
@@ -349,14 +357,14 @@ static int program_opp_freq(int res, int target_level, 
int current_level)
        return target_level;
 }
 
-static int program_opp(int res, enum opp_t opp_type, int target_level,
+static int program_opp(int res, struct device *dev, int target_level,
                int current_level)
 {
        int i, ret = 0, raise;
        unsigned long freq;
 
        /* See if have a freq associated, if not, invalid opp */
-       ret = opp_to_freq(&freq, opp_type, target_level);
+       ret = opp_to_freq(&freq, dev, target_level);
        if (unlikely(ret))
                return ret;
 
@@ -379,12 +387,12 @@ static int program_opp(int res, enum opp_t opp_type, int 
target_level,
                         * transitioning from good to good OPP
                         * none of the following should fail..
                         */
-                       oppx = opp_find_freq_exact(opp_type, freq, true);
+                       oppx = opp_find_freq_exact(dev, freq, true);
                        BUG_ON(IS_ERR(oppx));
                        uvdc_target = opp_get_voltage(oppx);
 
-                       BUG_ON(opp_to_freq(&freq, opp_type, current_level));
-                       oppx = opp_find_freq_exact(opp_type, freq, true);
+                       BUG_ON(opp_to_freq(&freq, dev, current_level));
+                       oppx = opp_find_freq_exact(dev, freq, true);
                        BUG_ON(IS_ERR(oppx));
                        uvdc_current = opp_get_voltage(oppx);
 
@@ -405,6 +413,9 @@ int resource_set_opp_level(int res, u32 target_level, int 
flags)
        struct cpufreq_freqs freqs_notify;
 #endif
        struct shared_resource *resp;
+       struct device *mpu_dev = omap_get_mpu_device();
+       struct device *dsp_dev = omap_get_dsp_device();
+       struct device *l3_dev = omap_get_l3_device();
 
        if (res == VDD1_OPP)
                resp = vdd1_resp;
@@ -418,10 +429,10 @@ int resource_set_opp_level(int res, u32 target_level, int 
flags)
 
        /* Check if I can actually switch or not */
        if (res == VDD1_OPP) {
-               ret = opp_to_freq(&mpu_freq, OPP_MPU, target_level);
-               ret |= opp_to_freq(&mpu_old_freq, OPP_MPU, resp->curr_level);
+               ret = opp_to_freq(&mpu_freq, mpu_dev, target_level);
+               ret |= opp_to_freq(&mpu_old_freq, mpu_dev, resp->curr_level);
        } else {
-               ret = opp_to_freq(&l3_freq, OPP_L3, target_level);
+               ret = opp_to_freq(&l3_freq, l3_dev, target_level);
        }
        if (ret)
                return ret;
@@ -440,7 +451,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, OPP_MPU, target_level,
+               resp->curr_level = program_opp(res, mpu_dev, target_level,
                        resp->curr_level);
 #ifdef CONFIG_CPU_FREQ
                /* Send a post notification to CPUFreq */
@@ -451,7 +462,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, OPP_L3, target_level,
+               resp->curr_level = program_opp(res, l3_dev, target_level,
                        resp->curr_level);
        }
        mutex_unlock(&dvfs_mutex);
@@ -478,23 +489,24 @@ int set_opp(struct shared_resource *resp, u32 
target_level)
        } else if (resp == vdd2_resp) {
                unsigned long req_l3_freq;
                struct omap_opp *oppx = NULL;
+               struct device *l3_dev = omap_get_l3_device();
 
                /* Convert the tput in KiB/s to Bus frequency in MHz */
                req_l3_freq = (target_level * 1000)/4;
 
                /* Do I have a best match? */
-               oppx = opp_find_freq_ceil(OPP_L3, &req_l3_freq);
+               oppx = opp_find_freq_ceil(l3_dev, &req_l3_freq);
                if (IS_ERR(oppx)) {
                        /* Give me the best we got */
                        req_l3_freq = ULONG_MAX;
-                       oppx = opp_find_freq_floor(OPP_L3, &req_l3_freq);
+                       oppx = opp_find_freq_floor(l3_dev, &req_l3_freq);
                }
 
                /* uh uh.. no OPPs?? */
                BUG_ON(IS_ERR(oppx));
 
                target_level = 0;
-               ret = freq_to_opp((u8 *)&target_level, OPP_L3, req_l3_freq);
+               ret = freq_to_opp((u8 *)&target_level, l3_dev, req_l3_freq);
                /* we dont expect this to fail */
                BUG_ON(ret);
 
@@ -512,10 +524,13 @@ int set_opp(struct shared_resource *resp, u32 
target_level)
 int validate_opp(struct shared_resource *resp, u32 target_level)
 {
        unsigned long x;
+       struct device *mpu_dev = omap_get_mpu_device();
+       struct device *dsp_dev = omap_get_dsp_device();
+
        if (strcmp(resp->name, "mpu_freq") == 0)
-               return opp_to_freq(&x, OPP_MPU, target_level);
+               return opp_to_freq(&x, mpu_dev, target_level);
        else if (strcmp(resp->name, "dsp_freq") == 0)
-               return opp_to_freq(&x, OPP_DSP, target_level);
+               return opp_to_freq(&x, dsp_dev, target_level);
        return 0;
 }
 
@@ -527,6 +542,9 @@ void init_freq(struct shared_resource *resp)
        char *linked_res_name;
        int ret = -EINVAL;
        unsigned long freq = 0;
+       struct device *mpu_dev = omap_get_mpu_device();
+       struct device *dsp_dev = omap_get_dsp_device();
+
        resp->no_of_users = 0;
 
        linked_res_name = (char *)resp->resource_data;
@@ -535,14 +553,16 @@ void init_freq(struct shared_resource *resp)
        */
        if (strcmp(resp->name, "mpu_freq") == 0)
                /* MPU freq in Mhz */
-               ret = opp_to_freq(&freq, OPP_MPU, curr_vdd1_opp);
+               ret = opp_to_freq(&freq, mpu_dev, curr_vdd1_opp);
        else if (strcmp(resp->name, "dsp_freq") == 0)
                /* DSP freq in Mhz */
-               ret = opp_to_freq(&freq, OPP_DSP, curr_vdd1_opp);
+               ret = opp_to_freq(&freq, dsp_dev, curr_vdd1_opp);
        if (ret)
-               pr_err("%s: initializing frequency failed!\n", __func__);
+               pr_err("%s: initializing frequency failed for %s!\n",
+                      __func__, resp->name);
 
        resp->curr_level = freq;
+
        return;
 }
 
@@ -550,14 +570,16 @@ int set_freq(struct shared_resource *resp, u32 
target_level)
 {
        u8 vdd1_opp;
        int ret = -EINVAL;
+       struct device *mpu_dev = omap_get_mpu_device();
+       struct device *dsp_dev = omap_get_dsp_device();
 
        if (strcmp(resp->name, "mpu_freq") == 0) {
-               ret = freq_to_opp(&vdd1_opp, OPP_MPU, target_level);
+               ret = freq_to_opp(&vdd1_opp, mpu_dev, 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, OPP_DSP, target_level);
+               ret = freq_to_opp(&vdd1_opp, dsp_dev, target_level);
                if (!ret)
                        ret = resource_request("vdd1_opp", &dummy_dsp_dev,
                                        vdd1_opp);
@@ -570,9 +592,12 @@ int set_freq(struct shared_resource *resp, u32 
target_level)
 int validate_freq(struct shared_resource *resp, u32 target_level)
 {
        u8 x;
+       struct device *mpu_dev = omap_get_mpu_device();
+       struct device *dsp_dev = omap_get_dsp_device();
+
        if (strcmp(resp->name, "mpu_freq") == 0)
-               return freq_to_opp(&x, OPP_MPU, target_level);
+               return freq_to_opp(&x, mpu_dev, target_level);
        else if (strcmp(resp->name, "dsp_freq") == 0)
-               return freq_to_opp(&x, OPP_DSP, target_level);
+               return freq_to_opp(&x, dsp_dev, target_level);
        return 0;
 }
-- 
1.7.0.2

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to