Adapted the OMAP3 specific PM layer with the new OPP layer. The following
have been done
    1. Remove struct omap_opp_def and use only struct omap_opp as the previous
       was almost similar to struct omap_opp.
    2. Introduce a function 'get_l3_target_freq' to obtain the L3 frequency
       corresponding to MPU frequency.(This needs to be done neatly). I agree
       that this is ugly.
    3. Defined a voltage scaling registration function.
    4. Invoke the new OPP layer APIs for registering OPPs.

diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 9744a35..04265f5 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -113,7 +113,7 @@ static struct prm_setup_vc prm_setup = {
        .vdd1_off = 0x00,       /* 0.6v */
 };
 
-static struct omap_opp_def __initdata omap34xx_mpu_rate_table[] = {
+static struct omap_opp __initdata omap34xx_mpu_rate_table[] = {
        /* OPP1 */
        OMAP_OPP_DEF(true, 125000000, 975000),
        /* OPP2 */
@@ -128,7 +128,7 @@ static struct omap_opp_def __initdata 
omap34xx_mpu_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
-static struct omap_opp_def __initdata omap34xx_l3_rate_table[] = {
+static struct omap_opp __initdata omap34xx_l3_rate_table[] = {
        /* OPP1 */
        OMAP_OPP_DEF(false, 0, 975000),
        /* OPP2 */
@@ -139,7 +139,7 @@ static struct omap_opp_def __initdata 
omap34xx_l3_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
-static struct omap_opp_def __initdata omap34xx_dsp_rate_table[] = {
+static struct omap_opp __initdata omap34xx_dsp_rate_table[] = {
        /* OPP1 */
        OMAP_OPP_DEF(true, 90000000, 975000),
        /* OPP2 */
@@ -154,7 +154,7 @@ static struct omap_opp_def __initdata 
omap34xx_dsp_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
-static struct omap_opp_def __initdata omap36xx_mpu_rate_table[] = {
+static struct omap_opp __initdata omap36xx_mpu_rate_table[] = {
        /* OPP1 - OPP50 */
        OMAP_OPP_DEF(true,  300000000, 930000),
        /* OPP2 - OPP100 */
@@ -167,7 +167,7 @@ static struct omap_opp_def __initdata 
omap36xx_mpu_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
-static struct omap_opp_def __initdata omap36xx_l3_rate_table[] = {
+static struct omap_opp __initdata omap36xx_l3_rate_table[] = {
        /* OPP1 - OPP50 */
        OMAP_OPP_DEF(true, 100000000, 930000),
        /* OPP2 - OPP100, OPP-Turbo, OPP-SB */
@@ -176,7 +176,7 @@ static struct omap_opp_def __initdata 
omap36xx_l3_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
-static struct omap_opp_def __initdata omap36xx_dsp_rate_table[] = {
+static struct omap_opp __initdata omap36xx_dsp_rate_table[] = {
        /* OPP1 - OPP50 */
        OMAP_OPP_DEF(true,  260000000, 930000),
        /* OPP2 - OPP100 */
@@ -189,6 +189,27 @@ static struct omap_opp_def __initdata 
omap36xx_dsp_rate_table[] = {
        OMAP_OPP_DEF(0, 0, 0)
 };
 
+/*
+ *XXX: !!! Ugly Alert !!!
+ * Need this info from hw_mods or equivalent.
+ */
+unsigned long get_l3_target_freq(struct omap_opp *opp)
+{
+       if (cpu_is_omap3630()) {
+               if (opp_to_freq(opp) >= 600000000)
+                       return 200000000;
+               else
+                       return 100000000;
+       } else {
+               if (opp_to_freq(opp) >= 500000000)
+                       return 166000000;
+               else
+                       return 83000000;
+       }
+
+       return 0;
+}
+
 static inline void omap3_per_save_context(void)
 {
        omap_gpio_save_context();
@@ -1107,14 +1128,6 @@ void omap3_pm_off_mode_enable(int enable)
        else
                state = PWRDM_POWER_RET;
 
-#ifdef CONFIG_OMAP_PM_SRF
-       resource_lock_opp(VDD1_OPP);
-       resource_lock_opp(VDD2_OPP);
-       if (resource_refresh())
-               printk(KERN_ERR "Error: could not refresh resources\n");
-       resource_unlock_opp(VDD1_OPP);
-       resource_unlock_opp(VDD2_OPP);
-#endif
        list_for_each_entry(pwrst, &pwrst_list, node) {
                pwrst->next_state = state;
                set_pwrdm_state(pwrst->pwrdm, state);
@@ -1347,30 +1360,33 @@ 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[] = {
+       int i, entries;
+       struct omap_opp **omap3_opp_def_list;
+       struct omap_opp *omap34xx_opp_def_list[] = {
                omap34xx_mpu_rate_table,
                omap34xx_l3_rate_table,
                omap34xx_dsp_rate_table
        };
-       struct omap_opp_def *omap36xx_opp_def_list[] = {
+       struct omap_opp *omap36xx_opp_def_list[] = {
                omap36xx_mpu_rate_table,
                omap36xx_l3_rate_table,
                omap36xx_dsp_rate_table
        };
-       struct omap_opp **omap3_rate_tables[] = {
-               &mpu_opps,
-               &dsp_opps,
-               &l3_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]);
+
+       entries = cpu_is_omap3630() ? ARRAY_SIZE(omap36xx_opp_def_list) :
+                       ARRAY_SIZE(omap34xx_opp_def_list);
+
+       for (i = 0; i < entries; i++) {
+               int ret;
+               /*
+                * Alert!! Careful with the order of the rate table entries.
+                */
+               ret = create_opp_list(i + 1, omap3_opp_def_list[i]);
                /* We dont want half configured system at the moment */
-               BUG_ON(IS_ERR(omap3_rate_tables[i]));
+               BUG_ON(ret);
        }
 }
 
@@ -1384,6 +1400,17 @@ static int __init omap3_pm_early_init(void)
        return 0;
 }
 
+/* static DEFINE_SPINLOCK(scale_fn_lock); */
+volt_scale_t voltage_scale;
+int pm_register_volt_scaling(volt_scale_t fn)
+{
+       /* The lock may be unnecessary right now */
+       /* spinlock_irq(&scale_fn_lock); */
+       voltage_scale = fn;
+       /* spin_unlock_irq(&scale_fn_lock); */
+       return 0;
+}
+
 arch_initcall(omap3_pm_early_init);
 late_initcall(omap3_pm_init);
 


--
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