Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-10 Thread Tony Lindgren
* Konstantin Baydarov kbaida...@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 t...@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 t...@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  = 

Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-09 Thread Tony Lindgren
* Konstantin Baydarov kbaida...@dev.rtsoft.ru [120808 07:59]:
 On 08/08/2012 06:39 PM, Tony Lindgren 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
 }

OK so we already have set_globals_control, but we're not using it..
No need for this line is added above.

Let's do the attached clean-up patch and just leave omap_control_base
out of the driver for now as it's not currently needed there.

If omap_control_base is needed in the driver, then we need to pass
it in the platform_data to the driver for the non-DT boot case, or
parse it from DT like you're doing.

Regards,

Tony


From: Tony Lindgren t...@atomide.com
Date: Wed, 8 Aug 2012 23:13:03 -0700
Subject: [PATCH] ARM: OMAP2+: Change omap_type() to use omap_ctrl_base_get()

We have the SoC specific ctrl_base already initialized in
set_globals.

Signed-off-by: Tony Lindgren t...@atomide.com

--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -42,28 +42,20 @@ 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 = __raw_readl(omap_ctrl_base_get());
+   if (!val) {
+   pr_err(Cannot detect omap type!\n);
+   return 0;
+   }
+
+   if (soc_is_omap54xx()) {
val = OMAP5_DEVICETYPE_MASK;
val = 6;
-   goto out;
} else {
-   pr_err(Cannot detect omap type!\n);
-   goto out;
+   val = OMAP2_DEVICETYPE_MASK;
+   val = 8;
}
 
-   val = OMAP2_DEVICETYPE_MASK;
-   val = 8;
-
-out:
return val;
 }
 EXPORT_SYMBOL(omap_type);
--
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


Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-09 Thread Konstantin Baydarov
  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:

--- a/drivers/mfd/omap-control-core.c
+++ b/drivers/mfd/omap-control-core.c
@@ -35,13 +35,15 @@
 #include linux/of.h
 #include linux/of_address.h
 
-void __iomem *omap_control_base;
+void __iomem *omap_control_status_reg;
 unsigned long omap_control_phys_base;
 size_t omap_control_mapsize;
 
 u32 omap_control_status_read(void)


Then, if you want to move omap_control_status_reg(omap_control_base) 
initialization to the
omap2_set_globals_control(), it can be done following way:

--- a/arch/arm/mach-omap2/control.c
+++ b/arch/arm/mach-omap2/control.c
@@ -149,6 +149,8 @@ static struct omap3_control_regs control_context;
 #define OMAP_CTRL_REGADDR(reg) (omap2_ctrl_base + (reg))
 #define OMAP4_CTRL_PAD_REGADDR(reg)(omap4_ctrl_pad_base + (reg))
 
+extern void __iomem *omap_control_status_reg;
+
 void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
 {
if (omap2_globals-ctrl)
@@ -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;
 }
 
 void __iomem *omap_ctrl_base_get(void)


Then omap_type() can be changed:

diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 8018cad..916b3f6 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -39,31 +39,27 @@ unsigned int omap_rev(void)
 }
 EXPORT_SYMBOL(omap_rev);
 
+extern void __iomem *omap_control_status_reg;
+
 int omap_type(void)
 {
u32 val = 0;
 
-   if (cpu_is_omap24xx()) {
-   val = omap_control_status_read();
-   } else if (soc_is_am33xx()) {
-   val = omap_control_status_read();
-   } else if (cpu_is_omap34xx()) {
-   val = omap_control_status_read();
-   } else if (cpu_is_omap44xx()) {
+   if(!omap_control_status_reg) {
+   pr_err(Cannot detect omap type!\n);
+   goto out;
+   }
+
+   if(!soc_is_omap54xx()) {
val = omap_control_status_read();
-   } else if (soc_is_omap54xx()) {
+   val = OMAP2_DEVICETYPE_MASK;
+   val = 8;
+   } else {
val = omap_control_status_read();
val = OMAP5_DEVICETYPE_MASK;
val = 6;
-   goto out;
-   } else {
-   pr_err(Cannot detect omap type!\n);
-   goto out;
}
 
-   val = OMAP2_DEVICETYPE_MASK;
-   val = 8;
-
 out:
return val;
 }


  BR,
Konstantin Baydarov.

   Or you suggest to move
 void __init of_omap_control_init(const struct of_device_id *matches)
 {
 struct device_node *np;
 struct property *pp = 0;

 for_each_matching_node(np, matches) {
 pp = of_find_property(np, reg, NULL);
 if(pp) {
 omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value);
 omap_control_mapsize = (size_t)be32_to_cpup( 
 (void*)((char*)pp-value + 4) );
 /*
  * Map control module register CONTROL_STATUS register:
  * omap24xx - OMAP24XX_CONTROL_STATUS
  * am33xx   - AM33XX_CONTROL_STATUS
  * omap34xx - OMAP343X_CONTROL_STATUS
  * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS
  * omap54xx - OMAP5XXX_CONTROL_STATUS
  */
 omap_control_base = ioremap(omap_control_phys_base, 
 omap_control_mapsize);
 }
 }
 }

 into omap2_set_globals_control() ?

 Also if we move omap_control_base initialization to 
 omap2_set_globals_control(), than the initialization routine of 
 drivers/mfd/omap-control-core.c 

Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-08 Thread Tony Lindgren
* Tony Lindgren t...@atomide.com [120808 07:05]:
 * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]:
  +
  +u32 omap_control_status_read(void)
  +{
  +   return __raw_readl(omap_control_base);
  +}
 
 Ah OK it's changed here.. Sorry I was looking at the older
 version.
 
  +void __init of_omap_control_init(const struct of_device_id *matches)
  +{
  +   struct device_node *np;
  +   struct property *pp = 0;
  +
  +   for_each_matching_node(np, matches) {
  +   pp = of_find_property(np, reg, NULL);
  +   if(pp) {
  +   omap_control_phys_base = (unsigned 
  long)be32_to_cpup(pp-value);
  +   omap_control_mapsize = (size_t)be32_to_cpup( 
  (void*)((char*)pp-value + 4) );
  +   /*
  +* Map control module register CONTROL_STATUS register:
  +* omap24xx - OMAP24XX_CONTROL_STATUS
  +* am33xx   - AM33XX_CONTROL_STATUS
  +* omap34xx - OMAP343X_CONTROL_STATUS
  +* omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS
  +* omap54xx - OMAP5XXX_CONTROL_STATUS
  +*/
  +   omap_control_base = ioremap(omap_control_phys_base, 
  omap_control_mapsize);
  +   }
  +   }
  +}
 
 You should probably add a function for setting omap_control_base
 separately from *set_globals* in arch/arm/mach-omap2/common.c.
 That way it's initialized early for id.c, and you can initialize
 everything else later as regular device drivers.
 
 FYI, we want to initialize as much as possible late so we have
 proper debugging console set up in case things go wrong.

Hmm it seems that omap_control_base is now only initialized for DT boot
case? This will break booting on almost all systems..

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


Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-08 Thread Tony Lindgren
* Tony Lindgren t...@atomide.com [120808 07:11]:
 * Tony Lindgren t...@atomide.com [120808 07:05]:
  * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]:
   +
   +u32 omap_control_status_read(void)
   +{
   + return __raw_readl(omap_control_base);
   +}
  
  Ah OK it's changed here.. Sorry I was looking at the older
  version.
  
   +void __init of_omap_control_init(const struct of_device_id *matches)
   +{
   + struct device_node *np;
   + struct property *pp = 0;
   +
   + for_each_matching_node(np, matches) {
   + pp = of_find_property(np, reg, NULL);
   + if(pp) {
   + omap_control_phys_base = (unsigned 
   long)be32_to_cpup(pp-value);
   + omap_control_mapsize = (size_t)be32_to_cpup( 
   (void*)((char*)pp-value + 4) );
   + /*
   +  * Map control module register CONTROL_STATUS register:
   +  * omap24xx - OMAP24XX_CONTROL_STATUS
   +  * am33xx   - AM33XX_CONTROL_STATUS
   +  * omap34xx - OMAP343X_CONTROL_STATUS
   +  * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS
   +  * omap54xx - OMAP5XXX_CONTROL_STATUS
   +  */
   + omap_control_base = ioremap(omap_control_phys_base, 
   omap_control_mapsize);
   + }
   + }
   +}
  
  You should probably add a function for setting omap_control_base
  separately from *set_globals* in arch/arm/mach-omap2/common.c.
  That way it's initialized early for id.c, and you can initialize
  everything else later as regular device drivers.
  
  FYI, we want to initialize as much as possible late so we have
  proper debugging console set up in case things go wrong.
 
 Hmm it seems that omap_control_base is now only initialized for DT boot
 case? This will break booting on almost all systems..

Looking at things more, looks like omap_type() is getting called
early from timer.c. So maybe just let set_globals initialize
omap_control_base and let omap_type() read that directly. That way
the SCM core driver can behave like a regular device driver and it
does not need to be initialized early.

Regards,

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


Re: [linux-pm] [PATCH v4 2/4] mfd: omap: control: core system control driver

2012-08-08 Thread Konstantin Baydarov
  Hi, Tony.

On 08/08/2012 06:39 PM, Tony Lindgren wrote:
 * Tony Lindgren t...@atomide.com [120808 07:11]:
 * Tony Lindgren t...@atomide.com [120808 07:05]:
 * Konstantin Baydarov kbaida...@dev.rtsoft.ru [120725 04:10]:
 +
 +u32 omap_control_status_read(void)
 +{
 +  return __raw_readl(omap_control_base);
 +}
 Ah OK it's changed here.. Sorry I was looking at the older
 version.

 +void __init of_omap_control_init(const struct of_device_id *matches)
 +{
 +  struct device_node *np;
 +  struct property *pp = 0;
 +
 +  for_each_matching_node(np, matches) {
 +  pp = of_find_property(np, reg, NULL);
 +  if(pp) {
 +  omap_control_phys_base = (unsigned 
 long)be32_to_cpup(pp-value);
 +  omap_control_mapsize = (size_t)be32_to_cpup( 
 (void*)((char*)pp-value + 4) );
 +  /*
 +   * Map control module register CONTROL_STATUS register:
 +   * omap24xx - OMAP24XX_CONTROL_STATUS
 +   * am33xx   - AM33XX_CONTROL_STATUS
 +   * omap34xx - OMAP343X_CONTROL_STATUS
 +   * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS
 +   * omap54xx - OMAP5XXX_CONTROL_STATUS
 +   */
 +  omap_control_base = ioremap(omap_control_phys_base, 
 omap_control_mapsize);
 +  }
 +  }
 +}
 You should probably add a function for setting omap_control_base
 separately from *set_globals* in arch/arm/mach-omap2/common.c.
 That way it's initialized early for id.c, and you can initialize
 everything else later as regular device drivers.

 FYI, we want to initialize as much as possible late so we have
 proper debugging console set up in case things go wrong.
 Hmm it seems that omap_control_base is now only initialized for DT boot
 case? This will break booting on almost all systems..
 Looking at things more, looks like omap_type() is getting called
 early from timer.c. So maybe just let set_globals initialize
 omap_control_base and let omap_type() read that directly. That way
 the SCM core driver can behave like a regular device driver and it
 does not need to be initialized early.

  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
}

  Or you suggest to move
void __init of_omap_control_init(const struct of_device_id *matches)
{
struct device_node *np;
struct property *pp = 0;

for_each_matching_node(np, matches) {
pp = of_find_property(np, reg, NULL);
if(pp) {
omap_control_phys_base = (unsigned long)be32_to_cpup(pp-value);
omap_control_mapsize = (size_t)be32_to_cpup( 
(void*)((char*)pp-value + 4) );
/*
 * Map control module register CONTROL_STATUS register:
 * omap24xx - OMAP24XX_CONTROL_STATUS
 * am33xx   - AM33XX_CONTROL_STATUS
 * omap34xx - OMAP343X_CONTROL_STATUS
 * omap44xx - OMAP4_CTRL_MODULE_CORE_STATUS
 * omap54xx - OMAP5XXX_CONTROL_STATUS
 */
omap_control_base = ioremap(omap_control_phys_base, 
omap_control_mapsize);
}
}
}

into omap2_set_globals_control() ?

Also if we move omap_control_base initialization to 
omap2_set_globals_control(), than the initialization routine of 
drivers/mfd/omap-control-core.c become empty, because omap_control_base is the 
only thing that is initialized in omap-control-core driver.

  BR,
Konstantin Baydarov.


 Regards,

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

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