[linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver
Tony Lindgren
tony at atomide.com
Fri Aug 10 04:50:22 EDT 2012
* Konstantin Baydarov <kbaidarov at dev.rtsoft.ru> [120809 04:00]:
> Hi, Tony.
>
> On 08/08/2012 06:59 PM, Konstantin Baydarov wrote:
> > Yes, omap_type() is called very early , that is why I'm using early_initcall for omap_control_base initialization.
> >
> > Do you mean following?:
> > void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
> > {
> > if (omap2_globals->ctrl)
> > omap2_ctrl_base = omap2_globals->ctrl;
> >
> > if (omap2_globals->ctrl_pad)
> > omap4_ctrl_pad_base = omap2_globals->ctrl_pad;
> >
> > omap_control_base = omap2_ctrl_base; // this line is added
> > }
> Sorry for the confusion - the code above isn't correct. First, as omap-control-core.c driver maps only control module status register the omap_control_base should be renamed to omap_control_status_reg:
Heh right :) And that makes the patch I posted wrong too.
> @@ -156,6 +158,20 @@ void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
>
> if (omap2_globals->ctrl_pad)
> omap4_ctrl_pad_base = omap2_globals->ctrl_pad;
> +
> + omap_control_status_reg = omap2_ctrl_base;
> + if (cpu_is_omap24xx())
> + omap_control_status_reg += OMAP24XX_CONTROL_STATUS;
> + else if (soc_is_am33xx())
> + omap_control_status_reg += AM33XX_CONTROL_STATUS;
> + else if (cpu_is_omap34xx())
> + omap_control_status_reg += OMAP343X_CONTROL_STATUS;
> + else if (cpu_is_omap44xx())
> + omap_control_status_reg += OMAP4_CTRL_MODULE_CORE_STATUS;
> + else if (soc_is_omap54xx())
> + omap_control_status_reg += OMAP5XXX_CONTROL_STATUS;
> + else
> + omap_control_status_reg = 0;
> }
We can get rid of the if else SoC check here too. And we can limit the
control_status tinkering to id.c. Here's an updated clean-up patch.
Regards,
Tony
From: Tony Lindgren <tony at atomide.com>
Date: Wed, 8 Aug 2012 23:13:03 -0700
Subject: [PATCH] ARM: OMAP2+: Initialize things for omap_type() to simplify
SoC detection
Let's rename omap2_set_globals_tap() to omap2_set_globals_id() and update
the comments to remove old comments about map_io() as we don't need SoC
detection for map_io() any longer.
Let's also initialize control_status_reg with omap2_set_globals_id()
so we can avoid SoC tests every time omap_type() gets called.
Note that this patch sets the ti81xx to always return GP mode as
the mode bits seem to be marked as reserved in ti81xx TRM.
Signed-off-by: Tony Lindgren <tony at atomide.com>
diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c
index 069f972..64afeee 100644
--- a/arch/arm/mach-omap2/common.c
+++ b/arch/arm/mach-omap2/common.c
@@ -31,7 +31,7 @@
static void __init __omap2_set_globals(struct omap_globals *omap2_globals)
{
- omap2_set_globals_tap(omap2_globals);
+ omap2_set_globals_id(omap2_globals);
omap2_set_globals_sdrc(omap2_globals);
omap2_set_globals_control(omap2_globals);
omap2_set_globals_prcm(omap2_globals);
@@ -45,6 +45,8 @@ static struct omap_globals omap242x_globals = {
.sdrc = OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE),
.sms = OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE) +
+ OMAP24XX_CONTROL_STATUS,
.prm = OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE),
};
@@ -68,6 +70,8 @@ static struct omap_globals omap243x_globals = {
.sdrc = OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE),
.sms = OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE) +
+ OMAP24XX_CONTROL_STATUS,
.prm = OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE),
};
@@ -91,6 +95,8 @@ static struct omap_globals omap3_globals = {
.sdrc = OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE),
.sms = OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE) +
+ OMAP343X_CONTROL_STATUS,
.prm = OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE),
};
@@ -117,6 +123,8 @@ static struct omap_globals ti81xx_globals = {
.class = OMAP343X_CLASS,
.tap = OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(TI81XX_CTRL_BASE) +
+ TI81XX_CONTROL_STATUS,
.prm = OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(TI81XX_PRCM_BASE),
};
@@ -140,6 +148,8 @@ static struct omap_globals am33xx_globals = {
.class = AM335X_CLASS,
.tap = AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE),
.ctrl = AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE),
+ .ctrl_status = AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE) +
+ AM33XX_CONTROL_STATUS,
.prm = AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE),
.cm = AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE),
};
@@ -160,6 +170,8 @@ static struct omap_globals omap4_globals = {
.class = OMAP443X_CLASS,
.tap = OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE) +
+ OMAP4_CTRL_MODULE_CORE_STATUS,
.ctrl_pad = OMAP2_L4_IO_ADDRESS(OMAP443X_CTRL_BASE),
.prm = OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(OMAP4430_CM_BASE),
@@ -183,6 +195,8 @@ static struct omap_globals omap5_globals = {
.class = OMAP54XX_CLASS,
.tap = OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE),
.ctrl = OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE),
+ .ctrl_status = OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE) +
+ OMAP5XXX_CONTROL_STATUS,
.ctrl_pad = OMAP2_L4_IO_ADDRESS(OMAP54XX_CTRL_BASE),
.prm = OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE),
.cm = OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE),
@@ -192,7 +206,7 @@ static struct omap_globals omap5_globals = {
void __init omap2_set_globals_5xxx(void)
{
- omap2_set_globals_tap(&omap5_globals);
+ omap2_set_globals_id(&omap5_globals);
omap2_set_globals_control(&omap5_globals);
omap2_set_globals_prcm(&omap5_globals);
}
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 1f65b18..a3cee8c 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -168,6 +168,7 @@ struct omap_globals {
void __iomem *sdrc; /* SDRAM Controller */
void __iomem *sms; /* SDRAM Memory Scheduler */
void __iomem *ctrl; /* System Control Module */
+ void __iomem *ctrl_status; /* Control status register */
void __iomem *ctrl_pad; /* PAD Control Module */
void __iomem *prm; /* Power and Reset Management */
void __iomem *cm; /* Clock Management */
@@ -184,7 +185,7 @@ void omap2_set_globals_ti81xx(void);
void omap2_set_globals_am33xx(void);
/* These get called from omap2_set_globals_xxxx(), do not call these */
-void omap2_set_globals_tap(struct omap_globals *);
+void omap2_set_globals_id(struct omap_globals *);
#if defined(CONFIG_SOC_HAS_OMAP2_SDRC)
void omap2_set_globals_sdrc(struct omap_globals *);
#else
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
index b8cdc85..cf92e06 100644
--- a/arch/arm/mach-omap2/control.h
+++ b/arch/arm/mach-omap2/control.h
@@ -59,6 +59,7 @@
/* TI81XX spefic control submodules */
#define TI81XX_CONTROL_DEVCONF 0x600
+#define TI81XX_CONTROL_STATUS 0x040
/* Control register offsets - read/write with omap_ctrl_{read,write}{bwl}() */
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 40373db..19cc66d 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -29,6 +29,7 @@
#include "control.h"
static unsigned int omap_revision;
+static unsigned int control_status;
static const char *cpu_rev;
u32 omap_features;
@@ -40,31 +41,13 @@ EXPORT_SYMBOL(omap_rev);
int omap_type(void)
{
- u32 val = 0;
-
- if (cpu_is_omap24xx()) {
- val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
- } else if (soc_is_am33xx()) {
- val = omap_ctrl_readl(AM33XX_CONTROL_STATUS);
- } else if (cpu_is_omap34xx()) {
- val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
- } else if (cpu_is_omap44xx()) {
- val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
- } else if (soc_is_omap54xx()) {
- val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS);
- val &= OMAP5_DEVICETYPE_MASK;
- val >>= 6;
- goto out;
- } else {
- pr_err("Cannot detect omap type!\n");
- goto out;
+ if (!control_status) {
+ pr_err("Uninitialized control_status!\n");
+ WARN_ON(1);
+ return 0;
}
- val &= OMAP2_DEVICETYPE_MASK;
- val >>= 8;
-
-out:
- return val;
+ return control_status;
}
EXPORT_SYMBOL(omap_type);
@@ -554,13 +537,9 @@ void __init omap5xxx_check_revision(void)
}
/*
- * Set up things for map_io and processor detection later on. Gets called
- * pretty much first thing from board init. For multi-omap, this gets
- * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to
- * detect the exact revision later on in omap2_detect_revision() once map_io
- * is done.
+ * Initialize things for SoC detecttion. Gets called from init_early.
*/
-void __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
+void __init omap2_set_globals_id(struct omap_globals *omap2_globals)
{
omap_revision = omap2_globals->class;
tap_base = omap2_globals->tap;
@@ -569,4 +548,16 @@ void __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
tap_prod_id = 0x0210;
else
tap_prod_id = 0x0208;
+
+ control_status = __raw_readl(omap2_globals->ctrl_status);
+ if (cpu_is_ti81xx()) {
+ /* At least ti81xx TRM sprugx8.pdf lists type bits as reserved */
+ control_status = OMAP2_DEVICE_TYPE_GP;
+ } else if (soc_is_omap54xx()) {
+ control_status &= OMAP5_DEVICETYPE_MASK;
+ control_status >>= 6;
+ } else {
+ control_status &= OMAP2_DEVICETYPE_MASK;
+ control_status >>= 8;
+ }
}
More information about the linux-arm-kernel
mailing list