* [PATCH] OMAP3 : PM : Functions to get freq from opp and vice-versa
@ 2009-09-09 11:24 Sanjeev Premi
2009-09-30 18:17 ` Kevin Hilman
0 siblings, 1 reply; 3+ messages in thread
From: Sanjeev Premi @ 2009-09-09 11:24 UTC (permalink / raw)
To: linux-omap; +Cc: Sanjeev Premi
There is no generic function to get OPP corresponding to frequency
and vice versa.
Function get_opp() - in resource34xx.c - is included only when
CONFIG_OMAP_PM_SRF is enabled. Moreover, it is always called with
an explicit addition of MAX_VDDn_OPP e.g.
opp = get_opp(mpu_opps + MAX_VDD1_OPP, clk->rate);
opp = get_opp(l3_opps + MAX_VDD2_OPP, clk->rate);
This is 'addition' is required as there is no encapsulation of
MIN and MAX VDDs associated to the table.
This patch fixes the issue by creating a 'table' object that
encapsulates the MIN and MAX values and the existing rate table.
Signed-off-by: Sanjeev Premi <premi@ti.com>
---
arch/arm/mach-omap2/omap3-opp.h | 42 +++------------------
arch/arm/mach-omap2/pm.c | 49 +++++++++++++++++++++++++
arch/arm/mach-omap2/pm34xx.c | 57 +++++++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/omap-pm.h | 25 +++++++++++++
4 files changed, 137 insertions(+), 36 deletions(-)
diff --git a/arch/arm/mach-omap2/omap3-opp.h b/arch/arm/mach-omap2/omap3-opp.h
index 3c9a582..52deb4a 100644
--- a/arch/arm/mach-omap2/omap3-opp.h
+++ b/arch/arm/mach-omap2/omap3-opp.h
@@ -21,42 +21,12 @@
#define S83M 83000000
#define S166M 166000000
-static struct omap_opp omap3_mpu_rate_table[] = {
- {0, 0, 0},
- /*OPP1*/
- {S125M, VDD1_OPP1, 0x1E},
- /*OPP2*/
- {S250M, VDD1_OPP2, 0x26},
- /*OPP3*/
- {S500M, VDD1_OPP3, 0x30},
- /*OPP4*/
- {S550M, VDD1_OPP4, 0x36},
- /*OPP5*/
- {S600M, VDD1_OPP5, 0x3C},
-};
+extern struct omap_opp omap3_mpu_rate_table[];
+extern struct omap_opp omap3_dsp_rate_table[];
+extern struct omap_opp omap3_l3_rate_table[];
-static struct omap_opp omap3_l3_rate_table[] = {
- {0, 0, 0},
- /*OPP1*/
- {0, VDD2_OPP1, 0x1E},
- /*OPP2*/
- {S83M, VDD2_OPP2, 0x24},
- /*OPP3*/
- {S166M, VDD2_OPP3, 0x2C},
-};
-
-static struct omap_opp omap3_dsp_rate_table[] = {
- {0, 0, 0},
- /*OPP1*/
- {S90M, VDD1_OPP1, 0x1E},
- /*OPP2*/
- {S180M, VDD1_OPP2, 0x26},
- /*OPP3*/
- {S360M, VDD1_OPP3, 0x30},
- /*OPP4*/
- {S400M, VDD1_OPP4, 0x36},
- /*OPP5*/
- {S430M, VDD1_OPP5, 0x3C},
-};
+extern const struct omap_opp_table omap3_mpu_opp_table;
+extern const struct omap_opp_table omap3_dsp_opp_table;
+extern const struct omap_opp_table omap3_l3_opp_table;
#endif
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index fec7d00..2bbe63f 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -33,6 +33,7 @@
#include <mach/powerdomain.h>
#include <mach/resource.h>
#include <mach/omap34xx.h>
+#include <mach/omap-pm.h>
#include "prm-regbits-34xx.h"
#include "pm.h"
@@ -281,3 +282,51 @@ static int __init omap_pm_init(void)
return error;
}
late_initcall(omap_pm_init);
+
+/*
+ * Get frequency corresponding to an OPP
+ */
+int opp_to_freq(unsigned long* freq, const struct omap_opp_table* table, u8 opp)
+{
+ int i, found=0;
+
+ if (table && table->opps) {
+ for (i = table->min; i <= table->max; i++) {
+ if (table->opps[i].opp_id == opp) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (found) {
+ *freq = table->opps[i].rate;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Get OPP corresponding to a frequency
+ */
+int freq_to_opp(u8* opp, const struct omap_opp_table* table, unsigned long freq)
+{
+ int i, found=0;
+
+ if (table && table->opps) {
+ for (i = table->min; i <= table->max; i++) {
+ if (table->opps[i].rate == freq) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (found) {
+ *opp = table->opps[i].opp_id;
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 3d62b06..60b0441 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -50,6 +50,7 @@
#include "prm.h"
#include "pm.h"
#include "sdrc.h"
+#include "omap3-opp.h"
static int regset_save_on_suspend;
@@ -93,6 +94,62 @@ static struct prm_setup_vc prm_setup = {
.vdd1_off = 0x00, /* 0.6v */
};
+struct omap_opp omap3_mpu_rate_table[] = {
+ {0, 0, 0},
+ /*OPP1*/
+ {S125M, VDD1_OPP1, 0x1E},
+ /*OPP2*/
+ {S250M, VDD1_OPP2, 0x26},
+ /*OPP3*/
+ {S500M, VDD1_OPP3, 0x30},
+ /*OPP4*/
+ {S550M, VDD1_OPP4, 0x36},
+ /*OPP5*/
+ {S600M, VDD1_OPP5, 0x3C},
+};
+
+struct omap_opp omap3_l3_rate_table[] = {
+ {0, 0, 0},
+ /*OPP1*/
+ {0, VDD2_OPP1, 0x1E},
+ /*OPP2*/
+ {S83M, VDD2_OPP2, 0x24},
+ /*OPP3*/
+ {S166M, VDD2_OPP3, 0x2C},
+};
+
+struct omap_opp omap3_dsp_rate_table[] = {
+ {0, 0, 0},
+ /*OPP1*/
+ {S90M, VDD1_OPP1, 0x1E},
+ /*OPP2*/
+ {S180M, VDD1_OPP2, 0x26},
+ /*OPP3*/
+ {S360M, VDD1_OPP3, 0x30},
+ /*OPP4*/
+ {S400M, VDD1_OPP4, 0x36},
+ /*OPP5*/
+ {S430M, VDD1_OPP5, 0x3C},
+};
+
+const struct omap_opp_table omap3_mpu_opp_table = {
+ VDD1_OPP1,
+ VDD1_OPP5,
+ omap3_mpu_rate_table
+};
+
+const struct omap_opp_table omap3_dsp_opp_table = {
+ VDD1_OPP1,
+ VDD1_OPP5,
+ omap3_dsp_rate_table
+};
+
+const struct omap_opp_table omap3_l3_opp_table = {
+ VDD1_OPP1,
+ VDD1_OPP3,
+ omap3_l3_rate_table
+};
+
static inline void omap3_per_save_context(void)
{
omap3_gpio_save_context();
diff --git a/arch/arm/plat-omap/include/mach/omap-pm.h b/arch/arm/plat-omap/include/mach/omap-pm.h
index 583e540..cf910ef 100644
--- a/arch/arm/plat-omap/include/mach/omap-pm.h
+++ b/arch/arm/plat-omap/include/mach/omap-pm.h
@@ -33,6 +33,20 @@ struct omap_opp {
u16 vsel;
};
+/* struct omap_opp_table - View OPP table as an object
+ * @min: Minimum OPP id
+ * @max: Maximim OPP id
+ * @opps: Pointer to array defining the OPPs.
+ *
+ * An OPP table has varied length. Knowing minimum and maximum
+ * OPP ids allow easy traversal.
+ */
+struct omap_opp_table {
+ u8 min;
+ u8 max;
+ struct omap_opp* opps;
+};
+
extern struct omap_opp *mpu_opps;
extern struct omap_opp *dsp_opps;
extern struct omap_opp *l3_opps;
@@ -49,6 +63,17 @@ extern struct omap_opp *l3_opps;
#define OCP_INITIATOR_AGENT 2
/**
+ *
+ */
+int opp_to_freq(unsigned long* freq, const struct omap_opp_table* table, u8 opp);
+
+/**
+ *
+ */
+int freq_to_opp(u8* opp, const struct omap_opp_table* table, unsigned long freq);
+
+
+/**
* omap_pm_if_early_init - OMAP PM init code called before clock fw init
* @mpu_opp_table: array ptr to struct omap_opp for MPU
* @dsp_opp_table: array ptr to struct omap_opp for DSP
--
1.6.2.2
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] OMAP3 : PM : Functions to get freq from opp and vice-versa
2009-09-09 11:24 [PATCH] OMAP3 : PM : Functions to get freq from opp and vice-versa Sanjeev Premi
@ 2009-09-30 18:17 ` Kevin Hilman
2009-10-01 12:31 ` Premi, Sanjeev
0 siblings, 1 reply; 3+ messages in thread
From: Kevin Hilman @ 2009-09-30 18:17 UTC (permalink / raw)
To: Sanjeev Premi; +Cc: linux-omap
Sanjeev Premi <premi@ti.com> writes:
> There is no generic function to get OPP corresponding to frequency
> and vice versa.
>
> Function get_opp() - in resource34xx.c - is included only when
> CONFIG_OMAP_PM_SRF is enabled. Moreover, it is always called with
> an explicit addition of MAX_VDDn_OPP e.g.
> opp = get_opp(mpu_opps + MAX_VDD1_OPP, clk->rate);
> opp = get_opp(l3_opps + MAX_VDD2_OPP, clk->rate);
>
> This is 'addition' is required as there is no encapsulation of
> MIN and MAX VDDs associated to the table.
>
> This patch fixes the issue by creating a 'table' object that
> encapsulates the MIN and MAX values and the existing rate table.
>
> Signed-off-by: Sanjeev Premi <premi@ti.com>
Looks ok, minor comment below...
[...]
> diff --git a/arch/arm/plat-omap/include/mach/omap-pm.h b/arch/arm/plat-omap/include/mach/omap-pm.h
> index 583e540..cf910ef 100644
> --- a/arch/arm/plat-omap/include/mach/omap-pm.h
> +++ b/arch/arm/plat-omap/include/mach/omap-pm.h
> @@ -33,6 +33,20 @@ struct omap_opp {
> u16 vsel;
> };
>
> +/* struct omap_opp_table - View OPP table as an object
> + * @min: Minimum OPP id
> + * @max: Maximim OPP id
> + * @opps: Pointer to array defining the OPPs.
> + *
> + * An OPP table has varied length. Knowing minimum and maximum
> + * OPP ids allow easy traversal.
> + */
> +struct omap_opp_table {
> + u8 min;
> + u8 max;
> + struct omap_opp* opps;
> +};
> +
> extern struct omap_opp *mpu_opps;
> extern struct omap_opp *dsp_opps;
> extern struct omap_opp *l3_opps;
> @@ -49,6 +63,17 @@ extern struct omap_opp *l3_opps;
> #define OCP_INITIATOR_AGENT 2
>
> /**
> + *
> + */
Either add a useful comment or remove the comment block (preferably the latter)
> +int opp_to_freq(unsigned long* freq, const struct omap_opp_table* table, u8 opp);
> +
> +/**
> + *
> + */
ditto
Kevin
^ permalink raw reply [flat|nested] 3+ messages in thread* RE: [PATCH] OMAP3 : PM : Functions to get freq from opp and vice-versa
2009-09-30 18:17 ` Kevin Hilman
@ 2009-10-01 12:31 ` Premi, Sanjeev
0 siblings, 0 replies; 3+ messages in thread
From: Premi, Sanjeev @ 2009-10-01 12:31 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap@vger.kernel.org
> -----Original Message-----
> From: linux-omap-owner@vger.kernel.org
> [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Kevin Hilman
> Sent: Wednesday, September 30, 2009 11:48 PM
> To: Premi, Sanjeev
> Cc: linux-omap@vger.kernel.org
> Subject: Re: [PATCH] OMAP3 : PM : Functions to get freq from
> opp and vice-versa
>
> Sanjeev Premi <premi@ti.com> writes:
>
> > There is no generic function to get OPP corresponding to frequency
> > and vice versa.
> >
> > Function get_opp() - in resource34xx.c - is included only when
> > CONFIG_OMAP_PM_SRF is enabled. Moreover, it is always called with
> > an explicit addition of MAX_VDDn_OPP e.g.
> > opp = get_opp(mpu_opps + MAX_VDD1_OPP, clk->rate);
> > opp = get_opp(l3_opps + MAX_VDD2_OPP, clk->rate);
> >
> > This is 'addition' is required as there is no encapsulation of
> > MIN and MAX VDDs associated to the table.
> >
> > This patch fixes the issue by creating a 'table' object that
> > encapsulates the MIN and MAX values and the existing rate table.
> >
> > Signed-off-by: Sanjeev Premi <premi@ti.com>
>
> Looks ok, minor comment below...
[sp] Will take care of the comments in the next patch.
Best regards,
Sanjeev
>
> [...]
>
> > diff --git a/arch/arm/plat-omap/include/mach/omap-pm.h
> b/arch/arm/plat-omap/include/mach/omap-pm.h
> > index 583e540..cf910ef 100644
> > --- a/arch/arm/plat-omap/include/mach/omap-pm.h
> > +++ b/arch/arm/plat-omap/include/mach/omap-pm.h
> > @@ -33,6 +33,20 @@ struct omap_opp {
> > u16 vsel;
> > };
> >
> > +/* struct omap_opp_table - View OPP table as an object
> > + * @min: Minimum OPP id
> > + * @max: Maximim OPP id
> > + * @opps: Pointer to array defining the OPPs.
> > + *
> > + * An OPP table has varied length. Knowing minimum and maximum
> > + * OPP ids allow easy traversal.
> > + */
> > +struct omap_opp_table {
> > + u8 min;
> > + u8 max;
> > + struct omap_opp* opps;
> > +};
> > +
> > extern struct omap_opp *mpu_opps;
> > extern struct omap_opp *dsp_opps;
> > extern struct omap_opp *l3_opps;
> > @@ -49,6 +63,17 @@ extern struct omap_opp *l3_opps;
> > #define OCP_INITIATOR_AGENT 2
> >
> > /**
> > + *
> > + */
>
> Either add a useful comment or remove the comment block
> (preferably the latter)
>
> > +int opp_to_freq(unsigned long* freq, const struct
> omap_opp_table* table, u8 opp);
> > +
> > +/**
> > + *
> > + */
>
> ditto
>
> Kevin
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-10-01 12:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-09 11:24 [PATCH] OMAP3 : PM : Functions to get freq from opp and vice-versa Sanjeev Premi
2009-09-30 18:17 ` Kevin Hilman
2009-10-01 12:31 ` Premi, Sanjeev
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.