Adds OPP/Frequency resources to SRF
Signed-off-by: Rajendra Nayak <[EMAIL PROTECTED]>
---
arch/arm/mach-omap2/resource34xx.c | 101 +++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/resource34xx.h | 74 +++++++++++++++++++++++++++
2 files changed, 175 insertions(+)
Index: linux-omap-2.6/arch/arm/mach-omap2/resource34xx.c
===================================================================
--- linux-omap-2.6.orig/arch/arm/mach-omap2/resource34xx.c 2008-08-07
15:07:08.000000000 +0530
+++ linux-omap-2.6/arch/arm/mach-omap2/resource34xx.c 2008-08-07
15:09:01.000000000 +0530
@@ -146,3 +146,104 @@ int set_pd_latency(struct shared_resourc
}
return 0;
}
+
+static struct clk *vdd1_clk;
+static struct clk *vdd2_clk;
+static struct device dummy_srf_dev;
+
+/**
+ * init_opp - Initialize the OPP resource
+ */
+void init_opp(struct shared_resource *resp)
+{
+ resp->no_of_users = 0;
+ /* Initialize the current level of the OPP resource
+ * to the opp set by u-boot.
+ */
+ if (strcmp(resp->name, "vdd1_opp") == 0) {
+ resp->curr_level = curr_vdd1_prcm_set->opp;
+ vdd1_clk = clk_get(NULL, "virt_vdd1_prcm_set");
+ } else if (strcmp(resp->name, "vdd2_opp") == 0) {
+ resp->curr_level = curr_vdd2_prcm_set->opp;
+ vdd2_clk = clk_get(NULL, "virt_vdd2_prcm_set");
+ }
+ return;
+}
+
+int set_opp(struct shared_resource *resp, u32 target_level)
+{
+#ifdef CONFIG_MACH_OMAP_3430SDP
+ unsigned long mpu_freq;
+ if (strcmp(resp->name, "vdd1_opp") == 0) {
+ mpu_freq = get_freq(vdd1_rate_table + MAX_VDD1_OPP,
+ target_level);
+ clk_set_rate(vdd1_clk, mpu_freq);
+ resp->curr_level = curr_vdd1_prcm_set->opp;
+ } else if (strcmp(resp->name, "vdd2_opp") == 0) {
+ /* Not supported yet */
+ }
+#endif
+ return 0;
+}
+
+/**
+ * validate_opp - Validates if valid VDD1 OPP's are passed as the
+ * target_level.
+ * VDD2 OPP levels are passed as L3 throughput, which are then mapped
+ * to an appropriate OPP.
+ */
+int validate_opp(struct shared_resource *resp, u32 target_level)
+{
+ return 0;
+}
+
+/**
+ * init_freq - Initialize the frequency resource.
+ */
+void init_freq(struct shared_resource *resp)
+{
+#ifdef CONFIG_MACH_OMAP_3430SDP
+ char *linked_res_name;
+ resp->no_of_users = 0;
+
+ 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 */
+ resp->curr_level = curr_vdd1_prcm_set->speed;
+ else if (strcmp(resp->name, "dsp_freq") == 0)
+ /* DSP freq in Mhz */
+ resp->curr_level = get_freq(iva2_rate_table + MAX_VDD2_OPP,
+ curr_vdd1_prcm_set->opp);
+#endif
+ return;
+}
+
+int set_freq(struct shared_resource *resp, u32 target_level)
+{
+#ifdef CONFIG_MACH_OMAP_3430SDP
+ unsigned int vdd1_opp;
+
+ if (strcmp(resp->name, "mpu_freq") == 0)
+ vdd1_opp = get_opp(vdd1_rate_table + MAX_VDD1_OPP,
+ target_level);
+ else if (strcmp(resp->name, "dsp_freq") == 0)
+ vdd1_opp = get_opp(iva2_rate_table + MAX_VDD1_OPP,
+ target_level);
+
+ if (vdd1_opp == MIN_VDD1_OPP)
+ resource_release("vdd1_opp", &dummy_srf_dev);
+ else
+ resource_request("vdd1_opp", &dummy_srf_dev, vdd1_opp);
+
+ resp->curr_level = target_level;
+#endif
+ return 0;
+}
+
+int validate_freq(struct shared_resource *resp, u32 target_level)
+{
+ return 0;
+}
Index: linux-omap-2.6/arch/arm/mach-omap2/resource34xx.h
===================================================================
--- linux-omap-2.6.orig/arch/arm/mach-omap2/resource34xx.h 2008-08-07
15:07:02.000000000 +0530
+++ linux-omap-2.6/arch/arm/mach-omap2/resource34xx.h 2008-08-07
15:31:42.000000000 +0530
@@ -22,8 +22,17 @@
#define __ARCH_ARM_MACH_OMAP2_RESOURCE_H
#include <asm/arch/resource.h>
+#include <linux/clk.h>
+#include <asm/arch/clock.h>
#include <asm/arch/powerdomain.h>
+extern struct vdd_prcm_config *curr_vdd1_prcm_set;
+extern struct vdd_prcm_config *curr_vdd2_prcm_set;
+extern unsigned int get_freq(struct vdd_prcm_config *, unsigned long);
+extern unsigned int get_opp(struct vdd_prcm_config *, unsigned long);
+extern struct vdd_prcm_config vdd1_rate_table[];
+extern struct vdd_prcm_config vdd2_rate_table[];
+extern struct vdd_prcm_config iva2_rate_table[];
/**
* mpu_latency/core_latency are used to control the cpuidle C state.
*/
@@ -207,6 +216,66 @@ static struct shared_resource emu_pwrdm_
.ops = &pd_lat_res_ops,
};
+void init_opp(struct shared_resource *resp);
+int set_opp(struct shared_resource *resp, u32 target_level);
+int validate_opp(struct shared_resource *resp, u32 target_level);
+void init_freq(struct shared_resource *resp);
+int set_freq(struct shared_resource *resp, u32 target_level);
+int validate_freq(struct shared_resource *resp, u32 target_level);
+
+struct bus_throughput_db {
+ /* Throughput for each OPP/Freq of the bus */
+ unsigned long throughput[3];
+};
+
+static struct shared_resource_ops opp_res_ops = {
+ .init = init_opp,
+ .change_level = set_opp,
+ .validate_level = validate_opp,
+};
+
+static struct shared_resource vdd1_opp = {
+ .name = "vdd1_opp",
+ .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .ops = &opp_res_ops,
+};
+
+/* Throughput in KiB/s */
+static struct bus_throughput_db l3_throughput_db = {
+ .throughput[0] = 0,
+ .throughput[1] = 100,
+ .throughput[2] = 250,
+};
+
+static struct shared_resource vdd2_opp = {
+ .name = "vdd2_opp",
+ .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .resource_data = &l3_throughput_db,
+ .ops = &opp_res_ops,
+};
+
+static char linked_res[] = "vdd1_opp";
+
+static struct shared_resource_ops freq_res_ops = {
+ .init = init_freq,
+ .change_level = set_freq,
+ .validate_level = validate_freq,
+};
+
+static struct shared_resource mpu_freq = {
+ .name = "mpu_freq",
+ .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .resource_data = &linked_res,
+ .ops = &freq_res_ops,
+};
+
+static struct shared_resource dsp_freq = {
+ .name = "dsp_freq",
+ .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .resource_data = &linked_res,
+ .ops = &freq_res_ops,
+};
+
struct shared_resource *resources_omap[] __initdata = {
&mpu_latency,
&core_latency,
@@ -220,6 +289,11 @@ struct shared_resource *resources_omap[]
&neon_pwrdm_latency,
&usbhost_pwrdm_latency,
&emu_pwrdm_latency,
+ /* OPP/frequency resources */
+ &vdd1_opp,
+ &vdd2_opp,
+ &mpu_freq,
+ &dsp_freq,
NULL
};
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html