ARM: OMAP3+: smartreflex: add class support
Subsystems (3)
cover ARM: OMAP3+: smartreflex: add class support
From: Jean Pihet <[email protected]>
Add the class support so that various classes of operation can be implemented (class 1p5 etc.).
Based on linux-omap's master branch (3.3.0-rc6), commit 85244e0edd240da2004bb2ab7cbcbc67a336f20d
Nishanth Menon (6):
ARM: OMAP3+: SmartReflex: introduce class init, deinit and priv data
ARM: OMAP3+: SmartReflex: introduce notifiers flags
ARM: OMAP3+: SmartReflex: introduce notifier_control
ARM: OMAP3+: SmartReflex: disable spamming interrupts
ARM: OMAP3+: SmartReflex: introduce class private data per voltage
domain
ARM: OMAP3+: SmartReflex Class3: restrict CPU to run on
arch/arm/mach-omap2/smartreflex-class3.c | 15 ++- arch/arm/mach-omap2/smartreflex.c | 193 ++++++++++++++++++++++++++++-- arch/arm/mach-omap2/smartreflex.h | 30 ++++- 3 files changed, 222 insertions(+), 16 deletions(-)
Signature · 1 line
1.7.5.4
PATCH 1/6 ARM: OMAP3+: SmartReflex: introduce class init, deinit and priv data
From: Nishanth Menon <[email protected]>
Certain class drivers such as class 1.5 drivers, will need specific notification that they have to be inited up or deinited 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' init 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' deinit is called, signaling the end of usage for that domain.
--- arch/arm/mach-omap2/smartreflex.c | 15 +++++++++++++++ arch/arm/mach-omap2/smartreflex.h | 6 ++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/smartreflex.c +15 -0
@@ -226,6 +226,13 @@ static void sr_start_vddautocomp(struct omap_sr *sr)return ; } +if (sr_class->init && + sr_class->init (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; }
@@ -241,6 +248,14 @@ static void sr_stop_vddautocomp(struct omap_sr *sr)if (sr->autocomp_active) { sr_class->disable (sr->voltdm,1 ); +if (sr_class->deinit && + sr_class->deinit (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; } }
arch/arm/mach-omap2/smartreflex.h +6 -0
@@ -177,6 +177,8 @@ struct omap_smartreflex_dev_attr {* * @enable: API to enable a particular class smaartreflex. * @disable: API to disable a particular class smartreflex. +* @init: API to do class specific initialization (optional) +* @deinit: 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.
@@ -184,14 +186,18 @@ struct omap_smartreflex_dev_attr {* @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 (*init)(struct voltagedomain *voltdm,void *class_priv_data); +int (*deinit)(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; };/**
Signature · 1 line
1.7.5.4
PATCH 2/6 ARM: OMAP3+: SmartReflex: introduce notifiers flags
In reply to jean.pihet at newoldbits.comFrom: Nishanth Menon <[email protected]>
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 if we get a match with the notifier flags that the class driver requested.
--- arch/arm/mach-omap2/smartreflex.c | 79 ++++++++++++++++++++++++++++++++++++- arch/arm/mach-omap2/smartreflex.h | 6 +++ 2 files changed, 83 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/smartreflex.c +77 -2
@@ -121,25 +121,100 @@ 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 = data;u32 status =0 ; +u32 value =0 ;switch (sr_info->ip_type) {case 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);break ;case SR_TYPE_V2 : + value =notifier_to_irqen_v2 (sr_class->notify_flags);/* Read the status bits */ 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);break ;default : dev_err(&sr_info->pdev->dev, "UNKNOWN IP type %d\n",
@@ -148,7 +223,7 @@ static irqreturn_t sr_interrupt(int irq, void *data) }if (sr_class->notify) - sr_class->notify (sr_info->voltdm, status); + sr_class->notify (sr_info->voltdm, value);return IRQ_HANDLED ; }
arch/arm/mach-omap2/smartreflex.h +6 -0
@@ -142,6 +142,12 @@#define OMAP3430_SR_ERRWEIGHT 0x04#define OMAP3430_SR_ERRMAXLIMIT 0x02 +/* Smart reflex notifiers for class drivers to use */ +#define SR_NOTIFY_MCUDISACK BIT(3) +#define SR_NOTIFY_MCUBOUND BIT(2) +#define SR_NOTIFY_MCUVALID BIT(1) +#define SR_NOTIFY_MCUACCUM BIT(0) +/** * struct omap_sr_pmic_data - Strucutre to be populated by pmic code to pass * pmic specific info to smartreflex driver
Signature · 1 line
1.7.5.4
PATCH 3/6 ARM: OMAP3+: SmartReflex: introduce notifier_control
In reply to jean.pihet at newoldbits.comFrom: Nishanth Menon <[email protected]>
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.
We also ensure that disable/enable or irq is always guarenteed to be paired. The need to do this is because of the mixture of interrupt based and polling based operations that is implemented as the most optimal strategy for various SmartReflex AVS class
Introduce an SmartReflex driver API for doing the same. This is useful for SmartReflex AVS class 1.5 or 2 drivers.
--- arch/arm/mach-omap2/smartreflex.c | 65 +++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/smartreflex.h | 6 +++ 2 files changed, 71 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/smartreflex.c +65 -0
@@ -45,6 +45,7 @@ struct omap_sr {int srid;int ip_type;int nvalue_count; +bool irq_enabled;bool autocomp_active;u32 clk_length;u32 err_weight;
@@ -799,6 +800,70 @@ 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 (sr)) { +pr_warning ("%s: sr corresponding to domain not found\n" , + __func__); +return PTR_ERR (sr); + } +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) +sr_write_reg (sr,IRQSTATUS , value); + +if (enable != sr->irq_enabled) { +if (enable) +enable_irq (sr->irq); +else +disable_irq (sr->irq); + sr->irq_enabled = enable; + } + +return 0 ; +} + +/** * sr_register_class() - API to register a smartreflex class parameters. * @class_data: The structure containing various sr class specific data. *
arch/arm/mach-omap2/smartreflex.h +6 -0
@@ -251,6 +251,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_disable_errgen (struct voltagedomain *voltdm);int sr_configure_minmax (struct voltagedomain *voltdm);
@@ -260,6 +261,11 @@ 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(
Signature · 1 line
1.7.5.4
PATCH 3/6 ARM: OMAP3+: SmartReflex: introduce notifier_control
Quoted 6 lines · On Tue, Mar 13, 2012 at 05:26, <[email protected]> wrote:
arch/arm/mach-omap2/smartreflex.c +0
-0
...
Quoted 11 lines
+ ? ? ? switch (
sr->ip_type) {
+ ? ? ? caseSR_TYPE_V1:
+ ? ? ? ? ? ? ? value =notifier_to_irqen_v1(sr_class->notify_flags);
+ ? ? ? ? ? ? ? sr_modify_reg(sr,ERRCONFIG_V1, value,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (enable) ? value : 0);
+ ? ? ? ? ? ? ? break;
+ ? ? ? caseSR_TYPE_V2:
+ ? ? ? ? ? ? ? value =notifier_to_irqen_v2(sr_class->notify_flags);
+ ? ? ? ? ? ? ? sr_write_reg(sr, (enable) ?IRQENABLE_SET:IRQENABLE_CLR,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value);
+ ? ? ? ? ? ? ? break;
Quoted 8 lines
+ ? ? ? default:
+ ? ? ? ? ? ? ? ?dev_warn(&sr->pdev->dev, "%s: unknown type of sr??\n",
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__);
+ ? ? ? ? ? ? ? return-EINVAL;
+ ? ? ? }
+
+ ? ? ? if (!enable)
+ ? ? ? ? ? ? ?sr_write_reg(sr, IRQSTATUS, value);
can you move this to before we disable the interrupt? it took a while, but we caught a bug recently when we disable IRQ and then attempt to clear the status[1]
Regards,
Nishanth Menon
[1] http://review.omapzoom.org/#/c/20231/
PATCH 4/6 ARM: OMAP3+: SmartReflex: disable spamming interrupts
In reply to jean.pihet at newoldbits.comFrom: Nishanth Menon <[email protected]>
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.
--- arch/arm/mach-omap2/smartreflex.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/smartreflex.c +19 -2
@@ -223,8 +223,25 @@ static irqreturn_t sr_interrupt(int irq, void *data)return IRQ_NONE ; } -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); + sr_info->irq_enabled = false; + }else { +/* If the caller reports inability to handle, disable as well */ +if (sr_class->notify && + sr_class->notify (sr_info->voltdm, value)) { +dev_err (&sr_info->pdev->dev,"%s: Callback cant handle!" +"status=0x%08x. Disabling to prevent spam!!\n" , + __func__, status); +disable_irq_nosync (sr_info->irq); + sr_info->irq_enabled = false; + } + + }return IRQ_HANDLED ; }
Signature · 1 line
1.7.5.4
PATCH 5/6 ARM: OMAP3+: SmartReflex: introduce class private data per voltage domain
In reply to jean.pihet at newoldbits.comFrom: Nishanth Menon <[email protected]>
Introduce private data for class drivers to operate on per voltage domain. This removes the necessity for drivers such as SmartReflex AVS Class 1.5 drivers from maintaining a special lookup table which does not scale when number of voltage domains change depending on silicon. It also makes the life of such class drivers to be faster without having to do a double lookup to get to their voltage domain specific private data
--- arch/arm/mach-omap2/smartreflex-class3.c | 10 +++++++--- arch/arm/mach-omap2/smartreflex.c | 23 +++++++++++++---------- arch/arm/mach-omap2/smartreflex.h | 16 ++++++++++------ 3 files changed, 30 insertions(+), 19 deletions(-)
arch/arm/mach-omap2/smartreflex-class3.c +7 -3
@@ -13,7 +13,8 @@#include "smartreflex.h" -static int sr_class3_enable (struct voltagedomain *voltdm) +static int sr_class3_enable (struct voltagedomain *voltdm, +void *voltdm_cdata) {unsigned long volt =voltdm_get_voltage (voltdm);
@@ -27,7 +28,9 @@ static int sr_class3_enable(struct voltagedomain *voltdm)return sr_enable (voltdm, volt); } -static int sr_class3_disable (struct voltagedomain *voltdm,int is_volt_reset) +static int sr_class3_disable (struct voltagedomain *voltdm, +void *voltdm_cdata, +int is_volt_reset) {sr_disable_errgen (voltdm);omap_vp_disable (voltdm);
@@ -38,7 +41,8 @@ static int sr_class3_disable(struct voltagedomain *voltdm, int is_volt_reset)return 0 ; } -static int sr_class3_configure (struct voltagedomain *voltdm) +static int sr_class3_configure (struct voltagedomain *voltdm, +void *voltdm_cdata) {return sr_configure_errgen (voltdm); }
arch/arm/mach-omap2/smartreflex.c +13 -10
@@ -40,6 +40,8 @@ struct omap_sr {struct platform_device *pdev;struct omap_sr_nvalue_table *nvalue_table;struct voltagedomain *voltdm; +/* Managed by class driver as needed */ +void *voltdm_cdata;struct dentry *dbg_dir;unsigned int irq;int srid;
@@ -232,8 +234,8 @@ static irqreturn_t sr_interrupt(int irq, void *data) sr_info->irq_enabled = false; }else {/* If the caller reports inability to handle, disable as well */ -if (sr_class->notify && - sr_class->notify (sr_info->voltdm, value)) { +if (sr_class->notify && sr_class->notify (sr_info->voltdm, + sr_info->voltdm_cdata, value)) {dev_err (&sr_info->pdev->dev,"%s: Callback cant handle!" "status=0x%08x. Disabling to prevent spam!!\n" , __func__, status);
@@ -320,13 +322,14 @@ static void sr_start_vddautocomp(struct omap_sr *sr) }if (sr_class->init && - sr_class->init (sr->voltdm, sr_class->class_priv_data)) { + sr_class->init (sr->voltdm, &sr->voltdm_cdata, + sr_class->class_priv_data)) {dev_err (&sr->pdev->dev,"%s: SRClass initialization failed\n" , __func__);return ; } -if (!sr_class->enable (sr->voltdm)) +if (!sr_class->enable (sr->voltdm, sr->voltdm_cdata)) sr->autocomp_active = true; }
@@ -340,9 +343,9 @@ static void sr_stop_vddautocomp(struct omap_sr *sr) }if (sr->autocomp_active) { - sr_class->disable (sr->voltdm,1 ); + sr_class->disable (sr->voltdm, sr->voltdm_cdata,1 );if (sr_class->deinit && - sr_class->deinit (sr->voltdm, + sr_class->deinit (sr->voltdm, &sr->voltdm_cdata, sr_class->class_priv_data)) { dev_err(&sr->pdev->dev, "%s: SR[%d]Class deinitialization failed\n",
@@ -763,7 +766,7 @@ int sr_enable(struct voltagedomain *voltdm, unsigned long volt)return 0 ;/* Configure SR */ - ret = sr_class->configure (voltdm); + ret = sr_class->configure (voltdm, sr->voltdm_cdata);if (ret)return ret;
@@ -945,7 +948,7 @@ void omap_sr_enable(struct voltagedomain *voltdm)return ; } - sr_class->enable (voltdm); + sr_class->enable (voltdm, sr->voltdm_cdata); }/**
@@ -978,7 +981,7 @@ void omap_sr_disable(struct voltagedomain *voltdm)return ; } - sr_class->disable (voltdm,0 ); + sr_class->disable (voltdm, sr->voltdm_cdata,0 ); }/**
@@ -1011,7 +1014,7 @@ void omap_sr_disable_reset_volt(struct voltagedomain *voltdm)return ; } - sr_class->disable (voltdm,1 ); + sr_class->disable (voltdm, sr->voltdm_cdata,1 ); }/**
arch/arm/mach-omap2/smartreflex.h +10 -6
@@ -195,12 +195,16 @@ struct omap_smartreflex_dev_attr {* @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 (*init)(struct voltagedomain *voltdm,void *class_priv_data); -int (*deinit)(struct voltagedomain *voltdm,void *class_priv_data); -int (*configure)(struct voltagedomain *voltdm); -int (*notify)(struct voltagedomain *voltdm,u32 status); +int (*enable)(struct voltagedomain *voltdm,void *voltdm_cdata); +int (*disable)(struct voltagedomain *voltdm,void *voltdm_cdata, +int is_volt_reset); +int (*init)(struct voltagedomain *voltdm,void **voltdm_cdata, +void *class_priv_data); +int (*deinit)(struct voltagedomain *voltdm,void **voltdm_cdata, +void *class_priv_data); +int (*configure)(struct voltagedomain *voltdm,void *voltdm_cdata); +int (*notify)(struct voltagedomain *voltdm,void *voltdm_cdata, +u32 status);u8 notify_flags;u8 class_type;void *class_priv_data;
Signature · 1 line
1.7.5.4
PATCH 6/6 ARM: OMAP3+: SmartReflex Class3: restrict CPU to run on
In reply to jean.pihet at newoldbits.comFrom: Nishanth Menon <[email protected]>
Use SmartReflex AVS Class3 initialization only for OMAP343x family of processors.
--- arch/arm/mach-omap2/smartreflex-class3.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/smartreflex-class3.c +5 -0
@@ -11,6 +11,7 @@* published by the Free Software Foundation. */ +#include <plat/cpu.h> #include "smartreflex.h" static int sr_class3_enable(struct voltagedomain *voltdm,
@@ -58,6 +59,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); }
Signature · 1 line
1.7.5.4
PATCH 6/6 ARM: OMAP3+: SmartReflex Class3: restrict CPU to run on
Quoted 36 lines
-----Original Message-----
From: linux-omap-owner at vger.kernel.org [mailto:linux-omap- owner at vger.kernel.org] On Behalf Of jean.pihet at newoldbits.com
Sent: Tuesday, March 13, 2012 3:56 PM
To: linux-omap at vger.kernel.org; linux-arm-
kernel at lists.infradead.org; Kevin Hilman
Cc: Nishanth Menon; Jean Pihet
Subject: [PATCH 6/6] ARM: OMAP3+: SmartReflex Class3: restrict CPU to run onFrom: Nishanth Menon <[email protected]>
Use SmartReflex AVS Class3 initialization only for OMAP343x family of
processors.Signed-off-by Nishanth Menon <[email protected]>Signed-off-by Jean Pihet <[email protected]>--- arch/arm/mach-omap2/smartreflex-class3.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)arch/arm/mach-omap2/smartreflex-class3.c +1
-0@@ -11,6 +11,7 @@* published by the Free Software Foundation. */ +#include <plat/cpu.h> #include "smartreflex.h" static int sr_class3_enable(struct voltagedomain *voltdm,
arch/arm/mach-omap2/smartreflex-class3.c static struct omap_sr_class_data class3_data = { · line 64
Quoted 6 lines
arch/arm/mach-omap2/smartreflex-class3.c +3
-0@@ -58,6 +59,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 ;
Wouldn't this break SR on OMAP3630 and OMAP4? Shouldn't this be done once you have SR1.5 support in mainline?
Vishwa
Quoted 12 lines
arch/arm/mach-omap2/smartreflex-class3.c +1
-1+pr_info ("SmartReflex Class3 initialized\n" );return sr_register_class (&class3_data); } --1.7.5.4
--
To unsubscribe from this list: send the line "unsubscribe linux- omap" in
the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Tony Lindgren
maintainercover ARM: OMAP3+: smartreflex: add class support
In reply to jean.pihet at newoldbits.comQuoted 7 lines · jean.pihet at newoldbits.com
From: Jean Pihet <[email protected]>
Add the class support so that various classes of operation can be implemented (class 1p5 etc.).
Based on linux-omap's master branch (3.3.0-rc6), commit
85244e0edd240da2004bb2ab7cbcbc67a336f20d
We need to move smartreflex into drivers before adding anything new to it.
Tony