[PATCH 7/10] OPP layer and additional cleanups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux