Re: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-24 Thread Kevin Hilman
Paul Walmsley  writes:

> Hi Kevin,
>
> one other thought.
>
> On Thu, 24 Jun 2010, Paul Walmsley wrote:
>
>> On Wed, 23 Jun 2010, Kevin Hilman wrote:
>> 
>> > Create simple omap_devices for the main processors and busses.
>> > 
>> > This is required to support the forth-coming device-based OPP
>> > approach, where OPPs are managed and tracked at the device level.
>
> If these omap_devices are only to deal with OPPs, you might only need one 
> omap_device for the MPU subsystem for OMAP4, since I think both cores 
> receive the same clock.  That might simplify this patch for the current 
> timeframe.

Agreed.

Again, I fall victim to my own last-minute changes.  Up until yesterday
I wasn't trying to deal with SMP, and decided to add it yesterday,
clearly without a good (enough) understanding of the PER_CPU stuff for
SMP.

Will re-spin without the SMP and multiple-devices-in-class support.

Kevin

--
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: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-24 Thread Shilimkar, Santosh
> -Original Message-
> From: Paul Walmsley [mailto:p...@pwsan.com]
> Sent: Thursday, June 24, 2010 12:50 PM
> To: Shilimkar, Santosh
> Cc: Kevin Hilman; linux-omap@vger.kernel.org
> Subject: RE: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3
> 
> On Thu, 24 Jun 2010, Shilimkar, Santosh wrote:
> 
> > > -Original Message-
> > > From: linux-omap-ow...@vger.kernel.org 
> > > [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of
> Paul
> > > Walmsley
> > > Sent: Thursday, June 24, 2010 11:57 AM
> 
> > > > +struct device *omap_get_mpu_device(void)
> > > > +{
> > > > +   mpu_dev = per_cpu(mpu_dev, smp_processor_id());
> > >
> > > Looks like this will trash the per-CPU mpu_dev on SMP.  You'll need to
> > > rename one of these two mpu_devs.
> > >
> > > Also, won't the use of smp_processor_id() mean that this will just return
> > > the struct device * for the MPU that is running this code?  So on a
> > > two-CPU system, it would be either CPU 0 or 1, randomly.  I guess one
> > > solution would be to pass in the processor ID to omap_get_mpu_device().
> > >
> > MPUSS and both CPU's are clocked from same clock source, so above assumption
> > still work on OMAP4.
> 
> If the point is to only return an omap_device corresponding to the MPU
> subsystem, then all the per_cpu() stuff is unnecessary and can be dropped,
> and the function should be so named (e.g., omap_get_mpuss_device()).
> 
Indeed !!
Even otherwise the patch is not really initializing per-cpu device because
init(omap_hwmod_for_each_by_class("mpu", _init_omap_device, &mpu_dev);)
is called only on one CPU.

Regards,
Santosh
--
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: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-24 Thread Paul Walmsley
On Thu, 24 Jun 2010, Shilimkar, Santosh wrote:

> > -Original Message-
> > From: linux-omap-ow...@vger.kernel.org 
> > [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Paul
> > Walmsley
> > Sent: Thursday, June 24, 2010 11:57 AM

> > > +struct device *omap_get_mpu_device(void)
> > > +{
> > > + mpu_dev = per_cpu(mpu_dev, smp_processor_id());
> > 
> > Looks like this will trash the per-CPU mpu_dev on SMP.  You'll need to
> > rename one of these two mpu_devs.
> > 
> > Also, won't the use of smp_processor_id() mean that this will just return
> > the struct device * for the MPU that is running this code?  So on a
> > two-CPU system, it would be either CPU 0 or 1, randomly.  I guess one
> > solution would be to pass in the processor ID to omap_get_mpu_device().
> >
> MPUSS and both CPU's are clocked from same clock source, so above assumption
> still work on OMAP4.

If the point is to only return an omap_device corresponding to the MPU 
subsystem, then all the per_cpu() stuff is unnecessary and can be dropped, 
and the function should be so named (e.g., omap_get_mpuss_device()).


- Paul
--
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: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-23 Thread Shilimkar, Santosh
> -Original Message-
> From: linux-omap-ow...@vger.kernel.org 
> [mailto:linux-omap-ow...@vger.kernel.org] On Behalf Of Paul
> Walmsley
> Sent: Thursday, June 24, 2010 11:57 AM
> To: Kevin Hilman
> Cc: linux-omap@vger.kernel.org
> Subject: Re: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3
> 
> Hi Kevin,
> 
> some comments below -
> 
> On Wed, 23 Jun 2010, Kevin Hilman wrote:
> 
> > Create simple omap_devices for the main processors and busses.
> >
> > This is required to support the forth-coming device-based OPP
> > approach, where OPPs are managed and tracked at the device level.
> >
> > So that these primary devices are available for early PM initialization,
> > they are created as early platform_devices.
> 
> The idea sounds good, but -
> 
> >
> > Cc: Paul Walmsley 
> > Signed-off-by: Kevin Hilman 
> > ---
> >  arch/arm/mach-omap2/devices.c|2 +
> >  arch/arm/mach-omap2/io.c |   55 
> > +-
> >  arch/arm/plat-omap/include/plat/common.h |4 ++
> >  3 files changed, 60 insertions(+), 1 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
> > index 03e6c9e..62920ac 100644
> > --- a/arch/arm/mach-omap2/devices.c
> > +++ b/arch/arm/mach-omap2/devices.c
> > @@ -15,6 +15,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >
> >  #include 
> >  #include 
> > @@ -29,6 +30,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >
> >  #include "mux.h"
> >
> > diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> > index 3cfb425..ecebbbf 100644
> > --- a/arch/arm/mach-omap2/io.c
> > +++ b/arch/arm/mach-omap2/io.c
> > @@ -45,7 +45,7 @@
> >
> >  #include 
> >  #include "clockdomains.h"
> > -#include 
> > +#include 
> >
> >  /*
> >   * The machine specific code may provide the extra mapping besides the
> > @@ -313,6 +313,58 @@ static int __init _omap2_init_reprogram_sdrc(void)
> > return v;
> >  }
> >
> > +static struct omap_device_pm_latency *pm_lats;
> > +
> > +static DEFINE_PER_CPU(struct device *, mpu_dev);
> > +static struct devicee *dsp_dev;
> > +static struct device *l3_dev;
> > +
> > +struct device *omap_get_mpu_device(void)
> > +{
> > +   mpu_dev = per_cpu(mpu_dev, smp_processor_id());
> 
> Looks like this will trash the per-CPU mpu_dev on SMP.  You'll need to
> rename one of these two mpu_devs.
> 
> Also, won't the use of smp_processor_id() mean that this will just return
> the struct device * for the MPU that is running this code?  So on a
> two-CPU system, it would be either CPU 0 or 1, randomly.  I guess one
> solution would be to pass in the processor ID to omap_get_mpu_device().
>
MPUSS and both CPU's are clocked from same clock source, so above assumption
still work on OMAP4.
 
> > +   WARN_ON_ONCE(!mpu_dev);
> > +   return mpu_dev;
> > +}
> > +
> > +struct device *omap_get_dsp_device(void)
> > +{
> > +   WARN_ON_ONCE(!dsp_dev);
> > +   return dsp_dev;
> > +}
> > +
> > +struct device *omap_get_l3_device(void)
> > +{
> > +   WARN_ON_ONCE(!l3_dev);
> > +   return l3_dev;
> > +}
> > +
> > +static int _init_omap_device(struct omap_hwmod *oh, void *user)
> > +{
> > +   struct omap_device *od;
> > +   const char *name = oh->name;
> > +   struct device **new_dev = (struct device **)user;
> > +
> > +   od = omap_device_build(name, 0, oh, NULL, 0, pm_lats, 0, true);
> > +   if (WARN(IS_ERR(od), "Could not build omap_device for %s\n", name))
> > +   return -ENODEV;
> > +
> > +   *new_dev = &od->pdev.dev;
> > +
> > +   return 0;
> > +}
> > +
> > +/*
> > + * Build omap_devices for processors and bus.
> > + */
> > +static void omap_init_processor_devices(void)
> > +{
> > +   mpu_dev = per_cpu(mpu_dev, smp_processor_id());
> 
> (same issues as above)
> 
> > +
> > +   omap_hwmod_for_each_by_class("mpu", _init_omap_device, &mpu_dev);
> 
> This won't work on SMP - it will use the same mpu_dev variable for each
> MPU, so mpu_dev will contain the struct device * for the last MPU hwmod
> iterated over.
> 
> Also, there is a hidden assumption that the hwmods of class "mpu" will be
> iterated over in the order that the per_cpu() variable expect

Re: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-23 Thread Paul Walmsley
Hi Kevin,

one other thought.

On Thu, 24 Jun 2010, Paul Walmsley wrote:

> On Wed, 23 Jun 2010, Kevin Hilman wrote:
> 
> > Create simple omap_devices for the main processors and busses.
> > 
> > This is required to support the forth-coming device-based OPP
> > approach, where OPPs are managed and tracked at the device level.

If these omap_devices are only to deal with OPPs, you might only need one 
omap_device for the MPU subsystem for OMAP4, since I think both cores 
receive the same clock.  That might simplify this patch for the current 
timeframe.


- Paul
--
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: [PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-23 Thread Paul Walmsley
Hi Kevin,

some comments below -

On Wed, 23 Jun 2010, Kevin Hilman wrote:

> Create simple omap_devices for the main processors and busses.
> 
> This is required to support the forth-coming device-based OPP
> approach, where OPPs are managed and tracked at the device level.
> 
> So that these primary devices are available for early PM initialization,
> they are created as early platform_devices.

The idea sounds good, but -

> 
> Cc: Paul Walmsley 
> Signed-off-by: Kevin Hilman 
> ---
>  arch/arm/mach-omap2/devices.c|2 +
>  arch/arm/mach-omap2/io.c |   55 
> +-
>  arch/arm/plat-omap/include/plat/common.h |4 ++
>  3 files changed, 60 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
> index 03e6c9e..62920ac 100644
> --- a/arch/arm/mach-omap2/devices.c
> +++ b/arch/arm/mach-omap2/devices.c
> @@ -15,6 +15,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include 
>  #include 
> @@ -29,6 +30,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include "mux.h"
>  
> diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> index 3cfb425..ecebbbf 100644
> --- a/arch/arm/mach-omap2/io.c
> +++ b/arch/arm/mach-omap2/io.c
> @@ -45,7 +45,7 @@
>  
>  #include 
>  #include "clockdomains.h"
> -#include 
> +#include 
>  
>  /*
>   * The machine specific code may provide the extra mapping besides the
> @@ -313,6 +313,58 @@ static int __init _omap2_init_reprogram_sdrc(void)
>   return v;
>  }
>  
> +static struct omap_device_pm_latency *pm_lats;
> +
> +static DEFINE_PER_CPU(struct device *, mpu_dev);
> +static struct devicee *dsp_dev;
> +static struct device *l3_dev;
> +
> +struct device *omap_get_mpu_device(void)
> +{
> + mpu_dev = per_cpu(mpu_dev, smp_processor_id());

Looks like this will trash the per-CPU mpu_dev on SMP.  You'll need to 
rename one of these two mpu_devs.

Also, won't the use of smp_processor_id() mean that this will just return 
the struct device * for the MPU that is running this code?  So on a 
two-CPU system, it would be either CPU 0 or 1, randomly.  I guess one 
solution would be to pass in the processor ID to omap_get_mpu_device().

> + WARN_ON_ONCE(!mpu_dev);
> + return mpu_dev;
> +}
> +
> +struct device *omap_get_dsp_device(void)
> +{
> + WARN_ON_ONCE(!dsp_dev);
> + return dsp_dev;
> +}
> +
> +struct device *omap_get_l3_device(void)
> +{
> + WARN_ON_ONCE(!l3_dev);
> + return l3_dev;
> +}
> +
> +static int _init_omap_device(struct omap_hwmod *oh, void *user)
> +{
> + struct omap_device *od;
> + const char *name = oh->name;
> + struct device **new_dev = (struct device **)user;
> +
> + od = omap_device_build(name, 0, oh, NULL, 0, pm_lats, 0, true);
> + if (WARN(IS_ERR(od), "Could not build omap_device for %s\n", name))
> + return -ENODEV;
> +
> + *new_dev = &od->pdev.dev;
> +
> + return 0;
> +}
> +
> +/*
> + * Build omap_devices for processors and bus.
> + */
> +static void omap_init_processor_devices(void)
> +{
> + mpu_dev = per_cpu(mpu_dev, smp_processor_id());

(same issues as above)

> +
> + omap_hwmod_for_each_by_class("mpu", _init_omap_device, &mpu_dev);

This won't work on SMP - it will use the same mpu_dev variable for each 
MPU, so mpu_dev will contain the struct device * for the last MPU hwmod 
iterated over. 

Also, there is a hidden assumption that the hwmods of class "mpu" will be 
iterated over in the order that the per_cpu() variable expects...

> + omap_hwmod_for_each_by_class("dsp", _init_omap_device, &dsp_dev);
> + omap_hwmod_for_each_by_class("l3", _init_omap_device, &l3_dev);

If there is more than one hwmod in these classes, these will lose the 
omap_device pointers for all but the final omap_hwmod iterated over.

It's probably easier to just call omap_hwmod_lookup()/_init_omap_device() 
directly and forget about omap_hwmod_for_each_by_class() for the above 
two cases - maybe all three...

> +}
> +
>  void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
>struct omap_sdrc_params *sdrc_cs1)
>  {
> @@ -342,6 +394,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params 
> *sdrc_cs0,
>   omap_serial_early_init();
>   if (cpu_is_omap24xx() || cpu_is_omap34xx())   /* FIXME: OMAP4 */
>   omap_hwmod_late_init();
> + omap_init_processor_devices();
>   omap_pm_if_init();
>   if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
>   omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
> diff --git a/arch/arm/plat-omap/include/plat/common.h 
> b/arch/arm/plat-omap/include/plat/common.h
> index d265018..0059dec 100644
> --- a/arch/arm/plat-omap/include/plat/common.h
> +++ b/arch/arm/plat-omap/include/plat/common.h
> @@ -87,4 +87,8 @@ void omap2_set_globals_uart(struct omap_globals *);
>   }   \
>  })
>  
> +struct device

[PATCH 11/13] OMAP: create omap_devices for MPU, DSP, L3

2010-06-23 Thread Kevin Hilman
Create simple omap_devices for the main processors and busses.

This is required to support the forth-coming device-based OPP
approach, where OPPs are managed and tracked at the device level.

So that these primary devices are available for early PM initialization,
they are created as early platform_devices.

Cc: Paul Walmsley 
Signed-off-by: Kevin Hilman 
---
 arch/arm/mach-omap2/devices.c|2 +
 arch/arm/mach-omap2/io.c |   55 +-
 arch/arm/plat-omap/include/plat/common.h |4 ++
 3 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 03e6c9e..62920ac 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -29,6 +30,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "mux.h"
 
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 3cfb425..ecebbbf 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -45,7 +45,7 @@
 
 #include 
 #include "clockdomains.h"
-#include 
+#include 
 
 /*
  * The machine specific code may provide the extra mapping besides the
@@ -313,6 +313,58 @@ static int __init _omap2_init_reprogram_sdrc(void)
return v;
 }
 
+static struct omap_device_pm_latency *pm_lats;
+
+static DEFINE_PER_CPU(struct device *, mpu_dev);
+static struct device *dsp_dev;
+static struct device *l3_dev;
+
+struct device *omap_get_mpu_device(void)
+{
+   mpu_dev = per_cpu(mpu_dev, smp_processor_id());
+   WARN_ON_ONCE(!mpu_dev);
+   return mpu_dev;
+}
+
+struct device *omap_get_dsp_device(void)
+{
+   WARN_ON_ONCE(!dsp_dev);
+   return dsp_dev;
+}
+
+struct device *omap_get_l3_device(void)
+{
+   WARN_ON_ONCE(!l3_dev);
+   return l3_dev;
+}
+
+static int _init_omap_device(struct omap_hwmod *oh, void *user)
+{
+   struct omap_device *od;
+   const char *name = oh->name;
+   struct device **new_dev = (struct device **)user;
+
+   od = omap_device_build(name, 0, oh, NULL, 0, pm_lats, 0, true);
+   if (WARN(IS_ERR(od), "Could not build omap_device for %s\n", name))
+   return -ENODEV;
+
+   *new_dev = &od->pdev.dev;
+
+   return 0;
+}
+
+/*
+ * Build omap_devices for processors and bus.
+ */
+static void omap_init_processor_devices(void)
+{
+   mpu_dev = per_cpu(mpu_dev, smp_processor_id());
+
+   omap_hwmod_for_each_by_class("mpu", _init_omap_device, &mpu_dev);
+   omap_hwmod_for_each_by_class("dsp", _init_omap_device, &dsp_dev);
+   omap_hwmod_for_each_by_class("l3", _init_omap_device, &l3_dev);
+}
+
 void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
 struct omap_sdrc_params *sdrc_cs1)
 {
@@ -342,6 +394,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params 
*sdrc_cs0,
omap_serial_early_init();
if (cpu_is_omap24xx() || cpu_is_omap34xx())   /* FIXME: OMAP4 */
omap_hwmod_late_init();
+   omap_init_processor_devices();
omap_pm_if_init();
if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
diff --git a/arch/arm/plat-omap/include/plat/common.h 
b/arch/arm/plat-omap/include/plat/common.h
index d265018..0059dec 100644
--- a/arch/arm/plat-omap/include/plat/common.h
+++ b/arch/arm/plat-omap/include/plat/common.h
@@ -87,4 +87,8 @@ void omap2_set_globals_uart(struct omap_globals *);
}   \
 })
 
+struct device *omap_get_mpu_device(void);
+struct device *omap_get_dsp_device(void);
+struct device *omap_get_l3_device(void);
+
 #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */
-- 
1.7.0.2

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