Re: [PATCH V3 05/19] OMAP3+: voltage: use IS_ERR_OR_NULL

2011-03-05 Thread Nishanth Menon

David Cohen wrote, on 03/05/2011 11:06 PM:
[..]

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 53c399f..76bcaee 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -682,7 +682,7 @@ unsigned long omap_voltage_get_nom_volt(struct 
voltagedomain *voltdm)
  {
struct omap_vdd_info *vdd;

-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {


I have one comment here. voltdm is received as parameter and it's
already checked by IS_ERR(). Is there any specific reason for that?

yes:
1. omap_voltage_domain_lookup can return ERR_PTR() in certain conditions
2. the !voltdm is coz of the usage of these APIs from external to 
voltage.c (sr, pm, dvfs etc) - it is possible (and has happend) when 
mistakes have been made and NULL pointers passed as voltdm.




IS_ERR() doesn't suppose to be a macro to check if the pointer is
valid or not, but to know if there's an invalid value with error code
in the pointer value. It's useful when you have a function which
returns a pointer but it can return an error code when it fails.
Please, note that IS_ERR() won't detect invalid pointers which does
not represent an error code, so it's not correct to rely on it for
this purpose.
IMO, instead of change to IS_ERR_OR_NULL(), you could only remove
IS_ERR(). The same apply for the other cases.

no, I am not convinced with your argument.

omap_voltage_get_nom_volt(omap_voltage_domain_lookup("me"));
IS_ERR is useful in this case. If I were to remove vdata, 
PTR_ERR(something)== vdata and vdata !=NULL and it will try to 
dereference and crash.


my_dumb_func(){
struct voltagedomain *vdata = NULL;
if (cpu_is_omap3630()_) {
vdata = omap_voltage_domain_lookup("mpu")
}
/* forgot to add other cpu types or a else case */
/* do other things */
me_volt=omap_voltage_get_nom_volt(vdata);
/* do things with me_volt */
}

Sorry, but i think the check, even if seems superfluous is sane IMHO. 
even if the above code worked on 3630, it'd fail on o4/3430 without the 
check, it can even crash. and given that we've all seen our fair share 
of developers who develop for one platform without consideration that 
the rest of the world uses others as well... I do feel cases like above 
example might infact be a reality.


[...]

--
Regards,
Nishanth Menon
--
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 V3 05/19] OMAP3+: voltage: use IS_ERR_OR_NULL

2011-03-05 Thread David Cohen
Hi Nishanth,

On Sat, Mar 5, 2011 at 5:29 PM, Nishanth Menon  wrote:
> Use IS_ERR_OR_NULL macro instead of !xyz || IS_ERR(xyz) usage.
>
> Signed-off-by: Nishanth Menon 
> ---
>  arch/arm/mach-omap2/voltage.c |   22 +++---
>  1 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
> index 53c399f..76bcaee 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -682,7 +682,7 @@ unsigned long omap_voltage_get_nom_volt(struct 
> voltagedomain *voltdm)
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {

I have one comment here. voltdm is received as parameter and it's
already checked by IS_ERR(). Is there any specific reason for that?
IS_ERR() doesn't suppose to be a macro to check if the pointer is
valid or not, but to know if there's an invalid value with error code
in the pointer value. It's useful when you have a function which
returns a pointer but it can return an error code when it fails.
Please, note that IS_ERR() won't detect invalid pointers which does
not represent an error code, so it's not correct to rely on it for
this purpose.
IMO, instead of change to IS_ERR_OR_NULL(), you could only remove
IS_ERR(). The same apply for the other cases.

Kind regards,

David Cohen

>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return 0;
>        }
> @@ -703,7 +703,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain 
> *voltdm)
>        struct omap_vdd_info *vdd;
>        u8 curr_vsel;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return 0;
>        }
> @@ -738,7 +738,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
>        struct omap_vdd_info *vdd;
>        u32 vpconfig;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return;
>        }
> @@ -776,7 +776,7 @@ void omap_vp_disable(struct voltagedomain *voltdm)
>        u32 vpconfig;
>        int timeout;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return;
>        }
> @@ -829,7 +829,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return -EINVAL;
>        }
> @@ -858,7 +858,7 @@ void omap_voltage_reset(struct voltagedomain *voltdm)
>  {
>        unsigned long target_uvdc;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return;
>        }
> @@ -890,7 +890,7 @@ void omap_voltage_get_volttable(struct voltagedomain 
> *voltdm,
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return;
>        }
> @@ -921,7 +921,7 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct 
> voltagedomain *voltdm,
>        struct omap_vdd_info *vdd;
>        int i;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return ERR_PTR(-EINVAL);
>        }
> @@ -959,7 +959,7 @@ int omap_voltage_register_pmic(struct voltagedomain 
> *voltdm,
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return -EINVAL;
>        }
> @@ -986,7 +986,7 @@ struct dentry *omap_voltage_get_dbgdir(struct 
> voltagedomain *voltdm)
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return NULL;
>        }
> @@ -1011,7 +1011,7 @@ void omap_change_voltscale_method(struct voltagedomain 
> *voltdm,
>  {
>        struct omap_vdd_info *vdd;
>
> -       if (!voltdm || IS_ERR(voltdm)) {
> +       if (IS_ERR_OR_NULL(voltdm)) {
>                pr_warning("%s: VDD specified does not exist!\n", __func__);
>                return;
>        }
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majord...@vger.kernel.org

[PATCH] omap: overo: Add regulator for ads7846

2011-03-05 Thread Steve Sakoman
The ads7846 driver now requires a regulator.  This patch adds the
necessary regulator to the overo board file.  Without it, the
following error occurs (and the touchscreen will not function):

ads7846 spi1.0: unable to get regulator: -19

Signed-off-by: Steve Sakoman 
---
Note: this patch should be applied after the "[PATCH v3 0/2] Add DSS2
support on Overo" series.

 arch/arm/mach-omap2/board-overo.c |   31 +++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-overo.c 
b/arch/arm/mach-omap2/board-overo.c
index a2c17c9..1aee5b7 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -97,6 +98,34 @@ static struct ads7846_platform_data ads7846_config = {
.keep_vref_on   = 1,
 };
 
+/* fixed regulator for ads7846 */
+static struct regulator_consumer_supply ads7846_supply =
+   REGULATOR_SUPPLY("vcc", "spi1.0");
+
+static struct regulator_init_data vads7846_regulator = {
+   .constraints = {
+   .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+   },
+   .num_consumer_supplies  = 1,
+   .consumer_supplies  = &ads7846_supply,
+};
+
+static struct fixed_voltage_config vads7846 = {
+   .supply_name= "vads7846",
+   .microvolts = 330, /* 3.3V */
+   .gpio   = -EINVAL,
+   .startup_delay  = 0,
+   .init_data  = &vads7846_regulator,
+};
+
+static struct platform_device vads7846_device = {
+   .name   = "reg-fixed-voltage",
+   .id = 1,
+   .dev = {
+   .platform_data = &vads7846,
+   },
+};
+
 static void __init overo_ads7846_init(void)
 {
if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
@@ -106,6 +135,8 @@ static void __init overo_ads7846_init(void)
printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
return;
}
+
+   platform_device_register(&vads7846_device);
 }
 
 #else
-- 
1.7.0.4

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


[PATCH V3 19/19] OMAP3430: SR: class3: restrict CPU to run on

2011-03-05 Thread Nishanth Menon
Use SmartReflex AVS Class3 initialization only for OMAP343x family of
processors.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex-class3.c |5 +
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex-class3.c 
b/arch/arm/mach-omap2/smartreflex-class3.c
index 0136afb..6fbed0c 100644
--- a/arch/arm/mach-omap2/smartreflex-class3.c
+++ b/arch/arm/mach-omap2/smartreflex-class3.c
@@ -11,6 +11,7 @@
  * published by the Free Software Foundation.
  */
 
+#include 
 #include "smartreflex.h"
 
 static int sr_class3_enable(struct voltagedomain *voltdm,
@@ -49,6 +50,10 @@ static struct omap_sr_class_data class3_data = {
 /* Smartreflex Class3 init API to be called from board file */
 static int __init sr_class3_init(void)
 {
+   /* Enable this class only for OMAP343x */
+   if (!cpu_is_omap343x())
+   return -EINVAL;
+
pr_info("SmartReflex Class3 initialized\n");
return sr_register_class(&class3_data);
 }
-- 
1.7.1

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


[PATCH V3 18/19] OMAP3630+: SR: add support for class 1.5

2011-03-05 Thread Nishanth Menon
Traditional SmartReflex AVS(Automatic Voltage Scaling) classes are:
* Class 0 - Product test calibration
Silicon is calibration at production floor and fused with voltages
for each OPP
* Class 1 - Boot time calibration
Silicon is calibrated once at boot time and voltages are stored for
the lifetime of operation.
* Class 2 - Continuous s/w calibration
SR module notifies s/w for any change in the system which is desired
and the s/w makes runtime decisions in terms of setting the voltage,
this mechanism could be used in the system which does not have PMIC
capable of SR without using the voltage controller and voltage
processor blocks.
* Class 3 - Continuous h/w calibration
SR module is switch on after reaching a voltage level and SR
continuously monitors the system and makes runtime adjustments without
s/w involvement.

OMAP3430 has used SmartReflex AVS and with a a PMIC which understands the SR
protocol, Class 3 has been used. With OMAP3630 onwards, a new SmartReflex AVS
class of operation Class 1.5 was introduced.
* Class 1.5 - Periodic s/w calibration
This uses the h/w calibration loop and at the end of calibration
stores the voltages to be used run time, periodic recalibration is
performed as well.

The operational mode is describes as the following:
* SmartReflex AVS h/w calibration loop is essential to identify the optimal
voltage for a given OPP.
* Once this optimal voltage is detected, SmartReflex AVS loop is disabled in
class 1.5 mode of operation.
* Until there is a need for a recalibration, any further transition to an OPP
voltage which is calibrated can use the calibrated voltage and does not
require enabling the SR AVS h/w loop.
* On a periodic basis (recommendation being once approximately every 24 hours),
software is expected to perform a recalibration to find a new optimal
voltage which is compensated for device aging.
- For performing this recalibration, the start voltage does not need to
be the nominal voltage anymore. instead, the system can start with a
voltage which is 50mV higher than the previously calibrated voltage to
identify the new optimal voltage as the aging factor within a period of
1 day is not going to be anywhere close to 50mV.
- This "new starting point" for recalibration is called a dynamic
nominal voltage for that voltage point.
In short, with the introduction of SmartReflex class 1.5, there are three new
voltages possible in a system's DVFS transition:
* Nominal Voltage - The maximum voltage needed for a worst possible device
in the worst possible conditions. This is the voltage we choose as
the starting point for the h/w loop to optimize for the first time
calibration on system bootup.
* Dynamic Nominal Voltage - Worst case voltage for a specific device in
considering the system aging on the worst process device.
* Calibrated Voltage - Best voltage for the current device at a given point
of time.

In terms of the implementation, doing calibration involves waiting for the
SmartReflex h/w loop to settle down, and doing this as part of the DVFS flow
itself is to increase the latency of DVFS transition when there is a need to
calibrate that opp. instead, the calibration is performed "out of path" using
a workqueue statemachine. The workqueue waits for the system stabilization,
then enables VP interrupts to monitor for system instability interms of voltage
oscillations that are reported back to the system as interrupts, in case of
prolonged system oscillations, nominal voltage is chosen as a safe voltage and
this event is logged in the system log for developer debug and fixing.

For the recalibration, a common workqueue for all domains is started at the
start of the class initialization and it resets the calibrated voltages
on a periodic basis. For distros that may choose not to do the recommended
periodic recalibration, instead choose to perform boot time calibration,
kconfig configuration option is provided to do so.

TODO:
a) Cpuidle and suspend paths are not integrated with SmartReflex driver at
   this point.
b) Since the SR registers are accessed and controlled in parallel to DVFS
   some sort of mechanism is necessary to be introduced along with OMAP
   DVFS layer to ensure mutual exclusivity
c) Additional debug interfaces for vmin analysis for platform characterization
   and addition of system margin needs to be introduced from SmartReflex
   perspective.

This implementation also includes the following contributors:
Tony Lindgren for suggestion on using interrupt based mechanism instead of
polling to detect voltage oscillations.
Peter 'p2' De Schrijver for debating alternatives on recalibration mechanisms
Paul Walmsey, Eduardo Valentin, Ambresh K, Igor Dmitriev and quiet a few others
for patient review, tes

[PATCH V3 17/19] OMAP3+: SR: make enable path use volt_data pointer

2011-03-05 Thread Nishanth Menon
Passing the volt_data pointers across allows us to save us the effort
of looking up the voltage data pointer from the voltage value at
multiple layers, we need to look at the voltage data in DVFS layer
for further processing, so modify the APIs to pass the voltage data
pointer all the way through to lower layers to the SmartReflex AVS class
drivers.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex-class3.c |   13 +++--
 arch/arm/mach-omap2/smartreflex.c|   22 ++
 arch/arm/mach-omap2/smartreflex.h|8 +---
 3 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex-class3.c 
b/arch/arm/mach-omap2/smartreflex-class3.c
index 2ee48af..1d3eb11 100644
--- a/arch/arm/mach-omap2/smartreflex-class3.c
+++ b/arch/arm/mach-omap2/smartreflex-class3.c
@@ -13,19 +13,12 @@
 
 #include "smartreflex.h"
 
-static int sr_class3_enable(struct voltagedomain *voltdm)
+static int sr_class3_enable(struct voltagedomain *voltdm,
+   struct omap_volt_data *volt_data)
 {
-   unsigned long volt = omap_get_operation_voltage(
-   omap_voltage_get_nom_volt(voltdm));
-
-   if (!volt) {
-   pr_warning("%s: Curr voltage unknown. Cannot enable sr_%s\n",
-   __func__, voltdm->name);
-   return -ENODATA;
-   }
 
omap_vp_enable(voltdm);
-   return sr_enable(voltdm, volt);
+   return sr_enable(voltdm, volt_data);
 }
 
 static int sr_class3_disable(struct voltagedomain *voltdm, int is_volt_reset)
diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index b1a7cfe..5c549b9 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -306,7 +306,7 @@ static void sr_start_vddautocomp(struct omap_sr *sr, bool 
class_start)
return;
}
 
-   r = sr_class->enable(sr->voltdm);
+   r = sr_class->enable(sr->voltdm, omap_voltage_get_nom_volt(sr->voltdm));
if (!r && class_start)
sr->autocomp_active = true;
 }
@@ -626,7 +626,7 @@ int sr_configure_minmax(struct voltagedomain *voltdm)
 /**
  * sr_enable() - Enables the smartreflex module.
  * @voltdm:VDD pointer to which the SR module to be configured belongs to.
- * @volt:  The voltage at which the Voltage domain associated with
+ * @volt_data: The voltage at which the Voltage domain associated with
  * the smartreflex module is operating at.
  * This is required only to program the correct Ntarget value.
  *
@@ -634,10 +634,9 @@ int sr_configure_minmax(struct voltagedomain *voltdm)
  * enable a smartreflex module. Returns 0 on success. Returns error
  * value if the voltage passed is wrong or if ntarget value is wrong.
  */
-int sr_enable(struct voltagedomain *voltdm, unsigned long volt)
+int sr_enable(struct voltagedomain *voltdm, struct omap_volt_data *volt_data)
 {
u32 nvalue_reciprocal;
-   struct omap_volt_data *volt_data;
struct omap_sr *sr = _sr_lookup(voltdm);
int ret;
 
@@ -647,19 +646,16 @@ int sr_enable(struct voltagedomain *voltdm, unsigned long 
volt)
return -EINVAL;
}
 
-   volt_data = omap_voltage_get_voltdata(sr->voltdm, volt);
-
-   if (IS_ERR(volt_data)) {
-   dev_warn(&sr->pdev->dev, "%s: Unable to get voltage table"
-   "for nominal voltage %ld\n", __func__, volt);
-   return -ENODATA;
+   if (IS_ERR_OR_NULL(volt_data)) {
+   dev_warn(&sr->pdev->dev, "%s: bad voltage data\n", __func__);
+   return -EINVAL;
}
 
nvalue_reciprocal = sr_retrieve_nvalue(sr, volt_data->sr_efuse_offs);
 
if (!nvalue_reciprocal) {
dev_warn(&sr->pdev->dev, "%s: NVALUE = 0 at voltage %ld\n",
-   __func__, volt);
+   __func__, omap_get_operation_voltage(volt_data));
return -ENODATA;
}
 
@@ -816,13 +812,15 @@ int sr_register_class(struct omap_sr_class_data 
*class_data)
  * omap_sr_enable() -  API to enable SR clocks and to call into the
  * registered smartreflex class enable API.
  * @voltdm:VDD pointer to which the SR module to be configured belongs to.
+ * @volt_data: Voltage data to go to
  *
  * This API is to be called from the kernel in order to enable
  * a particular smartreflex module. This API will do the initial
  * configurations to turn on the smartreflex module and in turn call
  * into the registered smartreflex class enable API.
  */
-void omap_sr_enable(struct voltagedomain *voltdm)
+void omap_sr_enable(struct voltagedomain *voltdm,
+   struct omap_volt_data *volt_data)
 {
struct omap_sr *sr = _sr_lookup(voltdm);
 
diff --git a/arch/arm/mach-omap2/smartreflex.h 
b/arch/arm/mach-omap2/smartreflex.h
index 4a1ada4..812e86d 100644
--- a/arch/arm/mach-omap2/smartreflex.h

[PATCH V3 16/19] OMAP3+: SR: disable spamming interrupts

2011-03-05 Thread Nishanth Menon
At times with bad SR configurations, especially during silicon bring-ups,
we could get continuous spurious interrupts which end up hanging the
platform in the form of an ISR call for status bits that are
automatically enabled by the hardware without any software clearing
option.

If we detect scenarios where ISR was called without the corresponding
notification bit being set, instead of hanging up the system,
we will disable interrupt after noting the event in the system log
to try and keep system sanity and allow developer to debug and fix
the condition.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   12 ++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index f6e44a1..b1a7cfe 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -209,8 +209,16 @@ static irqreturn_t sr_interrupt(int irq, void *data)
value = irqstat_to_notifier_v2(status);
}
 
-   if (sr_class->notify)
-   sr_class->notify(sr_info->voltdm, value);
+   /* Attempt some resemblance of recovery! */
+   if (!value) {
+   dev_err(&sr_info->pdev->dev, "%s: Spurious interrupt!"
+   "status = 0x%08x. Disabling to prevent spamming!!\n",
+   __func__, status);
+   disable_irq_nosync(sr_info->irq);
+   } else {
+   if (sr_class->notify)
+   sr_class->notify(sr_info->voltdm, value);
+   }
 
return IRQ_HANDLED;
 }
-- 
1.7.1

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


[PATCH V3 15/19] OMAP3+: SR: introduce notifier_control

2011-03-05 Thread Nishanth Menon
We need some mechanism from class drivers to control when notifiers
should be triggered and when not, currently we have none, which makes
Class driver usage of the interrupt events almost impossible.

Introduce an SmartReflex driver API for doing the same. This is useful
for SmartReflex AVS class 1.5 or 2 drivers.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   57 +
 arch/arm/mach-omap2/smartreflex.h |8 +
 2 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 21944e2..f6e44a1 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -712,6 +712,63 @@ void sr_disable(struct voltagedomain *voltdm)
 }
 
 /**
+ * sr_notifier_control() - control the notifier mechanism
+ * @voltdm:VDD pointer to which the SR module to be configured belongs to.
+ * @enable:true to enable notifiers and false to disable the same
+ *
+ * SR modules allow an MCU interrupt mechanism that vary based on the IP
+ * revision, we allow the system to generate interrupt if the class driver
+ * has capability to handle the same. it is upto the class driver to ensure
+ * the proper sequencing and handling for a clean implementation. returns
+ * 0 if all goes fine, else returns failure results
+ */
+int sr_notifier_control(struct voltagedomain *voltdm, bool enable)
+{
+   struct omap_sr *sr = _sr_lookup(voltdm);
+   u32 value = 0;
+   if (IS_ERR_OR_NULL(sr)) {
+   pr_warning("%s: sr corresponding to domain not found\n",
+   __func__);
+   return -EINVAL;
+   }
+   if (!sr->autocomp_active)
+   return -EINVAL;
+
+   /* if I could never register an isr, why bother?? */
+   if (!(sr_class && sr_class->notify && sr_class->notify_flags &&
+   sr->irq)) {
+   dev_warn(&sr->pdev->dev,
+   "%s: unable to setup irq without handling mechanism\n",
+   __func__);
+   return -EINVAL;
+   }
+
+   switch (sr->ip_type) {
+   case SR_TYPE_V1:
+   value = notifier_to_irqen_v1(sr_class->notify_flags);
+   sr_modify_reg(sr, ERRCONFIG_V1, value,
+   (enable) ? value : 0);
+   break;
+   case SR_TYPE_V2:
+   value = notifier_to_irqen_v2(sr_class->notify_flags);
+   sr_write_reg(sr, (enable) ? IRQENABLE_SET : IRQENABLE_CLR,
+   value);
+   break;
+   default:
+dev_warn(&sr->pdev->dev, "%s: unknown type of sr??\n",
+__func__);
+   return -EINVAL;
+   }
+
+   if (enable)
+   enable_irq(sr->irq);
+   else
+   disable_irq_nosync(sr->irq);
+
+   return 0;
+}
+
+/**
  * sr_register_class() - API to register a smartreflex class parameters.
  * @class_data:The structure containing various sr class specific data.
  *
diff --git a/arch/arm/mach-omap2/smartreflex.h 
b/arch/arm/mach-omap2/smartreflex.h
index 2976bf6..4a1ada4 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -242,6 +242,7 @@ void omap_sr_register_pmic(struct omap_sr_pmic_data 
*pmic_data);
 /* Smartreflex driver hooks to be called from Smartreflex class driver */
 int sr_enable(struct voltagedomain *voltdm, unsigned long volt);
 void sr_disable(struct voltagedomain *voltdm);
+int sr_notifier_control(struct voltagedomain *voltdm, bool enable);
 int sr_configure_errgen(struct voltagedomain *voltdm);
 int sr_configure_minmax(struct voltagedomain *voltdm);
 
@@ -250,6 +251,13 @@ int sr_register_class(struct omap_sr_class_data 
*class_data);
 #else
 static inline void omap_sr_enable(struct voltagedomain *voltdm) {}
 static inline void omap_sr_disable(struct voltagedomain *voltdm) {}
+
+static inline int sr_notifier_control(struct voltagedomain *voltdm,
+   bool enable)
+{
+   return -EINVAL;
+}
+
 static inline void omap_sr_disable_reset_volt(
struct voltagedomain *voltdm) {}
 static inline void omap_sr_register_pmic(
-- 
1.7.1

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


[PATCH V3 14/19] OMAP3+: SR: introduce notifiers flags

2011-03-05 Thread Nishanth Menon
SmartReflex IP V1 and V2 have different registers and offsets.
Currently, we pass the status as is to the class driver. However,
since we don't pass the version of the underlying SR hardware
to the Class driver, it will not be unable to make consistent
sense of the status bits coming over to it.

A class driver should be able to function without dependency
on the exact IP version it is actually running on. We hence
introduce our own translation in software level for a generic
notification flag.

As part of this change, we will now call the notifier iff we get
a match with the notifier flags that the class driver requested.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   73 +++--
 arch/arm/mach-omap2/smartreflex.h |6 +++
 2 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index d839fa6..21944e2 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -123,27 +123,94 @@ static struct omap_sr *_sr_lookup(struct voltagedomain 
*voltdm)
return ERR_PTR(-ENODATA);
 }
 
+static inline u32 notifier_to_irqen_v1(u8 notify_flags)
+{
+   u32 val;
+   val = (notify_flags & SR_NOTIFY_MCUACCUM) ?
+   ERRCONFIG_MCUACCUMINTEN : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUVALID) ?
+   ERRCONFIG_MCUVALIDINTEN : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUBOUND) ?
+   ERRCONFIG_MCUBOUNDINTEN : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUDISACK) ?
+   ERRCONFIG_MCUDISACKINTEN : 0;
+   return val;
+}
+
+static inline u32 notifier_to_irqen_v2(u8 notify_flags)
+{
+   u32 val;
+   val = (notify_flags & SR_NOTIFY_MCUACCUM) ?
+   IRQENABLE_MCUACCUMINT : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUVALID) ?
+   IRQENABLE_MCUVALIDINT : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUBOUND) ?
+   IRQENABLE_MCUBOUNDSINT : 0;
+   val |= (notify_flags & SR_NOTIFY_MCUDISACK) ?
+   IRQENABLE_MCUDISABLEACKINT : 0;
+   return val;
+}
+
+static inline u8 irqstat_to_notifier_v1(u32 status)
+{
+   u8 val;
+   val = (status & ERRCONFIG_MCUACCUMINTST) ?
+   SR_NOTIFY_MCUACCUM : 0;
+   val |= (status & ERRCONFIG_MCUVALIDINTEN) ?
+   SR_NOTIFY_MCUVALID : 0;
+   val |= (status & ERRCONFIG_MCUBOUNDINTEN) ?
+   SR_NOTIFY_MCUBOUND : 0;
+   val |= (status & ERRCONFIG_MCUDISACKINTEN) ?
+   SR_NOTIFY_MCUDISACK : 0;
+   return val;
+}
+
+static inline u8 irqstat_to_notifier_v2(u32 status)
+{
+   u8 val;
+   val = (status & IRQENABLE_MCUACCUMINT) ?
+   SR_NOTIFY_MCUACCUM : 0;
+   val |= (status & IRQENABLE_MCUVALIDINT) ?
+   SR_NOTIFY_MCUVALID : 0;
+   val |= (status & IRQENABLE_MCUBOUNDSINT) ?
+   SR_NOTIFY_MCUBOUND : 0;
+   val |= (status & IRQENABLE_MCUDISABLEACKINT) ?
+   SR_NOTIFY_MCUDISACK : 0;
+   return val;
+}
+
+
 static irqreturn_t sr_interrupt(int irq, void *data)
 {
struct omap_sr *sr_info = (struct omap_sr *)data;
u32 status = 0;
+   u32 value = 0;
 
if (sr_info->ip_type == SR_TYPE_V1) {
+   /* Status bits are one bit before enable bits in v1 */
+   value = notifier_to_irqen_v1(sr_class->notify_flags) >> 1;
+
/* Read the status bits */
status = sr_read_reg(sr_info, ERRCONFIG_V1);
+   status &= value;
 
/* Clear them by writing back */
-   sr_write_reg(sr_info, ERRCONFIG_V1, status);
+   sr_modify_reg(sr_info, ERRCONFIG_V1, value, status);
+
+   value = irqstat_to_notifier_v1(status);
} else if (sr_info->ip_type == SR_TYPE_V2) {
+   value = notifier_to_irqen_v2(sr_class->notify_flags);
/* Read the status bits */
-   sr_read_reg(sr_info, IRQSTATUS);
+   status = sr_read_reg(sr_info, IRQSTATUS);
+   status &= value;
 
/* Clear them by writing back */
sr_write_reg(sr_info, IRQSTATUS, status);
+   value = irqstat_to_notifier_v2(status);
}
 
if (sr_class->notify)
-   sr_class->notify(sr_info->voltdm, status);
+   sr_class->notify(sr_info->voltdm, value);
 
return IRQ_HANDLED;
 }
diff --git a/arch/arm/mach-omap2/smartreflex.h 
b/arch/arm/mach-omap2/smartreflex.h
index d4b8bee..2976bf6 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -142,6 +142,12 @@
 #define OMAP3430_SR_ERRWEIGHT  0x04
 #define OMAP3430_SR_ERRMAXLIMIT0x02
 
+/* Smart reflex notifiers for class drivers to use */
+#define SR_NOTIFY_MCUDISACKBIT(3)
+#define SR_NOTIFY_MCUBOUND BIT(2)
+#define SR_NOTIFY_MCUVALID BIT(1)
+#define

[PATCH V3 13/19] OMAP3+: SR: Reuse sr_[start|stop]_vddautocomp functions

2011-03-05 Thread Nishanth Menon
From: Jarkko Nikula 

sr_start_vddautocomp and sr_stop_autocomp functions can be reused from
omap_sr_enable, omap_sr_disable and omap_sr_disable_reset_volt and by
adding one additional argument sr_stop_autocomp. This allows us to have
a single point where SR enable and disable operations are controlled from.

[n...@ti.com: synced it up with class start/stop as well. autocomp flag
 should only be disabled when SR is disabled for that domain]
Signed-off-by: Nishanth Menon 
Signed-off-by: Jarkko Nikula 
---
Side note: Jarkko has'nt seen this rev as I just finished the rebase and tested
but adding his signed-off anyways as he is primary contributor to the idea
and the patch.

 arch/arm/mach-omap2/smartreflex.c |   66 +
 1 files changed, 23 insertions(+), 43 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 592e9a0..d839fa6 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -211,8 +211,12 @@ static void sr_set_regfields(struct omap_sr *sr)
}
 }
 
-static void sr_start_vddautocomp(struct omap_sr *sr)
+static void sr_start_vddautocomp(struct omap_sr *sr, bool class_start)
 {
+   int r;
+   if (sr->autocomp_active)
+   return;
+
if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
dev_warn(&sr->pdev->dev,
"%s: smartreflex class driver not registered\n",
@@ -220,19 +224,24 @@ static void sr_start_vddautocomp(struct omap_sr *sr)
return;
}
 
-   if (sr_class->start &&
+   if (class_start && sr_class->start &&
sr_class->start(sr->voltdm, sr_class->class_priv_data)) {
dev_err(&sr->pdev->dev,
"%s: SRClass initialization failed\n", __func__);
return;
}
 
-   if (!sr_class->enable(sr->voltdm))
+   r = sr_class->enable(sr->voltdm);
+   if (!r && class_start)
sr->autocomp_active = true;
 }
 
-static void sr_stop_vddautocomp(struct omap_sr *sr)
+static void sr_stop_vddautocomp(struct omap_sr *sr, bool class_stop,
+   int is_volt_reset)
 {
+   if (!sr->autocomp_active)
+   return;
+
if (!sr_class || !(sr_class->disable)) {
dev_warn(&sr->pdev->dev,
"%s: smartreflex class driver not registered\n",
@@ -240,15 +249,13 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)
return;
}
 
-   if (sr->autocomp_active) {
-   sr_class->disable(sr->voltdm, 1);
+   sr_class->disable(sr->voltdm, is_volt_reset);
+   if (class_stop) {
if (sr_class->stop &&
-   sr_class->stop(sr->voltdm,
-   sr_class->class_priv_data)) {
+   sr_class->stop(sr->voltdm, sr_class->class_priv_data))
dev_err(&sr->pdev->dev,
"%s: SR[%d]Class deinitialization failed\n",
__func__, sr->srid);
-   }
sr->autocomp_active = false;
}
 }
@@ -285,7 +292,7 @@ static int sr_late_init(struct omap_sr *sr_info)
}
 
if (pdata && pdata->enable_on_init)
-   sr_start_vddautocomp(sr_info);
+   sr_start_vddautocomp(sr_info, true);
 
return ret;
 
@@ -693,16 +700,7 @@ void omap_sr_enable(struct voltagedomain *voltdm)
return;
}
 
-   if (!sr->autocomp_active)
-   return;
-
-   if (!sr_class || !(sr_class->enable) || !(sr_class->configure)) {
-   dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
-   "registered\n", __func__);
-   return;
-   }
-
-   sr_class->enable(voltdm);
+   sr_start_vddautocomp(sr, false);
 }
 
 /**
@@ -726,16 +724,7 @@ void omap_sr_disable(struct voltagedomain *voltdm)
return;
}
 
-   if (!sr->autocomp_active)
-   return;
-
-   if (!sr_class || !(sr_class->disable)) {
-   dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
-   "registered\n", __func__);
-   return;
-   }
-
-   sr_class->disable(voltdm, 0);
+   sr_stop_vddautocomp(sr, false, 0);
 }
 
 /**
@@ -759,16 +748,7 @@ void omap_sr_disable_reset_volt(struct voltagedomain 
*voltdm)
return;
}
 
-   if (!sr->autocomp_active)
-   return;
-
-   if (!sr_class || !(sr_class->disable)) {
-   dev_warn(&sr->pdev->dev, "%s: smartreflex class driver not"
-   "registered\n", __func__);
-   return;
-   }
-
-   sr_class->disable(voltdm, 1);
+   sr_stop_vddautocomp(sr, false, 1);
 }
 
 /**
@@ -823,9 +803,9 @@ static int omap_sr_autocomp_store(void *data, u64 val)
/* control enable/disable only if th

[PATCH V3 12/19] OMAP3+: SR: introduce class start,stop and priv data

2011-03-05 Thread Nishanth Menon
Certain class drivers such as class 1.5 drivers, will need specific
notification that they have to be started up or stopped independent
of smart reflex operation. They also may need private data to be
used for operations of their own, provide the same.
This allows the class driver to initialize it's internal data structures
on a need basis in preparation for the specific domain's autocomp usage.
The resultant operation is as follows:
when autocomp is set to 1 -> class drivers' start is called
The existing enable/disable is still used as before by the SmartReflex
core driver to enable disable the class operation.
When autocomp is set to 0 -> class drivers' stop is called, signaling
the end of usage for that domain.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   14 ++
 arch/arm/mach-omap2/smartreflex.h |6 ++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 1e52d61..592e9a0 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -220,6 +220,13 @@ static void sr_start_vddautocomp(struct omap_sr *sr)
return;
}
 
+   if (sr_class->start &&
+   sr_class->start(sr->voltdm, sr_class->class_priv_data)) {
+   dev_err(&sr->pdev->dev,
+   "%s: SRClass initialization failed\n", __func__);
+   return;
+   }
+
if (!sr_class->enable(sr->voltdm))
sr->autocomp_active = true;
 }
@@ -235,6 +242,13 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)
 
if (sr->autocomp_active) {
sr_class->disable(sr->voltdm, 1);
+   if (sr_class->stop &&
+   sr_class->stop(sr->voltdm,
+   sr_class->class_priv_data)) {
+   dev_err(&sr->pdev->dev,
+   "%s: SR[%d]Class deinitialization failed\n",
+   __func__, sr->srid);
+   }
sr->autocomp_active = false;
}
 }
diff --git a/arch/arm/mach-omap2/smartreflex.h 
b/arch/arm/mach-omap2/smartreflex.h
index 5f35b9e..d4b8bee 100644
--- a/arch/arm/mach-omap2/smartreflex.h
+++ b/arch/arm/mach-omap2/smartreflex.h
@@ -168,6 +168,8 @@ struct omap_sr_pmic_data {
  *
  * @enable:API to enable a particular class smaartreflex.
  * @disable:   API to disable a particular class smartreflex.
+ * @start: API to do class specific initialization (optional)
+ * @stop:  API to do class specific deinitialization (optional)
  * @configure: API to configure a particular class smartreflex.
  * @notify:API to notify the class driver about an event in SR.
  * Not needed for class3.
@@ -175,14 +177,18 @@ struct omap_sr_pmic_data {
  * @class_type:specify which smartreflex class.
  * Can be used by the SR driver to take any class
  * based decisions.
+ * @class_priv_data:   Class specific private data (optional)
  */
 struct omap_sr_class_data {
int (*enable)(struct voltagedomain *voltdm);
int (*disable)(struct voltagedomain *voltdm, int is_volt_reset);
+   int (*start)(struct voltagedomain *voltdm, void *class_priv_data);
+   int (*stop)(struct voltagedomain *voltdm, void *class_priv_data);
int (*configure)(struct voltagedomain *voltdm);
int (*notify)(struct voltagedomain *voltdm, u32 status);
u8 notify_flags;
u8 class_type;
+   void *class_priv_data;
 };
 
 /**
-- 
1.7.1

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


[PATCH V3 11/19] OMAP3+: SR: fix cosmetic indentation

2011-03-05 Thread Nishanth Menon
Error label case seems to have a 2 tab indentation when just 1 is
necessary.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   20 ++--
 1 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 2b6fdc7..1e52d61 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -276,16 +276,16 @@ static int sr_late_init(struct omap_sr *sr_info)
return ret;
 
 error:
-   iounmap(sr_info->base);
-   mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0);
-   release_mem_region(mem->start, resource_size(mem));
-   list_del(&sr_info->node);
-   dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
-   "interrupt handler. Smartreflex will"
-   "not function as desired\n", __func__);
-   kfree(name);
-   kfree(sr_info);
-   return ret;
+   iounmap(sr_info->base);
+   mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0);
+   release_mem_region(mem->start, resource_size(mem));
+   list_del(&sr_info->node);
+   dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
+   "interrupt handler. Smartreflex will"
+   "not function as desired\n", __func__);
+   kfree(name);
+   kfree(sr_info);
+   return ret;
 }
 
 static void sr_v1_disable(struct omap_sr *sr)
-- 
1.7.1

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


[PATCH V3 10/19] OMAP3+: SR: enable/disable SR only on need

2011-03-05 Thread Nishanth Menon
Since we already know the state of the autocomp enablement, we can
see if the requested state is different from the current state and
enable/disable SR only on the need basis.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |   11 +++
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index f9057ad..2b6fdc7 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -806,10 +806,13 @@ static int omap_sr_autocomp_store(void *data, u64 val)
return -EINVAL;
}
 
-   if (!val)
-   sr_stop_vddautocomp(sr_info);
-   else
-   sr_start_vddautocomp(sr_info);
+   /* control enable/disable only if there is a delta in value */
+   if (sr_info->autocomp_active != val) {
+   if (!val)
+   sr_stop_vddautocomp(sr_info);
+   else
+   sr_start_vddautocomp(sr_info);
+   }
 
return 0;
 }
-- 
1.7.1

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


[PATCH V3 09/19] OMAP3+: SR: disable interrupt by default

2011-03-05 Thread Nishanth Menon
We will enable and disable interrupt on a need basis in the class
driver. We need to keep the IRQ disabled by default else the
forceupdate or vcbypass events could trigger events that we don't
need/expect to handle.

This is a preparation for SmartReflex AVS class drivers such as
class 2 and class 1.5 which would need to use interrupts. Existing
SmartReflex AVS class 3 driver does not require to use interrupts
and is not impacted by this change.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 7096300..f9057ad 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -267,6 +267,7 @@ static int sr_late_init(struct omap_sr *sr_info)
0, name, (void *)sr_info);
if (ret)
goto error;
+   disable_irq(sr_info->irq);
}
 
if (pdata && pdata->enable_on_init)
-- 
1.7.1

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


[PATCH V3 08/19] OMAP3+: SR: make notify independent of class

2011-03-05 Thread Nishanth Menon
Interrupt notification mechanism of SmartReflex can be used by the
choice of implementation of the class driver. For example, Class 2 and
Class 1.5 of SmartReflex can both use the interrupt notification to
identify the transition of voltage or other events.

Hence, the actual class does not matter for notifier. Let the class
driver's handling decide how it should be used. SmartReflex driver
should provide just the primitives.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/smartreflex.c |6 ++
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-omap2/smartreflex.c 
b/arch/arm/mach-omap2/smartreflex.c
index 2566552..7096300 100644
--- a/arch/arm/mach-omap2/smartreflex.c
+++ b/arch/arm/mach-omap2/smartreflex.c
@@ -142,7 +142,7 @@ static irqreturn_t sr_interrupt(int irq, void *data)
sr_write_reg(sr_info, IRQSTATUS, status);
}
 
-   if (sr_class->class_type == SR_CLASS2 && sr_class->notify)
+   if (sr_class->notify)
sr_class->notify(sr_info->voltdm, status);
 
return IRQ_HANDLED;
@@ -257,9 +257,7 @@ static int sr_late_init(struct omap_sr *sr_info)
struct resource *mem;
int ret = 0;
 
-   if (sr_class->class_type == SR_CLASS2 &&
-   sr_class->notify_flags && sr_info->irq) {
-
+   if (sr_class->notify && sr_class->notify_flags && sr_info->irq) {
name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name);
if (name == NULL) {
ret = -ENOMEM;
-- 
1.7.1

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


[PATCH V3 07/19] OMAP3+: voltage: add transdone APIs

2011-03-05 Thread Nishanth Menon
Transdone event in Voltage processor gives us fine grained status on
the current status of the voltage communication with the PMIC.
Unfortunately, IRQ generation by VP is based on the start of the
transmission to VC from VP, not at the end (or the completion of
the voltage setting). Hence any users of voltage layer who need
to know fine grained information such as confirmation if the voltage
is actually send to PMIC, needs to depend on this status.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/voltage.c |   57 +++--
 arch/arm/mach-omap2/voltage.h |2 +
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index a12ac1e..2d70d13 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -455,10 +455,8 @@ static int vp_forceupdate_scale_voltage(struct 
omap_vdd_info *vdd,
 * is <3us
 */
while (timeout++ < VP_TRANXDONE_TIMEOUT) {
-   vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
-  prm_irqst_ocp_mod_offs, prm_irqst_reg);
-   if (!(vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) &
- vdd->vp_data->prm_irqst_data->tranxdone_status))
+   omap_vp_clear_transdone(&vdd->voltdm);
+   if (!omap_vp_is_transdone(&vdd->voltdm))
break;
udelay(1);
}
@@ -506,10 +504,8 @@ static int vp_forceupdate_scale_voltage(struct 
omap_vdd_info *vdd,
 */
timeout = 0;
while (timeout++ < VP_TRANXDONE_TIMEOUT) {
-   vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
-  prm_irqst_ocp_mod_offs, prm_irqst_reg);
-   if (!(vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) &
- vdd->vp_data->prm_irqst_data->tranxdone_status))
+   omap_vp_clear_transdone(&vdd->voltdm);
+   if (!omap_vp_is_transdone(&vdd->voltdm))
break;
udelay(1);
}
@@ -824,6 +820,51 @@ void omap_vp_disable(struct voltagedomain *voltdm)
 }
 
 /**
+ * omap_vp_is_transdone() - is voltage transfer done on vp?
+ * @voltdm:pointer to the VDD which is to be scaled.
+ *
+ * VP's transdone bit is the only way to ensure that the transfer
+ * of the voltage value has actually been send over to the PMIC
+ * This is hence useful for all users of voltage domain to precisely
+ * identify once the PMIC voltage has been set by the voltage processor
+ */
+bool omap_vp_is_transdone(struct voltagedomain *voltdm)
+{
+   struct omap_vdd_info *vdd;
+
+   if (IS_ERR_OR_NULL(voltdm)) {
+   pr_warning("%s: Bad Params vdm=%p\n", __func__, voltdm);
+   return false;
+   }
+
+   vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+   return (vdd->read_reg(prm_irqst_ocp_mod_offs,
+   vdd->vp_data->prm_irqst_data->prm_irqst_reg) &
+   vdd->vp_data->prm_irqst_data->tranxdone_status) ? true : false;
+}
+
+/**
+ * omap_vp_clear_transdone() - clear voltage transfer done status on vp
+ * @voltdm:pointer to the VDD which is to be scaled.
+ */
+bool omap_vp_clear_transdone(struct voltagedomain *voltdm)
+{
+   struct omap_vdd_info *vdd;
+
+   if (IS_ERR_OR_NULL(voltdm)) {
+   pr_warning("%s: Bad Params vdm=%p\n", __func__, voltdm);
+   return false;
+   }
+
+   vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+   vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
+   prm_irqst_ocp_mod_offs,
+   vdd->vp_data->prm_irqst_data->prm_irqst_reg);
+
+   return true;
+}
+
+/**
  * omap_voltage_scale_vdd() - API to scale voltage of a particular
  * voltage domain.
  * @voltdm:pointer to the VDD which is to be scaled.
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 6e9acd6..5b4e363 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -150,6 +150,8 @@ void omap_voltage_get_volttable(struct voltagedomain 
*voltdm,
 struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
unsigned long volt);
 struct omap_volt_data *omap_voltage_get_nom_volt(struct voltagedomain *voltdm);
+bool omap_vp_is_transdone(struct voltagedomain *voltdm);
+bool omap_vp_clear_transdone(struct voltagedomain *voltdm);
 struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm);
 int __init omap_voltage_early_init(s16 prm_mod, s16 prm_irqst_mod,
   struct omap_vdd_info *omap_vdd_array[],
-- 
1.7.1

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


[PATCH V3 06/19] OMAP3+: voltage: use volt_data pointer instead values

2011-03-05 Thread Nishanth Menon
Voltage values can get confusing in meaning with various SmartReflex
classes being active. Depending on the class used, the actual voltage
selected might be a variant. For example:
With SmartReflex AVS class 3:
a) If we don't have SR enabled, we will go to volt_nominal.
b) If have SR enabled, we go to volt_nominal, then enable SR and
   expect it to adjust voltage. We don't really care about the
   resultant voltage.
Essentially, when we ask voltage layer to scale to voltage x for OPP
y, it always means x is the nominal voltage for OPP y.

Now, once we introduce SmartReflex AVS class 1.5:
a) If you are booting for the first time OR if you never enabled SR
   before, we always go to volt_nominal.
b) If you enable SR and the OPP is calibrated, we will not enable SR
   again when that OPP is accessed anymore, but when we set voltage for
   an OPP, the voltage achieved will be volt_calibrated.
c) If recalibration timeout triggers or SR is disabled after a
   calibration, the calibrated values are not valid anymore, at this point,
   setting the voltage will mean volt_dynamic_nominal.
So, depending on which state the system is at, voltage for that OPP
we are setting has not 1 single value anymore, but 3 possible valid
values.

For upper layers(DVFS/cpufreq OMAP SoC layers) to use voltage values, it
will need to know which type of voltage AVS strategy is being used and
the corresponding system state from voltage layer perspective. This
would replicate the role of voltage layer, SmartReflex AVS in the upper
layers and make the corresponding implementations complex.

Since each voltage domain contains a set of volt_data structs representing
a voltage point that is supported for that domain, volt_data is a more
accurate representation of the voltage point we are interested in going to,
and the actual translation of this voltage point to the voltage value is
done inside the voltage layer. Doing this allows the users of the voltage
layer to be blissfully ignorant of any complexity of the underneath
layers and simplify the implementation of dependent layers.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/pm.c |3 +-
 arch/arm/mach-omap2/smartreflex-class3.c |3 +-
 arch/arm/mach-omap2/voltage.c|   75 +-
 arch/arm/mach-omap2/voltage.h|   17 +--
 4 files changed, 59 insertions(+), 39 deletions(-)

diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 2c3a253..2372744 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -209,7 +209,8 @@ static int __init omap2_set_init_voltage(char *vdd_name, 
char *clk_name,
goto exit;
}
 
-   omap_voltage_scale_vdd(voltdm, bootup_volt);
+   omap_voltage_scale_vdd(voltdm,
+   omap_voltage_get_voltdata(voltdm, bootup_volt));
return 0;
 
 exit:
diff --git a/arch/arm/mach-omap2/smartreflex-class3.c 
b/arch/arm/mach-omap2/smartreflex-class3.c
index f438cf4..2ee48af 100644
--- a/arch/arm/mach-omap2/smartreflex-class3.c
+++ b/arch/arm/mach-omap2/smartreflex-class3.c
@@ -15,7 +15,8 @@
 
 static int sr_class3_enable(struct voltagedomain *voltdm)
 {
-   unsigned long volt = omap_voltage_get_nom_volt(voltdm);
+   unsigned long volt = omap_get_operation_voltage(
+   omap_voltage_get_nom_volt(voltdm));
 
if (!volt) {
pr_warning("%s: Curr voltage unknown. Cannot enable sr_%s\n",
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 76bcaee..a12ac1e 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -58,7 +58,7 @@ static struct dentry *voltage_dir;
 
 /* Init function pointers */
 static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
-   unsigned long target_volt);
+   struct omap_volt_data *target_volt);
 
 static u32 omap3_voltage_read_reg(u16 mod, u8 offset)
 {
@@ -164,13 +164,20 @@ static int vp_volt_debug_get(void *data, u64 *val)
 static int nom_volt_debug_get(void *data, u64 *val)
 {
struct omap_vdd_info *vdd = (struct omap_vdd_info *) data;
+   struct omap_volt_data *volt_data;
 
if (!vdd) {
pr_warning("Wrong paramater passed\n");
return -EINVAL;
}
 
-   *val = omap_voltage_get_nom_volt(&vdd->voltdm);
+   volt_data = omap_voltage_get_nom_volt(&vdd->voltdm);
+   if (IS_ERR_OR_NULL(volt_data)) {
+   pr_warning("%s: No voltage/domain?\n", __func__);
+   return -ENODEV;
+   }
+
+   *val = volt_data->volt_nominal;
 
return 0;
 }
@@ -184,7 +191,8 @@ static void vp_latch_vsel(struct omap_vdd_info *vdd)
unsigned long uvdc;
char vsel;
 
-   uvdc = omap_voltage_get_nom_volt(&vdd->voltdm);
+   uvdc = omap_get_operation_voltage(
+   omap_voltage_get_nom_volt(&vdd->voltdm));
if (!

[PATCH V3 05/19] OMAP3+: voltage: use IS_ERR_OR_NULL

2011-03-05 Thread Nishanth Menon
Use IS_ERR_OR_NULL macro instead of !xyz || IS_ERR(xyz) usage.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/voltage.c |   22 +++---
 1 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 53c399f..76bcaee 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -682,7 +682,7 @@ unsigned long omap_voltage_get_nom_volt(struct 
voltagedomain *voltdm)
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return 0;
}
@@ -703,7 +703,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain 
*voltdm)
struct omap_vdd_info *vdd;
u8 curr_vsel;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return 0;
}
@@ -738,7 +738,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
struct omap_vdd_info *vdd;
u32 vpconfig;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return;
}
@@ -776,7 +776,7 @@ void omap_vp_disable(struct voltagedomain *voltdm)
u32 vpconfig;
int timeout;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return;
}
@@ -829,7 +829,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return -EINVAL;
}
@@ -858,7 +858,7 @@ void omap_voltage_reset(struct voltagedomain *voltdm)
 {
unsigned long target_uvdc;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return;
}
@@ -890,7 +890,7 @@ void omap_voltage_get_volttable(struct voltagedomain 
*voltdm,
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return;
}
@@ -921,7 +921,7 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct 
voltagedomain *voltdm,
struct omap_vdd_info *vdd;
int i;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return ERR_PTR(-EINVAL);
}
@@ -959,7 +959,7 @@ int omap_voltage_register_pmic(struct voltagedomain *voltdm,
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return -EINVAL;
}
@@ -986,7 +986,7 @@ struct dentry *omap_voltage_get_dbgdir(struct voltagedomain 
*voltdm)
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return NULL;
}
@@ -1011,7 +1011,7 @@ void omap_change_voltscale_method(struct voltagedomain 
*voltdm,
 {
struct omap_vdd_info *vdd;
 
-   if (!voltdm || IS_ERR(voltdm)) {
+   if (IS_ERR_OR_NULL(voltdm)) {
pr_warning("%s: VDD specified does not exist!\n", __func__);
return;
}
-- 
1.7.1

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


[PATCH V3 04/19] OMAP3+: voltage: remove spurious pr_notice for debugfs

2011-03-05 Thread Nishanth Menon
cat of debugfs entry for vp_volt provides voltage. The additional pr_notice
is just spam on console and provides no additional information.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/voltage.c |1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 1b40aa0..53c399f 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -150,7 +150,6 @@ static int vp_volt_debug_get(void *data, u64 *val)
}
 
vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage);
-   pr_notice("curr_vsel = %x\n", vsel);
 
if (!vdd->pmic_info->vsel_to_uv) {
pr_warning("PMIC function to convert vsel to voltage"
-- 
1.7.1

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


[PATCH V3 03/19] OMAP3+: voltage: remove initial voltage

2011-03-05 Thread Nishanth Menon
Blindly setting a 1.2V setting in the initial structure may not even
match the default voltages stored in the voltage table which are
supported for the domain. For example, OMAP3430 core domain does not
use 1.2V and ends up generating a warning on the first transition.

Further, since omap2_set_init_voltage is called as part of the pm
framework's initialization sequence to configure the voltage required
for the current OPP, the call does(and has to) setup the system
voltage(curr_volt as a result) using the right mechanisms appropriate
for the system at that point of time. This also overrides
initialization we are currently doing in voltage.c making it
redundant. So, remove the wrong and redundant initialization.

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/voltage.c |1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 56961df..1b40aa0 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -116,7 +116,6 @@ static int __init _config_common_vdd_data(struct 
omap_vdd_info *vdd)
sys_clk_speed /= 1000;
 
/* Generic voltage parameters */
-   vdd->curr_volt = 120;
vdd->volt_scale = vp_forceupdate_scale_voltage;
vdd->vp_enabled = false;
 
-- 
1.7.1

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


[PATCH V3 02/19] OMAP3+: voltage: fix build warning

2011-03-05 Thread Nishanth Menon
Handle the case for a future SoC where sys_ck_name might be
uninitialized. Fixes the build warning:
arch/arm/mach-omap2/voltage.c: In function 'omap_voltage_late_init':
arch/arm/mach-omap2/voltage.c:86:8: warning: 'sys_ck_name' may be used 
uninitialized in this function

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/voltage.c |8 ++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index e0cbd93..56961df 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -91,10 +91,14 @@ static int __init _config_common_vdd_data(struct 
omap_vdd_info *vdd)
 * XXX Clockfw should handle this, or this should be in a
 * struct record
 */
-   if (cpu_is_omap24xx() || cpu_is_omap34xx())
+   if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
sys_ck_name = "sys_ck";
-   else if (cpu_is_omap44xx())
+   } else if (cpu_is_omap44xx()) {
sys_ck_name = "sys_clkin_ck";
+   } else {
+   pr_err("%s: Unsupported OMAP\n", __func__);
+   return -EINVAL;
+   }
 
/*
 * Sys clk rate is require to calculate vp timeout value and
-- 
1.7.1

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


[PATCH V3 01/19] OMAP3: hwmod: add SmartReflex IRQs

2011-03-05 Thread Nishanth Menon
OMAP3 SmartReflex IRQs in hwmod structures with the same naming as
present in OMAP4. Without these IRQs being registered, SmartReflex
driver will be unable to get the IRQ numbers to handle notifications

Signed-off-by: Nishanth Menon 
---
 arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |   17 +
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c 
b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index 196a834..2d464bc 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -378,6 +378,15 @@ static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = {
.user   = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+
+static struct omap_hwmod_irq_info omap3_smartreflex_mpu_irqs[] = {
+   {.name = "sr1_irq", .irq = 18},
+};
+
+static struct omap_hwmod_irq_info omap3_smartreflex_core_irqs[] = {
+   {.name = "sr2_irq", .irq = 19},
+};
+
 /* L4 CORE -> SR1 interface */
 static struct omap_hwmod_addr_space omap3_sr1_addr_space[] = {
{
@@ -2925,6 +2934,8 @@ static struct omap_hwmod omap34xx_sr1_hwmod = {
.omap_chip  = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2 |
CHIP_IS_OMAP3430ES3_0 |
CHIP_IS_OMAP3430ES3_1),
+   .mpu_irqs   = omap3_smartreflex_mpu_irqs,
+   .mpu_irqs_cnt   = ARRAY_SIZE(omap3_smartreflex_mpu_irqs),
.flags  = HWMOD_SET_DEFAULT_CLOCKACT,
 };
 
@@ -2945,6 +2956,8 @@ static struct omap_hwmod omap36xx_sr1_hwmod = {
.slaves = omap3_sr1_slaves,
.slaves_cnt = ARRAY_SIZE(omap3_sr1_slaves),
.omap_chip  = OMAP_CHIP_INIT(CHIP_IS_OMAP3630ES1),
+   .mpu_irqs   = omap3_smartreflex_mpu_irqs,
+   .mpu_irqs_cnt   = ARRAY_SIZE(omap3_smartreflex_mpu_irqs),
 };
 
 /* SR2 */
@@ -2971,6 +2984,8 @@ static struct omap_hwmod omap34xx_sr2_hwmod = {
.omap_chip  = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2 |
CHIP_IS_OMAP3430ES3_0 |
CHIP_IS_OMAP3430ES3_1),
+   .mpu_irqs   = omap3_smartreflex_core_irqs,
+   .mpu_irqs_cnt   = ARRAY_SIZE(omap3_smartreflex_core_irqs),
.flags  = HWMOD_SET_DEFAULT_CLOCKACT,
 };
 
@@ -2991,6 +3006,8 @@ static struct omap_hwmod omap36xx_sr2_hwmod = {
.slaves = omap3_sr2_slaves,
.slaves_cnt = ARRAY_SIZE(omap3_sr2_slaves),
.omap_chip  = OMAP_CHIP_INIT(CHIP_IS_OMAP3630ES1),
+   .mpu_irqs   = omap3_smartreflex_core_irqs,
+   .mpu_irqs_cnt   = ARRAY_SIZE(omap3_smartreflex_core_irqs),
 };
 
 /*
-- 
1.7.1

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


[PATCH V3 00/19] OMAP3+: PM: introduce SR class 1.5

2011-03-05 Thread Nishanth Menon
Hi,

This series intends to introduce SmartReflex AVS Class 1.5 support which
is now the recommended AVS class for usage in OMAP3630, OMAP4 and potentially
in later generation of silicon as well. Smartreflex class 1.5 is a software
controlled hardware calibration mechanism designed to improve DVFS latencies
and system performance as well as helping bring in additional benefits to the
system from h/w perspective. The corresponding patch has details on this class
and the implementation as well.

The series eventually results in OMAP343x based platforms using class 3 and
OMAP3630, OMAP4 platforms using class 1.5 automatically without modifications
or additions to board files.

The series contains a bunch of bugfixes and improvements needed to introduce
SmartReflex AVS class 1.5.

This series is Based on:
a) k.org 2.6.38-rc7 (b2.6.38-rc7)
b) The pm-core branch Kevin Hilman's tree: (pm-base-v3)
 http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=summary

Some good fixes needed are here (optional):
c) sr-fixes: (sr-baseline-v3)
https://patchwork.kernel.org/patch/611991/
https://patchwork.kernel.org/patch/611951/
https://patchwork.kernel.org/patch/611961/
https://patchwork.kernel.org/patch/611971/

This series is also available at:
git://gitorious.org/linux-omap-nm-sr/linux-omap-sr.git
Branch: sr-1.5-v3

Changes in v3 since v2:
* On request from OMAP PM maintainer, the series is now rebased to
  pm-core of linux-omap-pm tree
  http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=summary
  Ref: http://marc.info/?l=linux-omap&m=129911240208955&w=2
  the voltage files and structures have been reorganized
  in pm-core, so the same code looks a little different now.
* Changes throughout the series for typos, spell corrections,
  using uppercase for abbreviations
* Updated commit message for patches 3, 6, 9 and 15
* Dropped patch http://marc.info/?t=129906354500012&r=1&w=2
* Added patch 2 in the series for pm-core branch (build warning)
* Included a squashed series from Jaarko(patch 9):
http://marc.info/?l=linux-omap&m=129908137900427&w=2
  This was rebased to pm-core+ my series
* patch 10 changed x ^ y check to x != y to basically get the same behavior
  but a little more readable without thinking bitops ;)
* patch 12 - changed class_init/deinit to start/stop APIs

v2: http://marc.info/?l=linux-omap&m=129906334611444&w=2
v1: http://marc.info/?l=linux-omap&m=129811693118173&w=2

Jarkko Nikula (1):
  OMAP3+: SR: Reuse sr_[start|stop]_vddautocomp functions

Nishanth Menon (18):
  OMAP3: hwmod: add SmartReflex IRQs
  OMAP3+: voltage: fix build warning
  OMAP3+: voltage: remove initial voltage
  OMAP3+: voltage: remove spurious pr_notice for debugfs
  OMAP3+: voltage: use IS_ERR_OR_NULL
  OMAP3+: voltage: use volt_data pointer instead values
  OMAP3+: voltage: add transdone APIs
  OMAP3+: SR: make notify independent of class
  OMAP3+: SR: disable interrupt by default
  OMAP3+: SR: enable/disable SR only on need
  OMAP3+: SR: fix cosmetic indentation
  OMAP3+: SR: introduce class start,stop and priv data
  OMAP3+: SR: introduce notifiers flags
  OMAP3+: SR: introduce notifier_control
  OMAP3+: SR: disable spamming interrupts
  OMAP3+: SR: make enable path use volt_data pointer
  OMAP3630+: SR: add support for class 1.5
  OMAP3430: SR: class3: restrict CPU to run on

 arch/arm/mach-omap2/Makefile   |1 +
 arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |   17 +
 arch/arm/mach-omap2/pm.c   |3 +-
 arch/arm/mach-omap2/smartreflex-class1p5.c |  582 
 arch/arm/mach-omap2/smartreflex-class3.c   |   21 +-
 arch/arm/mach-omap2/smartreflex.c  |  288 +++
 arch/arm/mach-omap2/smartreflex.h  |   39 ++-
 arch/arm/mach-omap2/voltage.c  |  241 +---
 arch/arm/mach-omap2/voltage.h  |   40 ++-
 arch/arm/plat-omap/Kconfig |   17 +
 10 files changed, 1106 insertions(+), 143 deletions(-)
 create mode 100644 arch/arm/mach-omap2/smartreflex-class1p5.c

Testing performed:
Testing with sr-1.5-v3 - http://pastebin.mozilla.org/1117880
- enable disable in domain combinations, test the new debugfs entries
  etc..
- platforms: SDP3430(OMAP3430), SDP3630(OMAP3630), PandaBoard(OMAP4430)

Testing with dvfs-test-v2 (not v3)
The DVFS series no longer applies on pm-core with the cleanups
that have taken place. I have been unable to test the latest
series with it yet.
V2 of the series was tested with:
http://pastebin.mozilla.org/1117872
- transitions from all opps to all other opps,sr enabled, disable
- platforms: SDP3430(OMAP3430), SDP3630(OMAP3630)
(further note: dvfs series does'nt support OMAP4 yet)

Regards,
Nishanth Menon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org

Re: [PATCH v3 0/2] Add DSS2 support on Overo

2011-03-05 Thread Tomi Valkeinen
On Sat, 2011-03-05 at 07:58 -0600, Steve Sakoman wrote:
> This patch series adds support for the set of display devices available
> for the Overo COM products: DVI, S-Video, the Samsung LTE430WQ-F0C LCD
> panel, and the LG.Philips LB035Q02 panel.
> 
> Tested with applicable expansion boards for each option: Tobi, Palo43,
> Chestnut43, and Palo35.
> 
> Changes from version 1: adds mutex locking to the lgphilips-lb035q02
> panel enable/disable and suspend/resume functions.
> 
> Changes from version 2: add missing semicolon to lb035q02_data definition
> 
> Steve Sakoman (2):
>   OMAP: DSS2: Add support for LG Philips LB035Q02 panel
>   OMAP: DSS2: Add DSS2 support for Overo
> 
>  arch/arm/mach-omap2/board-overo.c  |  239 ++---
>  drivers/video/omap2/displays/Kconfig   |6 +
>  drivers/video/omap2/displays/Makefile  |1 +
>  .../omap2/displays/panel-lgphilips-lb035q02.c  |  279 
> 
>  4 files changed, 488 insertions(+), 37 deletions(-)
>  create mode 100644 drivers/video/omap2/displays/panel-lgphilips-lb035q02.c

Thanks, applied.

 Tomi


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


[PM-CORE RFC] OMAP2+: make CONFIG_PM selectable

2011-03-05 Thread Nishanth Menon
Allow build with CONFIG_PM disabled. Esp when bringing up new
Silicon, this is a useful and often important requirement.

Instead we allow for CONFIG_PM to be selectable as desired.
Currently voltage files messup the build

Note: this is just a proposal - I have'nt actually done a clean build,
testing etc.. and was hoping to get some opinions why we have a hard
dependency on PM for OMAP2

Cc: Paul 
Cc: Tony 
Cc: Kevin 

---
patch approx based on pm-core

 arch/arm/mach-omap2/Kconfig  |2 --
 arch/arm/mach-omap2/Makefile |   12 
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index b9d8a7b..1c99a01 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -7,8 +7,6 @@ config ARCH_OMAP2PLUS_TYPICAL
default y
select AEABI
select REGULATOR
-   select PM
-   select PM_RUNTIME
select VFP
select NEON if ARCH_OMAP3 || ARCH_OMAP4
select SERIAL_OMAP
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 1d4d2ff..6d7f155 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -79,8 +79,7 @@ endif
 
 # PRCM
 obj-$(CONFIG_ARCH_OMAP2)   += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
-obj-$(CONFIG_ARCH_OMAP3)   += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o \
-  vc3xxx_data.o vp3xxx_data.o
+obj-$(CONFIG_ARCH_OMAP3)   += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP4)   += prcm.o cminst44xx.o cm44xx.o \
   prcm_mpu44xx.o prminst44xx.o
 # XXX The presence of cm2xxx_3xxx.o on the line below is temporary and
@@ -88,8 +87,12 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cminst44xx.o 
cm44xx.o \
 # use OMAP4-specific PRCM functions.
 obj-$(CONFIG_ARCH_OMAP4)   += prcm.o cm2xxx_3xxx.o cminst44xx.o \
   cm44xx.o prcm_mpu44xx.o \
-  prminst44xx.o vc44xx_data.o \
-  vp44xx_data.o
+  prminst44xx.o
+
+ifeq ($(CONFIG_PM),y)
+# OMAP Voltage h/w module specific
+obj-$(CONFIG_ARCH_OMAP3)   += vc3xxx_data.o vp3xxx_data.o
+obj-$(CONFIG_ARCH_OMAP4)   += vc44xx_data.o vp44xx_data.o
 
 # OMAP voltage domains
 voltagedomain-common   := voltage.o
@@ -98,6 +101,7 @@ obj-$(CONFIG_ARCH_OMAP3) += 
$(voltagedomain-common) \
   voltagedomains3xxx_data.o
 obj-$(CONFIG_ARCH_OMAP4)   += $(voltagedomain-common) \
   voltagedomains44xx_data.o
+endif
 
 # OMAP powerdomain framework
 powerdomain-common += powerdomain.o powerdomain-common.o
-- 
1.7.1

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


[PATCH v3 2/2] OMAP: DSS2: Add DSS2 support for Overo

2011-03-05 Thread Steve Sakoman
This patch adds DSS2 support for DVI, S-video, the 480x272 Samsung
LTE430WQ-F0C panel, and the 320x240 LG.Philips LB035Q02 panel.

Signed-off-by: Steve Sakoman 
---
 arch/arm/mach-omap2/board-overo.c |  239 +++--
 1 files changed, 202 insertions(+), 37 deletions(-)

diff --git a/arch/arm/mach-omap2/board-overo.c 
b/arch/arm/mach-omap2/board-overo.c
index a33ec0e..a2c17c9 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -41,10 +42,14 @@
 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 
 #include "mux.h"
@@ -68,8 +73,6 @@
 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
 
-#include 
-#include 
 #include 
 
 static struct omap2_mcspi_device_config ads7846_mcspi_config = {
@@ -94,18 +97,6 @@ static struct ads7846_platform_data ads7846_config = {
.keep_vref_on   = 1,
 };
 
-static struct spi_board_info overo_spi_board_info[] __initdata = {
-   {
-   .modalias   = "ads7846",
-   .bus_num= 1,
-   .chip_select= 0,
-   .max_speed_hz   = 150,
-   .controller_data= &ads7846_mcspi_config,
-   .irq= OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
-   .platform_data  = &ads7846_config,
-   }
-};
-
 static void __init overo_ads7846_init(void)
 {
if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
@@ -115,9 +106,6 @@ static void __init overo_ads7846_init(void)
printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
return;
}
-
-   spi_register_board_info(overo_spi_board_info,
-   ARRAY_SIZE(overo_spi_board_info));
 }
 
 #else
@@ -233,6 +221,137 @@ static inline void __init overo_init_smsc911x(void)
 static inline void __init overo_init_smsc911x(void) { return; }
 #endif
 
+/* DSS */
+static int lcd_enabled;
+static int dvi_enabled;
+
+#define OVERO_GPIO_LCD_EN 144
+#define OVERO_GPIO_LCD_BL 145
+
+static void __init overo_display_init(void)
+{
+   if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) &&
+   (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0))
+   gpio_export(OVERO_GPIO_LCD_EN, 0);
+   else
+   printk(KERN_ERR "could not obtain gpio for "
+   "OVERO_GPIO_LCD_EN\n");
+
+   if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) &&
+   (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0))
+   gpio_export(OVERO_GPIO_LCD_BL, 0);
+   else
+   printk(KERN_ERR "could not obtain gpio for "
+   "OVERO_GPIO_LCD_BL\n");
+}
+
+static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
+{
+   if (lcd_enabled) {
+   printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+   return -EINVAL;
+   }
+   dvi_enabled = 1;
+
+   return 0;
+}
+
+static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
+{
+   dvi_enabled = 0;
+}
+
+static struct panel_generic_dpi_data dvi_panel = {
+   .name   = "generic",
+   .platform_enable= overo_panel_enable_dvi,
+   .platform_disable   = overo_panel_disable_dvi,
+};
+
+static struct omap_dss_device overo_dvi_device = {
+   .name   = "dvi",
+   .type   = OMAP_DISPLAY_TYPE_DPI,
+   .driver_name= "generic_dpi_panel",
+   .data   = &dvi_panel,
+   .phy.dpi.data_lines = 24,
+};
+
+static struct omap_dss_device overo_tv_device = {
+   .name = "tv",
+   .driver_name = "venc",
+   .type = OMAP_DISPLAY_TYPE_VENC,
+   .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+};
+
+static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
+{
+   if (dvi_enabled) {
+   printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+   return -EINVAL;
+   }
+
+   gpio_set_value(OVERO_GPIO_LCD_EN, 1);
+   gpio_set_value(OVERO_GPIO_LCD_BL, 1);
+   lcd_enabled = 1;
+   return 0;
+}
+
+static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
+{
+   gpio_set_value(OVERO_GPIO_LCD_EN, 0);
+   gpio_set_value(OVERO_GPIO_LCD_BL, 0);
+   lcd_enabled = 0;
+}
+
+static struct panel_generic_dpi_data lcd43_panel = {
+   .name   = "samsung_lte430wq_f0c",
+   .platform_enable= overo_panel_enable_lcd,
+   .platform_disable   = overo_panel_disable_lcd,
+};
+
+static struct omap_dss_device overo_lcd43_device = {
+   .name   = "lcd43",
+   .type   = OMAP_DISPLAY_TYPE_DPI,
+  

[PATCH v3 1/2] OMAP: DSS2: Add support for LG Philips LB035Q02 panel

2011-03-05 Thread Steve Sakoman
This patch adds support for the Gumstix Palo35 expansion board
which utilizes the 320 x 240 pixel LG.Philips LB035Q02 LCD Panel

Signed-off-by: Steve Sakoman 
---
 drivers/video/omap2/displays/Kconfig   |6 +
 drivers/video/omap2/displays/Makefile  |1 +
 .../omap2/displays/panel-lgphilips-lb035q02.c  |  279 
 3 files changed, 286 insertions(+), 0 deletions(-)
 create mode 100644 drivers/video/omap2/displays/panel-lgphilips-lb035q02.c

diff --git a/drivers/video/omap2/displays/Kconfig 
b/drivers/video/omap2/displays/Kconfig
index 940cab3..d18ad6b 100644
--- a/drivers/video/omap2/displays/Kconfig
+++ b/drivers/video/omap2/displays/Kconfig
@@ -9,6 +9,12 @@ config PANEL_GENERIC_DPI
  Supports LCD Panel used in TI SDP3430 and EVM boards,
  OMAP3517 EVM boards and CM-T35.
 
+config PANEL_LGPHILIPS_LB035Q02
+   tristate "LG.Philips LB035Q02 LCD Panel"
+   depends on OMAP2_DSS && SPI
+   help
+ LCD Panel used on the Gumstix Overo Palo35
+
 config PANEL_SHARP_LS037V7DW01
 tristate "Sharp LS037V7DW01 LCD Panel"
 depends on OMAP2_DSS
diff --git a/drivers/video/omap2/displays/Makefile 
b/drivers/video/omap2/displays/Makefile
index 861f025..0f601ab 100644
--- a/drivers/video/omap2/displays/Makefile
+++ b/drivers/video/omap2/displays/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_PANEL_GENERIC_DPI) += panel-generic-dpi.o
+obj-$(CONFIG_PANEL_LGPHILIPS_LB035Q02) += panel-lgphilips-lb035q02.o
 obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o
 obj-$(CONFIG_PANEL_NEC_NL8048HL11_01B) += panel-nec-nl8048hl11-01b.o
 
diff --git a/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c 
b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
new file mode 100644
index 000..271324d
--- /dev/null
+++ b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
@@ -0,0 +1,279 @@
+/*
+ * LCD panel driver for LG.Philips LB035Q02
+ *
+ * Author: Steve Sakoman 
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see .
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+struct lb035q02_data {
+   struct mutex lock;
+};
+
+static struct omap_video_timings lb035q02_timings = {
+   .x_res = 320,
+   .y_res = 240,
+
+   .pixel_clock= 6500,
+
+   .hsw= 2,
+   .hfp= 20,
+   .hbp= 68,
+
+   .vsw= 2,
+   .vfp= 4,
+   .vbp= 18,
+};
+
+static int lb035q02_panel_power_on(struct omap_dss_device *dssdev)
+{
+   int r;
+
+   if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
+   return 0;
+
+   r = omapdss_dpi_display_enable(dssdev);
+   if (r)
+   goto err0;
+
+   if (dssdev->platform_enable) {
+   r = dssdev->platform_enable(dssdev);
+   if (r)
+   goto err1;
+   }
+
+   return 0;
+err1:
+   omapdss_dpi_display_disable(dssdev);
+err0:
+   return r;
+}
+
+static void lb035q02_panel_power_off(struct omap_dss_device *dssdev)
+{
+   if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+   return;
+
+   if (dssdev->platform_disable)
+   dssdev->platform_disable(dssdev);
+
+   omapdss_dpi_display_disable(dssdev);
+}
+
+static int lb035q02_panel_probe(struct omap_dss_device *dssdev)
+{
+   struct lb035q02_data *ld;
+   int r;
+
+   dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
+   OMAP_DSS_LCD_IHS;
+   dssdev->panel.timings = lb035q02_timings;
+
+   ld = kzalloc(sizeof(*ld), GFP_KERNEL);
+   if (!ld) {
+   r = -ENOMEM;
+   goto err;
+   }
+   mutex_init(&ld->lock);
+   dev_set_drvdata(&dssdev->dev, ld);
+   return 0;
+err:
+   return r;
+}
+
+static void lb035q02_panel_remove(struct omap_dss_device *dssdev)
+{
+   struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev);
+
+   kfree(ld);
+}
+
+static int lb035q02_panel_enable(struct omap_dss_device *dssdev)
+{
+   struct lb035q02_data *ld = dev_get_drvdata(&dssdev->dev);
+   int r;
+
+   mutex_lock(&ld->lock);
+
+   r = lb035q02_panel_power_on(dssdev);
+   if (r)
+   goto err;
+   dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+   mutex_unlock(&ld->lock);
+   return 0;
+err:
+   mutex_unlock(&ld->lock);
+   return r;
+}
+
+static void lb035q02_panel_disable(

[PATCH v3 0/2] Add DSS2 support on Overo

2011-03-05 Thread Steve Sakoman
This patch series adds support for the set of display devices available
for the Overo COM products: DVI, S-Video, the Samsung LTE430WQ-F0C LCD
panel, and the LG.Philips LB035Q02 panel.

Tested with applicable expansion boards for each option: Tobi, Palo43,
Chestnut43, and Palo35.

Changes from version 1: adds mutex locking to the lgphilips-lb035q02
panel enable/disable and suspend/resume functions.

Changes from version 2: add missing semicolon to lb035q02_data definition

Steve Sakoman (2):
  OMAP: DSS2: Add support for LG Philips LB035Q02 panel
  OMAP: DSS2: Add DSS2 support for Overo

 arch/arm/mach-omap2/board-overo.c  |  239 ++---
 drivers/video/omap2/displays/Kconfig   |6 +
 drivers/video/omap2/displays/Makefile  |1 +
 .../omap2/displays/panel-lgphilips-lb035q02.c  |  279 
 4 files changed, 488 insertions(+), 37 deletions(-)
 create mode 100644 drivers/video/omap2/displays/panel-lgphilips-lb035q02.c

--
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 v2 1/2] OMAP: DSS2: Add support for LG Philips LB035Q02 panel

2011-03-05 Thread Steve Sakoman
On Sat, Mar 5, 2011 at 1:18 AM, Tomi Valkeinen  wrote:
> Hi,
>
> On Fri, 2011-03-04 at 14:52 -0600, Steve Sakoman wrote:
>> This patch adds support for the Gumstix Palo35 expansion board
>> which utilizes the 320 x 240 pixel LG.Philips LB035Q02 LCD Panel
>>
>> Signed-off-by: Steve Sakoman 
>> ---
>>  drivers/video/omap2/displays/Kconfig               |    6 +
>>  drivers/video/omap2/displays/Makefile              |    1 +
>>  .../omap2/displays/panel-lgphilips-lb035q02.c      |  278 
>> 
>>  3 files changed, 285 insertions(+), 0 deletions(-)
>>  create mode 100644 drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
>
> This doesn't compile.

Sigh, that is because I am an idiot and sent from the wrong branch!  I
am really sorry to have wasted your time -- version 3 from the right
branch on the way.

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


[PATCH v3] OMAP3+: OPP: Replace voltage values with Macros

2011-03-05 Thread Nishanth Menon
From: Vishwanath BS 

Since all voltage data is now centralized in oppxxx_data.c, we can replace
the values in the opp table with the macros used for voltage values.

This will avoid opp table and voltage layer having conflicting values.

Signed-off-by: Vishwanath BS 

---
This patch has 3 line over 80 char warning. This is retained for readability
purposes.

Patch based on 2.6.38-rc7 + Tony and Kevin's tree @:

http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=summary
branch: pm-core
for easy incorporation since voltage layer has been cleaned up for .39
there.

v3: no functional content change. $subject fixed (the patch impacts omap3+)
commit message grammar fix.

v2: https://patchwork.kernel.org/patch/607541/
Rebased to pm-core (since pm-core now has voltage layer cleanups)

v1: http://marc.info/?l=linux-omap&m=129683786100355&w=2

 arch/arm/mach-omap2/opp3xxx_data.c |   46 ++--
 arch/arm/mach-omap2/opp4xxx_data.c |   12 
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-omap2/opp3xxx_data.c 
b/arch/arm/mach-omap2/opp3xxx_data.c
index d2bd1bd..d95f3f9 100644
--- a/arch/arm/mach-omap2/opp3xxx_data.c
+++ b/arch/arm/mach-omap2/opp3xxx_data.c
@@ -89,15 +89,15 @@ struct omap_volt_data omap36xx_vddcore_volt_data[] = {
 
 static struct omap_opp_def __initdata omap34xx_opp_def_list[] = {
/* MPU OPP1 */
-   OPP_INITIALIZER("mpu", true, 12500, 975000),
+   OPP_INITIALIZER("mpu", true, 12500, OMAP3430_VDD_MPU_OPP1_UV),
/* MPU OPP2 */
-   OPP_INITIALIZER("mpu", true, 25000, 1075000),
+   OPP_INITIALIZER("mpu", true, 25000, OMAP3430_VDD_MPU_OPP2_UV),
/* MPU OPP3 */
-   OPP_INITIALIZER("mpu", true, 5, 120),
+   OPP_INITIALIZER("mpu", true, 5, OMAP3430_VDD_MPU_OPP3_UV),
/* MPU OPP4 */
-   OPP_INITIALIZER("mpu", true, 55000, 127),
+   OPP_INITIALIZER("mpu", true, 55000, OMAP3430_VDD_MPU_OPP4_UV),
/* MPU OPP5 */
-   OPP_INITIALIZER("mpu", true, 6, 135),
+   OPP_INITIALIZER("mpu", true, 6, OMAP3430_VDD_MPU_OPP5_UV),
 
/*
 * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is
@@ -107,47 +107,47 @@ static struct omap_opp_def __initdata 
omap34xx_opp_def_list[] = {
 * impact that frequency will do to the MPU and the whole system in
 * general.
 */
-   OPP_INITIALIZER("l3_main", false, 4150, 975000),
+   OPP_INITIALIZER("l3_main", false, 4150, OMAP3430_VDD_CORE_OPP1_UV),
/* L3 OPP2 */
-   OPP_INITIALIZER("l3_main", true, 8300, 105),
+   OPP_INITIALIZER("l3_main", true, 8300, OMAP3430_VDD_CORE_OPP2_UV),
/* L3 OPP3 */
-   OPP_INITIALIZER("l3_main", true, 16600, 115),
+   OPP_INITIALIZER("l3_main", true, 16600, OMAP3430_VDD_CORE_OPP3_UV),
 
/* DSP OPP1 */
-   OPP_INITIALIZER("iva", true, 9000, 975000),
+   OPP_INITIALIZER("iva", true, 9000, OMAP3430_VDD_MPU_OPP1_UV),
/* DSP OPP2 */
-   OPP_INITIALIZER("iva", true, 18000, 1075000),
+   OPP_INITIALIZER("iva", true, 18000, OMAP3430_VDD_MPU_OPP2_UV),
/* DSP OPP3 */
-   OPP_INITIALIZER("iva", true, 36000, 120),
+   OPP_INITIALIZER("iva", true, 36000, OMAP3430_VDD_MPU_OPP3_UV),
/* DSP OPP4 */
-   OPP_INITIALIZER("iva", true, 4, 127),
+   OPP_INITIALIZER("iva", true, 4, OMAP3430_VDD_MPU_OPP4_UV),
/* DSP OPP5 */
-   OPP_INITIALIZER("iva", true, 43000, 135),
+   OPP_INITIALIZER("iva", true, 43000, OMAP3430_VDD_MPU_OPP5_UV),
 };
 
 static struct omap_opp_def __initdata omap36xx_opp_def_list[] = {
/* MPU OPP1 - OPP50 */
-   OPP_INITIALIZER("mpu", true,  3, 1012500),
+   OPP_INITIALIZER("mpu", true,  3, OMAP3630_VDD_MPU_OPP50_UV),
/* MPU OPP2 - OPP100 */
-   OPP_INITIALIZER("mpu", true,  6, 120),
+   OPP_INITIALIZER("mpu", true,  6, OMAP3630_VDD_MPU_OPP100_UV),
/* MPU OPP3 - OPP-Turbo */
-   OPP_INITIALIZER("mpu", false, 8, 1325000),
+   OPP_INITIALIZER("mpu", false, 8, OMAP3630_VDD_MPU_OPP120_UV),
/* MPU OPP4 - OPP-SB */
-   OPP_INITIALIZER("mpu", false, 10, 1375000),
+   OPP_INITIALIZER("mpu", false, 10, OMAP3630_VDD_MPU_OPP1G_UV),
 
/* L3 OPP1 - OPP50 */
-   OPP_INITIALIZER("l3_main", true, 1, 100),
+   OPP_INITIALIZER("l3_main", true, 1, OMAP3630_VDD_CORE_OPP50_UV),
/* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */
-   OPP_INITIALIZER("l3_main", true, 2, 120),
+   OPP_INITIALIZER("l3_main", true, 2, 
OMAP3630_VDD_CORE_OPP100_UV),
 
/* DSP OPP1 - OPP50 */
-   OPP_INITIALIZER("iva", true,  26000, 1012500),
+   OPP_INITIALIZER("iva", true,  26000

Re: [PATCH v2] OMAP2PLUS: Replace voltage values with Macros

2011-03-05 Thread Menon, Nishanth
2011/3/4 Nishanth Menon :
> From: Vishwanath BS 
>
> Since all voltage data is now centralized in oppxxx_data.c, we can remove
> the replace the values in the opp table with the macros used for voltage
> values.  This will avoid opp table and voltage layer having conflicting
> values.
dropping this patch -> i will post a v3 in a couple of mins. realized
that the $subject and commit message could be improved a bit :(

Regards,
Nishanth Menon


>
> Signed-off-by: Vishwanath BS 
> ---
> This patch has 3 line over 80 char warning. This is retained for readability
> purposes.
>
> v2: Rebased to pm-core (since pm-core now has voltage layer cleanups)
>
> v1: http://marc.info/?l=linux-omap&m=129683786100355&w=2
>
>  arch/arm/mach-omap2/opp3xxx_data.c |   46 
> ++--
>  arch/arm/mach-omap2/opp4xxx_data.c |   12 
>  2 files changed, 29 insertions(+), 29 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/opp3xxx_data.c 
> b/arch/arm/mach-omap2/opp3xxx_data.c
> index d2bd1bd..d95f3f9 100644
> --- a/arch/arm/mach-omap2/opp3xxx_data.c
> +++ b/arch/arm/mach-omap2/opp3xxx_data.c
> @@ -89,15 +89,15 @@ struct omap_volt_data omap36xx_vddcore_volt_data[] = {
>
>  static struct omap_opp_def __initdata omap34xx_opp_def_list[] = {
>        /* MPU OPP1 */
> -       OPP_INITIALIZER("mpu", true, 12500, 975000),
> +       OPP_INITIALIZER("mpu", true, 12500, OMAP3430_VDD_MPU_OPP1_UV),
>        /* MPU OPP2 */
> -       OPP_INITIALIZER("mpu", true, 25000, 1075000),
> +       OPP_INITIALIZER("mpu", true, 25000, OMAP3430_VDD_MPU_OPP2_UV),
>        /* MPU OPP3 */
> -       OPP_INITIALIZER("mpu", true, 5, 120),
> +       OPP_INITIALIZER("mpu", true, 5, OMAP3430_VDD_MPU_OPP3_UV),
>        /* MPU OPP4 */
> -       OPP_INITIALIZER("mpu", true, 55000, 127),
> +       OPP_INITIALIZER("mpu", true, 55000, OMAP3430_VDD_MPU_OPP4_UV),
>        /* MPU OPP5 */
> -       OPP_INITIALIZER("mpu", true, 6, 135),
> +       OPP_INITIALIZER("mpu", true, 6, OMAP3430_VDD_MPU_OPP5_UV),
>
>        /*
>         * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is
> @@ -107,47 +107,47 @@ static struct omap_opp_def __initdata 
> omap34xx_opp_def_list[] = {
>         * impact that frequency will do to the MPU and the whole system in
>         * general.
>         */
> -       OPP_INITIALIZER("l3_main", false, 4150, 975000),
> +       OPP_INITIALIZER("l3_main", false, 4150, 
> OMAP3430_VDD_CORE_OPP1_UV),
>        /* L3 OPP2 */
> -       OPP_INITIALIZER("l3_main", true, 8300, 105),
> +       OPP_INITIALIZER("l3_main", true, 8300, OMAP3430_VDD_CORE_OPP2_UV),
>        /* L3 OPP3 */
> -       OPP_INITIALIZER("l3_main", true, 16600, 115),
> +       OPP_INITIALIZER("l3_main", true, 16600, 
> OMAP3430_VDD_CORE_OPP3_UV),
>
>        /* DSP OPP1 */
> -       OPP_INITIALIZER("iva", true, 9000, 975000),
> +       OPP_INITIALIZER("iva", true, 9000, OMAP3430_VDD_MPU_OPP1_UV),
>        /* DSP OPP2 */
> -       OPP_INITIALIZER("iva", true, 18000, 1075000),
> +       OPP_INITIALIZER("iva", true, 18000, OMAP3430_VDD_MPU_OPP2_UV),
>        /* DSP OPP3 */
> -       OPP_INITIALIZER("iva", true, 36000, 120),
> +       OPP_INITIALIZER("iva", true, 36000, OMAP3430_VDD_MPU_OPP3_UV),
>        /* DSP OPP4 */
> -       OPP_INITIALIZER("iva", true, 4, 127),
> +       OPP_INITIALIZER("iva", true, 4, OMAP3430_VDD_MPU_OPP4_UV),
>        /* DSP OPP5 */
> -       OPP_INITIALIZER("iva", true, 43000, 135),
> +       OPP_INITIALIZER("iva", true, 43000, OMAP3430_VDD_MPU_OPP5_UV),
>  };
>
>  static struct omap_opp_def __initdata omap36xx_opp_def_list[] = {
>        /* MPU OPP1 - OPP50 */
> -       OPP_INITIALIZER("mpu", true,  3, 1012500),
> +       OPP_INITIALIZER("mpu", true,  3, OMAP3630_VDD_MPU_OPP50_UV),
>        /* MPU OPP2 - OPP100 */
> -       OPP_INITIALIZER("mpu", true,  6, 120),
> +       OPP_INITIALIZER("mpu", true,  6, OMAP3630_VDD_MPU_OPP100_UV),
>        /* MPU OPP3 - OPP-Turbo */
> -       OPP_INITIALIZER("mpu", false, 8, 1325000),
> +       OPP_INITIALIZER("mpu", false, 8, OMAP3630_VDD_MPU_OPP120_UV),
>        /* MPU OPP4 - OPP-SB */
> -       OPP_INITIALIZER("mpu", false, 10, 1375000),
> +       OPP_INITIALIZER("mpu", false, 10, OMAP3630_VDD_MPU_OPP1G_UV),
>
>        /* L3 OPP1 - OPP50 */
> -       OPP_INITIALIZER("l3_main", true, 1, 100),
> +       OPP_INITIALIZER("l3_main", true, 1, 
> OMAP3630_VDD_CORE_OPP50_UV),
>        /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */
> -       OPP_INITIALIZER("l3_main", true, 2, 120),
> +       OPP_INITIALIZER("l3_main", true, 2, 
> OMAP3630_VDD_CORE_OPP100_UV),
>
>        /* DSP OPP1 - OPP50 */
> -       OPP_INITIALIZER("iva", true,  26000, 1012500),
> +       OPP_INITIALIZER("iva", true,  26000, OMAP3630_VDD_MPU_OPP50_UV),
>     

Re: pm-core: recursive dependency on config

2011-03-05 Thread Russell King - ARM Linux
On Sat, Mar 05, 2011 at 02:11:29PM +0530, Santosh Shilimkar wrote:
> + Russell,
> 
> > -Original Message-
> > From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-
> > ow...@vger.kernel.org] On Behalf Of Menon, Nishanth
> > Sent: Saturday, March 05, 2011 1:51 PM
> > To: linux-omap
> > Subject: pm-core: recursive dependency on config
> >
> > Folks,
> > Dumb question:
> > Some one seen this one? is there a patch in the pipe for the fix?
> >
> > scripts/kconfig/conf --silentoldconfig Kconfig
> > arch/arm/Kconfig:1277:error: recursive dependency detected!
> > arch/arm/Kconfig:1277:  symbol SMP depends on CPU_V6K
> > arch/arm/mm/Kconfig:407:symbol CPU_V6K depends on SMP
> >
> I saw this one too. This is because of resent changes to
> ensure that CPU_32v6K is always enabled with SMP builds.
> 
> This is tricky dependency. May be RMK has better way to deal
> with this.
> 
> Two relevant commit on this are '85a11f52' and  '15490ef8'

What is 85a11f52 ?

15490ef8 (in mainline) is:

 config CPU_32v6K
bool "Support ARM V6K processor extensions" if !SMP
depends on CPU_V6 || CPU_V7
-   default y if SMP && !(ARCH_MX3 || ARCH_OMAP2)
+   default y if SMP

fbb4ddac (ARM: v6k: only allow SMP if we have v6k or v7 CPU) does this:

 config SMP
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
depends on EXPERIMENTAL
+   depends on CPU_V6K || CPU_V7

which I assume is 85a11f52 in Tony's tree.
However, e399b1a4e (ARM: v6k: introduce CPU_V6K option) does this:

-config CPU_32v6K
-   bool "Support ARM V6K processor extensions" if !SMP
-   depends on CPU_V6 || CPU_V7
-   default y if SMP && !(ARCH_MX3 || ARCH_OMAP2)
-   help
- Say Y here if your ARMv6 processor supports the 'K' extension.
- This enables the kernel to use some instructions not present
- on previous processors, and as such a kernel build with this
- enabled will not boot on processors with do not support these
- instructions.
+config CPU_V6K
+   bool "Support ARM V6K processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB
+   select CPU_32v6
+   select CPU_32v6K if !ARCH_OMAP2
+   select CPU_ABRT_EV6
+   select CPU_PABRT_V6
+   select CPU_CACHE_V6
+   select CPU_CACHE_VIPT
+   select CPU_CP15_MMU
+   select CPU_HAS_ASID if MMU
+   select CPU_COPY_V6 if MMU
+   select CPU_TLB_V6 if MMU

which conflicts with 15490ef8.

So I suspect that a merge conflict hasn't been resolved correctly.  I'm
not going to worry about that because I have the merge conflict resolution
here already as part of my tree.
--
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


[PATCH V2 3/3] OMAP4: Add IVA OPP enteries.

2011-03-05 Thread Shweta Gulati
This Patch adds OPP enteries for IVA  in OMAP4 OPP Table

Tested on OMAP4430 SDP Board.

Signed-off-by: Shweta Gulati 
Cc: linux-arm-ker...@lists.infradead.org 
---
 arch/arm/mach-omap2/opp4xxx_data.c |8 +++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/opp4xxx_data.c 
b/arch/arm/mach-omap2/opp4xxx_data.c
index 36a4517..ba5eddd 100644
--- a/arch/arm/mach-omap2/opp4xxx_data.c
+++ b/arch/arm/mach-omap2/opp4xxx_data.c
@@ -78,7 +78,13 @@ static struct omap_opp_def __initdata 
omap44xx_opp_def_list[] = {
OPP_INITIALIZER("l3_main_1", true, 1, 
OMAP4430_VDD_CORE_OPP50_UV),
/* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */
OPP_INITIALIZER("l3_main_1", true, 2, 
OMAP4430_VDD_CORE_OPP100_UV),
-   /* TODO: add IVA, DSP, aess, fdif, gpu */
+   /* IVA OPP1 - OPP50 */
+   OPP_INITIALIZER("iva", true, 13300, OMAP4430_VDD_IVA_OPP50_UV),
+   /* IVA OPP2 - OPP100 */
+   OPP_INITIALIZER("iva", true, 26610, OMAP4430_VDD_IVA_OPP100_UV),
+   /* IVA OPP3 - OPP-Turbo */
+   OPP_INITIALIZER("iva", false, 33200, OMAP4430_VDD_IVA_OPPTURBO_UV),
+   /* TODO: add DSP, aess, fdif, gpu */
 };
 
 /**
-- 
1.7.0.4

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


[PATCH V2 2/3] OMAP4: Update Voltage Rail Values for MPU/IVA

2011-03-05 Thread Shweta Gulati
Update MPU/IVA voltage Rail values obtained from
OMAP4430 Data Manual Operating Condition Addendum_v0.3.

Tested on OMAP4430 SDP Board.

Signed-off-by: Shweta Gulati 
Cc: linux-arm-ker...@lists.infradead.org 
---
 arch/arm/mach-omap2/opp4xxx_data.c |   14 +++---
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-omap2/opp4xxx_data.c 
b/arch/arm/mach-omap2/opp4xxx_data.c
index 93b9744..36a4517 100644
--- a/arch/arm/mach-omap2/opp4xxx_data.c
+++ b/arch/arm/mach-omap2/opp4xxx_data.c
@@ -31,10 +31,10 @@
  * voltage dependent data for each VDD.
  */
 
-#define OMAP4430_VDD_MPU_OPP50_UV  93
-#define OMAP4430_VDD_MPU_OPP100_UV 110
-#define OMAP4430_VDD_MPU_OPPTURBO_UV   126
-#define OMAP4430_VDD_MPU_OPPNITRO_UV   135
+#define OMAP4430_VDD_MPU_OPP50_UV  1025000
+#define OMAP4430_VDD_MPU_OPP100_UV 120
+#define OMAP4430_VDD_MPU_OPPTURBO_UV   1313000
+#define OMAP4430_VDD_MPU_OPPNITRO_UV   1375000
 
 struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = {
VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, 
OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c),
@@ -44,9 +44,9 @@ struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = {
VOLT_DATA_DEFINE(0, 0, 0, 0),
 };
 
-#define OMAP4430_VDD_IVA_OPP50_UV  93
-#define OMAP4430_VDD_IVA_OPP100_UV 110
-#define OMAP4430_VDD_IVA_OPPTURBO_UV   126
+#define OMAP4430_VDD_IVA_OPP50_UV  1013000
+#define OMAP4430_VDD_IVA_OPP100_UV 1188000
+#define OMAP4430_VDD_IVA_OPPTURBO_UV   130
 
 struct omap_volt_data omap44xx_vdd_iva_volt_data[] = {
VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, 
OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c),
-- 
1.7.0.4

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


[PATCH V2 1/3] OMAP4: Enable 800 MHz and 1 GHz MPU-OPP

2011-03-05 Thread Shweta Gulati
Almost all OMAP4 boards support OPP 800 MHz and OPP 1 GHz.
Enable them in OPP Table. For small minority of boards which use
OMAP4430-800 MHz device OPP 1GHz is not supported,
OPP 1GHz should be disabled from board file.

Signed-off-by: Shweta Gulati 
Cc: linux-arm-ker...@lists.infradead.org 
---
 arch/arm/mach-omap2/opp4xxx_data.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap2/opp4xxx_data.c 
b/arch/arm/mach-omap2/opp4xxx_data.c
index 57f1498..93b9744 100644
--- a/arch/arm/mach-omap2/opp4xxx_data.c
+++ b/arch/arm/mach-omap2/opp4xxx_data.c
@@ -71,9 +71,9 @@ static struct omap_opp_def __initdata omap44xx_opp_def_list[] 
= {
/* MPU OPP2 - OPP100 */
OPP_INITIALIZER("mpu", true, 6, OMAP4430_VDD_MPU_OPP100_UV),
/* MPU OPP3 - OPP-Turbo */
-   OPP_INITIALIZER("mpu", false, 8, OMAP4430_VDD_MPU_OPPTURBO_UV),
+   OPP_INITIALIZER("mpu", true, 8, OMAP4430_VDD_MPU_OPPTURBO_UV),
/* MPU OPP4 - OPP-SB */
-   OPP_INITIALIZER("mpu", false, 100800, OMAP4430_VDD_MPU_OPPNITRO_UV),
+   OPP_INITIALIZER("mpu", true, 100800, OMAP4430_VDD_MPU_OPPNITRO_UV),
/* L3 OPP1 - OPP50 */
OPP_INITIALIZER("l3_main_1", true, 1, 
OMAP4430_VDD_CORE_OPP50_UV),
/* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */
-- 
1.7.0.4

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


[PATCH V2 0/3]: OMAP4: Update OPP Table and Voltage Rail Values

2011-03-05 Thread Shweta Gulati
The Series Updates OPP Table for MPU, add OPP enteries
for IVA and update Voltage Rail values for MPU/IVA.

It is based on the Patch which replaces
Voltage values with Macros, Submitted by 
Nishanth Menon 
https://patchwork.kernel.org/patch/607541/

Branch: pm-core

Tested on OMAP4430 SDP.

V2:
Rebased on pm-core and incorporated
comments from Nishanth Menon. 

Shweta Gulati (3):
  OMAP4: Enable 800 MHz and 1 GHz OPP for OMAP4.
  OMAP4: Update Voltage Rail Values for MPU/IVA
  OMAP4: Add IVA OPP enteries.

 arch/arm/mach-omap2/opp4xxx_data.c |   26 --
 1 files changed, 16 insertions(+), 10 deletions(-)

--
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 v2 1/2] OMAP: DSS2: Add support for LG Philips LB035Q02 panel

2011-03-05 Thread Tomi Valkeinen
Hi,

On Fri, 2011-03-04 at 14:52 -0600, Steve Sakoman wrote:
> This patch adds support for the Gumstix Palo35 expansion board
> which utilizes the 320 x 240 pixel LG.Philips LB035Q02 LCD Panel
> 
> Signed-off-by: Steve Sakoman 
> ---
>  drivers/video/omap2/displays/Kconfig   |6 +
>  drivers/video/omap2/displays/Makefile  |1 +
>  .../omap2/displays/panel-lgphilips-lb035q02.c  |  278 
> 
>  3 files changed, 285 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/video/omap2/displays/panel-lgphilips-lb035q02.c

This doesn't compile.

 Tomi


--
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: pm-core: recursive dependency on config

2011-03-05 Thread Santosh Shilimkar
+ Russell,

> -Original Message-
> From: linux-omap-ow...@vger.kernel.org [mailto:linux-omap-
> ow...@vger.kernel.org] On Behalf Of Menon, Nishanth
> Sent: Saturday, March 05, 2011 1:51 PM
> To: linux-omap
> Subject: pm-core: recursive dependency on config
>
> Folks,
> Dumb question:
> Some one seen this one? is there a patch in the pipe for the fix?
>
> scripts/kconfig/conf --silentoldconfig Kconfig
> arch/arm/Kconfig:1277:error: recursive dependency detected!
> arch/arm/Kconfig:1277:symbol SMP depends on CPU_V6K
> arch/arm/mm/Kconfig:407:  symbol CPU_V6K depends on SMP
>
I saw this one too. This is because of resent changes to
ensure that CPU_32v6K is always enabled with SMP builds.

This is tricky dependency. May be RMK has better way to deal
with this.

Two relevant commit on this are '85a11f52' and  '15490ef8'

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


pm-core: recursive dependency on config

2011-03-05 Thread Menon, Nishanth
Folks,
Dumb question:
Some one seen this one? is there a patch in the pipe for the fix?

scripts/kconfig/conf --silentoldconfig Kconfig
arch/arm/Kconfig:1277:error: recursive dependency detected!
arch/arm/Kconfig:1277:  symbol SMP depends on CPU_V6K
arch/arm/mm/Kconfig:407:symbol CPU_V6K depends on SMP

Regards,
Nishanth Menon
--
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