* [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 8:58 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 02/19] OMAP2+: voltage: move PRCM mod offets into VC/VP structures Kevin Hilman
` (19 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
The voltage domain pointer currently in struct omap_hwmod is not used
and does not belong here. Instead, voltage domains will be associated
with powerdomains in forthcoming patches.
Acked-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 1adea9c..a5fa7c1 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -520,7 +520,6 @@ struct omap_hwmod {
struct clk *_clk;
struct omap_hwmod_opt_clk *opt_clks;
char *vdd_name;
- struct voltagedomain *voltdm;
struct omap_hwmod_ocp_if **masters; /* connect to *_IA */
struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */
void *dev_attr;
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer
2011-03-24 0:00 ` [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer Kevin Hilman
@ 2011-03-25 8:58 ` Jean Pihet
2011-03-25 14:24 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 8:58 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> The voltage domain pointer currently in struct omap_hwmod is not used
> and does not belong here. Instead, voltage domains will be associated
Extra space
> with powerdomains in forthcoming patches.
>
> Acked-by: Paul Walmsley <paul@pwsan.com>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 -
> 1 files changed, 0 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> index 1adea9c..a5fa7c1 100644
> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> @@ -520,7 +520,6 @@ struct omap_hwmod {
> struct clk *_clk;
> struct omap_hwmod_opt_clk *opt_clks;
> char *vdd_name;
> - struct voltagedomain *voltdm;
> struct omap_hwmod_ocp_if **masters; /* connect to *_IA */
> struct omap_hwmod_ocp_if **slaves; /* connect to *_TA */
> void *dev_attr;
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer
2011-03-25 8:58 ` Jean Pihet
@ 2011-03-25 14:24 ` Kevin Hilman
0 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 14:24 UTC (permalink / raw)
To: Jean Pihet; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Jean Pihet <jean.pihet@newoldbits.com> writes:
> On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
>> The voltage domain pointer currently in struct omap_hwmod is not used
>> and does not belong here. Instead, voltage domains will be associated
>
> Extra space
>
heh. My english teachers always taught me to put two spaces after a
period. ;)
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 02/19] OMAP2+: voltage: move PRCM mod offets into VC/VP structures
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 03/19] OMAP2+: voltage: move prm_irqst_reg from VP into voltage domain Kevin Hilman
` (18 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Eliminate need for global variables for the various PRM module offsets by
making them part of the VP/VC common structures
Eventually, these will likely be moved again, or more likely removed
when VP/VC code is isolated, but for now just getting rid of them as
global variabes so that the voltage domain initialization can be
cleaned up.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/vc.h | 2 +
arch/arm/mach-omap2/vc3xxx_data.c | 1 +
arch/arm/mach-omap2/vc44xx_data.c | 1 +
arch/arm/mach-omap2/voltage.c | 109 ++++++++++++-------------
arch/arm/mach-omap2/voltage.h | 6 +-
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 8 +-
arch/arm/mach-omap2/voltagedomains44xx_data.c | 9 +-
arch/arm/mach-omap2/vp.h | 2 +
arch/arm/mach-omap2/vp3xxx_data.c | 1 +
arch/arm/mach-omap2/vp44xx_data.c | 1 +
10 files changed, 70 insertions(+), 70 deletions(-)
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index e776777..f7338af 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -23,6 +23,7 @@
* struct omap_vc_common_data - per-VC register/bitfield data
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
+ * @prm_mod: PRM module id used for PRM register access
* @smps_sa_reg: Offset of PRM_VC_SMPS_SA reg from PRM start
* @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start
* @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
@@ -40,6 +41,7 @@
struct omap_vc_common_data {
u32 cmd_on_mask;
u32 valid;
+ s16 prm_mod;
u8 smps_sa_reg;
u8 smps_volra_reg;
u8 bypass_val_reg;
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index f37dc4b..55caccb 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -30,6 +30,7 @@
* XXX This stuff presumably belongs in the vc3xxx.c or vc.c file.
*/
static struct omap_vc_common_data omap3_vc_common = {
+ .prm_mod = OMAP3430_GR_MOD,
.smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index a98da8d..b62678e 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -31,6 +31,7 @@
* XXX This stuff presumably belongs in the vc3xxx.c or vc.c file.
*/
static const struct omap_vc_common_data omap4_vc_common = {
+ .prm_mod = OMAP4430_PRM_DEVICE_INST,
.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index c13b308..90191c4 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -50,10 +50,6 @@ static struct omap_vdd_info **vdd_info;
*/
static int nr_scalable_vdd;
-/* XXX document */
-static s16 prm_mod_offs;
-static s16 prm_irqst_ocp_mod_offs;
-
static struct dentry *voltage_dir;
/* Init function pointers */
@@ -147,7 +143,7 @@ static int vp_volt_debug_get(void *data, u64 *val)
return -EINVAL;
}
- vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage);
+ vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
if (!vdd->pmic_info->vsel_to_uv) {
pr_warning("PMIC function to convert vsel to voltage"
@@ -197,19 +193,19 @@ static void vp_latch_vsel(struct omap_vdd_info *vdd)
vsel = vdd->pmic_info->uv_to_vsel(uvdc);
- vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig);
+ vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvoltage_mask |
vdd->vp_data->vp_common->vpconfig_initvdd);
vpconfig |= vsel << vdd->vp_data->vp_common->vpconfig_initvoltage_shift;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Trigger initVDD value copy to voltage processor */
vdd->write_reg((vpconfig | vdd->vp_data->vp_common->vpconfig_initvdd),
- prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Clear initVDD copy trigger bit */
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
}
/* Generic voltage init functions */
@@ -227,19 +223,19 @@ static void __init vp_init(struct omap_vdd_info *vdd)
(vdd->vp_rt_data.vpconfig_errorgain <<
vdd->vp_data->vp_common->vpconfig_errorgain_shift) |
vdd->vp_data->vp_common->vpconfig_timeouten;
- vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vp_val = ((vdd->vp_rt_data.vstepmin_smpswaittimemin <<
vdd->vp_data->vp_common->vstepmin_smpswaittimemin_shift) |
(vdd->vp_rt_data.vstepmin_stepmin <<
vdd->vp_data->vp_common->vstepmin_stepmin_shift));
- vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vstepmin);
+ vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstepmin);
vp_val = ((vdd->vp_rt_data.vstepmax_smpswaittimemax <<
vdd->vp_data->vp_common->vstepmax_smpswaittimemax_shift) |
(vdd->vp_rt_data.vstepmax_stepmax <<
vdd->vp_data->vp_common->vstepmax_stepmax_shift));
- vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vstepmax);
+ vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstepmax);
vp_val = ((vdd->vp_rt_data.vlimitto_vddmax <<
vdd->vp_data->vp_common->vlimitto_vddmax_shift) |
@@ -247,7 +243,7 @@ static void __init vp_init(struct omap_vdd_info *vdd)
vdd->vp_data->vp_common->vlimitto_vddmin_shift) |
(vdd->vp_rt_data.vlimitto_timeout <<
vdd->vp_data->vp_common->vlimitto_timeout_shift));
- vdd->write_reg(vp_val, prm_mod_offs, vdd->vp_data->vlimitto);
+ vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vlimitto);
}
static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
@@ -336,23 +332,23 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd,
volt_data = NULL;
*target_vsel = vdd->pmic_info->uv_to_vsel(target_volt);
- *current_vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage);
+ *current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
/* Setting the ON voltage to the new target voltage */
- vc_cmdval = vdd->read_reg(prm_mod_offs, vdd->vc_data->cmdval_reg);
+ vc_cmdval = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
vc_cmdval &= ~vc_common->cmd_on_mask;
vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
- vdd->write_reg(vc_cmdval, prm_mod_offs, vdd->vc_data->cmdval_reg);
+ vdd->write_reg(vc_cmdval, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
/* Setting vp errorgain based on the voltage */
if (volt_data) {
- vp_errgain_val = vdd->read_reg(prm_mod_offs,
+ vp_errgain_val = vdd->read_reg(vdd->vp_data->vp_common->prm_mod,
vdd->vp_data->vpconfig);
vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain;
vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask;
vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain <<
vp_common->vpconfig_errorgain_shift;
- vdd->write_reg(vp_errgain_val, prm_mod_offs,
+ vdd->write_reg(vp_errgain_val, vdd->vp_data->vp_common->prm_mod,
vdd->vp_data->vpconfig);
}
@@ -394,11 +390,11 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
(vdd->pmic_info->i2c_slave_addr <<
vdd->vc_data->vc_common->slaveaddr_shift);
- vdd->write_reg(vc_bypass_value, prm_mod_offs, vc_bypass_val_reg);
- vdd->write_reg(vc_bypass_value | vc_valid, prm_mod_offs,
+ vdd->write_reg(vc_bypass_value, vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
+ vdd->write_reg(vc_bypass_value | vc_valid, vdd->vc_data->vc_common->prm_mod,
vc_bypass_val_reg);
- vc_bypass_value = vdd->read_reg(prm_mod_offs, vc_bypass_val_reg);
+ vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
/*
* Loop till the bypass command is acknowledged from the SMPS.
* NOTE: This is legacy code. The loop count and retry count needs
@@ -417,7 +413,7 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
loop_cnt = 0;
udelay(10);
}
- vc_bypass_value = vdd->read_reg(prm_mod_offs,
+ vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
vc_bypass_val_reg);
}
@@ -445,8 +441,8 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
*/
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->prm_irqst_mod, prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status))
break;
udelay(1);
@@ -458,28 +454,28 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
}
/* Configure for VP-Force Update */
- vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig);
+ vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvdd |
vdd->vp_data->vp_common->vpconfig_forceupdate |
vdd->vp_data->vp_common->vpconfig_initvoltage_mask);
vpconfig |= ((target_vsel <<
vdd->vp_data->vp_common->vpconfig_initvoltage_shift));
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Trigger initVDD value copy to voltage processor */
vpconfig |= vdd->vp_data->vp_common->vpconfig_initvdd;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Force update of voltage */
vpconfig |= vdd->vp_data->vp_common->vpconfig_forceupdate;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/*
* Wait for TransactionDone. Typical latency is <200us.
* Depends on SMPSWAITTIMEMIN/MAX and voltage change
*/
timeout = 0;
- omap_test_timeout((vdd->read_reg(prm_irqst_ocp_mod_offs, prm_irqst_reg) &
+ omap_test_timeout((vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status),
VP_TRANXDONE_TIMEOUT, timeout);
if (timeout >= VP_TRANXDONE_TIMEOUT)
@@ -496,8 +492,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->prm_irqst_mod, prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status))
break;
udelay(1);
@@ -508,13 +504,13 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
"to clear the TRANXDONE status\n",
__func__, vdd->voltdm.name);
- vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig);
+ vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Clear initVDD copy trigger bit */
vpconfig &= ~vdd->vp_data->vp_common->vpconfig_initvdd;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Clear force bit */
vpconfig &= ~vdd->vp_data->vp_common->vpconfig_forceupdate;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
return 0;
}
@@ -525,10 +521,10 @@ static void __init omap3_vfsm_init(struct omap_vdd_info *vdd)
* Voltage Manager FSM parameters init
* XXX This data should be passed in from the board file
*/
- vdd->write_reg(OMAP3_CLKSETUP, prm_mod_offs, OMAP3_PRM_CLKSETUP_OFFSET);
- vdd->write_reg(OMAP3_VOLTOFFSET, prm_mod_offs,
+ vdd->write_reg(OMAP3_CLKSETUP, vdd->vc_data->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
+ vdd->write_reg(OMAP3_VOLTOFFSET, vdd->vc_data->vc_common->prm_mod,
OMAP3_PRM_VOLTOFFSET_OFFSET);
- vdd->write_reg(OMAP3_VOLTSETUP2, prm_mod_offs,
+ vdd->write_reg(OMAP3_VOLTSETUP2, vdd->vc_data->vc_common->prm_mod,
OMAP3_PRM_VOLTSETUP2_OFFSET);
}
@@ -550,15 +546,15 @@ static void __init omap3_vc_init(struct omap_vdd_info *vdd)
(onlp_vsel << vdd->vc_data->vc_common->cmd_onlp_shift) |
(ret_vsel << vdd->vc_data->vc_common->cmd_ret_shift) |
(off_vsel << vdd->vc_data->vc_common->cmd_off_shift));
- vdd->write_reg(vc_val, prm_mod_offs, vdd->vc_data->cmdval_reg);
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
/*
* Generic VC parameters init
* XXX This data should be abstracted out
*/
- vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, prm_mod_offs,
+ vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vdd->vc_data->vc_common->prm_mod,
OMAP3_PRM_VC_CH_CONF_OFFSET);
- vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, prm_mod_offs,
+ vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vdd->vc_data->vc_common->prm_mod,
OMAP3_PRM_VC_I2C_CFG_OFFSET);
omap3_vfsm_init(vdd);
@@ -585,11 +581,11 @@ static void __init omap4_vc_init(struct omap_vdd_info *vdd)
vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
- vdd->write_reg(vc_val, prm_mod_offs, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
/* XXX These are magic numbers and do not belong! */
vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
- vdd->write_reg(vc_val, prm_mod_offs, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
is_initialized = true;
}
@@ -612,27 +608,27 @@ static void __init omap_vc_init(struct omap_vdd_info *vdd)
}
/* Set up the SMPS_SA(i2c slave address in VC */
- vc_val = vdd->read_reg(prm_mod_offs,
+ vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
vdd->vc_data->vc_common->smps_sa_reg);
vc_val &= ~vdd->vc_data->smps_sa_mask;
vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_data->smps_sa_shift;
- vdd->write_reg(vc_val, prm_mod_offs,
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
vdd->vc_data->vc_common->smps_sa_reg);
/* Setup the VOLRA(pmic reg addr) in VC */
- vc_val = vdd->read_reg(prm_mod_offs,
+ vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
vdd->vc_data->vc_common->smps_volra_reg);
vc_val &= ~vdd->vc_data->smps_volra_mask;
vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_data->smps_volra_shift;
- vdd->write_reg(vc_val, prm_mod_offs,
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
vdd->vc_data->vc_common->smps_volra_reg);
/* Configure the setup times */
- vc_val = vdd->read_reg(prm_mod_offs, vdd->vfsm->voltsetup_reg);
+ vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
vc_val &= ~vdd->vfsm->voltsetup_mask;
vc_val |= vdd->pmic_info->volt_setup_time <<
vdd->vfsm->voltsetup_shift;
- vdd->write_reg(vc_val, prm_mod_offs, vdd->vfsm->voltsetup_reg);
+ vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
if (cpu_is_omap34xx())
omap3_vc_init(vdd);
@@ -713,7 +709,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm)
return 0;
}
- curr_vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage);
+ curr_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
if (!vdd->pmic_info || !vdd->pmic_info->vsel_to_uv) {
pr_warning("%s: PMIC function to convert vsel to voltage"
@@ -755,9 +751,9 @@ void omap_vp_enable(struct voltagedomain *voltdm)
vp_latch_vsel(vdd);
/* Enable VP */
- vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig);
+ vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vpconfig |= vdd->vp_data->vp_common->vpconfig_vpenable;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vdd->vp_enabled = true;
}
@@ -794,14 +790,14 @@ void omap_vp_disable(struct voltagedomain *voltdm)
}
/* Disable VP */
- vpconfig = vdd->read_reg(prm_mod_offs, vdd->vp_data->vpconfig);
+ vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
vpconfig &= ~vdd->vp_data->vp_common->vpconfig_vpenable;
- vdd->write_reg(vpconfig, prm_mod_offs, vdd->vp_data->vpconfig);
+ vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/*
* Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
*/
- omap_test_timeout((vdd->read_reg(prm_mod_offs, vdd->vp_data->vstatus)),
+ omap_test_timeout((vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstatus)),
VP_IDLE_TIMEOUT, timeout);
if (timeout >= VP_IDLE_TIMEOUT)
@@ -1094,12 +1090,9 @@ int __init omap_voltage_late_init(void)
}
/* XXX document */
-int __init omap_voltage_early_init(s16 prm_mod, s16 prm_irqst_ocp_mod,
- struct omap_vdd_info *omap_vdd_array[],
+int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
u8 omap_vdd_count)
{
- prm_mod_offs = prm_mod;
- prm_irqst_ocp_mod_offs = prm_irqst_ocp_mod;
vdd_info = omap_vdd_array;
nr_scalable_vdd = omap_vdd_count;
return 0;
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index e9f5408..ffdc55e 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -119,6 +119,7 @@ struct omap_volt_pmic_info {
* @voltdm : pointer to the voltage domain structure
* @debug_dir : debug directory for this voltage domain.
* @curr_volt : current voltage for this vdd.
+ * @prm_irqst_mod : PRM module id used for PRM IRQ status register access
* @vp_enabled : flag to keep track of whether vp is enabled or not
* @volt_scale : API to scale the voltage of the vdd.
*/
@@ -133,6 +134,8 @@ struct omap_vdd_info {
struct dentry *debug_dir;
u32 curr_volt;
bool vp_enabled;
+
+ s16 prm_irqst_mod;
u32 (*read_reg) (u16 mod, u8 offset);
void (*write_reg) (u32 val, u16 mod, u8 offset);
int (*volt_scale) (struct omap_vdd_info *vdd,
@@ -151,8 +154,7 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
unsigned long volt);
unsigned long omap_voltage_get_nom_volt(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[],
+int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
u8 omap_vdd_count);
#ifdef CONFIG_PM
int omap_voltage_register_pmic(struct voltagedomain *voltdm,
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index def230f..0d30b7f 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -38,6 +38,7 @@ static const struct omap_vfsm_instance_data omap3_vdd1_vfsm_data = {
};
static struct omap_vdd_info omap3_vdd1_info = {
+ .prm_irqst_mod = OCP_MOD,
.vp_data = &omap3_vp1_data,
.vc_data = &omap3_vc1_data,
.vfsm = &omap3_vdd1_vfsm_data,
@@ -53,6 +54,7 @@ static const struct omap_vfsm_instance_data omap3_vdd2_vfsm_data = {
};
static struct omap_vdd_info omap3_vdd2_info = {
+ .prm_irqst_mod = OCP_MOD,
.vp_data = &omap3_vp2_data,
.vc_data = &omap3_vc2_data,
.vfsm = &omap3_vdd2_vfsm_data,
@@ -70,9 +72,6 @@ static struct omap_vdd_info *omap3_vdd_info[] = {
/* OMAP3 specific voltage init functions */
static int __init omap3xxx_voltage_early_init(void)
{
- s16 prm_mod = OMAP3430_GR_MOD;
- s16 prm_irqst_ocp_mod = OCP_MOD;
-
if (!cpu_is_omap34xx())
return 0;
@@ -88,8 +87,7 @@ static int __init omap3xxx_voltage_early_init(void)
omap3_vdd2_info.volt_data = omap34xx_vddcore_volt_data;
}
- return omap_voltage_early_init(prm_mod, prm_irqst_ocp_mod,
- omap3_vdd_info,
+ return omap_voltage_early_init(omap3_vdd_info,
ARRAY_SIZE(omap3_vdd_info));
};
core_initcall(omap3xxx_voltage_early_init);
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c
index cb64996..1c2d7d7 100644
--- a/arch/arm/mach-omap2/voltagedomains44xx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c
@@ -37,6 +37,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_mpu_vfsm_data = {
};
static struct omap_vdd_info omap4_vdd_mpu_info = {
+ .prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.vp_data = &omap4_vp_mpu_data,
.vc_data = &omap4_vc_mpu_data,
.vfsm = &omap4_vdd_mpu_vfsm_data,
@@ -50,6 +51,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_iva_vfsm_data = {
};
static struct omap_vdd_info omap4_vdd_iva_info = {
+ .prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.vp_data = &omap4_vp_iva_data,
.vc_data = &omap4_vc_iva_data,
.vfsm = &omap4_vdd_iva_vfsm_data,
@@ -63,6 +65,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_core_vfsm_data = {
};
static struct omap_vdd_info omap4_vdd_core_info = {
+ .prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.vp_data = &omap4_vp_core_data,
.vc_data = &omap4_vc_core_data,
.vfsm = &omap4_vdd_core_vfsm_data,
@@ -81,9 +84,6 @@ static struct omap_vdd_info *omap4_vdd_info[] = {
/* OMAP4 specific voltage init functions */
static int __init omap44xx_voltage_early_init(void)
{
- s16 prm_mod = OMAP4430_PRM_DEVICE_INST;
- s16 prm_irqst_ocp_mod = OMAP4430_PRM_OCP_SOCKET_INST;
-
if (!cpu_is_omap44xx())
return 0;
@@ -95,8 +95,7 @@ static int __init omap44xx_voltage_early_init(void)
omap4_vdd_iva_info.volt_data = omap44xx_vdd_iva_volt_data;
omap4_vdd_core_info.volt_data = omap44xx_vdd_core_volt_data;
- return omap_voltage_early_init(prm_mod, prm_irqst_ocp_mod,
- omap4_vdd_info,
+ return omap_voltage_early_init(omap4_vdd_info,
ARRAY_SIZE(omap4_vdd_info));
};
core_initcall(omap44xx_voltage_early_init);
diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
index 7ce134f..d277da6 100644
--- a/arch/arm/mach-omap2/vp.h
+++ b/arch/arm/mach-omap2/vp.h
@@ -42,6 +42,7 @@
* @vpconfig_vlimitto_vddmin_shift: VDDMIN field shift in PRM_VP*_VLIMITTO reg
* @vpconfig_vlimitto_vddmax_shift: VDDMAX field shift in PRM_VP*_VLIMITTO reg
* @vpconfig_vlimitto_timeout_shift: TIMEOUT field shift in PRM_VP*_VLIMITTO reg
+ * @prm_mod: PRM module id used for PRM register access
*
* XXX It it not necessary to have both a mask and a shift for the same
* bitfield - remove one
@@ -54,6 +55,7 @@ struct omap_vp_common_data {
u32 vpconfig_initvdd;
u32 vpconfig_forceupdate;
u32 vpconfig_vpenable;
+ s16 prm_mod;
u8 vpconfig_erroroffset_shift;
u8 vpconfig_errorgain_shift;
u8 vpconfig_initvoltage_shift;
diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c
index 6452170..c9b3e64 100644
--- a/arch/arm/mach-omap2/vp3xxx_data.c
+++ b/arch/arm/mach-omap2/vp3xxx_data.c
@@ -31,6 +31,7 @@
* XXX This stuff presumably belongs in the vp3xxx.c or vp.c file.
*/
static const struct omap_vp_common_data omap3_vp_common = {
+ .prm_mod = OMAP3430_GR_MOD,
.vpconfig_erroroffset_shift = OMAP3430_ERROROFFSET_SHIFT,
.vpconfig_errorgain_mask = OMAP3430_ERRORGAIN_MASK,
.vpconfig_errorgain_shift = OMAP3430_ERRORGAIN_SHIFT,
diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c
index 65d1ad6..1a0842e 100644
--- a/arch/arm/mach-omap2/vp44xx_data.c
+++ b/arch/arm/mach-omap2/vp44xx_data.c
@@ -32,6 +32,7 @@
* XXX This stuff presumably belongs in the vp44xx.c or vp.c file.
*/
static const struct omap_vp_common_data omap4_vp_common = {
+ .prm_mod = OMAP4430_PRM_DEVICE_INST,
.vpconfig_erroroffset_shift = OMAP4430_ERROROFFSET_SHIFT,
.vpconfig_errorgain_mask = OMAP4430_ERRORGAIN_MASK,
.vpconfig_errorgain_shift = OMAP4430_ERRORGAIN_SHIFT,
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 03/19] OMAP2+: voltage: move prm_irqst_reg from VP into voltage domain
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 01/19] OMAP2+: hwmod: remove unused voltagedomain pointer Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 02/19] OMAP2+: voltage: move PRCM mod offets into VC/VP structures Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer Kevin Hilman
` (17 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
The prm_irqst_reg is not part of the VP. Move it up into the common
voltage domain struct.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/voltage.c | 15 +++++++--------
arch/arm/mach-omap2/voltage.h | 1 +
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 2 ++
arch/arm/mach-omap2/voltagedomains44xx_data.c | 3 +++
arch/arm/mach-omap2/vp.h | 3 ---
arch/arm/mach-omap2/vp3xxx_data.c | 2 --
arch/arm/mach-omap2/vp44xx_data.c | 3 ---
7 files changed, 13 insertions(+), 16 deletions(-)
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 90191c4..15a9cb8 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -426,23 +426,21 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
unsigned long target_volt)
{
u32 vpconfig;
- u8 target_vsel, current_vsel, prm_irqst_reg;
+ u8 target_vsel, current_vsel;
int ret, timeout = 0;
ret = _pre_volt_scale(vdd, target_volt, &target_vsel, ¤t_vsel);
if (ret)
return ret;
- prm_irqst_reg = vdd->vp_data->prm_irqst_data->prm_irqst_reg;
-
/*
* Clear all pending TransactionDone interrupt/status. Typical latency
* is <3us
*/
while (timeout++ < VP_TRANXDONE_TIMEOUT) {
vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
- vdd->prm_irqst_mod, prm_irqst_reg);
- if (!(vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
+ vdd->prm_irqst_mod, vdd->prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status))
break;
udelay(1);
@@ -475,7 +473,8 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
* Depends on SMPSWAITTIMEMIN/MAX and voltage change
*/
timeout = 0;
- omap_test_timeout((vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
+ omap_test_timeout((vdd->read_reg(vdd->prm_irqst_mod,
+ vdd->prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status),
VP_TRANXDONE_TIMEOUT, timeout);
if (timeout >= VP_TRANXDONE_TIMEOUT)
@@ -492,8 +491,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,
- vdd->prm_irqst_mod, prm_irqst_reg);
- if (!(vdd->read_reg(vdd->prm_irqst_mod, prm_irqst_reg) &
+ vdd->prm_irqst_mod, vdd->prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
vdd->vp_data->prm_irqst_data->tranxdone_status))
break;
udelay(1);
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index ffdc55e..db23d49 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -136,6 +136,7 @@ struct omap_vdd_info {
bool vp_enabled;
s16 prm_irqst_mod;
+ u8 prm_irqst_reg;
u32 (*read_reg) (u16 mod, u8 offset);
void (*write_reg) (u32 val, u16 mod, u8 offset);
int (*volt_scale) (struct omap_vdd_info *vdd,
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index 0d30b7f..f831f9a 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -39,6 +39,7 @@ static const struct omap_vfsm_instance_data omap3_vdd1_vfsm_data = {
static struct omap_vdd_info omap3_vdd1_info = {
.prm_irqst_mod = OCP_MOD,
+ .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.vp_data = &omap3_vp1_data,
.vc_data = &omap3_vc1_data,
.vfsm = &omap3_vdd1_vfsm_data,
@@ -55,6 +56,7 @@ static const struct omap_vfsm_instance_data omap3_vdd2_vfsm_data = {
static struct omap_vdd_info omap3_vdd2_info = {
.prm_irqst_mod = OCP_MOD,
+ .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.vp_data = &omap3_vp2_data,
.vc_data = &omap3_vc2_data,
.vfsm = &omap3_vdd2_vfsm_data,
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c
index 1c2d7d7..85da60c 100644
--- a/arch/arm/mach-omap2/voltagedomains44xx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c
@@ -38,6 +38,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_mpu_vfsm_data = {
static struct omap_vdd_info omap4_vdd_mpu_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
+ .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_mpu_data,
.vc_data = &omap4_vc_mpu_data,
.vfsm = &omap4_vdd_mpu_vfsm_data,
@@ -52,6 +53,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_iva_vfsm_data = {
static struct omap_vdd_info omap4_vdd_iva_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
+ .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_iva_data,
.vc_data = &omap4_vc_iva_data,
.vfsm = &omap4_vdd_iva_vfsm_data,
@@ -66,6 +68,7 @@ static const struct omap_vfsm_instance_data omap4_vdd_core_vfsm_data = {
static struct omap_vdd_info omap4_vdd_core_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
+ .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_core_data,
.vc_data = &omap4_vc_core_data,
.vfsm = &omap4_vdd_core_vfsm_data,
diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
index d277da6..5406b08 100644
--- a/arch/arm/mach-omap2/vp.h
+++ b/arch/arm/mach-omap2/vp.h
@@ -70,16 +70,13 @@ struct omap_vp_common_data {
/**
* struct omap_vp_prm_irqst_data - PRM_IRQSTATUS_MPU.VP_TRANXDONE_ST data
- * @prm_irqst_reg: reg offset for PRM_IRQSTATUS_MPU from top of PRM
* @tranxdone_status: VP_TRANXDONE_ST bitmask in PRM_IRQSTATUS_MPU reg
*
- * XXX prm_irqst_reg does not belong here
* XXX Note that on OMAP3, VP_TRANXDONE interrupt may not work due to a
* hardware bug
* XXX This structure is probably not needed
*/
struct omap_vp_prm_irqst_data {
- u8 prm_irqst_reg;
u32 tranxdone_status;
};
diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c
index c9b3e64..a8ea045 100644
--- a/arch/arm/mach-omap2/vp3xxx_data.c
+++ b/arch/arm/mach-omap2/vp3xxx_data.c
@@ -51,7 +51,6 @@ static const struct omap_vp_common_data omap3_vp_common = {
};
static const struct omap_vp_prm_irqst_data omap3_vp1_prm_irqst_data = {
- .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.tranxdone_status = OMAP3430_VP1_TRANXDONE_ST_MASK,
};
@@ -67,7 +66,6 @@ struct omap_vp_instance_data omap3_vp1_data = {
};
static const struct omap_vp_prm_irqst_data omap3_vp2_prm_irqst_data = {
- .prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.tranxdone_status = OMAP3430_VP2_TRANXDONE_ST_MASK,
};
diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c
index 1a0842e..0957c24 100644
--- a/arch/arm/mach-omap2/vp44xx_data.c
+++ b/arch/arm/mach-omap2/vp44xx_data.c
@@ -52,7 +52,6 @@ static const struct omap_vp_common_data omap4_vp_common = {
};
static const struct omap_vp_prm_irqst_data omap4_vp_mpu_prm_irqst_data = {
- .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.tranxdone_status = OMAP4430_VP_MPU_TRANXDONE_ST_MASK,
};
@@ -68,7 +67,6 @@ struct omap_vp_instance_data omap4_vp_mpu_data = {
};
static const struct omap_vp_prm_irqst_data omap4_vp_iva_prm_irqst_data = {
- .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET,
.tranxdone_status = OMAP4430_VP_IVA_TRANXDONE_ST_MASK,
};
@@ -84,7 +82,6 @@ struct omap_vp_instance_data omap4_vp_iva_data = {
};
static const struct omap_vp_prm_irqst_data omap4_vp_core_prm_irqst_data = {
- .prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_OFFSET,
.tranxdone_status = OMAP4430_VP_CORE_TRANXDONE_ST_MASK,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (2 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 03/19] OMAP2+: voltage: move prm_irqst_reg from VP into voltage domain Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 8:59 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 05/19] OMAP3: voltage: rename "mpu" voltagedomain to "mpu_iva" Kevin Hilman
` (16 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Start cleaning up the voltage layer to have a voltage domain layer
that resembles thae structure of the existing clock and power domain
layers. To that end:
- move the 'struct voltagedomain' out of 'struct omap_vdd_info' to
become the primary data structure.
- convert any functions taking a pointer to struct omap_vdd_info into
functions taking a struct voltagedomain pointer.
- convert the register & initialize of voltage domains to look like
that of powerdomains
- convert omap_voltage_domain_lookup() to voltdm_lookup(), modeled
after the current powerdomain and clockdomain lookup functions.
- omap_voltage_late_init(): only configure VDD info when
the vdd_info struct is non-NULL
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/io.c | 3 +
arch/arm/mach-omap2/omap_twl.c | 10 +-
arch/arm/mach-omap2/pm.c | 2 +-
arch/arm/mach-omap2/sr_device.c | 2 +-
arch/arm/mach-omap2/voltage.c | 257 ++++++++++++++-----------
arch/arm/mach-omap2/voltage.h | 27 ++--
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 34 ++--
arch/arm/mach-omap2/voltagedomains44xx_data.c | 44 ++--
8 files changed, 207 insertions(+), 172 deletions(-)
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 441e79d..44c2c3e 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -38,6 +38,7 @@
#include "io.h"
#include <plat/omap-pm.h>
+#include "voltage.h"
#include "powerdomain.h"
#include "clockdomain.h"
@@ -363,10 +364,12 @@ void __init omap2_init_common_infrastructure(void)
omap2xxx_clockdomains_init();
omap2430_hwmod_init();
} else if (cpu_is_omap34xx()) {
+ omap3xxx_voltagedomains_init();
omap3xxx_powerdomains_init();
omap3xxx_clockdomains_init();
omap3xxx_hwmod_init();
} else if (cpu_is_omap44xx()) {
+ omap44xx_voltagedomains_init();
omap44xx_powerdomains_init();
omap44xx_clockdomains_init();
omap44xx_hwmod_init();
diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c
index 0a8e74e..287aef2 100644
--- a/arch/arm/mach-omap2/omap_twl.c
+++ b/arch/arm/mach-omap2/omap_twl.c
@@ -250,13 +250,13 @@ int __init omap4_twl_init(void)
if (!cpu_is_omap44xx())
return -ENODEV;
- voltdm = omap_voltage_domain_lookup("mpu");
+ voltdm = voltdm_lookup("mpu");
omap_voltage_register_pmic(voltdm, &omap4_mpu_volt_info);
- voltdm = omap_voltage_domain_lookup("iva");
+ voltdm = voltdm_lookup("iva");
omap_voltage_register_pmic(voltdm, &omap4_iva_volt_info);
- voltdm = omap_voltage_domain_lookup("core");
+ voltdm = voltdm_lookup("core");
omap_voltage_register_pmic(voltdm, &omap4_core_volt_info);
return 0;
@@ -288,10 +288,10 @@ int __init omap3_twl_init(void)
if (!twl_sr_enable_autoinit)
omap3_twl_set_sr_bit(true);
- voltdm = omap_voltage_domain_lookup("mpu");
+ voltdm = voltdm_lookup("mpu");
omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info);
- voltdm = omap_voltage_domain_lookup("core");
+ voltdm = voltdm_lookup("core");
omap_voltage_register_pmic(voltdm, &omap3_core_volt_info);
return 0;
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 49486f5..917e1e3 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -181,7 +181,7 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
goto exit;
}
- voltdm = omap_voltage_domain_lookup(vdd_name);
+ voltdm = voltdm_lookup(vdd_name);
if (IS_ERR(voltdm)) {
printk(KERN_ERR "%s: Unable to get vdd pointer for vdd_%s\n",
__func__, vdd_name);
diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c
index 10d3c5e..2782d3f 100644
--- a/arch/arm/mach-omap2/sr_device.c
+++ b/arch/arm/mach-omap2/sr_device.c
@@ -102,7 +102,7 @@ static int sr_dev_init(struct omap_hwmod *oh, void *user)
sr_data->senn_mod = 0x1;
sr_data->senp_mod = 0x1;
- sr_data->voltdm = omap_voltage_domain_lookup(oh->vdd_name);
+ sr_data->voltdm = voltdm_lookup(oh->vdd_name);
if (IS_ERR(sr_data->voltdm)) {
pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
__func__, oh->vdd_name);
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 15a9cb8..f995003 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -40,20 +40,13 @@
#include "vc.h"
#include "vp.h"
-#define VOLTAGE_DIR_SIZE 16
-
-
-static struct omap_vdd_info **vdd_info;
-
-/*
- * Number of scalable voltage domains.
- */
-static int nr_scalable_vdd;
+static LIST_HEAD(voltdm_list);
+#define VOLTAGE_DIR_SIZE 16
static struct dentry *voltage_dir;
/* Init function pointers */
-static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
+static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
unsigned long target_volt);
static u32 omap3_voltage_read_reg(u16 mod, u8 offset)
@@ -77,11 +70,12 @@ static void omap4_voltage_write_reg(u32 val, u16 mod, u8 offset)
omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION, mod, offset);
}
-static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
+static int __init _config_common_vdd_data(struct voltagedomain *voltdm)
{
char *sys_ck_name;
struct clk *sys_ck;
u32 sys_clk_speed, timeout_val, waittime;
+ struct omap_vdd_info *vdd = voltdm->vdd;
/*
* XXX Clockfw should handle this, or this should be in a
@@ -101,7 +95,7 @@ static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
sys_ck = clk_get(NULL, sys_ck_name);
if (IS_ERR(sys_ck)) {
pr_warning("%s: Could not get the sys clk to calculate"
- "various vdd_%s params\n", __func__, vdd->voltdm.name);
+ "various vdd_%s params\n", __func__, voltdm->name);
return -EINVAL;
}
sys_clk_speed = clk_get_rate(sys_ck);
@@ -135,7 +129,8 @@ static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
/* Voltage debugfs support */
static int vp_volt_debug_get(void *data, u64 *val)
{
- struct omap_vdd_info *vdd = (struct omap_vdd_info *) data;
+ struct voltagedomain *voltdm = (struct voltagedomain *)data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
u8 vsel;
if (!vdd) {
@@ -157,14 +152,14 @@ 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 voltagedomain *voltdm = (struct voltagedomain *)data;
- if (!vdd) {
+ if (!voltdm) {
pr_warning("Wrong paramater passed\n");
return -EINVAL;
}
- *val = omap_voltage_get_nom_volt(&vdd->voltdm);
+ *val = omap_voltage_get_nom_volt(voltdm);
return 0;
}
@@ -172,16 +167,17 @@ static int nom_volt_debug_get(void *data, u64 *val)
DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops, vp_volt_debug_get, NULL, "%llu\n");
DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops, nom_volt_debug_get, NULL,
"%llu\n");
-static void vp_latch_vsel(struct omap_vdd_info *vdd)
+static void vp_latch_vsel(struct voltagedomain *voltdm)
{
u32 vpconfig;
unsigned long uvdc;
char vsel;
+ struct omap_vdd_info *vdd = voltdm->vdd;
- uvdc = omap_voltage_get_nom_volt(&vdd->voltdm);
+ uvdc = omap_voltage_get_nom_volt(voltdm);
if (!uvdc) {
pr_warning("%s: unable to find current voltage for vdd_%s\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return;
}
@@ -209,13 +205,14 @@ static void vp_latch_vsel(struct omap_vdd_info *vdd)
}
/* Generic voltage init functions */
-static void __init vp_init(struct omap_vdd_info *vdd)
+static void __init vp_init(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
u32 vp_val;
if (!vdd->read_reg || !vdd->write_reg) {
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return;
}
@@ -246,25 +243,26 @@ static void __init vp_init(struct omap_vdd_info *vdd)
vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vlimitto);
}
-static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
+static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
{
char *name;
+ struct omap_vdd_info *vdd = voltdm->vdd;
name = kzalloc(VOLTAGE_DIR_SIZE, GFP_KERNEL);
if (!name) {
pr_warning("%s: Unable to allocate memory for debugfs"
" directory name for vdd_%s",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return;
}
strcpy(name, "vdd_");
- strcat(name, vdd->voltdm.name);
+ strcat(name, voltdm->name);
vdd->debug_dir = debugfs_create_dir(name, voltage_dir);
kfree(name);
if (IS_ERR(vdd->debug_dir)) {
pr_warning("%s: Unable to create debugfs directory for"
- " vdd_%s\n", __func__, vdd->voltdm.name);
+ " vdd_%s\n", __func__, voltdm->name);
vdd->debug_dir = NULL;
return;
}
@@ -288,16 +286,17 @@ static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
(void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd->debug_dir,
&(vdd->vp_rt_data.vlimitto_timeout));
(void) debugfs_create_file("curr_vp_volt", S_IRUGO, vdd->debug_dir,
- (void *) vdd, &vp_volt_debug_fops);
+ (void *) voltdm, &vp_volt_debug_fops);
(void) debugfs_create_file("curr_nominal_volt", S_IRUGO,
- vdd->debug_dir, (void *) vdd,
+ vdd->debug_dir, (void *) voltdm,
&nom_volt_debug_fops);
}
/* Voltage scale and accessory APIs */
-static int _pre_volt_scale(struct omap_vdd_info *vdd,
+static int _pre_volt_scale(struct voltagedomain *voltdm,
unsigned long target_volt, u8 *target_vsel, u8 *current_vsel)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
struct omap_volt_data *volt_data;
const struct omap_vc_common_data *vc_common;
const struct omap_vp_common_data *vp_common;
@@ -309,25 +308,25 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd,
/* Check if suffiecient pmic info is available for this vdd */
if (!vdd->pmic_info) {
pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return -EINVAL;
}
if (!vdd->pmic_info->uv_to_vsel) {
pr_err("%s: PMIC function to convert voltage in uV to"
"vsel not registered. Hence unable to scale voltage"
- "for vdd_%s\n", __func__, vdd->voltdm.name);
+ "for vdd_%s\n", __func__, voltdm->name);
return -ENODATA;
}
if (!vdd->read_reg || !vdd->write_reg) {
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return -EINVAL;
}
/* Get volt_data corresponding to target_volt */
- volt_data = omap_voltage_get_voltdata(&vdd->voltdm, target_volt);
+ volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
if (IS_ERR(volt_data))
volt_data = NULL;
@@ -355,9 +354,10 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd,
return 0;
}
-static void _post_volt_scale(struct omap_vdd_info *vdd,
+static void _post_volt_scale(struct voltagedomain *voltdm,
unsigned long target_volt, u8 target_vsel, u8 current_vsel)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
u32 smps_steps = 0, smps_delay = 0;
smps_steps = abs(target_vsel - current_vsel);
@@ -370,15 +370,16 @@ static void _post_volt_scale(struct omap_vdd_info *vdd,
}
/* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
-static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
+static int vc_bypass_scale_voltage(struct voltagedomain *voltdm,
unsigned long target_volt)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
u32 loop_cnt = 0, retries_cnt = 0;
u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
u8 target_vsel, current_vsel;
int ret;
- ret = _pre_volt_scale(vdd, target_volt, &target_vsel, ¤t_vsel);
+ ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
if (ret)
return ret;
@@ -417,19 +418,20 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
vc_bypass_val_reg);
}
- _post_volt_scale(vdd, target_volt, target_vsel, current_vsel);
+ _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
return 0;
}
/* VP force update method of voltage scaling */
-static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
+static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
unsigned long target_volt)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
u32 vpconfig;
u8 target_vsel, current_vsel;
int ret, timeout = 0;
- ret = _pre_volt_scale(vdd, target_volt, &target_vsel, ¤t_vsel);
+ ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
if (ret)
return ret;
@@ -447,7 +449,7 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
}
if (timeout >= VP_TRANXDONE_TIMEOUT) {
pr_warning("%s: vdd_%s TRANXDONE timeout exceeded."
- "Voltage change aborted", __func__, vdd->voltdm.name);
+ "Voltage change aborted", __func__, voltdm->name);
return -ETIMEDOUT;
}
@@ -480,9 +482,9 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
if (timeout >= VP_TRANXDONE_TIMEOUT)
pr_err("%s: vdd_%s TRANXDONE timeout exceeded."
"TRANXDONE never got set after the voltage update\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
- _post_volt_scale(vdd, target_volt, target_vsel, current_vsel);
+ _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
/*
* Disable TransactionDone interrupt , clear all status, clear
@@ -501,7 +503,7 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
if (timeout >= VP_TRANXDONE_TIMEOUT)
pr_warning("%s: vdd_%s TRANXDONE timeout exceeded while trying"
"to clear the TRANXDONE status\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
/* Clear initVDD copy trigger bit */
@@ -514,8 +516,10 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
return 0;
}
-static void __init omap3_vfsm_init(struct omap_vdd_info *vdd)
+static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
+
/*
* Voltage Manager FSM parameters init
* XXX This data should be passed in from the board file
@@ -527,8 +531,9 @@ static void __init omap3_vfsm_init(struct omap_vdd_info *vdd)
OMAP3_PRM_VOLTSETUP2_OFFSET);
}
-static void __init omap3_vc_init(struct omap_vdd_info *vdd)
+static void __init omap3_vc_init(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
static bool is_initialized;
u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
u32 vc_val;
@@ -556,15 +561,16 @@ static void __init omap3_vc_init(struct omap_vdd_info *vdd)
vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vdd->vc_data->vc_common->prm_mod,
OMAP3_PRM_VC_I2C_CFG_OFFSET);
- omap3_vfsm_init(vdd);
+ omap3_vfsm_init(voltdm);
is_initialized = true;
}
/* OMAP4 specific voltage init functions */
-static void __init omap4_vc_init(struct omap_vdd_info *vdd)
+static void __init omap4_vc_init(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
static bool is_initialized;
u32 vc_val;
@@ -589,20 +595,21 @@ static void __init omap4_vc_init(struct omap_vdd_info *vdd)
is_initialized = true;
}
-static void __init omap_vc_init(struct omap_vdd_info *vdd)
+static void __init omap_vc_init(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
u32 vc_val;
if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
pr_err("%s: PMIC info requried to configure vc for"
"vdd_%s not populated.Hence cannot initialize vc\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return;
}
if (!vdd->read_reg || !vdd->write_reg) {
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, vdd->voltdm.name);
+ __func__, voltdm->name);
return;
}
@@ -630,23 +637,24 @@ static void __init omap_vc_init(struct omap_vdd_info *vdd)
vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
if (cpu_is_omap34xx())
- omap3_vc_init(vdd);
+ omap3_vc_init(voltdm);
else if (cpu_is_omap44xx())
- omap4_vc_init(vdd);
+ omap4_vc_init(voltdm);
}
-static int __init omap_vdd_data_configure(struct omap_vdd_info *vdd)
+static int __init omap_vdd_data_configure(struct voltagedomain *voltdm)
{
+ struct omap_vdd_info *vdd = voltdm->vdd;
int ret = -EINVAL;
if (!vdd->pmic_info) {
pr_err("%s: PMIC info requried to configure vdd_%s not"
"populated.Hence cannot initialize vdd_%s\n",
- __func__, vdd->voltdm.name, vdd->voltdm.name);
+ __func__, voltdm->name, voltdm->name);
goto ovdc_out;
}
- if (IS_ERR_VALUE(_config_common_vdd_data(vdd)))
+ if (IS_ERR_VALUE(_config_common_vdd_data(voltdm)))
goto ovdc_out;
if (cpu_is_omap34xx()) {
@@ -680,7 +688,7 @@ unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm)
return 0;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
return vdd->curr_volt;
}
@@ -701,7 +709,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm)
return 0;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
if (!vdd->read_reg) {
pr_err("%s: No read API for reading vdd_%s regs\n",
__func__, voltdm->name);
@@ -736,7 +744,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
return;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
if (!vdd->read_reg || !vdd->write_reg) {
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
__func__, voltdm->name);
@@ -747,7 +755,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
if (vdd->vp_enabled)
return;
- vp_latch_vsel(vdd);
+ vp_latch_vsel(voltdm);
/* Enable VP */
vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
@@ -774,7 +782,7 @@ void omap_vp_disable(struct voltagedomain *voltdm)
return;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
if (!vdd->read_reg || !vdd->write_reg) {
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
__func__, voltdm->name);
@@ -827,7 +835,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
return -EINVAL;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
if (!vdd->volt_scale) {
pr_err("%s: No voltage scale API registered for vdd_%s\n",
@@ -835,7 +843,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
return -ENODATA;
}
- return vdd->volt_scale(vdd, target_volt);
+ return vdd->volt_scale(voltdm, target_volt);
}
/**
@@ -888,7 +896,7 @@ void omap_voltage_get_volttable(struct voltagedomain *voltdm,
return;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
*volt_data = vdd->volt_data;
}
@@ -919,7 +927,7 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
return ERR_PTR(-EINVAL);
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
if (!vdd->volt_data) {
pr_warning("%s: voltage table does not exist for vdd_%s\n",
@@ -957,7 +965,7 @@ int omap_voltage_register_pmic(struct voltagedomain *voltdm,
return -EINVAL;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
vdd->pmic_info = pmic_info;
@@ -984,7 +992,7 @@ struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm)
return NULL;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
return vdd->debug_dir;
}
@@ -1009,7 +1017,7 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
return;
}
- vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
+ vdd = voltdm->vdd;
switch (voltscale_method) {
case VOLTSCALE_VPFORCEUPDATE:
@@ -1025,38 +1033,6 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
}
/**
- * omap_voltage_domain_lookup() - API to get the voltage domain pointer
- * @name: Name of the voltage domain
- *
- * This API looks up in the global vdd_info struct for the
- * existence of voltage domain <name>. If it exists, the API returns
- * a pointer to the voltage domain structure corresponding to the
- * VDD<name>. Else retuns error pointer.
- */
-struct voltagedomain *omap_voltage_domain_lookup(char *name)
-{
- int i;
-
- if (!vdd_info) {
- pr_err("%s: Voltage driver init not yet happened.Faulting!\n",
- __func__);
- return ERR_PTR(-EINVAL);
- }
-
- if (!name) {
- pr_err("%s: No name to get the votage domain!\n", __func__);
- return ERR_PTR(-EINVAL);
- }
-
- for (i = 0; i < nr_scalable_vdd; i++) {
- if (!(strcmp(name, vdd_info[i]->voltdm.name)))
- return &vdd_info[i]->voltdm;
- }
-
- return ERR_PTR(-EINVAL);
-}
-
-/**
* omap_voltage_late_init() - Init the various voltage parameters
*
* This API is to be called in the later stages of the
@@ -1065,9 +1041,9 @@ struct voltagedomain *omap_voltage_domain_lookup(char *name)
*/
int __init omap_voltage_late_init(void)
{
- int i;
+ struct voltagedomain *voltdm;
- if (!vdd_info) {
+ if (list_empty(&voltdm_list)) {
pr_err("%s: Voltage driver support not added\n",
__func__);
return -EINVAL;
@@ -1077,22 +1053,81 @@ int __init omap_voltage_late_init(void)
if (IS_ERR(voltage_dir))
pr_err("%s: Unable to create voltage debugfs main dir\n",
__func__);
- for (i = 0; i < nr_scalable_vdd; i++) {
- if (omap_vdd_data_configure(vdd_info[i]))
- continue;
- omap_vc_init(vdd_info[i]);
- vp_init(vdd_info[i]);
- vdd_debugfs_init(vdd_info[i]);
+ list_for_each_entry(voltdm, &voltdm_list, node) {
+ if (voltdm->vdd) {
+ if (omap_vdd_data_configure(voltdm))
+ continue;
+ omap_vc_init(voltdm);
+ vp_init(voltdm);
+ vdd_debugfs_init(voltdm);
+ }
}
return 0;
}
-/* XXX document */
-int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
- u8 omap_vdd_count)
+static struct voltagedomain *_voltdm_lookup(const char *name)
{
- vdd_info = omap_vdd_array;
- nr_scalable_vdd = omap_vdd_count;
+ struct voltagedomain *voltdm, *temp_voltdm;
+
+ voltdm = NULL;
+
+ list_for_each_entry(temp_voltdm, &voltdm_list, node) {
+ if (!strcmp(name, temp_voltdm->name)) {
+ voltdm = temp_voltdm;
+ break;
+ }
+ }
+
+ return voltdm;
+}
+
+static int _voltdm_register(struct voltagedomain *voltdm)
+{
+ if (!voltdm || !voltdm->name)
+ return -EINVAL;
+
+ list_add(&voltdm->node, &voltdm_list);
+
+ pr_debug("voltagedomain: registered %s\n", voltdm->name);
+
return 0;
}
+
+/**
+ * voltdm_lookup - look up a voltagedomain by name, return a pointer
+ * @name: name of voltagedomain
+ *
+ * Find a registered voltagedomain by its name @name. Returns a pointer
+ * to the struct voltagedomain if found, or NULL otherwise.
+ */
+struct voltagedomain *voltdm_lookup(const char *name)
+{
+ struct voltagedomain *voltdm ;
+
+ if (!name)
+ return NULL;
+
+ voltdm = _voltdm_lookup(name);
+
+ return voltdm;
+}
+
+/**
+ * voltdm_init - set up the voltagedomain layer
+ * @voltdm_list: array of struct voltagedomain pointers to register
+ *
+ * Loop through the array of voltagedomains @voltdm_list, registering all
+ * that are available on the current CPU. If voltdm_list is supplied
+ * and not null, all of the referenced voltagedomains will be
+ * registered. No return value.
+ */
+void voltdm_init(struct voltagedomain **voltdms)
+{
+ struct voltagedomain **v;
+
+ if (voltdms) {
+ for (v = voltdms; *v; v++)
+ _voltdm_register(*v);
+ }
+}
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index db23d49..5440298 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -31,6 +31,8 @@
#define OMAP3_VOLTOFFSET 0xff
#define OMAP3_VOLTSETUP2 0xff
+struct omap_vdd_info;
+
/**
* struct omap_vfsm_instance_data - per-voltage manager FSM register/bitfield
* data
@@ -50,11 +52,14 @@ struct omap_vfsm_instance_data {
/**
* struct voltagedomain - omap voltage domain global structure.
- * @name: Name of the voltage domain which can be used as a unique
- * identifier.
+ * @name: Name of the voltage domain which can be used as a unique identifier.
+ * @node: list_head linking all voltage domains
+ * @vdd: to be removed
*/
struct voltagedomain {
char *name;
+ struct list_head node;
+ struct omap_vdd_info *vdd;
};
/**
@@ -116,7 +121,6 @@ struct omap_volt_pmic_info {
* @vc_data : structure containing various various vc registers,
* shifts, masks etc.
* @vfsm : voltage manager FSM data
- * @voltdm : pointer to the voltage domain structure
* @debug_dir : debug directory for this voltage domain.
* @curr_volt : current voltage for this vdd.
* @prm_irqst_mod : PRM module id used for PRM IRQ status register access
@@ -130,7 +134,6 @@ struct omap_vdd_info {
struct omap_vp_runtime_data vp_rt_data;
struct omap_vc_instance_data *vc_data;
const struct omap_vfsm_instance_data *vfsm;
- struct voltagedomain voltdm;
struct dentry *debug_dir;
u32 curr_volt;
bool vp_enabled;
@@ -139,7 +142,7 @@ struct omap_vdd_info {
u8 prm_irqst_reg;
u32 (*read_reg) (u16 mod, u8 offset);
void (*write_reg) (u32 val, u16 mod, u8 offset);
- int (*volt_scale) (struct omap_vdd_info *vdd,
+ int (*volt_scale) (struct voltagedomain *voltdm,
unsigned long target_volt);
};
@@ -155,16 +158,11 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
unsigned long volt);
unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm);
struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm);
-int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
- u8 omap_vdd_count);
#ifdef CONFIG_PM
int omap_voltage_register_pmic(struct voltagedomain *voltdm,
struct omap_volt_pmic_info *pmic_info);
void omap_change_voltscale_method(struct voltagedomain *voltdm,
int voltscale_method);
-/* API to get the voltagedomain pointer */
-struct voltagedomain *omap_voltage_domain_lookup(char *name);
-
int omap_voltage_late_init(void);
#else
static inline int omap_voltage_register_pmic(struct voltagedomain *voltdm,
@@ -178,10 +176,11 @@ static inline int omap_voltage_late_init(void)
{
return -EINVAL;
}
-static inline struct voltagedomain *omap_voltage_domain_lookup(char *name)
-{
- return ERR_PTR(-EINVAL);
-}
#endif
+extern void omap3xxx_voltagedomains_init(void);
+extern void omap44xx_voltagedomains_init(void);
+
+struct voltagedomain *voltdm_lookup(const char *name);
+void voltdm_init(struct voltagedomain **voltdm_list);
#endif
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index f831f9a..4bee412 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -43,9 +43,6 @@ static struct omap_vdd_info omap3_vdd1_info = {
.vp_data = &omap3_vp1_data,
.vc_data = &omap3_vc1_data,
.vfsm = &omap3_vdd1_vfsm_data,
- .voltdm = {
- .name = "mpu",
- },
};
static const struct omap_vfsm_instance_data omap3_vdd2_vfsm_data = {
@@ -60,23 +57,26 @@ static struct omap_vdd_info omap3_vdd2_info = {
.vp_data = &omap3_vp2_data,
.vc_data = &omap3_vc2_data,
.vfsm = &omap3_vdd2_vfsm_data,
- .voltdm = {
- .name = "core",
- },
};
-/* OMAP3 VDD structures */
-static struct omap_vdd_info *omap3_vdd_info[] = {
- &omap3_vdd1_info,
- &omap3_vdd2_info,
+static struct voltagedomain omap3_voltdm_mpu = {
+ .name = "mpu",
+ .vdd = &omap3_vdd1_info,
};
-/* OMAP3 specific voltage init functions */
-static int __init omap3xxx_voltage_early_init(void)
-{
- if (!cpu_is_omap34xx())
- return 0;
+static struct voltagedomain omap3_voltdm_core = {
+ .name = "core",
+ .vdd = &omap3_vdd2_info,
+};
+static struct voltagedomain *voltagedomains_omap3[] __initdata = {
+ &omap3_voltdm_mpu,
+ &omap3_voltdm_core,
+ NULL,
+};
+
+void __init omap3xxx_voltagedomains_init(void)
+{
/*
* XXX Will depend on the process, validation, and binning
* for the currently-running IC
@@ -89,7 +89,5 @@ static int __init omap3xxx_voltage_early_init(void)
omap3_vdd2_info.volt_data = omap34xx_vddcore_volt_data;
}
- return omap_voltage_early_init(omap3_vdd_info,
- ARRAY_SIZE(omap3_vdd_info));
+ voltdm_init(voltagedomains_omap3);
};
-core_initcall(omap3xxx_voltage_early_init);
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c
index 85da60c..068a5e7 100644
--- a/arch/arm/mach-omap2/voltagedomains44xx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c
@@ -42,9 +42,6 @@ static struct omap_vdd_info omap4_vdd_mpu_info = {
.vp_data = &omap4_vp_mpu_data,
.vc_data = &omap4_vc_mpu_data,
.vfsm = &omap4_vdd_mpu_vfsm_data,
- .voltdm = {
- .name = "mpu",
- },
};
static const struct omap_vfsm_instance_data omap4_vdd_iva_vfsm_data = {
@@ -57,9 +54,6 @@ static struct omap_vdd_info omap4_vdd_iva_info = {
.vp_data = &omap4_vp_iva_data,
.vc_data = &omap4_vc_iva_data,
.vfsm = &omap4_vdd_iva_vfsm_data,
- .voltdm = {
- .name = "iva",
- },
};
static const struct omap_vfsm_instance_data omap4_vdd_core_vfsm_data = {
@@ -72,24 +66,32 @@ static struct omap_vdd_info omap4_vdd_core_info = {
.vp_data = &omap4_vp_core_data,
.vc_data = &omap4_vc_core_data,
.vfsm = &omap4_vdd_core_vfsm_data,
- .voltdm = {
- .name = "core",
- },
};
-/* OMAP4 VDD structures */
-static struct omap_vdd_info *omap4_vdd_info[] = {
- &omap4_vdd_mpu_info,
- &omap4_vdd_iva_info,
- &omap4_vdd_core_info,
+static struct voltagedomain omap4_voltdm_mpu = {
+ .name = "mpu",
+ .vdd = &omap4_vdd_mpu_info,
};
-/* OMAP4 specific voltage init functions */
-static int __init omap44xx_voltage_early_init(void)
-{
- if (!cpu_is_omap44xx())
- return 0;
+static struct voltagedomain omap4_voltdm_iva = {
+ .name = "iva",
+ .vdd = &omap4_vdd_iva_info,
+};
+
+static struct voltagedomain omap4_voltdm_core = {
+ .name = "core",
+ .vdd = &omap4_vdd_core_info,
+};
+static struct voltagedomain *voltagedomains_omap4[] __initdata = {
+ &omap4_voltdm_mpu,
+ &omap4_voltdm_iva,
+ &omap4_voltdm_core,
+ NULL,
+};
+
+void __init omap44xx_voltagedomains_init(void)
+{
/*
* XXX Will depend on the process, validation, and binning
* for the currently-running IC
@@ -98,7 +100,5 @@ static int __init omap44xx_voltage_early_init(void)
omap4_vdd_iva_info.volt_data = omap44xx_vdd_iva_volt_data;
omap4_vdd_core_info.volt_data = omap44xx_vdd_core_volt_data;
- return omap_voltage_early_init(omap4_vdd_info,
- ARRAY_SIZE(omap4_vdd_info));
+ voltdm_init(voltagedomains_omap4);
};
-core_initcall(omap44xx_voltage_early_init);
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer
2011-03-24 0:00 ` [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer Kevin Hilman
@ 2011-03-25 8:59 ` Jean Pihet
2011-03-25 15:48 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 8:59 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> Start cleaning up the voltage layer to have a voltage domain layer
> that resembles thae structure of the existing clock and power domain
s/thae/the
> layers. To that end:
Extra space
>
> - move the 'struct voltagedomain' out of 'struct omap_vdd_info' to
> become the primary data structure.
>
> - convert any functions taking a pointer to struct omap_vdd_info into
> functions taking a struct voltagedomain pointer.
>
> - convert the register & initialize of voltage domains to look like
> that of powerdomains
>
> - convert omap_voltage_domain_lookup() to voltdm_lookup(), modeled
> after the current powerdomain and clockdomain lookup functions.
>
> - omap_voltage_late_init(): only configure VDD info when
> the vdd_info struct is non-NULL
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/io.c | 3 +
> arch/arm/mach-omap2/omap_twl.c | 10 +-
> arch/arm/mach-omap2/pm.c | 2 +-
> arch/arm/mach-omap2/sr_device.c | 2 +-
> arch/arm/mach-omap2/voltage.c | 257 ++++++++++++++-----------
> arch/arm/mach-omap2/voltage.h | 27 ++--
> arch/arm/mach-omap2/voltagedomains3xxx_data.c | 34 ++--
> arch/arm/mach-omap2/voltagedomains44xx_data.c | 44 ++--
> 8 files changed, 207 insertions(+), 172 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
> index 441e79d..44c2c3e 100644
> --- a/arch/arm/mach-omap2/io.c
> +++ b/arch/arm/mach-omap2/io.c
> @@ -38,6 +38,7 @@
> #include "io.h"
>
> #include <plat/omap-pm.h>
> +#include "voltage.h"
> #include "powerdomain.h"
>
> #include "clockdomain.h"
> @@ -363,10 +364,12 @@ void __init omap2_init_common_infrastructure(void)
> omap2xxx_clockdomains_init();
> omap2430_hwmod_init();
> } else if (cpu_is_omap34xx()) {
> + omap3xxx_voltagedomains_init();
> omap3xxx_powerdomains_init();
> omap3xxx_clockdomains_init();
> omap3xxx_hwmod_init();
> } else if (cpu_is_omap44xx()) {
> + omap44xx_voltagedomains_init();
> omap44xx_powerdomains_init();
> omap44xx_clockdomains_init();
> omap44xx_hwmod_init();
> diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c
> index 0a8e74e..287aef2 100644
> --- a/arch/arm/mach-omap2/omap_twl.c
> +++ b/arch/arm/mach-omap2/omap_twl.c
> @@ -250,13 +250,13 @@ int __init omap4_twl_init(void)
> if (!cpu_is_omap44xx())
> return -ENODEV;
>
> - voltdm = omap_voltage_domain_lookup("mpu");
> + voltdm = voltdm_lookup("mpu");
> omap_voltage_register_pmic(voltdm, &omap4_mpu_volt_info);
>
> - voltdm = omap_voltage_domain_lookup("iva");
> + voltdm = voltdm_lookup("iva");
> omap_voltage_register_pmic(voltdm, &omap4_iva_volt_info);
>
> - voltdm = omap_voltage_domain_lookup("core");
> + voltdm = voltdm_lookup("core");
> omap_voltage_register_pmic(voltdm, &omap4_core_volt_info);
>
> return 0;
> @@ -288,10 +288,10 @@ int __init omap3_twl_init(void)
> if (!twl_sr_enable_autoinit)
> omap3_twl_set_sr_bit(true);
>
> - voltdm = omap_voltage_domain_lookup("mpu");
> + voltdm = voltdm_lookup("mpu");
> omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info);
>
> - voltdm = omap_voltage_domain_lookup("core");
> + voltdm = voltdm_lookup("core");
> omap_voltage_register_pmic(voltdm, &omap3_core_volt_info);
>
> return 0;
> diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
> index 49486f5..917e1e3 100644
> --- a/arch/arm/mach-omap2/pm.c
> +++ b/arch/arm/mach-omap2/pm.c
> @@ -181,7 +181,7 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
> goto exit;
> }
>
> - voltdm = omap_voltage_domain_lookup(vdd_name);
> + voltdm = voltdm_lookup(vdd_name);
> if (IS_ERR(voltdm)) {
> printk(KERN_ERR "%s: Unable to get vdd pointer for vdd_%s\n",
> __func__, vdd_name);
> diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c
> index 10d3c5e..2782d3f 100644
> --- a/arch/arm/mach-omap2/sr_device.c
> +++ b/arch/arm/mach-omap2/sr_device.c
> @@ -102,7 +102,7 @@ static int sr_dev_init(struct omap_hwmod *oh, void *user)
> sr_data->senn_mod = 0x1;
> sr_data->senp_mod = 0x1;
>
> - sr_data->voltdm = omap_voltage_domain_lookup(oh->vdd_name);
> + sr_data->voltdm = voltdm_lookup(oh->vdd_name);
> if (IS_ERR(sr_data->voltdm)) {
> pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
> __func__, oh->vdd_name);
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
> index 15a9cb8..f995003 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -40,20 +40,13 @@
> #include "vc.h"
> #include "vp.h"
>
> -#define VOLTAGE_DIR_SIZE 16
> -
> -
> -static struct omap_vdd_info **vdd_info;
> -
> -/*
> - * Number of scalable voltage domains.
> - */
> -static int nr_scalable_vdd;
> +static LIST_HEAD(voltdm_list);
>
> +#define VOLTAGE_DIR_SIZE 16
> static struct dentry *voltage_dir;
>
> /* Init function pointers */
> -static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> +static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> unsigned long target_volt);
>
> static u32 omap3_voltage_read_reg(u16 mod, u8 offset)
> @@ -77,11 +70,12 @@ static void omap4_voltage_write_reg(u32 val, u16 mod, u8 offset)
> omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION, mod, offset);
> }
>
> -static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
> +static int __init _config_common_vdd_data(struct voltagedomain *voltdm)
> {
> char *sys_ck_name;
> struct clk *sys_ck;
> u32 sys_clk_speed, timeout_val, waittime;
> + struct omap_vdd_info *vdd = voltdm->vdd;
>
> /*
> * XXX Clockfw should handle this, or this should be in a
> @@ -101,7 +95,7 @@ static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
> sys_ck = clk_get(NULL, sys_ck_name);
> if (IS_ERR(sys_ck)) {
> pr_warning("%s: Could not get the sys clk to calculate"
> - "various vdd_%s params\n", __func__, vdd->voltdm.name);
> + "various vdd_%s params\n", __func__, voltdm->name);
> return -EINVAL;
> }
> sys_clk_speed = clk_get_rate(sys_ck);
> @@ -135,7 +129,8 @@ static int __init _config_common_vdd_data(struct omap_vdd_info *vdd)
> /* Voltage debugfs support */
> static int vp_volt_debug_get(void *data, u64 *val)
> {
> - struct omap_vdd_info *vdd = (struct omap_vdd_info *) data;
> + struct voltagedomain *voltdm = (struct voltagedomain *)data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u8 vsel;
>
> if (!vdd) {
> @@ -157,14 +152,14 @@ 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 voltagedomain *voltdm = (struct voltagedomain *)data;
>
> - if (!vdd) {
> + if (!voltdm) {
> pr_warning("Wrong paramater passed\n");
> return -EINVAL;
> }
>
> - *val = omap_voltage_get_nom_volt(&vdd->voltdm);
> + *val = omap_voltage_get_nom_volt(voltdm);
>
> return 0;
> }
> @@ -172,16 +167,17 @@ static int nom_volt_debug_get(void *data, u64 *val)
> DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops, vp_volt_debug_get, NULL, "%llu\n");
> DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops, nom_volt_debug_get, NULL,
> "%llu\n");
> -static void vp_latch_vsel(struct omap_vdd_info *vdd)
> +static void vp_latch_vsel(struct voltagedomain *voltdm)
> {
> u32 vpconfig;
> unsigned long uvdc;
> char vsel;
> + struct omap_vdd_info *vdd = voltdm->vdd;
>
> - uvdc = omap_voltage_get_nom_volt(&vdd->voltdm);
> + uvdc = omap_voltage_get_nom_volt(voltdm);
> if (!uvdc) {
> pr_warning("%s: unable to find current voltage for vdd_%s\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return;
> }
>
> @@ -209,13 +205,14 @@ static void vp_latch_vsel(struct omap_vdd_info *vdd)
> }
>
> /* Generic voltage init functions */
> -static void __init vp_init(struct omap_vdd_info *vdd)
> +static void __init vp_init(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u32 vp_val;
>
> if (!vdd->read_reg || !vdd->write_reg) {
> pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return;
> }
>
> @@ -246,25 +243,26 @@ static void __init vp_init(struct omap_vdd_info *vdd)
> vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vlimitto);
> }
>
> -static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
> +static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
> {
> char *name;
> + struct omap_vdd_info *vdd = voltdm->vdd;
>
> name = kzalloc(VOLTAGE_DIR_SIZE, GFP_KERNEL);
> if (!name) {
> pr_warning("%s: Unable to allocate memory for debugfs"
> " directory name for vdd_%s",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return;
> }
> strcpy(name, "vdd_");
> - strcat(name, vdd->voltdm.name);
> + strcat(name, voltdm->name);
>
> vdd->debug_dir = debugfs_create_dir(name, voltage_dir);
> kfree(name);
> if (IS_ERR(vdd->debug_dir)) {
> pr_warning("%s: Unable to create debugfs directory for"
> - " vdd_%s\n", __func__, vdd->voltdm.name);
> + " vdd_%s\n", __func__, voltdm->name);
> vdd->debug_dir = NULL;
> return;
> }
> @@ -288,16 +286,17 @@ static void __init vdd_debugfs_init(struct omap_vdd_info *vdd)
> (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd->debug_dir,
> &(vdd->vp_rt_data.vlimitto_timeout));
> (void) debugfs_create_file("curr_vp_volt", S_IRUGO, vdd->debug_dir,
> - (void *) vdd, &vp_volt_debug_fops);
> + (void *) voltdm, &vp_volt_debug_fops);
> (void) debugfs_create_file("curr_nominal_volt", S_IRUGO,
> - vdd->debug_dir, (void *) vdd,
> + vdd->debug_dir, (void *) voltdm,
> &nom_volt_debug_fops);
> }
>
> /* Voltage scale and accessory APIs */
> -static int _pre_volt_scale(struct omap_vdd_info *vdd,
> +static int _pre_volt_scale(struct voltagedomain *voltdm,
> unsigned long target_volt, u8 *target_vsel, u8 *current_vsel)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> struct omap_volt_data *volt_data;
> const struct omap_vc_common_data *vc_common;
> const struct omap_vp_common_data *vp_common;
> @@ -309,25 +308,25 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd,
> /* Check if suffiecient pmic info is available for this vdd */
> if (!vdd->pmic_info) {
> pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return -EINVAL;
> }
>
> if (!vdd->pmic_info->uv_to_vsel) {
> pr_err("%s: PMIC function to convert voltage in uV to"
> "vsel not registered. Hence unable to scale voltage"
> - "for vdd_%s\n", __func__, vdd->voltdm.name);
> + "for vdd_%s\n", __func__, voltdm->name);
> return -ENODATA;
> }
>
> if (!vdd->read_reg || !vdd->write_reg) {
> pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return -EINVAL;
> }
>
> /* Get volt_data corresponding to target_volt */
> - volt_data = omap_voltage_get_voltdata(&vdd->voltdm, target_volt);
> + volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
> if (IS_ERR(volt_data))
> volt_data = NULL;
>
> @@ -355,9 +354,10 @@ static int _pre_volt_scale(struct omap_vdd_info *vdd,
> return 0;
> }
>
> -static void _post_volt_scale(struct omap_vdd_info *vdd,
> +static void _post_volt_scale(struct voltagedomain *voltdm,
> unsigned long target_volt, u8 target_vsel, u8 current_vsel)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u32 smps_steps = 0, smps_delay = 0;
>
> smps_steps = abs(target_vsel - current_vsel);
> @@ -370,15 +370,16 @@ static void _post_volt_scale(struct omap_vdd_info *vdd,
> }
>
> /* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
> -static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
> +static int vc_bypass_scale_voltage(struct voltagedomain *voltdm,
> unsigned long target_volt)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u32 loop_cnt = 0, retries_cnt = 0;
> u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
> u8 target_vsel, current_vsel;
> int ret;
>
> - ret = _pre_volt_scale(vdd, target_volt, &target_vsel, ¤t_vsel);
> + ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> if (ret)
> return ret;
>
> @@ -417,19 +418,20 @@ static int vc_bypass_scale_voltage(struct omap_vdd_info *vdd,
> vc_bypass_val_reg);
> }
>
> - _post_volt_scale(vdd, target_volt, target_vsel, current_vsel);
> + _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
> return 0;
> }
>
> /* VP force update method of voltage scaling */
> -static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> +static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> unsigned long target_volt)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u32 vpconfig;
> u8 target_vsel, current_vsel;
> int ret, timeout = 0;
>
> - ret = _pre_volt_scale(vdd, target_volt, &target_vsel, ¤t_vsel);
> + ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> if (ret)
> return ret;
>
> @@ -447,7 +449,7 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> }
> if (timeout >= VP_TRANXDONE_TIMEOUT) {
> pr_warning("%s: vdd_%s TRANXDONE timeout exceeded."
> - "Voltage change aborted", __func__, vdd->voltdm.name);
> + "Voltage change aborted", __func__, voltdm->name);
> return -ETIMEDOUT;
> }
>
> @@ -480,9 +482,9 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> if (timeout >= VP_TRANXDONE_TIMEOUT)
> pr_err("%s: vdd_%s TRANXDONE timeout exceeded."
> "TRANXDONE never got set after the voltage update\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
>
> - _post_volt_scale(vdd, target_volt, target_vsel, current_vsel);
> + _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
>
> /*
> * Disable TransactionDone interrupt , clear all status, clear
> @@ -501,7 +503,7 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> if (timeout >= VP_TRANXDONE_TIMEOUT)
> pr_warning("%s: vdd_%s TRANXDONE timeout exceeded while trying"
> "to clear the TRANXDONE status\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
>
> vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
> /* Clear initVDD copy trigger bit */
> @@ -514,8 +516,10 @@ static int vp_forceupdate_scale_voltage(struct omap_vdd_info *vdd,
> return 0;
> }
>
> -static void __init omap3_vfsm_init(struct omap_vdd_info *vdd)
> +static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> +
> /*
> * Voltage Manager FSM parameters init
> * XXX This data should be passed in from the board file
> @@ -527,8 +531,9 @@ static void __init omap3_vfsm_init(struct omap_vdd_info *vdd)
> OMAP3_PRM_VOLTSETUP2_OFFSET);
> }
>
> -static void __init omap3_vc_init(struct omap_vdd_info *vdd)
> +static void __init omap3_vc_init(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> static bool is_initialized;
> u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
> u32 vc_val;
> @@ -556,15 +561,16 @@ static void __init omap3_vc_init(struct omap_vdd_info *vdd)
> vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vdd->vc_data->vc_common->prm_mod,
> OMAP3_PRM_VC_I2C_CFG_OFFSET);
>
> - omap3_vfsm_init(vdd);
> + omap3_vfsm_init(voltdm);
>
> is_initialized = true;
> }
>
>
> /* OMAP4 specific voltage init functions */
> -static void __init omap4_vc_init(struct omap_vdd_info *vdd)
> +static void __init omap4_vc_init(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> static bool is_initialized;
> u32 vc_val;
>
> @@ -589,20 +595,21 @@ static void __init omap4_vc_init(struct omap_vdd_info *vdd)
> is_initialized = true;
> }
>
> -static void __init omap_vc_init(struct omap_vdd_info *vdd)
> +static void __init omap_vc_init(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> u32 vc_val;
>
> if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
> pr_err("%s: PMIC info requried to configure vc for"
> "vdd_%s not populated.Hence cannot initialize vc\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return;
> }
>
> if (!vdd->read_reg || !vdd->write_reg) {
> pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> - __func__, vdd->voltdm.name);
> + __func__, voltdm->name);
> return;
> }
>
> @@ -630,23 +637,24 @@ static void __init omap_vc_init(struct omap_vdd_info *vdd)
> vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
>
> if (cpu_is_omap34xx())
> - omap3_vc_init(vdd);
> + omap3_vc_init(voltdm);
> else if (cpu_is_omap44xx())
> - omap4_vc_init(vdd);
> + omap4_vc_init(voltdm);
> }
>
> -static int __init omap_vdd_data_configure(struct omap_vdd_info *vdd)
> +static int __init omap_vdd_data_configure(struct voltagedomain *voltdm)
> {
> + struct omap_vdd_info *vdd = voltdm->vdd;
> int ret = -EINVAL;
>
> if (!vdd->pmic_info) {
> pr_err("%s: PMIC info requried to configure vdd_%s not"
> "populated.Hence cannot initialize vdd_%s\n",
> - __func__, vdd->voltdm.name, vdd->voltdm.name);
> + __func__, voltdm->name, voltdm->name);
> goto ovdc_out;
> }
>
> - if (IS_ERR_VALUE(_config_common_vdd_data(vdd)))
> + if (IS_ERR_VALUE(_config_common_vdd_data(voltdm)))
> goto ovdc_out;
>
> if (cpu_is_omap34xx()) {
> @@ -680,7 +688,7 @@ unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm)
> return 0;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> return vdd->curr_volt;
> }
> @@ -701,7 +709,7 @@ unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm)
> return 0;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
> if (!vdd->read_reg) {
> pr_err("%s: No read API for reading vdd_%s regs\n",
> __func__, voltdm->name);
> @@ -736,7 +744,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
> return;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
> if (!vdd->read_reg || !vdd->write_reg) {
> pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> __func__, voltdm->name);
> @@ -747,7 +755,7 @@ void omap_vp_enable(struct voltagedomain *voltdm)
> if (vdd->vp_enabled)
> return;
>
> - vp_latch_vsel(vdd);
> + vp_latch_vsel(voltdm);
>
> /* Enable VP */
> vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
> @@ -774,7 +782,7 @@ void omap_vp_disable(struct voltagedomain *voltdm)
> return;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
> if (!vdd->read_reg || !vdd->write_reg) {
> pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> __func__, voltdm->name);
> @@ -827,7 +835,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
> return -EINVAL;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> if (!vdd->volt_scale) {
> pr_err("%s: No voltage scale API registered for vdd_%s\n",
> @@ -835,7 +843,7 @@ int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
> return -ENODATA;
> }
>
> - return vdd->volt_scale(vdd, target_volt);
> + return vdd->volt_scale(voltdm, target_volt);
> }
>
> /**
> @@ -888,7 +896,7 @@ void omap_voltage_get_volttable(struct voltagedomain *voltdm,
> return;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> *volt_data = vdd->volt_data;
> }
> @@ -919,7 +927,7 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
> return ERR_PTR(-EINVAL);
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> if (!vdd->volt_data) {
> pr_warning("%s: voltage table does not exist for vdd_%s\n",
> @@ -957,7 +965,7 @@ int omap_voltage_register_pmic(struct voltagedomain *voltdm,
> return -EINVAL;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> vdd->pmic_info = pmic_info;
>
> @@ -984,7 +992,7 @@ struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm)
> return NULL;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> return vdd->debug_dir;
> }
> @@ -1009,7 +1017,7 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
> return;
> }
>
> - vdd = container_of(voltdm, struct omap_vdd_info, voltdm);
> + vdd = voltdm->vdd;
>
> switch (voltscale_method) {
> case VOLTSCALE_VPFORCEUPDATE:
> @@ -1025,38 +1033,6 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
> }
>
> /**
> - * omap_voltage_domain_lookup() - API to get the voltage domain pointer
> - * @name: Name of the voltage domain
> - *
> - * This API looks up in the global vdd_info struct for the
> - * existence of voltage domain <name>. If it exists, the API returns
> - * a pointer to the voltage domain structure corresponding to the
> - * VDD<name>. Else retuns error pointer.
> - */
> -struct voltagedomain *omap_voltage_domain_lookup(char *name)
> -{
> - int i;
> -
> - if (!vdd_info) {
> - pr_err("%s: Voltage driver init not yet happened.Faulting!\n",
> - __func__);
> - return ERR_PTR(-EINVAL);
> - }
> -
> - if (!name) {
> - pr_err("%s: No name to get the votage domain!\n", __func__);
> - return ERR_PTR(-EINVAL);
> - }
> -
> - for (i = 0; i < nr_scalable_vdd; i++) {
> - if (!(strcmp(name, vdd_info[i]->voltdm.name)))
> - return &vdd_info[i]->voltdm;
> - }
> -
> - return ERR_PTR(-EINVAL);
> -}
> -
> -/**
> * omap_voltage_late_init() - Init the various voltage parameters
> *
> * This API is to be called in the later stages of the
> @@ -1065,9 +1041,9 @@ struct voltagedomain *omap_voltage_domain_lookup(char *name)
> */
> int __init omap_voltage_late_init(void)
> {
> - int i;
> + struct voltagedomain *voltdm;
>
> - if (!vdd_info) {
> + if (list_empty(&voltdm_list)) {
> pr_err("%s: Voltage driver support not added\n",
> __func__);
> return -EINVAL;
> @@ -1077,22 +1053,81 @@ int __init omap_voltage_late_init(void)
> if (IS_ERR(voltage_dir))
> pr_err("%s: Unable to create voltage debugfs main dir\n",
> __func__);
> - for (i = 0; i < nr_scalable_vdd; i++) {
> - if (omap_vdd_data_configure(vdd_info[i]))
> - continue;
> - omap_vc_init(vdd_info[i]);
> - vp_init(vdd_info[i]);
> - vdd_debugfs_init(vdd_info[i]);
> + list_for_each_entry(voltdm, &voltdm_list, node) {
> + if (voltdm->vdd) {
> + if (omap_vdd_data_configure(voltdm))
> + continue;
> + omap_vc_init(voltdm);
> + vp_init(voltdm);
> + vdd_debugfs_init(voltdm);
> + }
> }
>
> return 0;
> }
>
> -/* XXX document */
> -int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
> - u8 omap_vdd_count)
> +static struct voltagedomain *_voltdm_lookup(const char *name)
> {
> - vdd_info = omap_vdd_array;
> - nr_scalable_vdd = omap_vdd_count;
> + struct voltagedomain *voltdm, *temp_voltdm;
> +
> + voltdm = NULL;
> +
> + list_for_each_entry(temp_voltdm, &voltdm_list, node) {
> + if (!strcmp(name, temp_voltdm->name)) {
> + voltdm = temp_voltdm;
> + break;
> + }
> + }
> +
> + return voltdm;
> +}
> +
> +static int _voltdm_register(struct voltagedomain *voltdm)
> +{
> + if (!voltdm || !voltdm->name)
> + return -EINVAL;
> +
> + list_add(&voltdm->node, &voltdm_list);
> +
> + pr_debug("voltagedomain: registered %s\n", voltdm->name);
> +
> return 0;
> }
> +
> +/**
> + * voltdm_lookup - look up a voltagedomain by name, return a pointer
> + * @name: name of voltagedomain
> + *
> + * Find a registered voltagedomain by its name @name. Returns a pointer
> + * to the struct voltagedomain if found, or NULL otherwise.
> + */
> +struct voltagedomain *voltdm_lookup(const char *name)
> +{
> + struct voltagedomain *voltdm ;
> +
> + if (!name)
> + return NULL;
> +
> + voltdm = _voltdm_lookup(name);
> +
> + return voltdm;
> +}
> +
> +/**
> + * voltdm_init - set up the voltagedomain layer
> + * @voltdm_list: array of struct voltagedomain pointers to register
> + *
> + * Loop through the array of voltagedomains @voltdm_list, registering all
> + * that are available on the current CPU. If voltdm_list is supplied
> + * and not null, all of the referenced voltagedomains will be
> + * registered. No return value.
> + */
> +void voltdm_init(struct voltagedomain **voltdms)
> +{
> + struct voltagedomain **v;
> +
> + if (voltdms) {
> + for (v = voltdms; *v; v++)
> + _voltdm_register(*v);
> + }
> +}
> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
> index db23d49..5440298 100644
> --- a/arch/arm/mach-omap2/voltage.h
> +++ b/arch/arm/mach-omap2/voltage.h
> @@ -31,6 +31,8 @@
> #define OMAP3_VOLTOFFSET 0xff
> #define OMAP3_VOLTSETUP2 0xff
>
> +struct omap_vdd_info;
> +
> /**
> * struct omap_vfsm_instance_data - per-voltage manager FSM register/bitfield
> * data
> @@ -50,11 +52,14 @@ struct omap_vfsm_instance_data {
>
> /**
> * struct voltagedomain - omap voltage domain global structure.
> - * @name: Name of the voltage domain which can be used as a unique
> - * identifier.
> + * @name: Name of the voltage domain which can be used as a unique identifier.
> + * @node: list_head linking all voltage domains
> + * @vdd: to be removed
> */
> struct voltagedomain {
> char *name;
> + struct list_head node;
> + struct omap_vdd_info *vdd;
> };
>
> /**
> @@ -116,7 +121,6 @@ struct omap_volt_pmic_info {
> * @vc_data : structure containing various various vc registers,
> * shifts, masks etc.
> * @vfsm : voltage manager FSM data
> - * @voltdm : pointer to the voltage domain structure
> * @debug_dir : debug directory for this voltage domain.
> * @curr_volt : current voltage for this vdd.
> * @prm_irqst_mod : PRM module id used for PRM IRQ status register access
> @@ -130,7 +134,6 @@ struct omap_vdd_info {
> struct omap_vp_runtime_data vp_rt_data;
> struct omap_vc_instance_data *vc_data;
> const struct omap_vfsm_instance_data *vfsm;
> - struct voltagedomain voltdm;
> struct dentry *debug_dir;
> u32 curr_volt;
> bool vp_enabled;
> @@ -139,7 +142,7 @@ struct omap_vdd_info {
> u8 prm_irqst_reg;
> u32 (*read_reg) (u16 mod, u8 offset);
> void (*write_reg) (u32 val, u16 mod, u8 offset);
> - int (*volt_scale) (struct omap_vdd_info *vdd,
> + int (*volt_scale) (struct voltagedomain *voltdm,
> unsigned long target_volt);
> };
>
> @@ -155,16 +158,11 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
> unsigned long volt);
> unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm);
> struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm);
> -int __init omap_voltage_early_init(struct omap_vdd_info *omap_vdd_array[],
> - u8 omap_vdd_count);
> #ifdef CONFIG_PM
> int omap_voltage_register_pmic(struct voltagedomain *voltdm,
> struct omap_volt_pmic_info *pmic_info);
> void omap_change_voltscale_method(struct voltagedomain *voltdm,
> int voltscale_method);
> -/* API to get the voltagedomain pointer */
> -struct voltagedomain *omap_voltage_domain_lookup(char *name);
> -
> int omap_voltage_late_init(void);
> #else
> static inline int omap_voltage_register_pmic(struct voltagedomain *voltdm,
> @@ -178,10 +176,11 @@ static inline int omap_voltage_late_init(void)
> {
> return -EINVAL;
> }
> -static inline struct voltagedomain *omap_voltage_domain_lookup(char *name)
> -{
> - return ERR_PTR(-EINVAL);
> -}
> #endif
>
> +extern void omap3xxx_voltagedomains_init(void);
> +extern void omap44xx_voltagedomains_init(void);
> +
> +struct voltagedomain *voltdm_lookup(const char *name);
> +void voltdm_init(struct voltagedomain **voltdm_list);
> #endif
> diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> index f831f9a..4bee412 100644
> --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> @@ -43,9 +43,6 @@ static struct omap_vdd_info omap3_vdd1_info = {
> .vp_data = &omap3_vp1_data,
> .vc_data = &omap3_vc1_data,
> .vfsm = &omap3_vdd1_vfsm_data,
> - .voltdm = {
> - .name = "mpu",
> - },
> };
>
> static const struct omap_vfsm_instance_data omap3_vdd2_vfsm_data = {
> @@ -60,23 +57,26 @@ static struct omap_vdd_info omap3_vdd2_info = {
> .vp_data = &omap3_vp2_data,
> .vc_data = &omap3_vc2_data,
> .vfsm = &omap3_vdd2_vfsm_data,
> - .voltdm = {
> - .name = "core",
> - },
> };
>
> -/* OMAP3 VDD structures */
> -static struct omap_vdd_info *omap3_vdd_info[] = {
> - &omap3_vdd1_info,
> - &omap3_vdd2_info,
> +static struct voltagedomain omap3_voltdm_mpu = {
> + .name = "mpu",
> + .vdd = &omap3_vdd1_info,
> };
>
> -/* OMAP3 specific voltage init functions */
> -static int __init omap3xxx_voltage_early_init(void)
> -{
> - if (!cpu_is_omap34xx())
> - return 0;
> +static struct voltagedomain omap3_voltdm_core = {
> + .name = "core",
> + .vdd = &omap3_vdd2_info,
> +};
>
> +static struct voltagedomain *voltagedomains_omap3[] __initdata = {
> + &omap3_voltdm_mpu,
> + &omap3_voltdm_core,
> + NULL,
> +};
> +
> +void __init omap3xxx_voltagedomains_init(void)
> +{
> /*
> * XXX Will depend on the process, validation, and binning
> * for the currently-running IC
> @@ -89,7 +89,5 @@ static int __init omap3xxx_voltage_early_init(void)
> omap3_vdd2_info.volt_data = omap34xx_vddcore_volt_data;
> }
>
> - return omap_voltage_early_init(omap3_vdd_info,
> - ARRAY_SIZE(omap3_vdd_info));
> + voltdm_init(voltagedomains_omap3);
> };
> -core_initcall(omap3xxx_voltage_early_init);
> diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c
> index 85da60c..068a5e7 100644
> --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c
> +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c
> @@ -42,9 +42,6 @@ static struct omap_vdd_info omap4_vdd_mpu_info = {
> .vp_data = &omap4_vp_mpu_data,
> .vc_data = &omap4_vc_mpu_data,
> .vfsm = &omap4_vdd_mpu_vfsm_data,
> - .voltdm = {
> - .name = "mpu",
> - },
> };
>
> static const struct omap_vfsm_instance_data omap4_vdd_iva_vfsm_data = {
> @@ -57,9 +54,6 @@ static struct omap_vdd_info omap4_vdd_iva_info = {
> .vp_data = &omap4_vp_iva_data,
> .vc_data = &omap4_vc_iva_data,
> .vfsm = &omap4_vdd_iva_vfsm_data,
> - .voltdm = {
> - .name = "iva",
> - },
> };
>
> static const struct omap_vfsm_instance_data omap4_vdd_core_vfsm_data = {
> @@ -72,24 +66,32 @@ static struct omap_vdd_info omap4_vdd_core_info = {
> .vp_data = &omap4_vp_core_data,
> .vc_data = &omap4_vc_core_data,
> .vfsm = &omap4_vdd_core_vfsm_data,
> - .voltdm = {
> - .name = "core",
> - },
> };
>
> -/* OMAP4 VDD structures */
> -static struct omap_vdd_info *omap4_vdd_info[] = {
> - &omap4_vdd_mpu_info,
> - &omap4_vdd_iva_info,
> - &omap4_vdd_core_info,
> +static struct voltagedomain omap4_voltdm_mpu = {
> + .name = "mpu",
> + .vdd = &omap4_vdd_mpu_info,
> };
>
> -/* OMAP4 specific voltage init functions */
> -static int __init omap44xx_voltage_early_init(void)
> -{
> - if (!cpu_is_omap44xx())
> - return 0;
> +static struct voltagedomain omap4_voltdm_iva = {
> + .name = "iva",
> + .vdd = &omap4_vdd_iva_info,
> +};
> +
> +static struct voltagedomain omap4_voltdm_core = {
> + .name = "core",
> + .vdd = &omap4_vdd_core_info,
> +};
>
> +static struct voltagedomain *voltagedomains_omap4[] __initdata = {
> + &omap4_voltdm_mpu,
> + &omap4_voltdm_iva,
> + &omap4_voltdm_core,
> + NULL,
> +};
> +
> +void __init omap44xx_voltagedomains_init(void)
> +{
> /*
> * XXX Will depend on the process, validation, and binning
> * for the currently-running IC
> @@ -98,7 +100,5 @@ static int __init omap44xx_voltage_early_init(void)
> omap4_vdd_iva_info.volt_data = omap44xx_vdd_iva_volt_data;
> omap4_vdd_core_info.volt_data = omap44xx_vdd_core_volt_data;
>
> - return omap_voltage_early_init(omap4_vdd_info,
> - ARRAY_SIZE(omap4_vdd_info));
> + voltdm_init(voltagedomains_omap4);
> };
> -core_initcall(omap44xx_voltage_early_init);
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer
2011-03-25 8:59 ` Jean Pihet
@ 2011-03-25 15:48 ` Kevin Hilman
2011-03-25 16:41 ` Jean Pihet
0 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 15:48 UTC (permalink / raw)
To: Jean Pihet; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Hi Jean,
Jean Pihet <jean.pihet@newoldbits.com> writes:
> On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
>> Start cleaning up the voltage layer to have a voltage domain layer
>> that resembles thae structure of the existing clock and power domain
> s/thae/the
>
>> layers. To that end:
> Extra space
>
Thanks for the review of this series.
When commenting on a patch (especially large ones) it helps if you
remove context that is not relevant to the patch.
For example, your two comments above are the only ones on this patch,
yet below you still have the entire patch context, which requires the
author to look through the whole patch again to see if there are other
comments.
It is a great help to the author (and other reviewers) if the reply only
keeps the relevant context so it's obvious what the reply is to.
Thanks,
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer
2011-03-25 15:48 ` Kevin Hilman
@ 2011-03-25 16:41 ` Jean Pihet
0 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 16:41 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Fri, Mar 25, 2011 at 4:48 PM, Kevin Hilman <khilman@ti.com> wrote:
> Hi Jean,
>
> Jean Pihet <jean.pihet@newoldbits.com> writes:
>
>> On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
>>> Start cleaning up the voltage layer to have a voltage domain layer
>>> that resembles thae structure of the existing clock and power domain
>> s/thae/the
>>
>>> layers. To that end:
>> Extra space
>>
>
> Thanks for the review of this series.
>
> When commenting on a patch (especially large ones) it helps if you
> remove context that is not relevant to the patch.
>
> For example, your two comments above are the only ones on this patch,
> yet below you still have the entire patch context, which requires the
> author to look through the whole patch again to see if there are other
> comments.
Ok got the point. In fact my e-mail app (gmail web) does automatically
hide the similar portions of text.
>
> It is a great help to the author (and other reviewers) if the reply only
> keeps the relevant context so it's obvious what the reply is to.
>
> Thanks,
>
> Kevin
Thanks,
Jean
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 05/19] OMAP3: voltage: rename "mpu" voltagedomain to "mpu_iva"
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (3 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 04/19] OMAP2+: voltage: start towards a new voltagedomain layer Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 06/19] OMAP3: voltagedomain data: add wakeup domain Kevin Hilman
` (15 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
This voltage domain (a.k.a. VDD1) contains both the MPU and the IVA, so
rename appropriately.
Also fixup any users of the "mpu" name to use "mpu_iva"
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 4 ++--
arch/arm/mach-omap2/omap_twl.c | 2 +-
arch/arm/mach-omap2/pm.c | 2 +-
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index c819c30..84feaf1 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -2909,7 +2909,7 @@ static struct omap_hwmod omap34xx_sr1_hwmod = {
.name = "sr1_hwmod",
.class = &omap34xx_smartreflex_hwmod_class,
.main_clk = "sr1_fck",
- .vdd_name = "mpu",
+ .vdd_name = "mpu_iva",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
@@ -2931,7 +2931,7 @@ static struct omap_hwmod omap36xx_sr1_hwmod = {
.name = "sr1_hwmod",
.class = &omap36xx_smartreflex_hwmod_class,
.main_clk = "sr1_fck",
- .vdd_name = "mpu",
+ .vdd_name = "mpu_iva",
.prcm = {
.omap2 = {
.prcm_reg_id = 1,
diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c
index 287aef2..57c325a 100644
--- a/arch/arm/mach-omap2/omap_twl.c
+++ b/arch/arm/mach-omap2/omap_twl.c
@@ -288,7 +288,7 @@ int __init omap3_twl_init(void)
if (!twl_sr_enable_autoinit)
omap3_twl_set_sr_bit(true);
- voltdm = voltdm_lookup("mpu");
+ voltdm = voltdm_lookup("mpu_iva");
omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info);
voltdm = voltdm_lookup("core");
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 917e1e3..820b7b5 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -226,7 +226,7 @@ static void __init omap3_init_voltages(void)
if (!cpu_is_omap34xx())
return;
- omap2_set_init_voltage("mpu", "dpll1_ck", mpu_dev);
+ omap2_set_init_voltage("mpu_iva", "dpll1_ck", mpu_dev);
omap2_set_init_voltage("core", "l3_ick", l3_dev);
}
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index 4bee412..2167ef4 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -60,7 +60,7 @@ static struct omap_vdd_info omap3_vdd2_info = {
};
static struct voltagedomain omap3_voltdm_mpu = {
- .name = "mpu",
+ .name = "mpu_iva",
.vdd = &omap3_vdd1_info,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 06/19] OMAP3: voltagedomain data: add wakeup domain
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (4 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 05/19] OMAP3: voltage: rename "mpu" voltagedomain to "mpu_iva" Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:00 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain Kevin Hilman
` (14 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Add wakeup voltage domain so that the wakeup powerdomain can have an
associated powerdomain. Note that the scalable flat is not set for
the this voltagedomain, so it will not be fully initialized like
scalable voltage domains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index 2167ef4..b476ee6 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -69,9 +69,14 @@ static struct voltagedomain omap3_voltdm_core = {
.vdd = &omap3_vdd2_info,
};
+static struct voltagedomain omap3_voltdm_wkup = {
+ .name = "wkup",
+};
+
static struct voltagedomain *voltagedomains_omap3[] __initdata = {
&omap3_voltdm_mpu,
&omap3_voltdm_core,
+ &omap3_voltdm_wkup,
NULL,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 06/19] OMAP3: voltagedomain data: add wakeup domain
2011-03-24 0:00 ` [PATCH/RFC 06/19] OMAP3: voltagedomain data: add wakeup domain Kevin Hilman
@ 2011-03-25 9:00 ` Jean Pihet
0 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:00 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> Add wakeup voltage domain so that the wakeup powerdomain can have an
> associated powerdomain. Note that the scalable flat is not set for
Extra space. s/flat/flag ?
> the this voltagedomain, so it will not be fully initialized like
> scalable voltage domains.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/voltagedomains3xxx_data.c | 5 +++++
> 1 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> index 2167ef4..b476ee6 100644
> --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> @@ -69,9 +69,14 @@ static struct voltagedomain omap3_voltdm_core = {
> .vdd = &omap3_vdd2_info,
> };
>
> +static struct voltagedomain omap3_voltdm_wkup = {
> + .name = "wkup",
> +};
> +
> static struct voltagedomain *voltagedomains_omap3[] __initdata = {
> &omap3_voltdm_mpu,
> &omap3_voltdm_core,
> + &omap3_voltdm_wkup,
> NULL,
> };
>
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (5 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 06/19] OMAP3: voltagedomain data: add wakeup domain Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 5:23 ` Vishwanath Sripathy
2011-03-24 0:00 ` [PATCH/RFC 08/19] OMAP2+: powerdomain: add voltagedomain to struct powerdomain Kevin Hilman
` (13 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Add a 'bool scalable' flag to the struct powerdomain and set it for
the MPU_IVA and CORE voltage domains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/voltage.c | 3 +++
arch/arm/mach-omap2/voltage.h | 2 ++
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 2 ++
3 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index f995003..bc944ff 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -1054,6 +1054,9 @@ int __init omap_voltage_late_init(void)
pr_err("%s: Unable to create voltage debugfs main dir\n",
__func__);
list_for_each_entry(voltdm, &voltdm_list, node) {
+ if (!voltdm->scalable)
+ continue;
+
if (voltdm->vdd) {
if (omap_vdd_data_configure(voltdm))
continue;
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 5440298..25cfb5c 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -53,11 +53,13 @@ struct omap_vfsm_instance_data {
/**
* struct voltagedomain - omap voltage domain global structure.
* @name: Name of the voltage domain which can be used as a unique identifier.
+ * @scalable: Whether or not this voltage domain is scalable
* @node: list_head linking all voltage domains
* @vdd: to be removed
*/
struct voltagedomain {
char *name;
+ bool scalable;
struct list_head node;
struct omap_vdd_info *vdd;
};
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index b476ee6..e9664843 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -61,11 +61,13 @@ static struct omap_vdd_info omap3_vdd2_info = {
static struct voltagedomain omap3_voltdm_mpu = {
.name = "mpu_iva",
+ .scalable = true,
.vdd = &omap3_vdd1_info,
};
static struct voltagedomain omap3_voltdm_core = {
.name = "core",
+ .scalable = true,
.vdd = &omap3_vdd2_info,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* RE: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain
2011-03-24 0:00 ` [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain Kevin Hilman
@ 2011-03-24 5:23 ` Vishwanath Sripathy
2011-03-24 14:12 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Vishwanath Sripathy @ 2011-03-24 5:23 UTC (permalink / raw)
To: Kevin Hilman, linux-omap; +Cc: Paul Walmsely, Benoit Cousson
> -----Original Message-----
> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
> owner@vger.kernel.org] On Behalf Of Kevin Hilman
> Sent: Thursday, March 24, 2011 5:30 AM
> To: linux-omap@vger.kernel.org
> Cc: Paul Walmsely; Benoit Cousson
> Subject: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to
> voltagedomain
>
> Add a 'bool scalable' flag to the struct powerdomain and set it for
I suppose you meant "struct voltagedomain".
But shouldn't this flag be part of PMIC struct?
Voltage scalability depends on the kind of VDD supply from PMIC. So even
if OMAP supports voltage scaling, we may not be able to scale the voltage
if PMIC does not support it.
> the MPU_IVA and CORE voltage domains.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/voltage.c | 3 +++
> arch/arm/mach-omap2/voltage.h | 2 ++
> arch/arm/mach-omap2/voltagedomains3xxx_data.c | 2 ++
> 3 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-
> omap2/voltage.c
> index f995003..bc944ff 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -1054,6 +1054,9 @@ int __init omap_voltage_late_init(void)
> pr_err("%s: Unable to create voltage debugfs main dir\n",
> __func__);
> list_for_each_entry(voltdm, &voltdm_list, node) {
> + if (!voltdm->scalable)
> + continue;
> +
> if (voltdm->vdd) {
> if (omap_vdd_data_configure(voltdm))
> continue;
> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-
> omap2/voltage.h
> index 5440298..25cfb5c 100644
> --- a/arch/arm/mach-omap2/voltage.h
> +++ b/arch/arm/mach-omap2/voltage.h
> @@ -53,11 +53,13 @@ struct omap_vfsm_instance_data {
> /**
> * struct voltagedomain - omap voltage domain global structure.
> * @name: Name of the voltage domain which can be used as a unique
> identifier.
> + * @scalable: Whether or not this voltage domain is scalable
> * @node: list_head linking all voltage domains
> * @vdd: to be removed
> */
> struct voltagedomain {
> char *name;
> + bool scalable;
> struct list_head node;
> struct omap_vdd_info *vdd;
> };
> diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> index b476ee6..e9664843 100644
> --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
> @@ -61,11 +61,13 @@ static struct omap_vdd_info omap3_vdd2_info =
> {
>
> static struct voltagedomain omap3_voltdm_mpu = {
> .name = "mpu_iva",
> + .scalable = true,
> .vdd = &omap3_vdd1_info,
> };
>
> static struct voltagedomain omap3_voltdm_core = {
> .name = "core",
> + .scalable = true,
> .vdd = &omap3_vdd2_info,
> };
Why is this applicable only for OMAP3 and not for OMAP4?
Vishwa
>
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain
2011-03-24 5:23 ` Vishwanath Sripathy
@ 2011-03-24 14:12 ` Kevin Hilman
2011-03-24 14:54 ` Cousson, Benoit
0 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 14:12 UTC (permalink / raw)
To: Vishwanath Sripathy; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Vishwanath Sripathy <vishwanath.bs@ti.com> writes:
>> -----Original Message-----
>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
>> owner@vger.kernel.org] On Behalf Of Kevin Hilman
>> Sent: Thursday, March 24, 2011 5:30 AM
>> To: linux-omap@vger.kernel.org
>> Cc: Paul Walmsely; Benoit Cousson
>> Subject: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to
>> voltagedomain
>>
>> Add a 'bool scalable' flag to the struct powerdomain and set it for
>
> I suppose you meant "struct voltagedomain".
yes
> But shouldn't this flag be part of PMIC struct?
> Voltage scalability depends on the kind of VDD supply from PMIC. So even
> if OMAP supports voltage scaling, we may not be able to scale the voltage
> if PMIC does not support it.
That's a good point. Probably I can drop this flag and just use the
existence of the various fields of the voltage domain (pmic, vc, vp,
etc.) to determine if the voltdm can scale.
Kevin
>> the MPU_IVA and CORE voltage domains.
>
>>
>> Signed-off-by: Kevin Hilman <khilman@ti.com>
>> ---
>> arch/arm/mach-omap2/voltage.c | 3 +++
>> arch/arm/mach-omap2/voltage.h | 2 ++
>> arch/arm/mach-omap2/voltagedomains3xxx_data.c | 2 ++
>> 3 files changed, 7 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-
>> omap2/voltage.c
>> index f995003..bc944ff 100644
>> --- a/arch/arm/mach-omap2/voltage.c
>> +++ b/arch/arm/mach-omap2/voltage.c
>> @@ -1054,6 +1054,9 @@ int __init omap_voltage_late_init(void)
>> pr_err("%s: Unable to create voltage debugfs main dir\n",
>> __func__);
>> list_for_each_entry(voltdm, &voltdm_list, node) {
>> + if (!voltdm->scalable)
>> + continue;
>> +
>> if (voltdm->vdd) {
>> if (omap_vdd_data_configure(voltdm))
>> continue;
>> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-
>> omap2/voltage.h
>> index 5440298..25cfb5c 100644
>> --- a/arch/arm/mach-omap2/voltage.h
>> +++ b/arch/arm/mach-omap2/voltage.h
>> @@ -53,11 +53,13 @@ struct omap_vfsm_instance_data {
>> /**
>> * struct voltagedomain - omap voltage domain global structure.
>> * @name: Name of the voltage domain which can be used as a unique
>> identifier.
>> + * @scalable: Whether or not this voltage domain is scalable
>> * @node: list_head linking all voltage domains
>> * @vdd: to be removed
>> */
>> struct voltagedomain {
>> char *name;
>> + bool scalable;
>> struct list_head node;
>> struct omap_vdd_info *vdd;
>> };
>> diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
>> b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
>> index b476ee6..e9664843 100644
>> --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
>> +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
>> @@ -61,11 +61,13 @@ static struct omap_vdd_info omap3_vdd2_info =
>> {
>>
>> static struct voltagedomain omap3_voltdm_mpu = {
>> .name = "mpu_iva",
>> + .scalable = true,
>> .vdd = &omap3_vdd1_info,
>> };
>>
>> static struct voltagedomain omap3_voltdm_core = {
>> .name = "core",
>> + .scalable = true,
>> .vdd = &omap3_vdd2_info,
>> };
> Why is this applicable only for OMAP3 and not for OMAP4?
>
> Vishwa
>>
>> --
>> 1.7.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain
2011-03-24 14:12 ` Kevin Hilman
@ 2011-03-24 14:54 ` Cousson, Benoit
2011-03-24 17:31 ` Vishwanath Sripathy
0 siblings, 1 reply; 50+ messages in thread
From: Cousson, Benoit @ 2011-03-24 14:54 UTC (permalink / raw)
To: Hilman, Kevin
Cc: Sripathy, Vishwanath, linux-omap@vger.kernel.org, Paul Walmsely
On 3/24/2011 3:12 PM, Hilman, Kevin wrote:
> Vishwanath Sripathy<vishwanath.bs@ti.com> writes:
>
>>> -----Original Message-----
>>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
>>> owner@vger.kernel.org] On Behalf Of Kevin Hilman
>>> Sent: Thursday, March 24, 2011 5:30 AM
>>> To: linux-omap@vger.kernel.org
>>> Cc: Paul Walmsely; Benoit Cousson
>>> Subject: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to
>>> voltagedomain
>>>
>>> Add a 'bool scalable' flag to the struct powerdomain and set it for
>>
>> I suppose you meant "struct voltagedomain".
>
> yes
>
>> But shouldn't this flag be part of PMIC struct?
>> Voltage scalability depends on the kind of VDD supply from PMIC. So even
>> if OMAP supports voltage scaling, we may not be able to scale the voltage
>> if PMIC does not support it.
>
> That's a good point. Probably I can drop this flag and just use the
> existence of the various fields of the voltage domain (pmic, vc, vp,
> etc.) to determine if the voltdm can scale.
Mmm, the scalability is still a characteristic of the OMAP voltage
domain. Some are scalable with a supported range of voltage, some are not.
So that information is relevant in the voltage domain. Then the
regulator framework will have as well some information about the range
that should match what OMAP is able to do.
Benoit
^ permalink raw reply [flat|nested] 50+ messages in thread
* RE: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain
2011-03-24 14:54 ` Cousson, Benoit
@ 2011-03-24 17:31 ` Vishwanath Sripathy
0 siblings, 0 replies; 50+ messages in thread
From: Vishwanath Sripathy @ 2011-03-24 17:31 UTC (permalink / raw)
To: Benoit Cousson, Kevin Hilman; +Cc: linux-omap, Paul Walmsely
> -----Original Message-----
> From: Cousson, Benoit [mailto:b-cousson@ti.com]
> Sent: Thursday, March 24, 2011 8:24 PM
> To: Hilman, Kevin
> Cc: Sripathy, Vishwanath; linux-omap@vger.kernel.org; Paul Walmsely
> Subject: Re: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to
> voltagedomain
>
> On 3/24/2011 3:12 PM, Hilman, Kevin wrote:
> > Vishwanath Sripathy<vishwanath.bs@ti.com> writes:
> >
> >>> -----Original Message-----
> >>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
> >>> owner@vger.kernel.org] On Behalf Of Kevin Hilman
> >>> Sent: Thursday, March 24, 2011 5:30 AM
> >>> To: linux-omap@vger.kernel.org
> >>> Cc: Paul Walmsely; Benoit Cousson
> >>> Subject: [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to
> >>> voltagedomain
> >>>
> >>> Add a 'bool scalable' flag to the struct powerdomain and set it for
> >>
> >> I suppose you meant "struct voltagedomain".
> >
> > yes
> >
> >> But shouldn't this flag be part of PMIC struct?
> >> Voltage scalability depends on the kind of VDD supply from PMIC. So
> even
> >> if OMAP supports voltage scaling, we may not be able to scale the
> voltage
> >> if PMIC does not support it.
> >
> > That's a good point. Probably I can drop this flag and just use the
> > existence of the various fields of the voltage domain (pmic, vc, vp,
> > etc.) to determine if the voltdm can scale.
>
> Mmm, the scalability is still a characteristic of the OMAP voltage
> domain. Some are scalable with a supported range of voltage, some are
> not.
Then should we need this flag in both Voltage domain as well as PMIC?
If both are scalable then only voltage can be scaled I suppose.
Vishwa
>
> So that information is relevant in the voltage domain. Then the
> regulator framework will have as well some information about the range
> that should match what OMAP is able to do.
>
> Benoit
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 08/19] OMAP2+: powerdomain: add voltagedomain to struct powerdomain
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (6 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 07/19] OMAP3: voltage: add scalable flag to voltagedomain Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:05 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 09/19] OMAP2: add voltage domains and connect to powerdomains Kevin Hilman
` (12 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Each powerdomain is associated with a powerdomain. Add an entry to
struct powerdomain where the enclosing voltagedomain can be
referenced.
Modeled after similar relationship between clockdomains and powerdomains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/powerdomain.h | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
index 027f40b..cc03a0d 100644
--- a/arch/arm/mach-omap2/powerdomain.h
+++ b/arch/arm/mach-omap2/powerdomain.h
@@ -24,6 +24,8 @@
#include <plat/cpu.h>
+#include "voltage.h"
+
/* Powerdomain basic power states */
#define PWRDM_POWER_OFF 0x0
#define PWRDM_POWER_RET 0x1
@@ -78,6 +80,7 @@ struct powerdomain;
/**
* struct powerdomain - OMAP powerdomain
* @name: Powerdomain name
+ * @voltdm: voltagedomain containing this powerdomain
* @omap_chip: represents the OMAP chip types containing this pwrdm
* @prcm_offs: the address offset from CM_BASE/PRM_BASE
* @prcm_partition: (OMAP4 only) the PRCM partition ID containing @prcm_offs
@@ -98,6 +101,10 @@ struct powerdomain;
*/
struct powerdomain {
const char *name;
+ union {
+ const char *name;
+ struct voltagedomain *ptr;
+ } voltdm;
const struct omap_chip_id omap_chip;
const s16 prcm_offs;
const u8 pwrsts;
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 08/19] OMAP2+: powerdomain: add voltagedomain to struct powerdomain
2011-03-24 0:00 ` [PATCH/RFC 08/19] OMAP2+: powerdomain: add voltagedomain to struct powerdomain Kevin Hilman
@ 2011-03-25 9:05 ` Jean Pihet
2011-03-25 15:49 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:05 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> Each powerdomain is associated with a powerdomain. Add an entry to
Do you mean '... with a voltage domain'?
> struct powerdomain where the enclosing voltagedomain can be
> referenced.
>
> Modeled after similar relationship between clockdomains and powerdomains.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/powerdomain.h | 7 +++++++
> 1 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
> index 027f40b..cc03a0d 100644
> --- a/arch/arm/mach-omap2/powerdomain.h
> +++ b/arch/arm/mach-omap2/powerdomain.h
> @@ -24,6 +24,8 @@
>
> #include <plat/cpu.h>
>
> +#include "voltage.h"
> +
> /* Powerdomain basic power states */
> #define PWRDM_POWER_OFF 0x0
> #define PWRDM_POWER_RET 0x1
> @@ -78,6 +80,7 @@ struct powerdomain;
> /**
> * struct powerdomain - OMAP powerdomain
> * @name: Powerdomain name
> + * @voltdm: voltagedomain containing this powerdomain
> * @omap_chip: represents the OMAP chip types containing this pwrdm
> * @prcm_offs: the address offset from CM_BASE/PRM_BASE
> * @prcm_partition: (OMAP4 only) the PRCM partition ID containing @prcm_offs
> @@ -98,6 +101,10 @@ struct powerdomain;
> */
> struct powerdomain {
> const char *name;
> + union {
> + const char *name;
> + struct voltagedomain *ptr;
> + } voltdm;
> const struct omap_chip_id omap_chip;
> const s16 prcm_offs;
> const u8 pwrsts;
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 09/19] OMAP2: add voltage domains and connect to powerdomains
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (7 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 08/19] OMAP2+: powerdomain: add voltagedomain to struct powerdomain Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains Kevin Hilman
` (11 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Create basic voltagedomains for OMAP2 and associate OMAP2 powerdomains
with the newly created voltage domains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/Makefile | 3 +-
arch/arm/mach-omap2/io.c | 2 +
arch/arm/mach-omap2/powerdomains2xxx_data.c | 4 +++
arch/arm/mach-omap2/voltage.h | 1 +
arch/arm/mach-omap2/voltagedomains2xxx_data.c | 33 +++++++++++++++++++++++++
5 files changed, 42 insertions(+), 1 deletions(-)
create mode 100644 arch/arm/mach-omap2/voltagedomains2xxx_data.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 82b2a67..ce2105c 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -91,7 +91,8 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \
# OMAP voltage domains
ifeq ($(CONFIG_PM),y)
voltagedomain-common := voltage.o
-obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common)
+obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \
+ voltagedomains2xxx_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \
voltagedomains3xxx_data.o
obj-$(CONFIG_ARCH_OMAP4) += $(voltagedomain-common) \
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 44c2c3e..b5c8e80 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -356,10 +356,12 @@ void __init omap2_init_common_infrastructure(void)
u8 postsetup_state;
if (cpu_is_omap242x()) {
+ omap2xxx_voltagedomains_init();
omap2xxx_powerdomains_init();
omap2xxx_clockdomains_init();
omap2420_hwmod_init();
} else if (cpu_is_omap243x()) {
+ omap2xxx_voltagedomains_init();
omap2xxx_powerdomains_init();
omap2xxx_clockdomains_init();
omap2430_hwmod_init();
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_data.c
index cc389fb..274f64c 100644
--- a/arch/arm/mach-omap2/powerdomains2xxx_data.c
+++ b/arch/arm/mach-omap2/powerdomains2xxx_data.c
@@ -38,6 +38,7 @@ static struct powerdomain dsp_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON,
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain mpu_24xx_pwrdm = {
@@ -53,6 +54,7 @@ static struct powerdomain mpu_24xx_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON,
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain core_24xx_pwrdm = {
@@ -71,6 +73,7 @@ static struct powerdomain core_24xx_pwrdm = {
[1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
[2] = PWRSTS_OFF_RET_ON, /* MEM3ONSTATE */
},
+ .voltdm = { .name = "core" },
};
@@ -95,6 +98,7 @@ static struct powerdomain mdm_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
#endif /* CONFIG_SOC_OMAP2430 */
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 25cfb5c..cacd76e 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -180,6 +180,7 @@ static inline int omap_voltage_late_init(void)
}
#endif
+extern void omap2xxx_voltagedomains_init(void);
extern void omap3xxx_voltagedomains_init(void);
extern void omap44xx_voltagedomains_init(void);
diff --git a/arch/arm/mach-omap2/voltagedomains2xxx_data.c b/arch/arm/mach-omap2/voltagedomains2xxx_data.c
new file mode 100644
index 0000000..4993bbe
--- /dev/null
+++ b/arch/arm/mach-omap2/voltagedomains2xxx_data.c
@@ -0,0 +1,33 @@
+/*
+ * OMAP3 voltage domain data
+ *
+ * Copyright (C) 2007, 2010 Texas Instruments, Inc.
+
+ * 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.
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include "voltage.h"
+
+static struct voltagedomain omap2_voltdm_core = {
+ .name = "core",
+ .scalable = true,
+};
+
+static struct voltagedomain omap2_voltdm_wkup = {
+ .name = "wkup",
+};
+
+static struct voltagedomain *voltagedomains_omap2[] __initdata = {
+ &omap2_voltdm_core,
+ &omap2_voltdm_wkup,
+ NULL,
+};
+
+void __init omap2xxx_voltagedomains_init(void)
+{
+ voltdm_init(voltagedomains_omap2);
+}
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (8 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 09/19] OMAP2: add voltage domains and connect to powerdomains Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:09 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 11/19] OMAP4: " Kevin Hilman
` (10 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Add voltage domain name to indicate which voltagedomain each
powerdomain is in. A missing voltage domain name means that that
powerdomain is not in one of the currently scalable voltage domains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c | 2 ++
arch/arm/mach-omap2/powerdomains3xxx_data.c | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
index 4210c33..45aa4b7 100644
--- a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
+++ b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
@@ -70,6 +70,7 @@ struct powerdomain gfx_omap2_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
struct powerdomain wkup_omap2_pwrdm = {
@@ -77,4 +78,5 @@ struct powerdomain wkup_omap2_pwrdm = {
.prcm_offs = WKUP_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
.pwrsts = PWRSTS_ON,
+ .voltdm = { .name = "wkup" },
};
diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c
index 9c9c113..09bdfcf 100644
--- a/arch/arm/mach-omap2/powerdomains3xxx_data.c
+++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c
@@ -52,6 +52,7 @@ static struct powerdomain iva2_pwrdm = {
[2] = PWRSTS_OFF_ON,
[3] = PWRSTS_ON,
},
+ .voltdm = { .name = "mpu_iva" },
};
static struct powerdomain mpu_3xxx_pwrdm = {
@@ -68,6 +69,7 @@ static struct powerdomain mpu_3xxx_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_OFF_ON,
},
+ .voltdm = { .name = "mpu_iva" },
};
/*
@@ -98,6 +100,7 @@ static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
[0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
[1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain core_3xxx_es3_1_pwrdm = {
@@ -121,6 +124,7 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = {
[0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
[1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain dss_pwrdm = {
@@ -136,6 +140,7 @@ static struct powerdomain dss_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
/*
@@ -157,6 +162,7 @@ static struct powerdomain sgx_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain cam_pwrdm = {
@@ -172,6 +178,7 @@ static struct powerdomain cam_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain per_pwrdm = {
@@ -187,12 +194,14 @@ static struct powerdomain per_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain emu_pwrdm = {
.name = "emu_pwrdm",
.prcm_offs = OMAP3430_EMU_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .voltdm = { .name = "core" },
};
static struct powerdomain neon_pwrdm = {
@@ -201,6 +210,7 @@ static struct powerdomain neon_pwrdm = {
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
.pwrsts = PWRSTS_OFF_RET_ON,
.pwrsts_logic_ret = PWRSTS_RET,
+ .voltdm = { .name = "mpu_iva" },
};
static struct powerdomain usbhost_pwrdm = {
@@ -223,36 +233,42 @@ static struct powerdomain usbhost_pwrdm = {
.pwrsts_mem_on = {
[0] = PWRSTS_ON, /* MEMONSTATE */
},
+ .voltdm = { .name = "core" },
};
static struct powerdomain dpll1_pwrdm = {
.name = "dpll1_pwrdm",
.prcm_offs = MPU_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .voltdm = { .name = "mpu_iva" },
};
static struct powerdomain dpll2_pwrdm = {
.name = "dpll2_pwrdm",
.prcm_offs = OMAP3430_IVA2_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .voltdm = { .name = "mpu_iva" },
};
static struct powerdomain dpll3_pwrdm = {
.name = "dpll3_pwrdm",
.prcm_offs = PLL_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .voltdm = { .name = "core" },
};
static struct powerdomain dpll4_pwrdm = {
.name = "dpll4_pwrdm",
.prcm_offs = PLL_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+ .voltdm = { .name = "core" },
};
static struct powerdomain dpll5_pwrdm = {
.name = "dpll5_pwrdm",
.prcm_offs = PLL_MOD,
.omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
+ .voltdm = { .name = "core" },
};
/* As powerdomains are added or removed above, this list must also be changed */
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains
2011-03-24 0:00 ` [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains Kevin Hilman
@ 2011-03-25 9:09 ` Jean Pihet
2011-03-25 15:51 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:09 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> Add voltage domain name to indicate which voltagedomain each
> powerdomain is in. A missing voltage domain name means that that
> powerdomain is not in one of the currently scalable voltage domains.
Is that the role of the 'scalable' flag? Why not fill in all
powerdomain structs and set the flag on scalable VDs only?
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c | 2 ++
> arch/arm/mach-omap2/powerdomains3xxx_data.c | 16 ++++++++++++++++
> 2 files changed, 18 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
> index 4210c33..45aa4b7 100644
> --- a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
> +++ b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c
> @@ -70,6 +70,7 @@ struct powerdomain gfx_omap2_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> struct powerdomain wkup_omap2_pwrdm = {
> @@ -77,4 +78,5 @@ struct powerdomain wkup_omap2_pwrdm = {
> .prcm_offs = WKUP_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
> .pwrsts = PWRSTS_ON,
> + .voltdm = { .name = "wkup" },
> };
> diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c
> index 9c9c113..09bdfcf 100644
> --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c
> +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c
> @@ -52,6 +52,7 @@ static struct powerdomain iva2_pwrdm = {
> [2] = PWRSTS_OFF_ON,
> [3] = PWRSTS_ON,
> },
> + .voltdm = { .name = "mpu_iva" },
> };
>
> static struct powerdomain mpu_3xxx_pwrdm = {
> @@ -68,6 +69,7 @@ static struct powerdomain mpu_3xxx_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_OFF_ON,
> },
> + .voltdm = { .name = "mpu_iva" },
> };
>
> /*
> @@ -98,6 +100,7 @@ static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
> [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
> [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain core_3xxx_es3_1_pwrdm = {
> @@ -121,6 +124,7 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = {
> [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
> [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain dss_pwrdm = {
> @@ -136,6 +140,7 @@ static struct powerdomain dss_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> /*
> @@ -157,6 +162,7 @@ static struct powerdomain sgx_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain cam_pwrdm = {
> @@ -172,6 +178,7 @@ static struct powerdomain cam_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain per_pwrdm = {
> @@ -187,12 +194,14 @@ static struct powerdomain per_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain emu_pwrdm = {
> .name = "emu_pwrdm",
> .prcm_offs = OMAP3430_EMU_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain neon_pwrdm = {
> @@ -201,6 +210,7 @@ static struct powerdomain neon_pwrdm = {
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> .pwrsts = PWRSTS_OFF_RET_ON,
> .pwrsts_logic_ret = PWRSTS_RET,
> + .voltdm = { .name = "mpu_iva" },
> };
>
> static struct powerdomain usbhost_pwrdm = {
> @@ -223,36 +233,42 @@ static struct powerdomain usbhost_pwrdm = {
> .pwrsts_mem_on = {
> [0] = PWRSTS_ON, /* MEMONSTATE */
> },
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain dpll1_pwrdm = {
> .name = "dpll1_pwrdm",
> .prcm_offs = MPU_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> + .voltdm = { .name = "mpu_iva" },
> };
>
> static struct powerdomain dpll2_pwrdm = {
> .name = "dpll2_pwrdm",
> .prcm_offs = OMAP3430_IVA2_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> + .voltdm = { .name = "mpu_iva" },
> };
>
> static struct powerdomain dpll3_pwrdm = {
> .name = "dpll3_pwrdm",
> .prcm_offs = PLL_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain dpll4_pwrdm = {
> .name = "dpll4_pwrdm",
> .prcm_offs = PLL_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> + .voltdm = { .name = "core" },
> };
>
> static struct powerdomain dpll5_pwrdm = {
> .name = "dpll5_pwrdm",
> .prcm_offs = PLL_MOD,
> .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
> + .voltdm = { .name = "core" },
> };
>
> /* As powerdomains are added or removed above, this list must also be changed */
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains
2011-03-25 9:09 ` Jean Pihet
@ 2011-03-25 15:51 ` Kevin Hilman
2011-03-25 16:43 ` Jean Pihet
0 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 15:51 UTC (permalink / raw)
To: Jean Pihet; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Jean Pihet <jean.pihet@newoldbits.com> writes:
> On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
>> Add voltage domain name to indicate which voltagedomain each
>> powerdomain is in. A missing voltage domain name means that that
>> powerdomain is not in one of the currently scalable voltage domains.
>
> Is that the role of the 'scalable' flag? Why not fill in all
> powerdomain structs and set the flag on scalable VDs only?
>
Yes.
This changelog was written before I added the scalable flag. Will fix
up the changelog.
Thanks,
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains
2011-03-25 15:51 ` Kevin Hilman
@ 2011-03-25 16:43 ` Jean Pihet
0 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 16:43 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Fri, Mar 25, 2011 at 4:51 PM, Kevin Hilman <khilman@ti.com> wrote:
> Jean Pihet <jean.pihet@newoldbits.com> writes:
>
>> On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
>>> Add voltage domain name to indicate which voltagedomain each
>>> powerdomain is in. A missing voltage domain name means that that
>>> powerdomain is not in one of the currently scalable voltage domains.
>>
>> Is that the role of the 'scalable' flag? Why not fill in all
>> powerdomain structs and set the flag on scalable VDs only?
>>
>
> Yes.
>
> This changelog was written before I added the scalable flag. Will fix
> up the changelog.
Ok if the code does accordingly (which I suppose it does).
>
> Thanks,
>
> Kevin
>
Jean
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 11/19] OMAP4: powerdomain data: add voltage domains
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (9 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 10/19] OMAP3: powerdomain data: add voltage domains Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register Kevin Hilman
` (9 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
From: Benoit Cousson <b-cousson@ti.com>
Add voltage domain name to indicate which voltagedomain each
powerdomain is in.
The fixed voltage domain like ldo_wakeup for emu and wkup power
domain is added too.
Update the TI copyright date to 2011.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/powerdomains44xx_data.c | 18 +++++++++++++++++-
1 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomains44xx_data.c b/arch/arm/mach-omap2/powerdomains44xx_data.c
index c4222c7..3a95b6a 100644
--- a/arch/arm/mach-omap2/powerdomains44xx_data.c
+++ b/arch/arm/mach-omap2/powerdomains44xx_data.c
@@ -1,7 +1,7 @@
/*
* OMAP4 Power domains framework
*
- * Copyright (C) 2009-2010 Texas Instruments, Inc.
+ * Copyright (C) 2009-2011 Texas Instruments, Inc.
* Copyright (C) 2009-2011 Nokia Corporation
*
* Abhijit Pagare (abhijitpagare@ti.com)
@@ -33,6 +33,7 @@
/* core_44xx_pwrdm: CORE power domain */
static struct powerdomain core_44xx_pwrdm = {
.name = "core_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_CORE_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -59,6 +60,7 @@ static struct powerdomain core_44xx_pwrdm = {
/* gfx_44xx_pwrdm: 3D accelerator power domain */
static struct powerdomain gfx_44xx_pwrdm = {
.name = "gfx_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_GFX_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -76,6 +78,7 @@ static struct powerdomain gfx_44xx_pwrdm = {
/* abe_44xx_pwrdm: Audio back end power domain */
static struct powerdomain abe_44xx_pwrdm = {
.name = "abe_pwrdm",
+ .voltdm = { .name = "iva" },
.prcm_offs = OMAP4430_PRM_ABE_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -96,6 +99,7 @@ static struct powerdomain abe_44xx_pwrdm = {
/* dss_44xx_pwrdm: Display subsystem power domain */
static struct powerdomain dss_44xx_pwrdm = {
.name = "dss_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_DSS_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -114,6 +118,7 @@ static struct powerdomain dss_44xx_pwrdm = {
/* tesla_44xx_pwrdm: Tesla processor power domain */
static struct powerdomain tesla_44xx_pwrdm = {
.name = "tesla_pwrdm",
+ .voltdm = { .name = "iva" },
.prcm_offs = OMAP4430_PRM_TESLA_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -136,6 +141,7 @@ static struct powerdomain tesla_44xx_pwrdm = {
/* wkup_44xx_pwrdm: Wake-up power domain */
static struct powerdomain wkup_44xx_pwrdm = {
.name = "wkup_pwrdm",
+ .voltdm = { .name = "ldo_wakeup" },
.prcm_offs = OMAP4430_PRM_WKUP_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -152,6 +158,7 @@ static struct powerdomain wkup_44xx_pwrdm = {
/* cpu0_44xx_pwrdm: MPU0 processor and Neon coprocessor power domain */
static struct powerdomain cpu0_44xx_pwrdm = {
.name = "cpu0_pwrdm",
+ .voltdm = { .name = "mpu" },
.prcm_offs = OMAP4430_PRCM_MPU_CPU0_INST,
.prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -169,6 +176,7 @@ static struct powerdomain cpu0_44xx_pwrdm = {
/* cpu1_44xx_pwrdm: MPU1 processor and Neon coprocessor power domain */
static struct powerdomain cpu1_44xx_pwrdm = {
.name = "cpu1_pwrdm",
+ .voltdm = { .name = "mpu" },
.prcm_offs = OMAP4430_PRCM_MPU_CPU1_INST,
.prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -186,6 +194,7 @@ static struct powerdomain cpu1_44xx_pwrdm = {
/* emu_44xx_pwrdm: Emulation power domain */
static struct powerdomain emu_44xx_pwrdm = {
.name = "emu_pwrdm",
+ .voltdm = { .name = "ldo_wakeup" },
.prcm_offs = OMAP4430_PRM_EMU_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -202,6 +211,7 @@ static struct powerdomain emu_44xx_pwrdm = {
/* mpu_44xx_pwrdm: Modena processor and the Neon coprocessor power domain */
static struct powerdomain mpu_44xx_pwrdm = {
.name = "mpu_pwrdm",
+ .voltdm = { .name = "mpu" },
.prcm_offs = OMAP4430_PRM_MPU_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -223,6 +233,7 @@ static struct powerdomain mpu_44xx_pwrdm = {
/* ivahd_44xx_pwrdm: IVA-HD power domain */
static struct powerdomain ivahd_44xx_pwrdm = {
.name = "ivahd_pwrdm",
+ .voltdm = { .name = "iva" },
.prcm_offs = OMAP4430_PRM_IVAHD_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -247,6 +258,7 @@ static struct powerdomain ivahd_44xx_pwrdm = {
/* cam_44xx_pwrdm: Camera subsystem power domain */
static struct powerdomain cam_44xx_pwrdm = {
.name = "cam_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_CAM_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -264,6 +276,7 @@ static struct powerdomain cam_44xx_pwrdm = {
/* l3init_44xx_pwrdm: L3 initators pheripherals power domain */
static struct powerdomain l3init_44xx_pwrdm = {
.name = "l3init_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_L3INIT_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -282,6 +295,7 @@ static struct powerdomain l3init_44xx_pwrdm = {
/* l4per_44xx_pwrdm: Target peripherals power domain */
static struct powerdomain l4per_44xx_pwrdm = {
.name = "l4per_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_L4PER_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -305,6 +319,7 @@ static struct powerdomain l4per_44xx_pwrdm = {
*/
static struct powerdomain always_on_core_44xx_pwrdm = {
.name = "always_on_core_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_ALWAYS_ON_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
@@ -314,6 +329,7 @@ static struct powerdomain always_on_core_44xx_pwrdm = {
/* cefuse_44xx_pwrdm: Customer efuse controller power domain */
static struct powerdomain cefuse_44xx_pwrdm = {
.name = "cefuse_pwrdm",
+ .voltdm = { .name = "core" },
.prcm_offs = OMAP4430_PRM_CEFUSE_INST,
.prcm_partition = OMAP4430_PRM_PARTITION,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (10 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 11/19] OMAP4: " Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:18 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain Kevin Hilman
` (8 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
When a powerdomain is registered, lookup the voltage domain by name
and keep a pointer to the containing voltagedomain in the powerdomain
structure.
Modeled after similar method between powerdomain and clockdomain layers.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/powerdomain.c | 21 +++++++++++++++++++++
arch/arm/mach-omap2/powerdomain.h | 1 +
arch/arm/mach-omap2/voltage.h | 1 +
3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 49c6513..8fccd4b 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -77,6 +77,7 @@ static struct powerdomain *_pwrdm_lookup(const char *name)
static int _pwrdm_register(struct powerdomain *pwrdm)
{
int i;
+ struct voltagedomain *voltdm;
if (!pwrdm || !pwrdm->name)
return -EINVAL;
@@ -94,6 +95,14 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
if (_pwrdm_lookup(pwrdm->name))
return -EEXIST;
+ voltdm = voltdm_lookup(pwrdm->voltdm.name);
+ if (!voltdm) {
+ pr_err("powerdomain: %s: voltagedomain %s does not exist\n",
+ pwrdm->name, pwrdm->voltdm.name);
+ return -EINVAL;
+ }
+ pwrdm->voltdm.ptr = voltdm;
+
list_add(&pwrdm->node, &pwrdm_list);
/* Initialize the powerdomain's state counter */
@@ -383,6 +392,18 @@ int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
}
/**
+ * pwrdm_get_voltdm - return a ptr to the voltdm that this pwrdm resides in
+ * @pwrdm: struct powerdomain *
+ *
+ * Return a pointer to the struct voltageomain that the specified powerdomain
+ * @pwrdm exists in.
+ */
+struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm)
+{
+ return pwrdm->voltdm.ptr;
+}
+
+/**
* pwrdm_get_mem_bank_count - get number of memory banks in this powerdomain
* @pwrdm: struct powerdomain *
*
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
index cc03a0d..3a1ec37 100644
--- a/arch/arm/mach-omap2/powerdomain.h
+++ b/arch/arm/mach-omap2/powerdomain.h
@@ -183,6 +183,7 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
int (*fn)(struct powerdomain *pwrdm,
struct clockdomain *clkdm));
+struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm);
int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index cacd76e..966aa88 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -186,4 +186,5 @@ extern void omap44xx_voltagedomains_init(void);
struct voltagedomain *voltdm_lookup(const char *name);
void voltdm_init(struct voltagedomain **voltdm_list);
+int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
#endif
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register
2011-03-24 0:00 ` [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register Kevin Hilman
@ 2011-03-25 9:18 ` Jean Pihet
2011-03-25 15:52 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:18 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> When a powerdomain is registered, lookup the voltage domain by name
> and keep a pointer to the containing voltagedomain in the powerdomain
> structure.
>
> Modeled after similar method between powerdomain and clockdomain layers.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/powerdomain.c | 21 +++++++++++++++++++++
> arch/arm/mach-omap2/powerdomain.h | 1 +
> arch/arm/mach-omap2/voltage.h | 1 +
> 3 files changed, 23 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
> index 49c6513..8fccd4b 100644
> --- a/arch/arm/mach-omap2/powerdomain.c
> +++ b/arch/arm/mach-omap2/powerdomain.c
> @@ -77,6 +77,7 @@ static struct powerdomain *_pwrdm_lookup(const char *name)
> static int _pwrdm_register(struct powerdomain *pwrdm)
> {
> int i;
> + struct voltagedomain *voltdm;
>
> if (!pwrdm || !pwrdm->name)
> return -EINVAL;
> @@ -94,6 +95,14 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
> if (_pwrdm_lookup(pwrdm->name))
> return -EEXIST;
>
> + voltdm = voltdm_lookup(pwrdm->voltdm.name);
> + if (!voltdm) {
> + pr_err("powerdomain: %s: voltagedomain %s does not exist\n",
> + pwrdm->name, pwrdm->voltdm.name);
> + return -EINVAL;
Per patch 10/19 some power domains do not have an associated voltage
domain struct filled in. This will result in failure of the power
domain registration. I think this is not expected.
> + }
> + pwrdm->voltdm.ptr = voltdm;
> +
> list_add(&pwrdm->node, &pwrdm_list);
>
> /* Initialize the powerdomain's state counter */
> @@ -383,6 +392,18 @@ int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
> }
>
> /**
> + * pwrdm_get_voltdm - return a ptr to the voltdm that this pwrdm resides in
> + * @pwrdm: struct powerdomain *
> + *
> + * Return a pointer to the struct voltageomain that the specified powerdomain
> + * @pwrdm exists in.
> + */
> +struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm)
> +{
> + return pwrdm->voltdm.ptr;
> +}
> +
> +/**
> * pwrdm_get_mem_bank_count - get number of memory banks in this powerdomain
> * @pwrdm: struct powerdomain *
> *
> diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
> index cc03a0d..3a1ec37 100644
> --- a/arch/arm/mach-omap2/powerdomain.h
> +++ b/arch/arm/mach-omap2/powerdomain.h
> @@ -183,6 +183,7 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
> int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
> int (*fn)(struct powerdomain *pwrdm,
> struct clockdomain *clkdm));
> +struct voltagedomain *pwrdm_get_voltdm(struct powerdomain *pwrdm);
>
> int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm);
>
> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
> index cacd76e..966aa88 100644
> --- a/arch/arm/mach-omap2/voltage.h
> +++ b/arch/arm/mach-omap2/voltage.h
> @@ -186,4 +186,5 @@ extern void omap44xx_voltagedomains_init(void);
>
> struct voltagedomain *voltdm_lookup(const char *name);
> void voltdm_init(struct voltagedomain **voltdm_list);
> +int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
> #endif
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register
2011-03-25 9:18 ` Jean Pihet
@ 2011-03-25 15:52 ` Kevin Hilman
0 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 15:52 UTC (permalink / raw)
To: Jean Pihet; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Jean Pihet <jean.pihet@newoldbits.com> writes:
[...]
>> @@ -94,6 +95,14 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
>> if (_pwrdm_lookup(pwrdm->name))
>> return -EEXIST;
>>
>> + voltdm = voltdm_lookup(pwrdm->voltdm.name);
>> + if (!voltdm) {
>> + pr_err("powerdomain: %s: voltagedomain %s does not exist\n",
>> + pwrdm->name, pwrdm->voltdm.name);
>> + return -EINVAL;
>
> Per patch 10/19 some power domains do not have an associated voltage
> domain struct filled in. This will result in failure of the power
> domain registration. I think this is not expected.
>
Right. I'll fix up the changelog in patch 10. Now, all powerdomains
are required to have a voltage domain.
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (11 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 12/19] OMAP2+: powerdomain: add voltage domain lookup during register Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:22 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 14/19] OMAP2+: voltage: split voltage controller (VC) code into dedicated layer Kevin Hilman
` (7 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
When a powerdomain is registered and it has an associated voltage domain,
add the powerdomain to the voltagedomain using voltdm_add_pwrdm().
Also add voltagedomain iterator helper functions to iterate over all
registered voltagedomains and all powerdomains associated with a
voltagedomain.
Modeled after a similar relationship between clockdomains and powerdomains.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/powerdomain.c | 2 +
arch/arm/mach-omap2/powerdomain.h | 2 +
arch/arm/mach-omap2/voltage.c | 80 +++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/voltage.h | 15 +++++++
4 files changed, 99 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 8fccd4b..224272e 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -102,6 +102,8 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
return -EINVAL;
}
pwrdm->voltdm.ptr = voltdm;
+ INIT_LIST_HEAD(&pwrdm->voltdm_node);
+ voltdm_add_pwrdm(voltdm, pwrdm);
list_add(&pwrdm->node, &pwrdm_list);
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
index 3a1ec37..6a4f71a 100644
--- a/arch/arm/mach-omap2/powerdomain.h
+++ b/arch/arm/mach-omap2/powerdomain.h
@@ -92,6 +92,7 @@ struct powerdomain;
* @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON
* @pwrdm_clkdms: Clockdomains in this powerdomain
* @node: list_head linking all powerdomains
+ * @voltdm_node: list_head linking all powerdomains in a voltagedomain
* @state:
* @state_counter:
* @timer:
@@ -116,6 +117,7 @@ struct powerdomain {
const u8 prcm_partition;
struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
struct list_head node;
+ struct list_head voltdm_node;
int state;
unsigned state_counter[PWRDM_MAX_PWRSTS];
unsigned ret_logic_off_counter;
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index bc944ff..b1b5e38 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -36,6 +36,7 @@
#include "control.h"
#include "voltage.h"
+#include "powerdomain.h"
#include "vc.h"
#include "vp.h"
@@ -1085,11 +1086,90 @@ static struct voltagedomain *_voltdm_lookup(const char *name)
return voltdm;
}
+/**
+ * voltdm_add_pwrdm - add a powerdomain to a voltagedomain
+ * @voltdm: struct voltagedomain * to add the powerdomain to
+ * @pwrdm: struct powerdomain * to associate with a voltagedomain
+ *
+ * Associate the powerdomain @pwrdm with a voltagedomain @voltdm. This
+ * enables the use of voltdm_for_each_pwrdm(). Returns -EINVAL if
+ * presented with invalid pointers; -ENOMEM if memory could not be allocated;
+ * or 0 upon success.
+ */
+int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm)
+{
+ if (!voltdm || !pwrdm)
+ return -EINVAL;
+
+ pr_debug("voltagedomain: associating powerdomain %s with voltagedomain "
+ "%s\n", pwrdm->name, voltdm->name);
+
+ list_add(&pwrdm->voltdm_node, &voltdm->pwrdm_list);
+
+ return 0;
+}
+
+/**
+ * voltdm_for_each_pwrdm - call function for each pwrdm in a voltdm
+ * @voltdm: struct voltagedomain * to iterate over
+ * @fn: callback function *
+ *
+ * Call the supplied function @fn for each powerdomain in the
+ * voltagedomain @voltdm. Returns -EINVAL if presented with invalid
+ * pointers; or passes along the last return value of the callback
+ * function, which should be 0 for success or anything else to
+ * indicate failure.
+ */
+int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
+ int (*fn)(struct voltagedomain *voltdm,
+ struct powerdomain *pwrdm))
+{
+ struct powerdomain *pwrdm;
+ int ret = 0;
+
+ if (!fn)
+ return -EINVAL;
+
+ list_for_each_entry(pwrdm, &voltdm->pwrdm_list, voltdm_node)
+ ret = (*fn)(voltdm, pwrdm);
+
+ return ret;
+}
+
+/**
+ * voltdm_for_each - call function on each registered voltagedomain
+ * @fn: callback function *
+ *
+ * Call the supplied function @fn for each registered voltagedomain.
+ * The callback function @fn can return anything but 0 to bail out
+ * early from the iterator. Returns the last return value of the
+ * callback function, which should be 0 for success or anything else
+ * to indicate failure; or -EINVAL if the function pointer is null.
+ */
+int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
+ void *user)
+{
+ struct voltagedomain *temp_voltdm;
+ int ret = 0;
+
+ if (!fn)
+ return -EINVAL;
+
+ list_for_each_entry(temp_voltdm, &voltdm_list, node) {
+ ret = (*fn)(temp_voltdm, user);
+ if (ret)
+ break;
+ }
+
+ return ret;
+}
+
static int _voltdm_register(struct voltagedomain *voltdm)
{
if (!voltdm || !voltdm->name)
return -EINVAL;
+ INIT_LIST_HEAD(&voltdm->pwrdm_list);
list_add(&voltdm->node, &voltdm_list);
pr_debug("voltagedomain: registered %s\n", voltdm->name);
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 966aa88..df8d234 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -19,6 +19,13 @@
#include "vc.h"
#include "vp.h"
+struct powerdomain;
+
+/*
+ * Maximum number of powerdomains that can be associated with a voltagedomain.
+ */
+#define VOLTDM_MAX_PWRDMS 10
+
/* XXX document */
#define VOLTSCALE_VPFORCEUPDATE 1
#define VOLTSCALE_VCBYPASS 2
@@ -55,12 +62,15 @@ struct omap_vfsm_instance_data {
* @name: Name of the voltage domain which can be used as a unique identifier.
* @scalable: Whether or not this voltage domain is scalable
* @node: list_head linking all voltage domains
+ * @pwrdm_node: list_head linking all powerdomains in this voltagedomain
* @vdd: to be removed
+ * @pwrdms: powerdomains in this voltagedomain
*/
struct voltagedomain {
char *name;
bool scalable;
struct list_head node;
+ struct list_head pwrdm_list;
struct omap_vdd_info *vdd;
};
@@ -187,4 +197,9 @@ extern void omap44xx_voltagedomains_init(void);
struct voltagedomain *voltdm_lookup(const char *name);
void voltdm_init(struct voltagedomain **voltdm_list);
int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
+int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
+ void *user);
+int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
+ int (*fn)(struct voltagedomain *voltdm,
+ struct powerdomain *pwrdm));
#endif
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain
2011-03-24 0:00 ` [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain Kevin Hilman
@ 2011-03-25 9:22 ` Jean Pihet
2011-03-25 15:56 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:22 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> When a powerdomain is registered and it has an associated voltage domain,
> add the powerdomain to the voltagedomain using voltdm_add_pwrdm().
>
> Also add voltagedomain iterator helper functions to iterate over all
> registered voltagedomains and all powerdomains associated with a
> voltagedomain.
>
> Modeled after a similar relationship between clockdomains and powerdomains.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/powerdomain.c | 2 +
> arch/arm/mach-omap2/powerdomain.h | 2 +
> arch/arm/mach-omap2/voltage.c | 80 +++++++++++++++++++++++++++++++++++++
> arch/arm/mach-omap2/voltage.h | 15 +++++++
> 4 files changed, 99 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
> index 8fccd4b..224272e 100644
> --- a/arch/arm/mach-omap2/powerdomain.c
> +++ b/arch/arm/mach-omap2/powerdomain.c
> @@ -102,6 +102,8 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
> return -EINVAL;
> }
> pwrdm->voltdm.ptr = voltdm;
> + INIT_LIST_HEAD(&pwrdm->voltdm_node);
> + voltdm_add_pwrdm(voltdm, pwrdm);
>
> list_add(&pwrdm->node, &pwrdm_list);
>
> diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
> index 3a1ec37..6a4f71a 100644
> --- a/arch/arm/mach-omap2/powerdomain.h
> +++ b/arch/arm/mach-omap2/powerdomain.h
> @@ -92,6 +92,7 @@ struct powerdomain;
> * @pwrsts_mem_on: Possible memory bank pwrstates when pwrdm in ON
> * @pwrdm_clkdms: Clockdomains in this powerdomain
> * @node: list_head linking all powerdomains
> + * @voltdm_node: list_head linking all powerdomains in a voltagedomain
> * @state:
> * @state_counter:
> * @timer:
> @@ -116,6 +117,7 @@ struct powerdomain {
> const u8 prcm_partition;
> struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
> struct list_head node;
> + struct list_head voltdm_node;
> int state;
> unsigned state_counter[PWRDM_MAX_PWRSTS];
> unsigned ret_logic_off_counter;
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
> index bc944ff..b1b5e38 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -36,6 +36,7 @@
> #include "control.h"
>
> #include "voltage.h"
> +#include "powerdomain.h"
>
> #include "vc.h"
> #include "vp.h"
> @@ -1085,11 +1086,90 @@ static struct voltagedomain *_voltdm_lookup(const char *name)
> return voltdm;
> }
>
> +/**
> + * voltdm_add_pwrdm - add a powerdomain to a voltagedomain
> + * @voltdm: struct voltagedomain * to add the powerdomain to
> + * @pwrdm: struct powerdomain * to associate with a voltagedomain
> + *
> + * Associate the powerdomain @pwrdm with a voltagedomain @voltdm. This
> + * enables the use of voltdm_for_each_pwrdm(). Returns -EINVAL if
> + * presented with invalid pointers; -ENOMEM if memory could not be allocated;
> + * or 0 upon success.
> + */
> +int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm)
> +{
> + if (!voltdm || !pwrdm)
> + return -EINVAL;
> +
> + pr_debug("voltagedomain: associating powerdomain %s with voltagedomain "
> + "%s\n", pwrdm->name, voltdm->name);
> +
> + list_add(&pwrdm->voltdm_node, &voltdm->pwrdm_list);
> +
> + return 0;
> +}
> +
> +/**
> + * voltdm_for_each_pwrdm - call function for each pwrdm in a voltdm
> + * @voltdm: struct voltagedomain * to iterate over
> + * @fn: callback function *
> + *
> + * Call the supplied function @fn for each powerdomain in the
> + * voltagedomain @voltdm. Returns -EINVAL if presented with invalid
> + * pointers; or passes along the last return value of the callback
> + * function, which should be 0 for success or anything else to
> + * indicate failure.
> + */
> +int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
> + int (*fn)(struct voltagedomain *voltdm,
> + struct powerdomain *pwrdm))
> +{
> + struct powerdomain *pwrdm;
> + int ret = 0;
> +
> + if (!fn)
> + return -EINVAL;
> +
> + list_for_each_entry(pwrdm, &voltdm->pwrdm_list, voltdm_node)
> + ret = (*fn)(voltdm, pwrdm);
> +
> + return ret;
> +}
> +
> +/**
> + * voltdm_for_each - call function on each registered voltagedomain
> + * @fn: callback function *
> + *
> + * Call the supplied function @fn for each registered voltagedomain.
> + * The callback function @fn can return anything but 0 to bail out
> + * early from the iterator. Returns the last return value of the
> + * callback function, which should be 0 for success or anything else
> + * to indicate failure; or -EINVAL if the function pointer is null.
The function description does not match the prototype.
> + */
> +int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
> + void *user)
> +{
> + struct voltagedomain *temp_voltdm;
> + int ret = 0;
> +
> + if (!fn)
> + return -EINVAL;
> +
> + list_for_each_entry(temp_voltdm, &voltdm_list, node) {
> + ret = (*fn)(temp_voltdm, user);
> + if (ret)
> + break;
> + }
> +
> + return ret;
> +}
> +
> static int _voltdm_register(struct voltagedomain *voltdm)
> {
> if (!voltdm || !voltdm->name)
> return -EINVAL;
>
> + INIT_LIST_HEAD(&voltdm->pwrdm_list);
> list_add(&voltdm->node, &voltdm_list);
>
> pr_debug("voltagedomain: registered %s\n", voltdm->name);
> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
> index 966aa88..df8d234 100644
> --- a/arch/arm/mach-omap2/voltage.h
> +++ b/arch/arm/mach-omap2/voltage.h
> @@ -19,6 +19,13 @@
> #include "vc.h"
> #include "vp.h"
>
> +struct powerdomain;
> +
> +/*
> + * Maximum number of powerdomains that can be associated with a voltagedomain.
> + */
> +#define VOLTDM_MAX_PWRDMS 10
This is not used in the patch. Is it needed?
> +
> /* XXX document */
> #define VOLTSCALE_VPFORCEUPDATE 1
> #define VOLTSCALE_VCBYPASS 2
> @@ -55,12 +62,15 @@ struct omap_vfsm_instance_data {
> * @name: Name of the voltage domain which can be used as a unique identifier.
> * @scalable: Whether or not this voltage domain is scalable
> * @node: list_head linking all voltage domains
> + * @pwrdm_node: list_head linking all powerdomains in this voltagedomain
> * @vdd: to be removed
> + * @pwrdms: powerdomains in this voltagedomain
> */
> struct voltagedomain {
> char *name;
> bool scalable;
> struct list_head node;
> + struct list_head pwrdm_list;
> struct omap_vdd_info *vdd;
> };
>
> @@ -187,4 +197,9 @@ extern void omap44xx_voltagedomains_init(void);
> struct voltagedomain *voltdm_lookup(const char *name);
> void voltdm_init(struct voltagedomain **voltdm_list);
> int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
> +int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
> + void *user);
> +int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
> + int (*fn)(struct voltagedomain *voltdm,
> + struct powerdomain *pwrdm));
> #endif
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain
2011-03-25 9:22 ` Jean Pihet
@ 2011-03-25 15:56 ` Kevin Hilman
2011-03-25 16:52 ` Jean Pihet
0 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 15:56 UTC (permalink / raw)
To: Jean Pihet; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Jean Pihet <jean.pihet@newoldbits.com> writes:
[...]
>> +
>> +/**
>> + * voltdm_for_each - call function on each registered voltagedomain
>> + * @fn: callback function *
>> + *
>> + * Call the supplied function @fn for each registered voltagedomain.
>> + * The callback function @fn can return anything but 0 to bail out
>> + * early from the iterator. Returns the last return value of the
>> + * callback function, which should be 0 for success or anything else
>> + * to indicate failure; or -EINVAL if the function pointer is null.
>
> The function description does not match the prototype.
>
in what way?
the description is wrong in how it describes the "bail out" but I don't
see what you mean for the prototype.
[...]
>>
>> +struct powerdomain;
>> +
>> +/*
>> + * Maximum number of powerdomains that can be associated with a voltagedomain.
>> + */
>> +#define VOLTDM_MAX_PWRDMS 10
> This is not used in the patch. Is it needed?
>
Nope. Will drop.
Thanks,
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain
2011-03-25 15:56 ` Kevin Hilman
@ 2011-03-25 16:52 ` Jean Pihet
0 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 16:52 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Fri, Mar 25, 2011 at 4:56 PM, Kevin Hilman <khilman@ti.com> wrote:
> Jean Pihet <jean.pihet@newoldbits.com> writes:
>
> [...]
>
>>> +
>>> +/**
>>> + * voltdm_for_each - call function on each registered voltagedomain
>>> + * @fn: callback function *
>>> + *
>>> + * Call the supplied function @fn for each registered voltagedomain.
>>> + * The callback function @fn can return anything but 0 to bail out
>>> + * early from the iterator. Returns the last return value of the
>>> + * callback function, which should be 0 for success or anything else
>>> + * to indicate failure; or -EINVAL if the function pointer is null.
>>
>> The function description does not match the prototype.
>>
>
> in what way?
>
> the description is wrong in how it describes the "bail out" but I don't
> see what you mean for the prototype.
'user' is not in the list of parmaters, not it is present in the
function description.
>
> [...]
>
>>>
>>> +struct powerdomain;
>>> +
>>> +/*
>>> + * Maximum number of powerdomains that can be associated with a voltagedomain.
>>> + */
>>> +#define VOLTDM_MAX_PWRDMS 10
>> This is not used in the patch. Is it needed?
>>
>
> Nope. Will drop.
Ok
>
> Thanks,
>
> Kevin
>
Thanks,
Jean
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 14/19] OMAP2+: voltage: split voltage controller (VC) code into dedicated layer
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (12 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 13/19] OMAP2+: voltage: keep track of powerdomains in each voltagedomain Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 9:26 ` Jean Pihet
2011-03-24 0:00 ` [PATCH/RFC 15/19] OMAP2+: voltage: move VC into struct voltagedomain, misc. renames Kevin Hilman
` (6 subsequent siblings)
20 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
As part of the voltage layer cleanup, split out VC specific code into
a dedicated VC layer. This patch primarily just moves VC code from
voltage.c into vc.c, and adds prototypes to vc.h.
No functional changes.
For readability, cach function was given a local 'vc' pointer:
struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
and a global replace of s/vdd->vc_data/vc/ was done.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/Makefile | 2 +-
arch/arm/mach-omap2/vc.c | 276 +++++++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc.h | 12 ++
arch/arm/mach-omap2/voltage.c | 262 +--------------------------------------
4 files changed, 292 insertions(+), 260 deletions(-)
create mode 100644 arch/arm/mach-omap2/vc.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index ce2105c..a0d8f61 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -90,7 +90,7 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \
# OMAP voltage domains
ifeq ($(CONFIG_PM),y)
-voltagedomain-common := voltage.o
+voltagedomain-common := voltage.o vc.o
obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \
voltagedomains2xxx_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
new file mode 100644
index 0000000..4e65fdc
--- /dev/null
+++ b/arch/arm/mach-omap2/vc.c
@@ -0,0 +1,276 @@
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+
+#include <plat/cpu.h>
+
+#include "voltage.h"
+#include "vc.h"
+#include "prm-regbits-34xx.h"
+#include "prm-regbits-44xx.h"
+#include "prm44xx.h"
+
+/* Voltage scale and accessory APIs */
+int omap_vc_pre_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt,
+ u8 *target_vsel, u8 *current_vsel)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ struct omap_volt_data *volt_data;
+ const struct omap_vc_common_data *vc_common;
+ const struct omap_vp_common_data *vp_common;
+ u32 vc_cmdval, vp_errgain_val;
+
+ vc_common = vc->vc_common;
+ vp_common = vdd->vp_data->vp_common;
+
+ /* Check if suffiecient pmic info is available for this vdd */
+ if (!vdd->pmic_info) {
+ pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
+ __func__, voltdm->name);
+ return -EINVAL;
+ }
+
+ if (!vdd->pmic_info->uv_to_vsel) {
+ pr_err("%s: PMIC function to convert voltage in uV to"
+ "vsel not registered. Hence unable to scale voltage"
+ "for vdd_%s\n", __func__, voltdm->name);
+ return -ENODATA;
+ }
+
+ if (!vdd->read_reg || !vdd->write_reg) {
+ pr_err("%s: No read/write API for accessing vdd_%s regs\n",
+ __func__, voltdm->name);
+ return -EINVAL;
+ }
+
+ /* Get volt_data corresponding to target_volt */
+ volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
+ if (IS_ERR(volt_data))
+ volt_data = NULL;
+
+ *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt);
+ *current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
+
+ /* Setting the ON voltage to the new target voltage */
+ vc_cmdval = vdd->read_reg(vc->vc_common->prm_mod, vc->cmdval_reg);
+ vc_cmdval &= ~vc_common->cmd_on_mask;
+ vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
+ vdd->write_reg(vc_cmdval, vc->vc_common->prm_mod, vc->cmdval_reg);
+
+ /* Setting vp errorgain based on the voltage */
+ if (volt_data) {
+ vp_errgain_val = vdd->read_reg(vdd->vp_data->vp_common->prm_mod,
+ vdd->vp_data->vpconfig);
+ vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain;
+ vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask;
+ vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain <<
+ vp_common->vpconfig_errorgain_shift;
+ vdd->write_reg(vp_errgain_val, vdd->vp_data->vp_common->prm_mod,
+ vdd->vp_data->vpconfig);
+ }
+
+ return 0;
+}
+
+void omap_vc_post_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt,
+ u8 target_vsel, u8 current_vsel)
+{
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u32 smps_steps = 0, smps_delay = 0;
+
+ smps_steps = abs(target_vsel - current_vsel);
+ /* SMPS slew rate / step size. 2us added as buffer. */
+ smps_delay = ((smps_steps * vdd->pmic_info->step_size) /
+ vdd->pmic_info->slew_rate) + 2;
+ udelay(smps_delay);
+
+ vdd->curr_volt = target_volt;
+}
+
+/* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
+int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
+ unsigned long target_volt)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u32 loop_cnt = 0, retries_cnt = 0;
+ u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
+ u8 target_vsel, current_vsel;
+ int ret;
+
+ ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
+ if (ret)
+ return ret;
+
+ vc_valid = vc->vc_common->valid;
+ vc_bypass_val_reg = vc->vc_common->bypass_val_reg;
+ vc_bypass_value = (target_vsel << vc->vc_common->data_shift) |
+ (vdd->pmic_info->pmic_reg <<
+ vc->vc_common->regaddr_shift) |
+ (vdd->pmic_info->i2c_slave_addr <<
+ vc->vc_common->slaveaddr_shift);
+
+ vdd->write_reg(vc_bypass_value, vc->vc_common->prm_mod, vc_bypass_val_reg);
+ vdd->write_reg(vc_bypass_value | vc_valid, vc->vc_common->prm_mod,
+ vc_bypass_val_reg);
+
+ vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod, vc_bypass_val_reg);
+ /*
+ * Loop till the bypass command is acknowledged from the SMPS.
+ * NOTE: This is legacy code. The loop count and retry count needs
+ * to be revisited.
+ */
+ while (!(vc_bypass_value & vc_valid)) {
+ loop_cnt++;
+
+ if (retries_cnt > 10) {
+ pr_warning("%s: Retry count exceeded\n", __func__);
+ return -ETIMEDOUT;
+ }
+
+ if (loop_cnt > 50) {
+ retries_cnt++;
+ loop_cnt = 0;
+ udelay(10);
+ }
+ vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod,
+ vc_bypass_val_reg);
+ }
+
+ omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
+ return 0;
+}
+
+static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+
+ /*
+ * Voltage Manager FSM parameters init
+ * XXX This data should be passed in from the board file
+ */
+ vdd->write_reg(OMAP3_CLKSETUP, vc->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
+ vdd->write_reg(OMAP3_VOLTOFFSET, vc->vc_common->prm_mod,
+ OMAP3_PRM_VOLTOFFSET_OFFSET);
+ vdd->write_reg(OMAP3_VOLTSETUP2, vc->vc_common->prm_mod,
+ OMAP3_PRM_VOLTSETUP2_OFFSET);
+}
+
+static void __init omap3_vc_init(struct voltagedomain *voltdm)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ static bool is_initialized;
+ u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
+ u32 vc_val;
+
+ if (is_initialized)
+ return;
+
+ /* Set up the on, inactive, retention and off voltage */
+ on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt);
+ onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt);
+ ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt);
+ off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt);
+ vc_val = ((on_vsel << vc->vc_common->cmd_on_shift) |
+ (onlp_vsel << vc->vc_common->cmd_onlp_shift) |
+ (ret_vsel << vc->vc_common->cmd_ret_shift) |
+ (off_vsel << vc->vc_common->cmd_off_shift));
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod, vc->cmdval_reg);
+
+ /*
+ * Generic VC parameters init
+ * XXX This data should be abstracted out
+ */
+ vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vc->vc_common->prm_mod,
+ OMAP3_PRM_VC_CH_CONF_OFFSET);
+ vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vc->vc_common->prm_mod,
+ OMAP3_PRM_VC_I2C_CFG_OFFSET);
+
+ omap3_vfsm_init(voltdm);
+
+ is_initialized = true;
+}
+
+
+/* OMAP4 specific voltage init functions */
+static void __init omap4_vc_init(struct voltagedomain *voltdm)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ static bool is_initialized;
+ u32 vc_val;
+
+ if (is_initialized)
+ return;
+
+ /* TODO: Configure setup times and CMD_VAL values*/
+
+ /*
+ * Generic VC parameters init
+ * XXX This data should be abstracted out
+ */
+ vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
+ OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
+ OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
+
+ /* XXX These are magic numbers and do not belong! */
+ vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
+
+ is_initialized = true;
+}
+
+void __init omap_vc_init(struct voltagedomain *voltdm)
+{
+ struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u32 vc_val;
+
+ if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
+ pr_err("%s: PMIC info requried to configure vc for"
+ "vdd_%s not populated.Hence cannot initialize vc\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ if (!vdd->read_reg || !vdd->write_reg) {
+ pr_err("%s: No read/write API for accessing vdd_%s regs\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ /* Set up the SMPS_SA(i2c slave address in VC */
+ vc_val = vdd->read_reg(vc->vc_common->prm_mod,
+ vc->vc_common->smps_sa_reg);
+ vc_val &= ~vc->smps_sa_mask;
+ vc_val |= vdd->pmic_info->i2c_slave_addr << vc->smps_sa_shift;
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod,
+ vc->vc_common->smps_sa_reg);
+
+ /* Setup the VOLRA(pmic reg addr) in VC */
+ vc_val = vdd->read_reg(vc->vc_common->prm_mod,
+ vc->vc_common->smps_volra_reg);
+ vc_val &= ~vc->smps_volra_mask;
+ vc_val |= vdd->pmic_info->pmic_reg << vc->smps_volra_shift;
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod,
+ vc->vc_common->smps_volra_reg);
+
+ /* Configure the setup times */
+ vc_val = vdd->read_reg(vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
+ vc_val &= ~vdd->vfsm->voltsetup_mask;
+ vc_val |= vdd->pmic_info->volt_setup_time <<
+ vdd->vfsm->voltsetup_shift;
+ vdd->write_reg(vc_val, vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
+
+ if (cpu_is_omap34xx())
+ omap3_vc_init(voltdm);
+ else if (cpu_is_omap44xx())
+ omap4_vc_init(voltdm);
+}
+
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index f7338af..b823e5b 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -19,6 +19,8 @@
#include <linux/kernel.h>
+struct voltagedomain;
+
/**
* struct omap_vc_common_data - per-VC register/bitfield data
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
@@ -81,5 +83,15 @@ extern struct omap_vc_instance_data omap4_vc_mpu_data;
extern struct omap_vc_instance_data omap4_vc_iva_data;
extern struct omap_vc_instance_data omap4_vc_core_data;
+void omap_vc_init(struct voltagedomain *voltdm);
+int omap_vc_pre_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt,
+ u8 *target_vsel, u8 *current_vsel);
+void omap_vc_post_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt,
+ u8 target_vsel, u8 current_vsel);
+int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
+ unsigned long target_volt);
+
#endif
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index b1b5e38..8a47dd1 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -293,136 +293,6 @@ static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
&nom_volt_debug_fops);
}
-/* Voltage scale and accessory APIs */
-static int _pre_volt_scale(struct voltagedomain *voltdm,
- unsigned long target_volt, u8 *target_vsel, u8 *current_vsel)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- struct omap_volt_data *volt_data;
- const struct omap_vc_common_data *vc_common;
- const struct omap_vp_common_data *vp_common;
- u32 vc_cmdval, vp_errgain_val;
-
- vc_common = vdd->vc_data->vc_common;
- vp_common = vdd->vp_data->vp_common;
-
- /* Check if suffiecient pmic info is available for this vdd */
- if (!vdd->pmic_info) {
- pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
- __func__, voltdm->name);
- return -EINVAL;
- }
-
- if (!vdd->pmic_info->uv_to_vsel) {
- pr_err("%s: PMIC function to convert voltage in uV to"
- "vsel not registered. Hence unable to scale voltage"
- "for vdd_%s\n", __func__, voltdm->name);
- return -ENODATA;
- }
-
- if (!vdd->read_reg || !vdd->write_reg) {
- pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, voltdm->name);
- return -EINVAL;
- }
-
- /* Get volt_data corresponding to target_volt */
- volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
- if (IS_ERR(volt_data))
- volt_data = NULL;
-
- *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt);
- *current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
-
- /* Setting the ON voltage to the new target voltage */
- vc_cmdval = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
- vc_cmdval &= ~vc_common->cmd_on_mask;
- vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
- vdd->write_reg(vc_cmdval, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
-
- /* Setting vp errorgain based on the voltage */
- if (volt_data) {
- vp_errgain_val = vdd->read_reg(vdd->vp_data->vp_common->prm_mod,
- vdd->vp_data->vpconfig);
- vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain;
- vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask;
- vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain <<
- vp_common->vpconfig_errorgain_shift;
- vdd->write_reg(vp_errgain_val, vdd->vp_data->vp_common->prm_mod,
- vdd->vp_data->vpconfig);
- }
-
- return 0;
-}
-
-static void _post_volt_scale(struct voltagedomain *voltdm,
- unsigned long target_volt, u8 target_vsel, u8 current_vsel)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- u32 smps_steps = 0, smps_delay = 0;
-
- smps_steps = abs(target_vsel - current_vsel);
- /* SMPS slew rate / step size. 2us added as buffer. */
- smps_delay = ((smps_steps * vdd->pmic_info->step_size) /
- vdd->pmic_info->slew_rate) + 2;
- udelay(smps_delay);
-
- vdd->curr_volt = target_volt;
-}
-
-/* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
-static int vc_bypass_scale_voltage(struct voltagedomain *voltdm,
- unsigned long target_volt)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- u32 loop_cnt = 0, retries_cnt = 0;
- u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
- u8 target_vsel, current_vsel;
- int ret;
-
- ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
- if (ret)
- return ret;
-
- vc_valid = vdd->vc_data->vc_common->valid;
- vc_bypass_val_reg = vdd->vc_data->vc_common->bypass_val_reg;
- vc_bypass_value = (target_vsel << vdd->vc_data->vc_common->data_shift) |
- (vdd->pmic_info->pmic_reg <<
- vdd->vc_data->vc_common->regaddr_shift) |
- (vdd->pmic_info->i2c_slave_addr <<
- vdd->vc_data->vc_common->slaveaddr_shift);
-
- vdd->write_reg(vc_bypass_value, vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
- vdd->write_reg(vc_bypass_value | vc_valid, vdd->vc_data->vc_common->prm_mod,
- vc_bypass_val_reg);
-
- vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
- /*
- * Loop till the bypass command is acknowledged from the SMPS.
- * NOTE: This is legacy code. The loop count and retry count needs
- * to be revisited.
- */
- while (!(vc_bypass_value & vc_valid)) {
- loop_cnt++;
-
- if (retries_cnt > 10) {
- pr_warning("%s: Retry count exceeded\n", __func__);
- return -ETIMEDOUT;
- }
-
- if (loop_cnt > 50) {
- retries_cnt++;
- loop_cnt = 0;
- udelay(10);
- }
- vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
- vc_bypass_val_reg);
- }
-
- _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
- return 0;
-}
-
/* VP force update method of voltage scaling */
static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
unsigned long target_volt)
@@ -432,7 +302,7 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
u8 target_vsel, current_vsel;
int ret, timeout = 0;
- ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
+ ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
if (ret)
return ret;
@@ -485,7 +355,7 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
"TRANXDONE never got set after the voltage update\n",
__func__, voltdm->name);
- _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
+ omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
/*
* Disable TransactionDone interrupt , clear all status, clear
@@ -517,132 +387,6 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
return 0;
}
-static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
-
- /*
- * Voltage Manager FSM parameters init
- * XXX This data should be passed in from the board file
- */
- vdd->write_reg(OMAP3_CLKSETUP, vdd->vc_data->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
- vdd->write_reg(OMAP3_VOLTOFFSET, vdd->vc_data->vc_common->prm_mod,
- OMAP3_PRM_VOLTOFFSET_OFFSET);
- vdd->write_reg(OMAP3_VOLTSETUP2, vdd->vc_data->vc_common->prm_mod,
- OMAP3_PRM_VOLTSETUP2_OFFSET);
-}
-
-static void __init omap3_vc_init(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- static bool is_initialized;
- u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
- u32 vc_val;
-
- if (is_initialized)
- return;
-
- /* Set up the on, inactive, retention and off voltage */
- on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt);
- onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt);
- ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt);
- off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt);
- vc_val = ((on_vsel << vdd->vc_data->vc_common->cmd_on_shift) |
- (onlp_vsel << vdd->vc_data->vc_common->cmd_onlp_shift) |
- (ret_vsel << vdd->vc_data->vc_common->cmd_ret_shift) |
- (off_vsel << vdd->vc_data->vc_common->cmd_off_shift));
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
-
- /*
- * Generic VC parameters init
- * XXX This data should be abstracted out
- */
- vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vdd->vc_data->vc_common->prm_mod,
- OMAP3_PRM_VC_CH_CONF_OFFSET);
- vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vdd->vc_data->vc_common->prm_mod,
- OMAP3_PRM_VC_I2C_CFG_OFFSET);
-
- omap3_vfsm_init(voltdm);
-
- is_initialized = true;
-}
-
-
-/* OMAP4 specific voltage init functions */
-static void __init omap4_vc_init(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- static bool is_initialized;
- u32 vc_val;
-
- if (is_initialized)
- return;
-
- /* TODO: Configure setup times and CMD_VAL values*/
-
- /*
- * Generic VC parameters init
- * XXX This data should be abstracted out
- */
- vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
- OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
- OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
-
- /* XXX These are magic numbers and do not belong! */
- vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
-
- is_initialized = true;
-}
-
-static void __init omap_vc_init(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- u32 vc_val;
-
- if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
- pr_err("%s: PMIC info requried to configure vc for"
- "vdd_%s not populated.Hence cannot initialize vc\n",
- __func__, voltdm->name);
- return;
- }
-
- if (!vdd->read_reg || !vdd->write_reg) {
- pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, voltdm->name);
- return;
- }
-
- /* Set up the SMPS_SA(i2c slave address in VC */
- vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
- vdd->vc_data->vc_common->smps_sa_reg);
- vc_val &= ~vdd->vc_data->smps_sa_mask;
- vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_data->smps_sa_shift;
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
- vdd->vc_data->vc_common->smps_sa_reg);
-
- /* Setup the VOLRA(pmic reg addr) in VC */
- vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
- vdd->vc_data->vc_common->smps_volra_reg);
- vc_val &= ~vdd->vc_data->smps_volra_mask;
- vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_data->smps_volra_shift;
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
- vdd->vc_data->vc_common->smps_volra_reg);
-
- /* Configure the setup times */
- vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
- vc_val &= ~vdd->vfsm->voltsetup_mask;
- vc_val |= vdd->pmic_info->volt_setup_time <<
- vdd->vfsm->voltsetup_shift;
- vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
-
- if (cpu_is_omap34xx())
- omap3_vc_init(voltdm);
- else if (cpu_is_omap44xx())
- omap4_vc_init(voltdm);
-}
-
static int __init omap_vdd_data_configure(struct voltagedomain *voltdm)
{
struct omap_vdd_info *vdd = voltdm->vdd;
@@ -1025,7 +769,7 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
vdd->volt_scale = vp_forceupdate_scale_voltage;
return;
case VOLTSCALE_VCBYPASS:
- vdd->volt_scale = vc_bypass_scale_voltage;
+ vdd->volt_scale = omap_vc_bypass_scale_voltage;
return;
default:
pr_warning("%s: Trying to change the method of voltage scaling"
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 14/19] OMAP2+: voltage: split voltage controller (VC) code into dedicated layer
2011-03-24 0:00 ` [PATCH/RFC 14/19] OMAP2+: voltage: split voltage controller (VC) code into dedicated layer Kevin Hilman
@ 2011-03-25 9:26 ` Jean Pihet
0 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 9:26 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> As part of the voltage layer cleanup, split out VC specific code into
> a dedicated VC layer. This patch primarily just moves VC code from
> voltage.c into vc.c, and adds prototypes to vc.h.
>
> No functional changes.
>
> For readability, cach function was given a local 'vc' pointer:
s/cach/each
>
> struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
>
> and a global replace of s/vdd->vc_data/vc/ was done.
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/Makefile | 2 +-
> arch/arm/mach-omap2/vc.c | 276 +++++++++++++++++++++++++++++++++++++++++
> arch/arm/mach-omap2/vc.h | 12 ++
> arch/arm/mach-omap2/voltage.c | 262 +--------------------------------------
> 4 files changed, 292 insertions(+), 260 deletions(-)
> create mode 100644 arch/arm/mach-omap2/vc.c
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index ce2105c..a0d8f61 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -90,7 +90,7 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \
>
> # OMAP voltage domains
> ifeq ($(CONFIG_PM),y)
> -voltagedomain-common := voltage.o
> +voltagedomain-common := voltage.o vc.o
> obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \
> voltagedomains2xxx_data.o
> obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \
> diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
> new file mode 100644
> index 0000000..4e65fdc
> --- /dev/null
> +++ b/arch/arm/mach-omap2/vc.c
> @@ -0,0 +1,276 @@
> +#include <linux/kernel.h>
> +#include <linux/delay.h>
> +#include <linux/init.h>
> +
> +#include <plat/cpu.h>
> +
> +#include "voltage.h"
> +#include "vc.h"
> +#include "prm-regbits-34xx.h"
> +#include "prm-regbits-44xx.h"
> +#include "prm44xx.h"
> +
> +/* Voltage scale and accessory APIs */
> +int omap_vc_pre_scale(struct voltagedomain *voltdm,
> + unsigned long target_volt,
> + u8 *target_vsel, u8 *current_vsel)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + struct omap_volt_data *volt_data;
> + const struct omap_vc_common_data *vc_common;
> + const struct omap_vp_common_data *vp_common;
> + u32 vc_cmdval, vp_errgain_val;
> +
> + vc_common = vc->vc_common;
> + vp_common = vdd->vp_data->vp_common;
> +
> + /* Check if suffiecient pmic info is available for this vdd */
Typo
> + if (!vdd->pmic_info) {
> + pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
> + __func__, voltdm->name);
> + return -EINVAL;
> + }
> +
> + if (!vdd->pmic_info->uv_to_vsel) {
> + pr_err("%s: PMIC function to convert voltage in uV to"
> + "vsel not registered. Hence unable to scale voltage"
> + "for vdd_%s\n", __func__, voltdm->name);
> + return -ENODATA;
> + }
> +
> + if (!vdd->read_reg || !vdd->write_reg) {
> + pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> + __func__, voltdm->name);
> + return -EINVAL;
> + }
> +
> + /* Get volt_data corresponding to target_volt */
> + volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
> + if (IS_ERR(volt_data))
> + volt_data = NULL;
> +
> + *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt);
> + *current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
> +
> + /* Setting the ON voltage to the new target voltage */
> + vc_cmdval = vdd->read_reg(vc->vc_common->prm_mod, vc->cmdval_reg);
> + vc_cmdval &= ~vc_common->cmd_on_mask;
> + vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
> + vdd->write_reg(vc_cmdval, vc->vc_common->prm_mod, vc->cmdval_reg);
> +
> + /* Setting vp errorgain based on the voltage */
> + if (volt_data) {
> + vp_errgain_val = vdd->read_reg(vdd->vp_data->vp_common->prm_mod,
> + vdd->vp_data->vpconfig);
> + vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain;
> + vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask;
> + vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain <<
> + vp_common->vpconfig_errorgain_shift;
> + vdd->write_reg(vp_errgain_val, vdd->vp_data->vp_common->prm_mod,
> + vdd->vp_data->vpconfig);
> + }
> +
> + return 0;
> +}
> +
> +void omap_vc_post_scale(struct voltagedomain *voltdm,
> + unsigned long target_volt,
> + u8 target_vsel, u8 current_vsel)
> +{
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + u32 smps_steps = 0, smps_delay = 0;
> +
> + smps_steps = abs(target_vsel - current_vsel);
> + /* SMPS slew rate / step size. 2us added as buffer. */
> + smps_delay = ((smps_steps * vdd->pmic_info->step_size) /
> + vdd->pmic_info->slew_rate) + 2;
> + udelay(smps_delay);
> +
> + vdd->curr_volt = target_volt;
> +}
> +
> +/* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
> +int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
> + unsigned long target_volt)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + u32 loop_cnt = 0, retries_cnt = 0;
> + u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
> + u8 target_vsel, current_vsel;
> + int ret;
> +
> + ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> + if (ret)
> + return ret;
> +
> + vc_valid = vc->vc_common->valid;
> + vc_bypass_val_reg = vc->vc_common->bypass_val_reg;
> + vc_bypass_value = (target_vsel << vc->vc_common->data_shift) |
> + (vdd->pmic_info->pmic_reg <<
> + vc->vc_common->regaddr_shift) |
> + (vdd->pmic_info->i2c_slave_addr <<
> + vc->vc_common->slaveaddr_shift);
> +
> + vdd->write_reg(vc_bypass_value, vc->vc_common->prm_mod, vc_bypass_val_reg);
> + vdd->write_reg(vc_bypass_value | vc_valid, vc->vc_common->prm_mod,
> + vc_bypass_val_reg);
> +
> + vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod, vc_bypass_val_reg);
> + /*
> + * Loop till the bypass command is acknowledged from the SMPS.
> + * NOTE: This is legacy code. The loop count and retry count needs
> + * to be revisited.
> + */
> + while (!(vc_bypass_value & vc_valid)) {
> + loop_cnt++;
> +
> + if (retries_cnt > 10) {
> + pr_warning("%s: Retry count exceeded\n", __func__);
> + return -ETIMEDOUT;
> + }
> +
> + if (loop_cnt > 50) {
> + retries_cnt++;
> + loop_cnt = 0;
> + udelay(10);
> + }
> + vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod,
> + vc_bypass_val_reg);
> + }
> +
> + omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
> + return 0;
> +}
> +
> +static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> +
> + /*
> + * Voltage Manager FSM parameters init
> + * XXX This data should be passed in from the board file
> + */
> + vdd->write_reg(OMAP3_CLKSETUP, vc->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
> + vdd->write_reg(OMAP3_VOLTOFFSET, vc->vc_common->prm_mod,
> + OMAP3_PRM_VOLTOFFSET_OFFSET);
> + vdd->write_reg(OMAP3_VOLTSETUP2, vc->vc_common->prm_mod,
> + OMAP3_PRM_VOLTSETUP2_OFFSET);
> +}
> +
> +static void __init omap3_vc_init(struct voltagedomain *voltdm)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + static bool is_initialized;
> + u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
> + u32 vc_val;
> +
> + if (is_initialized)
> + return;
> +
> + /* Set up the on, inactive, retention and off voltage */
> + on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt);
> + onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt);
> + ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt);
> + off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt);
> + vc_val = ((on_vsel << vc->vc_common->cmd_on_shift) |
> + (onlp_vsel << vc->vc_common->cmd_onlp_shift) |
> + (ret_vsel << vc->vc_common->cmd_ret_shift) |
> + (off_vsel << vc->vc_common->cmd_off_shift));
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod, vc->cmdval_reg);
> +
> + /*
> + * Generic VC parameters init
> + * XXX This data should be abstracted out
> + */
> + vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vc->vc_common->prm_mod,
> + OMAP3_PRM_VC_CH_CONF_OFFSET);
> + vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vc->vc_common->prm_mod,
> + OMAP3_PRM_VC_I2C_CFG_OFFSET);
> +
> + omap3_vfsm_init(voltdm);
> +
> + is_initialized = true;
> +}
> +
> +
> +/* OMAP4 specific voltage init functions */
> +static void __init omap4_vc_init(struct voltagedomain *voltdm)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + static bool is_initialized;
> + u32 vc_val;
> +
> + if (is_initialized)
> + return;
> +
> + /* TODO: Configure setup times and CMD_VAL values*/
> +
> + /*
> + * Generic VC parameters init
> + * XXX This data should be abstracted out
> + */
> + vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
> + OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
> + OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
> +
> + /* XXX These are magic numbers and do not belong! */
> + vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
> +
> + is_initialized = true;
> +}
> +
> +void __init omap_vc_init(struct voltagedomain *voltdm)
> +{
> + struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
> + struct omap_vdd_info *vdd = voltdm->vdd;
> + u32 vc_val;
> +
> + if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
> + pr_err("%s: PMIC info requried to configure vc for"
> + "vdd_%s not populated.Hence cannot initialize vc\n",
> + __func__, voltdm->name);
> + return;
> + }
> +
> + if (!vdd->read_reg || !vdd->write_reg) {
> + pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> + __func__, voltdm->name);
> + return;
> + }
> +
> + /* Set up the SMPS_SA(i2c slave address in VC */
> + vc_val = vdd->read_reg(vc->vc_common->prm_mod,
> + vc->vc_common->smps_sa_reg);
> + vc_val &= ~vc->smps_sa_mask;
> + vc_val |= vdd->pmic_info->i2c_slave_addr << vc->smps_sa_shift;
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod,
> + vc->vc_common->smps_sa_reg);
> +
> + /* Setup the VOLRA(pmic reg addr) in VC */
> + vc_val = vdd->read_reg(vc->vc_common->prm_mod,
> + vc->vc_common->smps_volra_reg);
> + vc_val &= ~vc->smps_volra_mask;
> + vc_val |= vdd->pmic_info->pmic_reg << vc->smps_volra_shift;
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod,
> + vc->vc_common->smps_volra_reg);
> +
> + /* Configure the setup times */
> + vc_val = vdd->read_reg(vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
> + vc_val &= ~vdd->vfsm->voltsetup_mask;
> + vc_val |= vdd->pmic_info->volt_setup_time <<
> + vdd->vfsm->voltsetup_shift;
> + vdd->write_reg(vc_val, vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
> +
> + if (cpu_is_omap34xx())
> + omap3_vc_init(voltdm);
> + else if (cpu_is_omap44xx())
> + omap4_vc_init(voltdm);
> +}
> +
> diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
> index f7338af..b823e5b 100644
> --- a/arch/arm/mach-omap2/vc.h
> +++ b/arch/arm/mach-omap2/vc.h
> @@ -19,6 +19,8 @@
>
> #include <linux/kernel.h>
>
> +struct voltagedomain;
> +
> /**
> * struct omap_vc_common_data - per-VC register/bitfield data
> * @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
> @@ -81,5 +83,15 @@ extern struct omap_vc_instance_data omap4_vc_mpu_data;
> extern struct omap_vc_instance_data omap4_vc_iva_data;
> extern struct omap_vc_instance_data omap4_vc_core_data;
>
> +void omap_vc_init(struct voltagedomain *voltdm);
> +int omap_vc_pre_scale(struct voltagedomain *voltdm,
> + unsigned long target_volt,
> + u8 *target_vsel, u8 *current_vsel);
> +void omap_vc_post_scale(struct voltagedomain *voltdm,
> + unsigned long target_volt,
> + u8 target_vsel, u8 current_vsel);
> +int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
> + unsigned long target_volt);
> +
> #endif
>
> diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
> index b1b5e38..8a47dd1 100644
> --- a/arch/arm/mach-omap2/voltage.c
> +++ b/arch/arm/mach-omap2/voltage.c
> @@ -293,136 +293,6 @@ static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
> &nom_volt_debug_fops);
> }
>
> -/* Voltage scale and accessory APIs */
> -static int _pre_volt_scale(struct voltagedomain *voltdm,
> - unsigned long target_volt, u8 *target_vsel, u8 *current_vsel)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - struct omap_volt_data *volt_data;
> - const struct omap_vc_common_data *vc_common;
> - const struct omap_vp_common_data *vp_common;
> - u32 vc_cmdval, vp_errgain_val;
> -
> - vc_common = vdd->vc_data->vc_common;
> - vp_common = vdd->vp_data->vp_common;
> -
> - /* Check if suffiecient pmic info is available for this vdd */
> - if (!vdd->pmic_info) {
> - pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
> - __func__, voltdm->name);
> - return -EINVAL;
> - }
> -
> - if (!vdd->pmic_info->uv_to_vsel) {
> - pr_err("%s: PMIC function to convert voltage in uV to"
> - "vsel not registered. Hence unable to scale voltage"
> - "for vdd_%s\n", __func__, voltdm->name);
> - return -ENODATA;
> - }
> -
> - if (!vdd->read_reg || !vdd->write_reg) {
> - pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> - __func__, voltdm->name);
> - return -EINVAL;
> - }
> -
> - /* Get volt_data corresponding to target_volt */
> - volt_data = omap_voltage_get_voltdata(voltdm, target_volt);
> - if (IS_ERR(volt_data))
> - volt_data = NULL;
> -
> - *target_vsel = vdd->pmic_info->uv_to_vsel(target_volt);
> - *current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
> -
> - /* Setting the ON voltage to the new target voltage */
> - vc_cmdval = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
> - vc_cmdval &= ~vc_common->cmd_on_mask;
> - vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
> - vdd->write_reg(vc_cmdval, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
> -
> - /* Setting vp errorgain based on the voltage */
> - if (volt_data) {
> - vp_errgain_val = vdd->read_reg(vdd->vp_data->vp_common->prm_mod,
> - vdd->vp_data->vpconfig);
> - vdd->vp_rt_data.vpconfig_errorgain = volt_data->vp_errgain;
> - vp_errgain_val &= ~vp_common->vpconfig_errorgain_mask;
> - vp_errgain_val |= vdd->vp_rt_data.vpconfig_errorgain <<
> - vp_common->vpconfig_errorgain_shift;
> - vdd->write_reg(vp_errgain_val, vdd->vp_data->vp_common->prm_mod,
> - vdd->vp_data->vpconfig);
> - }
> -
> - return 0;
> -}
> -
> -static void _post_volt_scale(struct voltagedomain *voltdm,
> - unsigned long target_volt, u8 target_vsel, u8 current_vsel)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - u32 smps_steps = 0, smps_delay = 0;
> -
> - smps_steps = abs(target_vsel - current_vsel);
> - /* SMPS slew rate / step size. 2us added as buffer. */
> - smps_delay = ((smps_steps * vdd->pmic_info->step_size) /
> - vdd->pmic_info->slew_rate) + 2;
> - udelay(smps_delay);
> -
> - vdd->curr_volt = target_volt;
> -}
> -
> -/* vc_bypass_scale_voltage - VC bypass method of voltage scaling */
> -static int vc_bypass_scale_voltage(struct voltagedomain *voltdm,
> - unsigned long target_volt)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - u32 loop_cnt = 0, retries_cnt = 0;
> - u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
> - u8 target_vsel, current_vsel;
> - int ret;
> -
> - ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> - if (ret)
> - return ret;
> -
> - vc_valid = vdd->vc_data->vc_common->valid;
> - vc_bypass_val_reg = vdd->vc_data->vc_common->bypass_val_reg;
> - vc_bypass_value = (target_vsel << vdd->vc_data->vc_common->data_shift) |
> - (vdd->pmic_info->pmic_reg <<
> - vdd->vc_data->vc_common->regaddr_shift) |
> - (vdd->pmic_info->i2c_slave_addr <<
> - vdd->vc_data->vc_common->slaveaddr_shift);
> -
> - vdd->write_reg(vc_bypass_value, vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
> - vdd->write_reg(vc_bypass_value | vc_valid, vdd->vc_data->vc_common->prm_mod,
> - vc_bypass_val_reg);
> -
> - vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vc_bypass_val_reg);
> - /*
> - * Loop till the bypass command is acknowledged from the SMPS.
> - * NOTE: This is legacy code. The loop count and retry count needs
> - * to be revisited.
> - */
> - while (!(vc_bypass_value & vc_valid)) {
> - loop_cnt++;
> -
> - if (retries_cnt > 10) {
> - pr_warning("%s: Retry count exceeded\n", __func__);
> - return -ETIMEDOUT;
> - }
> -
> - if (loop_cnt > 50) {
> - retries_cnt++;
> - loop_cnt = 0;
> - udelay(10);
> - }
> - vc_bypass_value = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
> - vc_bypass_val_reg);
> - }
> -
> - _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
> - return 0;
> -}
> -
> /* VP force update method of voltage scaling */
> static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> unsigned long target_volt)
> @@ -432,7 +302,7 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> u8 target_vsel, current_vsel;
> int ret, timeout = 0;
>
> - ret = _pre_volt_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> + ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
> if (ret)
> return ret;
>
> @@ -485,7 +355,7 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> "TRANXDONE never got set after the voltage update\n",
> __func__, voltdm->name);
>
> - _post_volt_scale(voltdm, target_volt, target_vsel, current_vsel);
> + omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
>
> /*
> * Disable TransactionDone interrupt , clear all status, clear
> @@ -517,132 +387,6 @@ static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
> return 0;
> }
>
> -static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> -
> - /*
> - * Voltage Manager FSM parameters init
> - * XXX This data should be passed in from the board file
> - */
> - vdd->write_reg(OMAP3_CLKSETUP, vdd->vc_data->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
> - vdd->write_reg(OMAP3_VOLTOFFSET, vdd->vc_data->vc_common->prm_mod,
> - OMAP3_PRM_VOLTOFFSET_OFFSET);
> - vdd->write_reg(OMAP3_VOLTSETUP2, vdd->vc_data->vc_common->prm_mod,
> - OMAP3_PRM_VOLTSETUP2_OFFSET);
> -}
> -
> -static void __init omap3_vc_init(struct voltagedomain *voltdm)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - static bool is_initialized;
> - u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
> - u32 vc_val;
> -
> - if (is_initialized)
> - return;
> -
> - /* Set up the on, inactive, retention and off voltage */
> - on_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->on_volt);
> - onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt);
> - ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt);
> - off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt);
> - vc_val = ((on_vsel << vdd->vc_data->vc_common->cmd_on_shift) |
> - (onlp_vsel << vdd->vc_data->vc_common->cmd_onlp_shift) |
> - (ret_vsel << vdd->vc_data->vc_common->cmd_ret_shift) |
> - (off_vsel << vdd->vc_data->vc_common->cmd_off_shift));
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vc_data->cmdval_reg);
> -
> - /*
> - * Generic VC parameters init
> - * XXX This data should be abstracted out
> - */
> - vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vdd->vc_data->vc_common->prm_mod,
> - OMAP3_PRM_VC_CH_CONF_OFFSET);
> - vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vdd->vc_data->vc_common->prm_mod,
> - OMAP3_PRM_VC_I2C_CFG_OFFSET);
> -
> - omap3_vfsm_init(voltdm);
> -
> - is_initialized = true;
> -}
> -
> -
> -/* OMAP4 specific voltage init functions */
> -static void __init omap4_vc_init(struct voltagedomain *voltdm)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - static bool is_initialized;
> - u32 vc_val;
> -
> - if (is_initialized)
> - return;
> -
> - /* TODO: Configure setup times and CMD_VAL values*/
> -
> - /*
> - * Generic VC parameters init
> - * XXX This data should be abstracted out
> - */
> - vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
> - OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
> - OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
> -
> - /* XXX These are magic numbers and do not belong! */
> - vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
> -
> - is_initialized = true;
> -}
> -
> -static void __init omap_vc_init(struct voltagedomain *voltdm)
> -{
> - struct omap_vdd_info *vdd = voltdm->vdd;
> - u32 vc_val;
> -
> - if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
> - pr_err("%s: PMIC info requried to configure vc for"
> - "vdd_%s not populated.Hence cannot initialize vc\n",
> - __func__, voltdm->name);
> - return;
> - }
> -
> - if (!vdd->read_reg || !vdd->write_reg) {
> - pr_err("%s: No read/write API for accessing vdd_%s regs\n",
> - __func__, voltdm->name);
> - return;
> - }
> -
> - /* Set up the SMPS_SA(i2c slave address in VC */
> - vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
> - vdd->vc_data->vc_common->smps_sa_reg);
> - vc_val &= ~vdd->vc_data->smps_sa_mask;
> - vc_val |= vdd->pmic_info->i2c_slave_addr << vdd->vc_data->smps_sa_shift;
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
> - vdd->vc_data->vc_common->smps_sa_reg);
> -
> - /* Setup the VOLRA(pmic reg addr) in VC */
> - vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod,
> - vdd->vc_data->vc_common->smps_volra_reg);
> - vc_val &= ~vdd->vc_data->smps_volra_mask;
> - vc_val |= vdd->pmic_info->pmic_reg << vdd->vc_data->smps_volra_shift;
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod,
> - vdd->vc_data->vc_common->smps_volra_reg);
> -
> - /* Configure the setup times */
> - vc_val = vdd->read_reg(vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
> - vc_val &= ~vdd->vfsm->voltsetup_mask;
> - vc_val |= vdd->pmic_info->volt_setup_time <<
> - vdd->vfsm->voltsetup_shift;
> - vdd->write_reg(vc_val, vdd->vc_data->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
> -
> - if (cpu_is_omap34xx())
> - omap3_vc_init(voltdm);
> - else if (cpu_is_omap44xx())
> - omap4_vc_init(voltdm);
> -}
> -
> static int __init omap_vdd_data_configure(struct voltagedomain *voltdm)
> {
> struct omap_vdd_info *vdd = voltdm->vdd;
> @@ -1025,7 +769,7 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
> vdd->volt_scale = vp_forceupdate_scale_voltage;
> return;
> case VOLTSCALE_VCBYPASS:
> - vdd->volt_scale = vc_bypass_scale_voltage;
> + vdd->volt_scale = omap_vc_bypass_scale_voltage;
> return;
> default:
> pr_warning("%s: Trying to change the method of voltage scaling"
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH/RFC 15/19] OMAP2+: voltage: move VC into struct voltagedomain, misc. renames
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (13 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 14/19] OMAP2+: voltage: split voltage controller (VC) code into dedicated layer Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 16/19] OMAP2+: voltage: split out voltage processor (VP) code into new layer Kevin Hilman
` (5 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Move the VC instance struct from omap_vdd_info into struct voltagedomain.
While moving, perform some misc. renames for readability.
No functional changes.
Summary of renames:
- rename omap_vc_instance to omap_vc_channel, since there is only
one instance of the VC IP and this actually represents channels
using TRM terminology.
- rename 'vc_common' field of VC channel which led to:
s/vc->vc_common/vc->common/
- remove redundant '_data' suffix
- OMAP3: vc1 --> vc_mpu, vc2 --> vc_core
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/vc.c | 84 ++++++++++++-------------
arch/arm/mach-omap2/vc.h | 22 +++---
arch/arm/mach-omap2/vc3xxx_data.c | 10 ++--
arch/arm/mach-omap2/vc44xx_data.c | 14 ++--
arch/arm/mach-omap2/voltage.c | 4 +-
arch/arm/mach-omap2/voltage.h | 3 +-
arch/arm/mach-omap2/voltagedomains3xxx_data.c | 4 +-
arch/arm/mach-omap2/voltagedomains44xx_data.c | 6 +-
8 files changed, 74 insertions(+), 73 deletions(-)
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index 4e65fdc..29fbebd 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -15,14 +15,12 @@ int omap_vc_pre_scale(struct voltagedomain *voltdm,
unsigned long target_volt,
u8 *target_vsel, u8 *current_vsel)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
struct omap_volt_data *volt_data;
- const struct omap_vc_common_data *vc_common;
const struct omap_vp_common_data *vp_common;
u32 vc_cmdval, vp_errgain_val;
- vc_common = vc->vc_common;
vp_common = vdd->vp_data->vp_common;
/* Check if suffiecient pmic info is available for this vdd */
@@ -54,10 +52,10 @@ int omap_vc_pre_scale(struct voltagedomain *voltdm,
*current_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
/* Setting the ON voltage to the new target voltage */
- vc_cmdval = vdd->read_reg(vc->vc_common->prm_mod, vc->cmdval_reg);
- vc_cmdval &= ~vc_common->cmd_on_mask;
- vc_cmdval |= (*target_vsel << vc_common->cmd_on_shift);
- vdd->write_reg(vc_cmdval, vc->vc_common->prm_mod, vc->cmdval_reg);
+ vc_cmdval = vdd->read_reg(vc->common->prm_mod, vc->cmdval_reg);
+ vc_cmdval &= ~vc->common->cmd_on_mask;
+ vc_cmdval |= (*target_vsel << vc->common->cmd_on_shift);
+ vdd->write_reg(vc_cmdval, vc->common->prm_mod, vc->cmdval_reg);
/* Setting vp errorgain based on the voltage */
if (volt_data) {
@@ -94,7 +92,7 @@ void omap_vc_post_scale(struct voltagedomain *voltdm,
int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
unsigned long target_volt)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
u32 loop_cnt = 0, retries_cnt = 0;
u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
@@ -105,19 +103,19 @@ int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
if (ret)
return ret;
- vc_valid = vc->vc_common->valid;
- vc_bypass_val_reg = vc->vc_common->bypass_val_reg;
- vc_bypass_value = (target_vsel << vc->vc_common->data_shift) |
+ vc_valid = vc->common->valid;
+ vc_bypass_val_reg = vc->common->bypass_val_reg;
+ vc_bypass_value = (target_vsel << vc->common->data_shift) |
(vdd->pmic_info->pmic_reg <<
- vc->vc_common->regaddr_shift) |
+ vc->common->regaddr_shift) |
(vdd->pmic_info->i2c_slave_addr <<
- vc->vc_common->slaveaddr_shift);
+ vc->common->slaveaddr_shift);
- vdd->write_reg(vc_bypass_value, vc->vc_common->prm_mod, vc_bypass_val_reg);
- vdd->write_reg(vc_bypass_value | vc_valid, vc->vc_common->prm_mod,
+ vdd->write_reg(vc_bypass_value, vc->common->prm_mod, vc_bypass_val_reg);
+ vdd->write_reg(vc_bypass_value | vc_valid, vc->common->prm_mod,
vc_bypass_val_reg);
- vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod, vc_bypass_val_reg);
+ vc_bypass_value = vdd->read_reg(vc->common->prm_mod, vc_bypass_val_reg);
/*
* Loop till the bypass command is acknowledged from the SMPS.
* NOTE: This is legacy code. The loop count and retry count needs
@@ -136,7 +134,7 @@ int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
loop_cnt = 0;
udelay(10);
}
- vc_bypass_value = vdd->read_reg(vc->vc_common->prm_mod,
+ vc_bypass_value = vdd->read_reg(vc->common->prm_mod,
vc_bypass_val_reg);
}
@@ -146,23 +144,23 @@ int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
static void __init omap3_vfsm_init(struct voltagedomain *voltdm)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
/*
* Voltage Manager FSM parameters init
* XXX This data should be passed in from the board file
*/
- vdd->write_reg(OMAP3_CLKSETUP, vc->vc_common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
- vdd->write_reg(OMAP3_VOLTOFFSET, vc->vc_common->prm_mod,
+ vdd->write_reg(OMAP3_CLKSETUP, vc->common->prm_mod, OMAP3_PRM_CLKSETUP_OFFSET);
+ vdd->write_reg(OMAP3_VOLTOFFSET, vc->common->prm_mod,
OMAP3_PRM_VOLTOFFSET_OFFSET);
- vdd->write_reg(OMAP3_VOLTSETUP2, vc->vc_common->prm_mod,
+ vdd->write_reg(OMAP3_VOLTSETUP2, vc->common->prm_mod,
OMAP3_PRM_VOLTSETUP2_OFFSET);
}
static void __init omap3_vc_init(struct voltagedomain *voltdm)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
static bool is_initialized;
u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
@@ -176,19 +174,19 @@ static void __init omap3_vc_init(struct voltagedomain *voltdm)
onlp_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->onlp_volt);
ret_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->ret_volt);
off_vsel = vdd->pmic_info->uv_to_vsel(vdd->pmic_info->off_volt);
- vc_val = ((on_vsel << vc->vc_common->cmd_on_shift) |
- (onlp_vsel << vc->vc_common->cmd_onlp_shift) |
- (ret_vsel << vc->vc_common->cmd_ret_shift) |
- (off_vsel << vc->vc_common->cmd_off_shift));
- vdd->write_reg(vc_val, vc->vc_common->prm_mod, vc->cmdval_reg);
+ vc_val = ((on_vsel << vc->common->cmd_on_shift) |
+ (onlp_vsel << vc->common->cmd_onlp_shift) |
+ (ret_vsel << vc->common->cmd_ret_shift) |
+ (off_vsel << vc->common->cmd_off_shift));
+ vdd->write_reg(vc_val, vc->common->prm_mod, vc->cmdval_reg);
/*
* Generic VC parameters init
* XXX This data should be abstracted out
*/
- vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vc->vc_common->prm_mod,
+ vdd->write_reg(OMAP3430_CMD1_MASK | OMAP3430_RAV1_MASK, vc->common->prm_mod,
OMAP3_PRM_VC_CH_CONF_OFFSET);
- vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vc->vc_common->prm_mod,
+ vdd->write_reg(OMAP3430_MCODE_SHIFT | OMAP3430_HSEN_MASK, vc->common->prm_mod,
OMAP3_PRM_VC_I2C_CFG_OFFSET);
omap3_vfsm_init(voltdm);
@@ -200,7 +198,7 @@ static void __init omap3_vc_init(struct voltagedomain *voltdm)
/* OMAP4 specific voltage init functions */
static void __init omap4_vc_init(struct voltagedomain *voltdm)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
static bool is_initialized;
u32 vc_val;
@@ -217,18 +215,18 @@ static void __init omap4_vc_init(struct voltagedomain *voltdm)
vc_val = (OMAP4430_RAV_VDD_MPU_L_MASK | OMAP4430_CMD_VDD_MPU_L_MASK |
OMAP4430_RAV_VDD_IVA_L_MASK | OMAP4430_CMD_VDD_IVA_L_MASK |
OMAP4430_RAV_VDD_CORE_L_MASK | OMAP4430_CMD_VDD_CORE_L_MASK);
- vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
+ vdd->write_reg(vc_val, vc->common->prm_mod, OMAP4_PRM_VC_CFG_CHANNEL_OFFSET);
/* XXX These are magic numbers and do not belong! */
vc_val = (0x60 << OMAP4430_SCLL_SHIFT | 0x26 << OMAP4430_SCLH_SHIFT);
- vdd->write_reg(vc_val, vc->vc_common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
+ vdd->write_reg(vc_val, vc->common->prm_mod, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
is_initialized = true;
}
void __init omap_vc_init(struct voltagedomain *voltdm)
{
- struct omap_vc_instance_data *vc = voltdm->vdd->vc_data;
+ struct omap_vc_channel *vc = voltdm->vc;
struct omap_vdd_info *vdd = voltdm->vdd;
u32 vc_val;
@@ -246,27 +244,27 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
}
/* Set up the SMPS_SA(i2c slave address in VC */
- vc_val = vdd->read_reg(vc->vc_common->prm_mod,
- vc->vc_common->smps_sa_reg);
+ vc_val = vdd->read_reg(vc->common->prm_mod,
+ vc->common->smps_sa_reg);
vc_val &= ~vc->smps_sa_mask;
vc_val |= vdd->pmic_info->i2c_slave_addr << vc->smps_sa_shift;
- vdd->write_reg(vc_val, vc->vc_common->prm_mod,
- vc->vc_common->smps_sa_reg);
+ vdd->write_reg(vc_val, vc->common->prm_mod,
+ vc->common->smps_sa_reg);
/* Setup the VOLRA(pmic reg addr) in VC */
- vc_val = vdd->read_reg(vc->vc_common->prm_mod,
- vc->vc_common->smps_volra_reg);
+ vc_val = vdd->read_reg(vc->common->prm_mod,
+ vc->common->smps_volra_reg);
vc_val &= ~vc->smps_volra_mask;
vc_val |= vdd->pmic_info->pmic_reg << vc->smps_volra_shift;
- vdd->write_reg(vc_val, vc->vc_common->prm_mod,
- vc->vc_common->smps_volra_reg);
+ vdd->write_reg(vc_val, vc->common->prm_mod,
+ vc->common->smps_volra_reg);
/* Configure the setup times */
- vc_val = vdd->read_reg(vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
+ vc_val = vdd->read_reg(vc->common->prm_mod, vdd->vfsm->voltsetup_reg);
vc_val &= ~vdd->vfsm->voltsetup_mask;
vc_val |= vdd->pmic_info->volt_setup_time <<
vdd->vfsm->voltsetup_shift;
- vdd->write_reg(vc_val, vc->vc_common->prm_mod, vdd->vfsm->voltsetup_reg);
+ vdd->write_reg(vc_val, vc->common->prm_mod, vdd->vfsm->voltsetup_reg);
if (cpu_is_omap34xx())
omap3_vc_init(voltdm);
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index b823e5b..40632b6 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -22,7 +22,7 @@
struct voltagedomain;
/**
- * struct omap_vc_common_data - per-VC register/bitfield data
+ * struct omap_vc_common - per-VC register/bitfield data
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
* @prm_mod: PRM module id used for PRM register access
@@ -40,7 +40,7 @@ struct voltagedomain;
* XXX One of cmd_on_mask and cmd_on_shift are not needed
* XXX VALID should probably be a shift, not a mask
*/
-struct omap_vc_common_data {
+struct omap_vc_common {
u32 cmd_on_mask;
u32 valid;
s16 prm_mod;
@@ -57,8 +57,8 @@ struct omap_vc_common_data {
};
/**
- * struct omap_vc_instance_data - VC per-instance data
- * @vc_common: pointer to VC common data for this platform
+ * struct omap_vc_channel - VC per-instance data
+ * @common: pointer to VC common data for this platform
* @smps_sa_mask: SA* bitmask in the PRM_VC_SMPS_SA register
* @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register
* @smps_sa_shift: SA* field shift in the PRM_VC_SMPS_SA register
@@ -67,8 +67,8 @@ struct omap_vc_common_data {
* XXX It is not necessary to have both a *_mask and a *_shift -
* remove one
*/
-struct omap_vc_instance_data {
- const struct omap_vc_common_data *vc_common;
+struct omap_vc_channel {
+ const struct omap_vc_common *common;
u32 smps_sa_mask;
u32 smps_volra_mask;
u8 cmdval_reg;
@@ -76,12 +76,12 @@ struct omap_vc_instance_data {
u8 smps_volra_shift;
};
-extern struct omap_vc_instance_data omap3_vc1_data;
-extern struct omap_vc_instance_data omap3_vc2_data;
+extern struct omap_vc_channel omap3_vc_mpu;
+extern struct omap_vc_channel omap3_vc_core;
-extern struct omap_vc_instance_data omap4_vc_mpu_data;
-extern struct omap_vc_instance_data omap4_vc_iva_data;
-extern struct omap_vc_instance_data omap4_vc_core_data;
+extern struct omap_vc_channel omap4_vc_mpu;
+extern struct omap_vc_channel omap4_vc_iva;
+extern struct omap_vc_channel omap4_vc_core;
void omap_vc_init(struct voltagedomain *voltdm);
int omap_vc_pre_scale(struct voltagedomain *voltdm,
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index 55caccb..1a17ed4 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -29,7 +29,7 @@
* VC data common to 34xx/36xx chips
* XXX This stuff presumably belongs in the vc3xxx.c or vc.c file.
*/
-static struct omap_vc_common_data omap3_vc_common = {
+static struct omap_vc_common omap3_vc_common = {
.prm_mod = OMAP3430_GR_MOD,
.smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
@@ -45,8 +45,8 @@ static struct omap_vc_common_data omap3_vc_common = {
.cmd_off_shift = OMAP3430_VC_CMD_OFF_SHIFT,
};
-struct omap_vc_instance_data omap3_vc1_data = {
- .vc_common = &omap3_vc_common,
+struct omap_vc_channel omap3_vc_mpu = {
+ .common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
.smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
@@ -54,8 +54,8 @@ struct omap_vc_instance_data omap3_vc1_data = {
.smps_volra_mask = OMAP3430_VOLRA0_MASK,
};
-struct omap_vc_instance_data omap3_vc2_data = {
- .vc_common = &omap3_vc_common,
+struct omap_vc_channel omap3_vc_core = {
+ .common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
.smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index b62678e..56f3f4a 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -30,7 +30,7 @@
* VC data common to 44xx chips
* XXX This stuff presumably belongs in the vc3xxx.c or vc.c file.
*/
-static const struct omap_vc_common_data omap4_vc_common = {
+static const struct omap_vc_common omap4_vc_common = {
.prm_mod = OMAP4430_PRM_DEVICE_INST,
.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
@@ -47,8 +47,8 @@ static const struct omap_vc_common_data omap4_vc_common = {
};
/* VC instance data for each controllable voltage line */
-struct omap_vc_instance_data omap4_vc_mpu_data = {
- .vc_common = &omap4_vc_common,
+struct omap_vc_channel omap4_vc_mpu = {
+ .common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
.smps_sa_shift = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
@@ -56,8 +56,8 @@ struct omap_vc_instance_data omap4_vc_mpu_data = {
.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
};
-struct omap_vc_instance_data omap4_vc_iva_data = {
- .vc_common = &omap4_vc_common,
+struct omap_vc_channel omap4_vc_iva = {
+ .common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
.smps_sa_shift = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
@@ -65,8 +65,8 @@ struct omap_vc_instance_data omap4_vc_iva_data = {
.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
};
-struct omap_vc_instance_data omap4_vc_core_data = {
- .vc_common = &omap4_vc_common,
+struct omap_vc_channel omap4_vc_core = {
+ .common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
.smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index 8a47dd1..a7dd088 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -805,10 +805,12 @@ int __init omap_voltage_late_init(void)
if (voltdm->vdd) {
if (omap_vdd_data_configure(voltdm))
continue;
- omap_vc_init(voltdm);
vp_init(voltdm);
vdd_debugfs_init(voltdm);
}
+
+ if (voltdm->vc)
+ omap_vc_init(voltdm);
}
return 0;
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index df8d234..68a9439 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -71,6 +71,8 @@ struct voltagedomain {
bool scalable;
struct list_head node;
struct list_head pwrdm_list;
+ struct omap_vc_channel *vc;
+
struct omap_vdd_info *vdd;
};
@@ -144,7 +146,6 @@ struct omap_vdd_info {
struct omap_volt_pmic_info *pmic_info;
struct omap_vp_instance_data *vp_data;
struct omap_vp_runtime_data vp_rt_data;
- struct omap_vc_instance_data *vc_data;
const struct omap_vfsm_instance_data *vfsm;
struct dentry *debug_dir;
u32 curr_volt;
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
index e9664843..c5959f8 100644
--- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c
@@ -41,7 +41,6 @@ static struct omap_vdd_info omap3_vdd1_info = {
.prm_irqst_mod = OCP_MOD,
.prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.vp_data = &omap3_vp1_data,
- .vc_data = &omap3_vc1_data,
.vfsm = &omap3_vdd1_vfsm_data,
};
@@ -55,19 +54,20 @@ static struct omap_vdd_info omap3_vdd2_info = {
.prm_irqst_mod = OCP_MOD,
.prm_irqst_reg = OMAP3_PRM_IRQSTATUS_MPU_OFFSET,
.vp_data = &omap3_vp2_data,
- .vc_data = &omap3_vc2_data,
.vfsm = &omap3_vdd2_vfsm_data,
};
static struct voltagedomain omap3_voltdm_mpu = {
.name = "mpu_iva",
.scalable = true,
+ .vc = &omap3_vc_mpu,
.vdd = &omap3_vdd1_info,
};
static struct voltagedomain omap3_voltdm_core = {
.name = "core",
.scalable = true,
+ .vc = &omap3_vc_core,
.vdd = &omap3_vdd2_info,
};
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c
index 068a5e7..12c4a19 100644
--- a/arch/arm/mach-omap2/voltagedomains44xx_data.c
+++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c
@@ -40,7 +40,6 @@ static struct omap_vdd_info omap4_vdd_mpu_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_mpu_data,
- .vc_data = &omap4_vc_mpu_data,
.vfsm = &omap4_vdd_mpu_vfsm_data,
};
@@ -52,7 +51,6 @@ static struct omap_vdd_info omap4_vdd_iva_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_iva_data,
- .vc_data = &omap4_vc_iva_data,
.vfsm = &omap4_vdd_iva_vfsm_data,
};
@@ -64,22 +62,24 @@ static struct omap_vdd_info omap4_vdd_core_info = {
.prm_irqst_mod = OMAP4430_PRM_OCP_SOCKET_INST,
.prm_irqst_reg = OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET,
.vp_data = &omap4_vp_core_data,
- .vc_data = &omap4_vc_core_data,
.vfsm = &omap4_vdd_core_vfsm_data,
};
static struct voltagedomain omap4_voltdm_mpu = {
.name = "mpu",
+ .vc = &omap4_vc_mpu,
.vdd = &omap4_vdd_mpu_info,
};
static struct voltagedomain omap4_voltdm_iva = {
.name = "iva",
+ .vc = &omap4_vc_iva,
.vdd = &omap4_vdd_iva_info,
};
static struct voltagedomain omap4_voltdm_core = {
.name = "core",
+ .vc = &omap4_vc_core,
.vdd = &omap4_vdd_core_info,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 16/19] OMAP2+: voltage: split out voltage processor (VP) code into new layer
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (14 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 15/19] OMAP2+: voltage: move VC into struct voltagedomain, misc. renames Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 17/19] OMAP2+: voltage: VC: begin spliting out SoC specifics; start with i2c slave addr Kevin Hilman
` (4 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
This patch is primarily a move of VP specific code from voltage.c into
its own code in vp.c and adds prototypes to vp.h
No functional changes, except debugfs...
VP debugfs moved to 'vp' subdir of <debugfs>/voltage/ and 'vp_'
prefixes removed from all debugfs filenames.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/Makefile | 2 +-
arch/arm/mach-omap2/voltage.c | 348 +-------------------------------------
arch/arm/mach-omap2/voltage.h | 3 -
arch/arm/mach-omap2/vp.c | 374 +++++++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vp.h | 9 +
5 files changed, 387 insertions(+), 349 deletions(-)
create mode 100644 arch/arm/mach-omap2/vp.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index a0d8f61..bb82611 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -90,7 +90,7 @@ obj-$(CONFIG_ARCH_OMAP4) += prcm.o cm2xxx_3xxx.o cminst44xx.o \
# OMAP voltage domains
ifeq ($(CONFIG_PM),y)
-voltagedomain-common := voltage.o vc.o
+voltagedomain-common := voltage.o vc.o vp.o
obj-$(CONFIG_ARCH_OMAP2) += $(voltagedomain-common) \
voltagedomains2xxx_data.o
obj-$(CONFIG_ARCH_OMAP3) += $(voltagedomain-common) \
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index a7dd088..985d55a 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -46,10 +46,6 @@ static LIST_HEAD(voltdm_list);
#define VOLTAGE_DIR_SIZE 16
static struct dentry *voltage_dir;
-/* Init function pointers */
-static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
- unsigned long target_volt);
-
static u32 omap3_voltage_read_reg(u16 mod, u8 offset)
{
return omap2_prm_read_mod_reg(mod, offset);
@@ -105,7 +101,7 @@ static int __init _config_common_vdd_data(struct voltagedomain *voltdm)
sys_clk_speed /= 1000;
/* Generic voltage parameters */
- vdd->volt_scale = vp_forceupdate_scale_voltage;
+ vdd->volt_scale = omap_vp_forceupdate_scale;
vdd->vp_enabled = false;
vdd->vp_rt_data.vpconfig_erroroffset =
@@ -127,30 +123,6 @@ static int __init _config_common_vdd_data(struct voltagedomain *voltdm)
return 0;
}
-/* Voltage debugfs support */
-static int vp_volt_debug_get(void *data, u64 *val)
-{
- struct voltagedomain *voltdm = (struct voltagedomain *)data;
- struct omap_vdd_info *vdd = voltdm->vdd;
- u8 vsel;
-
- if (!vdd) {
- pr_warning("Wrong paramater passed\n");
- return -EINVAL;
- }
-
- vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
-
- if (!vdd->pmic_info->vsel_to_uv) {
- pr_warning("PMIC function to convert vsel to voltage"
- "in uV not registerd\n");
- return -EINVAL;
- }
-
- *val = vdd->pmic_info->vsel_to_uv(vsel);
- return 0;
-}
-
static int nom_volt_debug_get(void *data, u64 *val)
{
struct voltagedomain *voltdm = (struct voltagedomain *)data;
@@ -165,85 +137,8 @@ static int nom_volt_debug_get(void *data, u64 *val)
return 0;
}
-DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops, vp_volt_debug_get, NULL, "%llu\n");
DEFINE_SIMPLE_ATTRIBUTE(nom_volt_debug_fops, nom_volt_debug_get, NULL,
"%llu\n");
-static void vp_latch_vsel(struct voltagedomain *voltdm)
-{
- u32 vpconfig;
- unsigned long uvdc;
- char vsel;
- struct omap_vdd_info *vdd = voltdm->vdd;
-
- uvdc = omap_voltage_get_nom_volt(voltdm);
- if (!uvdc) {
- pr_warning("%s: unable to find current voltage for vdd_%s\n",
- __func__, voltdm->name);
- return;
- }
-
- if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
- pr_warning("%s: PMIC function to convert voltage in uV to"
- " vsel not registered\n", __func__);
- return;
- }
-
- vsel = vdd->pmic_info->uv_to_vsel(uvdc);
-
- vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvoltage_mask |
- vdd->vp_data->vp_common->vpconfig_initvdd);
- vpconfig |= vsel << vdd->vp_data->vp_common->vpconfig_initvoltage_shift;
-
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /* Trigger initVDD value copy to voltage processor */
- vdd->write_reg((vpconfig | vdd->vp_data->vp_common->vpconfig_initvdd),
- vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /* Clear initVDD copy trigger bit */
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-}
-
-/* Generic voltage init functions */
-static void __init vp_init(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- u32 vp_val;
-
- if (!vdd->read_reg || !vdd->write_reg) {
- pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, voltdm->name);
- return;
- }
-
- vp_val = vdd->vp_rt_data.vpconfig_erroroffset |
- (vdd->vp_rt_data.vpconfig_errorgain <<
- vdd->vp_data->vp_common->vpconfig_errorgain_shift) |
- vdd->vp_data->vp_common->vpconfig_timeouten;
- vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- vp_val = ((vdd->vp_rt_data.vstepmin_smpswaittimemin <<
- vdd->vp_data->vp_common->vstepmin_smpswaittimemin_shift) |
- (vdd->vp_rt_data.vstepmin_stepmin <<
- vdd->vp_data->vp_common->vstepmin_stepmin_shift));
- vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstepmin);
-
- vp_val = ((vdd->vp_rt_data.vstepmax_smpswaittimemax <<
- vdd->vp_data->vp_common->vstepmax_smpswaittimemax_shift) |
- (vdd->vp_rt_data.vstepmax_stepmax <<
- vdd->vp_data->vp_common->vstepmax_stepmax_shift));
- vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstepmax);
-
- vp_val = ((vdd->vp_rt_data.vlimitto_vddmax <<
- vdd->vp_data->vp_common->vlimitto_vddmax_shift) |
- (vdd->vp_rt_data.vlimitto_vddmin <<
- vdd->vp_data->vp_common->vlimitto_vddmin_shift) |
- (vdd->vp_rt_data.vlimitto_timeout <<
- vdd->vp_data->vp_common->vlimitto_timeout_shift));
- vdd->write_reg(vp_val, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vlimitto);
-}
-
static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
{
char *name;
@@ -268,125 +163,11 @@ static void __init vdd_debugfs_init(struct voltagedomain *voltdm)
return;
}
- (void) debugfs_create_x16("vp_errorgain", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vpconfig_errorgain));
- (void) debugfs_create_x16("vp_smpswaittimemin", S_IRUGO,
- vdd->debug_dir,
- &(vdd->vp_rt_data.vstepmin_smpswaittimemin));
- (void) debugfs_create_x8("vp_stepmin", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vstepmin_stepmin));
- (void) debugfs_create_x16("vp_smpswaittimemax", S_IRUGO,
- vdd->debug_dir,
- &(vdd->vp_rt_data.vstepmax_smpswaittimemax));
- (void) debugfs_create_x8("vp_stepmax", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vstepmax_stepmax));
- (void) debugfs_create_x8("vp_vddmax", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vlimitto_vddmax));
- (void) debugfs_create_x8("vp_vddmin", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vlimitto_vddmin));
- (void) debugfs_create_x16("vp_timeout", S_IRUGO, vdd->debug_dir,
- &(vdd->vp_rt_data.vlimitto_timeout));
- (void) debugfs_create_file("curr_vp_volt", S_IRUGO, vdd->debug_dir,
- (void *) voltdm, &vp_volt_debug_fops);
(void) debugfs_create_file("curr_nominal_volt", S_IRUGO,
vdd->debug_dir, (void *) voltdm,
&nom_volt_debug_fops);
}
-/* VP force update method of voltage scaling */
-static int vp_forceupdate_scale_voltage(struct voltagedomain *voltdm,
- unsigned long target_volt)
-{
- struct omap_vdd_info *vdd = voltdm->vdd;
- u32 vpconfig;
- u8 target_vsel, current_vsel;
- int ret, timeout = 0;
-
- ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
- if (ret)
- return ret;
-
- /*
- * Clear all pending TransactionDone interrupt/status. Typical latency
- * is <3us
- */
- while (timeout++ < VP_TRANXDONE_TIMEOUT) {
- vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
- vdd->prm_irqst_mod, vdd->prm_irqst_reg);
- if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
- vdd->vp_data->prm_irqst_data->tranxdone_status))
- break;
- udelay(1);
- }
- if (timeout >= VP_TRANXDONE_TIMEOUT) {
- pr_warning("%s: vdd_%s TRANXDONE timeout exceeded."
- "Voltage change aborted", __func__, voltdm->name);
- return -ETIMEDOUT;
- }
-
- /* Configure for VP-Force Update */
- vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- vpconfig &= ~(vdd->vp_data->vp_common->vpconfig_initvdd |
- vdd->vp_data->vp_common->vpconfig_forceupdate |
- vdd->vp_data->vp_common->vpconfig_initvoltage_mask);
- vpconfig |= ((target_vsel <<
- vdd->vp_data->vp_common->vpconfig_initvoltage_shift));
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /* Trigger initVDD value copy to voltage processor */
- vpconfig |= vdd->vp_data->vp_common->vpconfig_initvdd;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /* Force update of voltage */
- vpconfig |= vdd->vp_data->vp_common->vpconfig_forceupdate;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /*
- * Wait for TransactionDone. Typical latency is <200us.
- * Depends on SMPSWAITTIMEMIN/MAX and voltage change
- */
- timeout = 0;
- omap_test_timeout((vdd->read_reg(vdd->prm_irqst_mod,
- vdd->prm_irqst_reg) &
- vdd->vp_data->prm_irqst_data->tranxdone_status),
- VP_TRANXDONE_TIMEOUT, timeout);
- if (timeout >= VP_TRANXDONE_TIMEOUT)
- pr_err("%s: vdd_%s TRANXDONE timeout exceeded."
- "TRANXDONE never got set after the voltage update\n",
- __func__, voltdm->name);
-
- omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
-
- /*
- * Disable TransactionDone interrupt , clear all status, clear
- * control registers
- */
- timeout = 0;
- while (timeout++ < VP_TRANXDONE_TIMEOUT) {
- vdd->write_reg(vdd->vp_data->prm_irqst_data->tranxdone_status,
- vdd->prm_irqst_mod, vdd->prm_irqst_reg);
- if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
- vdd->vp_data->prm_irqst_data->tranxdone_status))
- break;
- udelay(1);
- }
-
- if (timeout >= VP_TRANXDONE_TIMEOUT)
- pr_warning("%s: vdd_%s TRANXDONE timeout exceeded while trying"
- "to clear the TRANXDONE status\n",
- __func__, voltdm->name);
-
- vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- /* Clear initVDD copy trigger bit */
- vpconfig &= ~vdd->vp_data->vp_common->vpconfig_initvdd;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- /* Clear force bit */
- vpconfig &= ~vdd->vp_data->vp_common->vpconfig_forceupdate;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- return 0;
-}
-
static int __init omap_vdd_data_configure(struct voltagedomain *voltdm)
{
struct omap_vdd_info *vdd = voltdm->vdd;
@@ -439,129 +220,6 @@ unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm)
}
/**
- * omap_vp_get_curr_volt() - API to get the current vp voltage.
- * @voltdm: pointer to the VDD.
- *
- * This API returns the current voltage for the specified voltage processor
- */
-unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd;
- u8 curr_vsel;
-
- if (!voltdm || IS_ERR(voltdm)) {
- pr_warning("%s: VDD specified does not exist!\n", __func__);
- return 0;
- }
-
- vdd = voltdm->vdd;
- if (!vdd->read_reg) {
- pr_err("%s: No read API for reading vdd_%s regs\n",
- __func__, voltdm->name);
- return 0;
- }
-
- curr_vsel = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->voltage);
-
- if (!vdd->pmic_info || !vdd->pmic_info->vsel_to_uv) {
- pr_warning("%s: PMIC function to convert vsel to voltage"
- "in uV not registerd\n", __func__);
- return 0;
- }
-
- return vdd->pmic_info->vsel_to_uv(curr_vsel);
-}
-
-/**
- * omap_vp_enable() - API to enable a particular VP
- * @voltdm: pointer to the VDD whose VP is to be enabled.
- *
- * This API enables a particular voltage processor. Needed by the smartreflex
- * class drivers.
- */
-void omap_vp_enable(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd;
- u32 vpconfig;
-
- if (!voltdm || IS_ERR(voltdm)) {
- pr_warning("%s: VDD specified does not exist!\n", __func__);
- return;
- }
-
- vdd = voltdm->vdd;
- if (!vdd->read_reg || !vdd->write_reg) {
- pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, voltdm->name);
- return;
- }
-
- /* If VP is already enabled, do nothing. Return */
- if (vdd->vp_enabled)
- return;
-
- vp_latch_vsel(voltdm);
-
- /* Enable VP */
- vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- vpconfig |= vdd->vp_data->vp_common->vpconfig_vpenable;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- vdd->vp_enabled = true;
-}
-
-/**
- * omap_vp_disable() - API to disable a particular VP
- * @voltdm: pointer to the VDD whose VP is to be disabled.
- *
- * This API disables a particular voltage processor. Needed by the smartreflex
- * class drivers.
- */
-void omap_vp_disable(struct voltagedomain *voltdm)
-{
- struct omap_vdd_info *vdd;
- u32 vpconfig;
- int timeout;
-
- if (!voltdm || IS_ERR(voltdm)) {
- pr_warning("%s: VDD specified does not exist!\n", __func__);
- return;
- }
-
- vdd = voltdm->vdd;
- if (!vdd->read_reg || !vdd->write_reg) {
- pr_err("%s: No read/write API for accessing vdd_%s regs\n",
- __func__, voltdm->name);
- return;
- }
-
- /* If VP is already disabled, do nothing. Return */
- if (!vdd->vp_enabled) {
- pr_warning("%s: Trying to disable VP for vdd_%s when"
- "it is already disabled\n", __func__, voltdm->name);
- return;
- }
-
- /* Disable VP */
- vpconfig = vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
- vpconfig &= ~vdd->vp_data->vp_common->vpconfig_vpenable;
- vdd->write_reg(vpconfig, vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vpconfig);
-
- /*
- * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
- */
- omap_test_timeout((vdd->read_reg(vdd->vp_data->vp_common->prm_mod, vdd->vp_data->vstatus)),
- VP_IDLE_TIMEOUT, timeout);
-
- if (timeout >= VP_IDLE_TIMEOUT)
- pr_warning("%s: vdd_%s idle timedout\n",
- __func__, voltdm->name);
-
- vdd->vp_enabled = false;
-
- return;
-}
-
-/**
* omap_voltage_scale_vdd() - API to scale voltage of a particular
* voltage domain.
* @voltdm: pointer to the VDD which is to be scaled.
@@ -766,7 +424,7 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
switch (voltscale_method) {
case VOLTSCALE_VPFORCEUPDATE:
- vdd->volt_scale = vp_forceupdate_scale_voltage;
+ vdd->volt_scale = omap_vp_forceupdate_scale;
return;
case VOLTSCALE_VCBYPASS:
vdd->volt_scale = omap_vc_bypass_scale_voltage;
@@ -805,8 +463,8 @@ int __init omap_voltage_late_init(void)
if (voltdm->vdd) {
if (omap_vdd_data_configure(voltdm))
continue;
- vp_init(voltdm);
vdd_debugfs_init(voltdm);
+ omap_vp_init(voltdm);
}
if (voltdm->vc)
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index 68a9439..c5d3087 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -159,9 +159,6 @@ struct omap_vdd_info {
unsigned long target_volt);
};
-unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm);
-void omap_vp_enable(struct voltagedomain *voltdm);
-void omap_vp_disable(struct voltagedomain *voltdm);
int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
unsigned long target_volt);
void omap_voltage_reset(struct voltagedomain *voltdm);
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
new file mode 100644
index 0000000..f3503de
--- /dev/null
+++ b/arch/arm/mach-omap2/vp.c
@@ -0,0 +1,374 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/debugfs.h>
+
+#include <plat/common.h>
+
+#include "voltage.h"
+#include "vp.h"
+#include "prm-regbits-34xx.h"
+#include "prm-regbits-44xx.h"
+#include "prm44xx.h"
+
+static void __init vp_debugfs_init(struct voltagedomain *voltdm);
+
+static void vp_latch_vsel(struct voltagedomain *voltdm)
+{
+ struct omap_vp_instance_data *vp = voltdm->vdd->vp_data;
+ u32 vpconfig;
+ unsigned long uvdc;
+ char vsel;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+
+ uvdc = omap_voltage_get_nom_volt(voltdm);
+ if (!uvdc) {
+ pr_warning("%s: unable to find current voltage for vdd_%s\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ if (!vdd->pmic_info || !vdd->pmic_info->uv_to_vsel) {
+ pr_warning("%s: PMIC function to convert voltage in uV to"
+ " vsel not registered\n", __func__);
+ return;
+ }
+
+ vsel = vdd->pmic_info->uv_to_vsel(uvdc);
+
+ vpconfig = vdd->read_reg(vp->vp_common->prm_mod, vp->vpconfig);
+ vpconfig &= ~(vp->vp_common->vpconfig_initvoltage_mask |
+ vp->vp_common->vpconfig_initvdd);
+ vpconfig |= vsel << vp->vp_common->vpconfig_initvoltage_shift;
+
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ /* Trigger initVDD value copy to voltage processor */
+ vdd->write_reg((vpconfig | vp->vp_common->vpconfig_initvdd),
+ vp->vp_common->prm_mod, vp->vpconfig);
+
+ /* Clear initVDD copy trigger bit */
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+}
+
+/* Generic voltage init functions */
+void __init omap_vp_init(struct voltagedomain *voltdm)
+{
+ struct omap_vp_instance_data *vp = voltdm->vdd->vp_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u32 vp_val;
+
+ if (!vdd->read_reg || !vdd->write_reg) {
+ pr_err("%s: No read/write API for accessing vdd_%s regs\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ vp_val = vdd->vp_rt_data.vpconfig_erroroffset |
+ (vdd->vp_rt_data.vpconfig_errorgain <<
+ vp->vp_common->vpconfig_errorgain_shift) |
+ vp->vp_common->vpconfig_timeouten;
+ vdd->write_reg(vp_val, vp->vp_common->prm_mod, vp->vpconfig);
+
+ vp_val = ((vdd->vp_rt_data.vstepmin_smpswaittimemin <<
+ vp->vp_common->vstepmin_smpswaittimemin_shift) |
+ (vdd->vp_rt_data.vstepmin_stepmin <<
+ vp->vp_common->vstepmin_stepmin_shift));
+ vdd->write_reg(vp_val, vp->vp_common->prm_mod, vp->vstepmin);
+
+ vp_val = ((vdd->vp_rt_data.vstepmax_smpswaittimemax <<
+ vp->vp_common->vstepmax_smpswaittimemax_shift) |
+ (vdd->vp_rt_data.vstepmax_stepmax <<
+ vp->vp_common->vstepmax_stepmax_shift));
+ vdd->write_reg(vp_val, vp->vp_common->prm_mod, vp->vstepmax);
+
+ vp_val = ((vdd->vp_rt_data.vlimitto_vddmax <<
+ vp->vp_common->vlimitto_vddmax_shift) |
+ (vdd->vp_rt_data.vlimitto_vddmin <<
+ vp->vp_common->vlimitto_vddmin_shift) |
+ (vdd->vp_rt_data.vlimitto_timeout <<
+ vp->vp_common->vlimitto_timeout_shift));
+ vdd->write_reg(vp_val, vp->vp_common->prm_mod, vp->vlimitto);
+
+ vp_debugfs_init(voltdm);
+}
+
+/* VP force update method of voltage scaling */
+int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt)
+{
+ struct omap_vp_instance_data *vp = voltdm->vdd->vp_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u32 vpconfig;
+ u8 target_vsel, current_vsel;
+ int ret, timeout = 0;
+
+ ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, ¤t_vsel);
+ if (ret)
+ return ret;
+
+ /*
+ * Clear all pending TransactionDone interrupt/status. Typical latency
+ * is <3us
+ */
+ while (timeout++ < VP_TRANXDONE_TIMEOUT) {
+ vdd->write_reg(vp->prm_irqst_data->tranxdone_status,
+ vdd->prm_irqst_mod, vdd->prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
+ vp->prm_irqst_data->tranxdone_status))
+ break;
+ udelay(1);
+ }
+ if (timeout >= VP_TRANXDONE_TIMEOUT) {
+ pr_warning("%s: vdd_%s TRANXDONE timeout exceeded."
+ "Voltage change aborted", __func__, voltdm->name);
+ return -ETIMEDOUT;
+ }
+
+ /* Configure for VP-Force Update */
+ vpconfig = vdd->read_reg(vp->vp_common->prm_mod, vp->vpconfig);
+ vpconfig &= ~(vp->vp_common->vpconfig_initvdd |
+ vp->vp_common->vpconfig_forceupdate |
+ vp->vp_common->vpconfig_initvoltage_mask);
+ vpconfig |= ((target_vsel <<
+ vp->vp_common->vpconfig_initvoltage_shift));
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ /* Trigger initVDD value copy to voltage processor */
+ vpconfig |= vp->vp_common->vpconfig_initvdd;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ /* Force update of voltage */
+ vpconfig |= vp->vp_common->vpconfig_forceupdate;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ /*
+ * Wait for TransactionDone. Typical latency is <200us.
+ * Depends on SMPSWAITTIMEMIN/MAX and voltage change
+ */
+ timeout = 0;
+ omap_test_timeout((vdd->read_reg(vdd->prm_irqst_mod,
+ vdd->prm_irqst_reg) &
+ vp->prm_irqst_data->tranxdone_status),
+ VP_TRANXDONE_TIMEOUT, timeout);
+ if (timeout >= VP_TRANXDONE_TIMEOUT)
+ pr_err("%s: vdd_%s TRANXDONE timeout exceeded."
+ "TRANXDONE never got set after the voltage update\n",
+ __func__, voltdm->name);
+
+ omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
+
+ /*
+ * Disable TransactionDone interrupt , clear all status, clear
+ * control registers
+ */
+ timeout = 0;
+ while (timeout++ < VP_TRANXDONE_TIMEOUT) {
+ vdd->write_reg(vp->prm_irqst_data->tranxdone_status,
+ vdd->prm_irqst_mod, vdd->prm_irqst_reg);
+ if (!(vdd->read_reg(vdd->prm_irqst_mod, vdd->prm_irqst_reg) &
+ vp->prm_irqst_data->tranxdone_status))
+ break;
+ udelay(1);
+ }
+
+ if (timeout >= VP_TRANXDONE_TIMEOUT)
+ pr_warning("%s: vdd_%s TRANXDONE timeout exceeded while trying"
+ "to clear the TRANXDONE status\n",
+ __func__, voltdm->name);
+
+ vpconfig = vdd->read_reg(vp->vp_common->prm_mod, vp->vpconfig);
+ /* Clear initVDD copy trigger bit */
+ vpconfig &= ~vp->vp_common->vpconfig_initvdd;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+ /* Clear force bit */
+ vpconfig &= ~vp->vp_common->vpconfig_forceupdate;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ return 0;
+}
+
+/**
+ * omap_vp_get_curr_volt() - API to get the current vp voltage.
+ * @voltdm: pointer to the VDD.
+ *
+ * This API returns the current voltage for the specified voltage processor
+ */
+unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm)
+{
+ struct omap_vp_instance_data *vp = voltdm->vdd->vp_data;
+ struct omap_vdd_info *vdd;
+ u8 curr_vsel;
+
+ if (!voltdm || IS_ERR(voltdm)) {
+ pr_warning("%s: VDD specified does not exist!\n", __func__);
+ return 0;
+ }
+
+ vdd = voltdm->vdd;
+ if (!vdd->read_reg) {
+ pr_err("%s: No read API for reading vdd_%s regs\n",
+ __func__, voltdm->name);
+ return 0;
+ }
+
+ curr_vsel = vdd->read_reg(vp->vp_common->prm_mod, vp->voltage);
+
+ if (!vdd->pmic_info || !vdd->pmic_info->vsel_to_uv) {
+ pr_warning("%s: PMIC function to convert vsel to voltage"
+ "in uV not registerd\n", __func__);
+ return 0;
+ }
+
+ return vdd->pmic_info->vsel_to_uv(curr_vsel);
+}
+
+/**
+ * omap_vp_enable() - API to enable a particular VP
+ * @voltdm: pointer to the VDD whose VP is to be enabled.
+ *
+ * This API enables a particular voltage processor. Needed by the smartreflex
+ * class drivers.
+ */
+void omap_vp_enable(struct voltagedomain *voltdm)
+{
+ struct omap_vp_instance_data *vp;
+ struct omap_vdd_info *vdd;
+ u32 vpconfig;
+
+ if (!voltdm || IS_ERR(voltdm)) {
+ pr_warning("%s: VDD specified does not exist!\n", __func__);
+ return;
+ }
+
+ vdd = voltdm->vdd;
+ vp = voltdm->vdd->vp_data;
+ if (!vdd->read_reg || !vdd->write_reg) {
+ pr_err("%s: No read/write API for accessing vdd_%s regs\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ /* If VP is already enabled, do nothing. Return */
+ if (vdd->vp_enabled)
+ return;
+
+ vp_latch_vsel(voltdm);
+
+ /* Enable VP */
+ vpconfig = vdd->read_reg(vp->vp_common->prm_mod, vp->vpconfig);
+ vpconfig |= vp->vp_common->vpconfig_vpenable;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+ vdd->vp_enabled = true;
+}
+
+/**
+ * omap_vp_disable() - API to disable a particular VP
+ * @voltdm: pointer to the VDD whose VP is to be disabled.
+ *
+ * This API disables a particular voltage processor. Needed by the smartreflex
+ * class drivers.
+ */
+void omap_vp_disable(struct voltagedomain *voltdm)
+{
+ struct omap_vp_instance_data *vp;
+ struct omap_vdd_info *vdd;
+ u32 vpconfig;
+ int timeout;
+
+ if (!voltdm || IS_ERR(voltdm)) {
+ pr_warning("%s: VDD specified does not exist!\n", __func__);
+ return;
+ }
+
+ vdd = voltdm->vdd;
+ vp = voltdm->vdd->vp_data;
+ if (!vdd->read_reg || !vdd->write_reg) {
+ pr_err("%s: No read/write API for accessing vdd_%s regs\n",
+ __func__, voltdm->name);
+ return;
+ }
+
+ /* If VP is already disabled, do nothing. Return */
+ if (!vdd->vp_enabled) {
+ pr_warning("%s: Trying to disable VP for vdd_%s when"
+ "it is already disabled\n", __func__, voltdm->name);
+ return;
+ }
+
+ /* Disable VP */
+ vpconfig = vdd->read_reg(vp->vp_common->prm_mod, vp->vpconfig);
+ vpconfig &= ~vp->vp_common->vpconfig_vpenable;
+ vdd->write_reg(vpconfig, vp->vp_common->prm_mod, vp->vpconfig);
+
+ /*
+ * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
+ */
+ omap_test_timeout((vdd->read_reg(vp->vp_common->prm_mod, vp->vstatus)),
+ VP_IDLE_TIMEOUT, timeout);
+
+ if (timeout >= VP_IDLE_TIMEOUT)
+ pr_warning("%s: vdd_%s idle timedout\n",
+ __func__, voltdm->name);
+
+ vdd->vp_enabled = false;
+
+ return;
+}
+
+/* Voltage debugfs support */
+static int vp_volt_debug_get(void *data, u64 *val)
+{
+ struct voltagedomain *voltdm = (struct voltagedomain *)data;
+ struct omap_vp_instance_data *vp = voltdm->vdd->vp_data;
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ u8 vsel;
+
+ if (!vdd) {
+ pr_warning("Wrong paramater passed\n");
+ return -EINVAL;
+ }
+
+ vsel = vdd->read_reg(vp->vp_common->prm_mod, vp->voltage);
+
+ if (!vdd->pmic_info->vsel_to_uv) {
+ pr_warning("PMIC function to convert vsel to voltage"
+ "in uV not registerd\n");
+ return -EINVAL;
+ }
+
+ *val = vdd->pmic_info->vsel_to_uv(vsel);
+ return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(vp_volt_debug_fops, vp_volt_debug_get, NULL, "%llu\n");
+
+static void __init vp_debugfs_init(struct voltagedomain *voltdm)
+{
+ struct omap_vdd_info *vdd = voltdm->vdd;
+ struct dentry *debug_dir;
+
+ debug_dir = debugfs_create_dir("vp", vdd->debug_dir);
+ if (IS_ERR(debug_dir))
+ pr_err("%s: Unable to create VP debugfs dir dir\n", __func__);
+
+ (void) debugfs_create_x16("errorgain", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vpconfig_errorgain));
+ (void) debugfs_create_x16("smpswaittimemin", S_IRUGO,
+ debug_dir,
+ &(vdd->vp_rt_data.vstepmin_smpswaittimemin));
+ (void) debugfs_create_x8("stepmin", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vstepmin_stepmin));
+ (void) debugfs_create_x16("smpswaittimemax", S_IRUGO,
+ debug_dir,
+ &(vdd->vp_rt_data.vstepmax_smpswaittimemax));
+ (void) debugfs_create_x8("stepmax", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vstepmax_stepmax));
+ (void) debugfs_create_x8("vddmax", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vlimitto_vddmax));
+ (void) debugfs_create_x8("vddmin", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vlimitto_vddmin));
+ (void) debugfs_create_x16("timeout", S_IRUGO, debug_dir,
+ &(vdd->vp_rt_data.vlimitto_timeout));
+ (void) debugfs_create_file("curr_volt", S_IRUGO, debug_dir,
+ (void *) voltdm, &vp_volt_debug_fops);
+}
diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
index 5406b08..025cf16 100644
--- a/arch/arm/mach-omap2/vp.h
+++ b/arch/arm/mach-omap2/vp.h
@@ -19,6 +19,8 @@
#include <linux/kernel.h>
+struct voltagedomain;
+
/* XXX document */
#define VP_IDLE_TIMEOUT 200
#define VP_TRANXDONE_TIMEOUT 300
@@ -139,4 +141,11 @@ extern struct omap_vp_instance_data omap4_vp_mpu_data;
extern struct omap_vp_instance_data omap4_vp_iva_data;
extern struct omap_vp_instance_data omap4_vp_core_data;
+void omap_vp_init(struct voltagedomain *voltdm);
+void omap_vp_enable(struct voltagedomain *voltdm);
+void omap_vp_disable(struct voltagedomain *voltdm);
+unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm);
+int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
+ unsigned long target_volt);
+
#endif
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 17/19] OMAP2+: voltage: VC: begin spliting out SoC specifics; start with i2c slave addr
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (15 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 16/19] OMAP2+: voltage: split out voltage processor (VP) code into new layer Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 18/19] OMAP2+: VC: support PMICs with separate voltage and command registers Kevin Hilman
` (3 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Each VC instance is given a new 'ops' field which contains SoC
specific implementations of various functions. For starters, this
patch adds an operation for setting the i2c slave address.
Changes to VC data structures
- remove unused smps_sa_reg. This is now part of the SoC specific VC code
- remove smps_sa_shift from VC instancc, use ffs(mask) to calculate shift
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/Makefile | 5 ++-
arch/arm/mach-omap2/vc.c | 9 +-----
arch/arm/mach-omap2/vc.h | 20 ++++++++++++----
arch/arm/mach-omap2/vc3xxx.c | 45 +++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc3xxx_data.c | 5 +--
arch/arm/mach-omap2/vc44xx.c | 45 +++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc44xx_data.c | 8 ++----
7 files changed, 115 insertions(+), 22 deletions(-)
create mode 100644 arch/arm/mach-omap2/vc3xxx.c
create mode 100644 arch/arm/mach-omap2/vc44xx.c
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index bb82611..0d659ae 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -79,14 +79,15 @@ 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
+ vc3xxx_data.o vp3xxx_data.o \
+ vc3xxx.o
# XXX The presence of cm2xxx_3xxx.o on the line below is temporary and
# will be removed once the OMAP4 part of the codebase is converted to
# 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
+ vp44xx_data.o vc44xx.o
# OMAP voltage domains
ifeq ($(CONFIG_PM),y)
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index 29fbebd..0c9a494 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -243,13 +243,8 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
return;
}
- /* Set up the SMPS_SA(i2c slave address in VC */
- vc_val = vdd->read_reg(vc->common->prm_mod,
- vc->common->smps_sa_reg);
- vc_val &= ~vc->smps_sa_mask;
- vc_val |= vdd->pmic_info->i2c_slave_addr << vc->smps_sa_shift;
- vdd->write_reg(vc_val, vc->common->prm_mod,
- vc->common->smps_sa_reg);
+ /* Set up the SMPS i2c slave address in VC */
+ vc->ops->set_i2c_slave_addr(vc, vdd->pmic_info->i2c_slave_addr);
/* Setup the VOLRA(pmic reg addr) in VC */
vc_val = vdd->read_reg(vc->common->prm_mod,
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index 40632b6..a29e117 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -20,13 +20,21 @@
#include <linux/kernel.h>
struct voltagedomain;
+struct omap_vc_channel;
+
+/**
+ * struct omap_vc_ops - SoC specific implementations of VC functions
+ * @set_i2c_slave_addr: set I2C slave address of PMIC SMPS
+ */
+struct omap_vc_ops {
+ int (*set_i2c_slave_addr)(struct omap_vc_channel *vc, u8 addr);
+};
/**
* struct omap_vc_common - per-VC register/bitfield data
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
* @prm_mod: PRM module id used for PRM register access
- * @smps_sa_reg: Offset of PRM_VC_SMPS_SA reg from PRM start
* @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start
* @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
* @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register
@@ -44,7 +52,6 @@ struct omap_vc_common {
u32 cmd_on_mask;
u32 valid;
s16 prm_mod;
- u8 smps_sa_reg;
u8 smps_volra_reg;
u8 bypass_val_reg;
u8 data_shift;
@@ -59,10 +66,10 @@ struct omap_vc_common {
/**
* struct omap_vc_channel - VC per-instance data
* @common: pointer to VC common data for this platform
- * @smps_sa_mask: SA* bitmask in the PRM_VC_SMPS_SA register
+ * @smps_sa_mask: slave address field mask in the PRM_VC_SMPS_SA register
* @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register
- * @smps_sa_shift: SA* field shift in the PRM_VC_SMPS_SA register
* @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA register
+ * @ops: SoC-specific implementations of VC operations
*
* XXX It is not necessary to have both a *_mask and a *_shift -
* remove one
@@ -72,16 +79,19 @@ struct omap_vc_channel {
u32 smps_sa_mask;
u32 smps_volra_mask;
u8 cmdval_reg;
- u8 smps_sa_shift;
u8 smps_volra_shift;
+
+ struct omap_vc_ops *ops;
};
extern struct omap_vc_channel omap3_vc_mpu;
extern struct omap_vc_channel omap3_vc_core;
+extern struct omap_vc_ops omap3_vc_ops;
extern struct omap_vc_channel omap4_vc_mpu;
extern struct omap_vc_channel omap4_vc_iva;
extern struct omap_vc_channel omap4_vc_core;
+extern struct omap_vc_ops omap4_vc_ops;
void omap_vc_init(struct voltagedomain *voltdm);
int omap_vc_pre_scale(struct voltagedomain *voltdm,
diff --git a/arch/arm/mach-omap2/vc3xxx.c b/arch/arm/mach-omap2/vc3xxx.c
new file mode 100644
index 0000000..020d148
--- /dev/null
+++ b/arch/arm/mach-omap2/vc3xxx.c
@@ -0,0 +1,45 @@
+#include <linux/types.h>
+#include <linux/bitops.h>
+
+#include "voltage.h"
+#include "vc.h"
+#include "prm-regbits-34xx.h"
+#include "prm2xxx_3xxx.h"
+
+static inline u32 omap3_vc_read(u8 offset)
+{
+ return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, offset);
+}
+
+static inline void omap3_vc_write(u32 val, u8 offset)
+{
+ omap2_prm_write_mod_reg(val, OMAP3430_GR_MOD, offset);
+}
+
+static inline u32 omap3_vc_rmw(u32 mask, u32 bits, u8 offset)
+{
+ u32 val;
+
+ val = omap3_vc_read(offset);
+ val &= ~mask;
+ val |= bits;
+ omap3_vc_write(val, offset);
+
+ return val;
+}
+
+static int omap3_vc_set_i2c_slave_addr(struct omap_vc_channel *vc,
+ u8 slave_addr)
+{
+ omap3_vc_rmw(vc->smps_sa_mask, slave_addr << ffs(vc->smps_sa_mask),
+ OMAP3_PRM_VC_SMPS_SA_OFFSET);
+
+ /* XXX should should probably also set the slave address in
+ * PRM_VC_BYPASS_VAL. */
+
+ return 0;
+}
+
+struct omap_vc_ops omap3_vc_ops = {
+ .set_i2c_slave_addr = omap3_vc_set_i2c_slave_addr,
+};
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index 1a17ed4..51aa2b6 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -31,7 +31,6 @@
*/
static struct omap_vc_common omap3_vc_common = {
.prm_mod = OMAP3430_GR_MOD,
- .smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
.data_shift = OMAP3430_DATA_SHIFT,
@@ -48,17 +47,17 @@ static struct omap_vc_common omap3_vc_common = {
struct omap_vc_channel omap3_vc_mpu = {
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
- .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
.smps_volra_shift = OMAP3430_VOLRA0_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA0_MASK,
+ .ops = &omap3_vc_ops,
};
struct omap_vc_channel omap3_vc_core = {
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
- .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
.smps_volra_shift = OMAP3430_VOLRA1_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA1_MASK,
+ .ops = &omap3_vc_ops,
};
diff --git a/arch/arm/mach-omap2/vc44xx.c b/arch/arm/mach-omap2/vc44xx.c
new file mode 100644
index 0000000..f53a6c7
--- /dev/null
+++ b/arch/arm/mach-omap2/vc44xx.c
@@ -0,0 +1,45 @@
+#include <linux/types.h>
+
+#include "voltage.h"
+#include "vc.h"
+#include "prm-regbits-44xx.h"
+#include "prm44xx.h"
+#include "prminst44xx.h"
+#include "prcm44xx.h"
+
+static inline u32 omap4_vc_read(u8 offset)
+{
+ return omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION,
+ OMAP4430_PRM_DEVICE_INST, offset);
+}
+
+static inline void omap4_vc_write(u32 val, u8 offset)
+{
+ omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION,
+ OMAP4430_PRM_DEVICE_INST, offset);
+}
+
+static inline u32 omap4_vc_rmw(u32 mask, u32 bits, u8 offset)
+{
+ u32 val;
+
+ val = omap4_vc_read(offset);
+ val &= ~mask;
+ val |= bits;
+ omap4_vc_write(val, offset);
+
+ return val;
+}
+
+static int omap4_vc_set_i2c_slave_addr(struct omap_vc_channel *vc,
+ u8 slave_addr)
+{
+ omap4_vc_rmw(vc->smps_sa_mask, slave_addr << ffs(vc->smps_sa_mask),
+ OMAP4_PRM_VC_SMPS_SA_OFFSET);
+
+ return 0;
+}
+
+struct omap_vc_ops omap4_vc_ops = {
+ .set_i2c_slave_addr = omap4_vc_set_i2c_slave_addr,
+};
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index 56f3f4a..9dbf307 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -32,7 +32,6 @@
*/
static const struct omap_vc_common omap4_vc_common = {
.prm_mod = OMAP4430_PRM_DEVICE_INST,
- .smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
.data_shift = OMAP4430_DATA_SHIFT,
@@ -50,27 +49,26 @@ static const struct omap_vc_common omap4_vc_common = {
struct omap_vc_channel omap4_vc_mpu = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
+ .ops = &omap4_vc_ops,
};
struct omap_vc_channel omap4_vc_iva = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
+ .ops = &omap4_vc_ops,
};
struct omap_vc_channel omap4_vc_core = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT,
.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
+ .ops = &omap4_vc_ops,
};
-
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 18/19] OMAP2+: VC: support PMICs with separate voltage and command registers
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (16 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 17/19] OMAP2+: voltage: VC: begin spliting out SoC specifics; start with i2c slave addr Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-24 0:00 ` [PATCH/RFC 19/19] OMAP2+: VC: add SoC-specific op for PMIC register addresses Kevin Hilman
` (2 subsequent siblings)
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
The VC layer can support PMICs with separate voltage and command
registers by putting the different registers in the PRM_VC_SMPS_VOL_RA
and PRCM_VC_SMPS_CMD_RA registers respectively.
The PMIC data must supply at least a voltage register address
(volt_reg_addr). The command register address (cmd_reg_addr) is
optional. If the PMIC data does not supply a separate command
register address, the VC will use the voltage register address for both.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/omap_twl.c | 10 +++++-----
arch/arm/mach-omap2/vc.c | 4 ++--
arch/arm/mach-omap2/voltage.h | 3 ++-
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c
index 57c325a..9428b00 100644
--- a/arch/arm/mach-omap2/omap_twl.c
+++ b/arch/arm/mach-omap2/omap_twl.c
@@ -158,7 +158,7 @@ static struct omap_volt_pmic_info omap3_mpu_volt_info = {
.vp_vddmax = OMAP3430_VP1_VLIMITTO_VDDMAX,
.vp_timeout_us = OMAP3_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = OMAP3_SRI2C_SLAVE_ADDR,
- .pmic_reg = OMAP3_VDD_MPU_SR_CONTROL_REG,
+ .volt_reg_addr = OMAP3_VDD_MPU_SR_CONTROL_REG,
.vsel_to_uv = twl4030_vsel_to_uv,
.uv_to_vsel = twl4030_uv_to_vsel,
};
@@ -178,7 +178,7 @@ static struct omap_volt_pmic_info omap3_core_volt_info = {
.vp_vddmax = OMAP3430_VP2_VLIMITTO_VDDMAX,
.vp_timeout_us = OMAP3_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = OMAP3_SRI2C_SLAVE_ADDR,
- .pmic_reg = OMAP3_VDD_CORE_SR_CONTROL_REG,
+ .volt_reg_addr = OMAP3_VDD_CORE_SR_CONTROL_REG,
.vsel_to_uv = twl4030_vsel_to_uv,
.uv_to_vsel = twl4030_uv_to_vsel,
};
@@ -198,7 +198,7 @@ static struct omap_volt_pmic_info omap4_mpu_volt_info = {
.vp_vddmax = OMAP4_VP_MPU_VLIMITTO_VDDMAX,
.vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = OMAP4_SRI2C_SLAVE_ADDR,
- .pmic_reg = OMAP4_VDD_MPU_SR_VOLT_REG,
+ .volt_reg_addr = OMAP4_VDD_MPU_SR_VOLT_REG,
.vsel_to_uv = twl6030_vsel_to_uv,
.uv_to_vsel = twl6030_uv_to_vsel,
};
@@ -218,7 +218,7 @@ static struct omap_volt_pmic_info omap4_iva_volt_info = {
.vp_vddmax = OMAP4_VP_IVA_VLIMITTO_VDDMAX,
.vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = OMAP4_SRI2C_SLAVE_ADDR,
- .pmic_reg = OMAP4_VDD_IVA_SR_VOLT_REG,
+ .volt_reg_addr = OMAP4_VDD_IVA_SR_VOLT_REG,
.vsel_to_uv = twl6030_vsel_to_uv,
.uv_to_vsel = twl6030_uv_to_vsel,
};
@@ -238,7 +238,7 @@ static struct omap_volt_pmic_info omap4_core_volt_info = {
.vp_vddmax = OMAP4_VP_CORE_VLIMITTO_VDDMAX,
.vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = OMAP4_SRI2C_SLAVE_ADDR,
- .pmic_reg = OMAP4_VDD_CORE_SR_VOLT_REG,
+ .volt_reg_addr = OMAP4_VDD_CORE_SR_VOLT_REG,
.vsel_to_uv = twl6030_vsel_to_uv,
.uv_to_vsel = twl6030_uv_to_vsel,
};
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index 0c9a494..c561cfc 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -106,7 +106,7 @@ int omap_vc_bypass_scale_voltage(struct voltagedomain *voltdm,
vc_valid = vc->common->valid;
vc_bypass_val_reg = vc->common->bypass_val_reg;
vc_bypass_value = (target_vsel << vc->common->data_shift) |
- (vdd->pmic_info->pmic_reg <<
+ (vdd->pmic_info->volt_reg_addr <<
vc->common->regaddr_shift) |
(vdd->pmic_info->i2c_slave_addr <<
vc->common->slaveaddr_shift);
@@ -250,7 +250,7 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
vc_val = vdd->read_reg(vc->common->prm_mod,
vc->common->smps_volra_reg);
vc_val &= ~vc->smps_volra_mask;
- vc_val |= vdd->pmic_info->pmic_reg << vc->smps_volra_shift;
+ vc_val |= vdd->pmic_info->volt_reg_addr << vc->smps_volra_shift;
vdd->write_reg(vc_val, vc->common->prm_mod,
vc->common->smps_volra_reg);
diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
index c5d3087..d26d839 100644
--- a/arch/arm/mach-omap2/voltage.h
+++ b/arch/arm/mach-omap2/voltage.h
@@ -117,7 +117,8 @@ struct omap_volt_pmic_info {
u8 vp_vddmax;
u8 vp_timeout_us;
u8 i2c_slave_addr;
- u8 pmic_reg;
+ u8 volt_reg_addr;
+ u8 cmd_reg_addr;
unsigned long (*vsel_to_uv) (const u8 vsel);
u8 (*uv_to_vsel) (unsigned long uV);
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH/RFC 19/19] OMAP2+: VC: add SoC-specific op for PMIC register addresses
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (17 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 18/19] OMAP2+: VC: support PMICs with separate voltage and command registers Kevin Hilman
@ 2011-03-24 0:00 ` Kevin Hilman
2011-03-25 0:02 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
2011-03-25 8:58 ` Jean Pihet
20 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-24 0:00 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Add a new SoC-specific operation for setting PMIC register addresses
in the VC for the voltage configuration register and command
configuration register.
Some PMICs use a single register for voltage configuration and
on/retention/off commands, others use separate registers. This patch
adds a VC operation for setting these registers. The voltage
configuration register is required, and the command register may
optionally be zero, meaning it is not used. The command register
address is only written to the VC if it is non-zero.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/vc.c | 8 ++------
arch/arm/mach-omap2/vc.h | 11 ++++-------
arch/arm/mach-omap2/vc3xxx.c | 28 ++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc3xxx_data.c | 5 ++---
arch/arm/mach-omap2/vc44xx.c | 28 ++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc44xx_data.c | 7 +++----
6 files changed, 67 insertions(+), 20 deletions(-)
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index c561cfc..94f2008 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -247,12 +247,8 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
vc->ops->set_i2c_slave_addr(vc, vdd->pmic_info->i2c_slave_addr);
/* Setup the VOLRA(pmic reg addr) in VC */
- vc_val = vdd->read_reg(vc->common->prm_mod,
- vc->common->smps_volra_reg);
- vc_val &= ~vc->smps_volra_mask;
- vc_val |= vdd->pmic_info->volt_reg_addr << vc->smps_volra_shift;
- vdd->write_reg(vc_val, vc->common->prm_mod,
- vc->common->smps_volra_reg);
+ vc->ops->set_pmic_reg_addrs(vc, vdd->pmic_info->volt_reg_addr,
+ vdd->pmic_info->cmd_reg_addr);
/* Configure the setup times */
vc_val = vdd->read_reg(vc->common->prm_mod, vdd->vfsm->voltsetup_reg);
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index a29e117..7e74683 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -28,6 +28,8 @@ struct omap_vc_channel;
*/
struct omap_vc_ops {
int (*set_i2c_slave_addr)(struct omap_vc_channel *vc, u8 addr);
+ int (*set_pmic_reg_addrs)(struct omap_vc_channel *vc,
+ u8 volt_addr, u8 cmd_addr);
};
/**
@@ -35,7 +37,6 @@ struct omap_vc_ops {
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
* @prm_mod: PRM module id used for PRM register access
- * @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start
* @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
* @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register
* @slaveaddr_shift: SLAVEADDR field shift in PRM_VC_BYPASS_VAL register
@@ -52,7 +53,6 @@ struct omap_vc_common {
u32 cmd_on_mask;
u32 valid;
s16 prm_mod;
- u8 smps_volra_reg;
u8 bypass_val_reg;
u8 data_shift;
u8 slaveaddr_shift;
@@ -67,19 +67,16 @@ struct omap_vc_common {
* struct omap_vc_channel - VC per-instance data
* @common: pointer to VC common data for this platform
* @smps_sa_mask: slave address field mask in the PRM_VC_SMPS_SA register
- * @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register
- * @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA register
+ * @smps_volra_mask: VOLRA bitmask in the PRM_VC_VOL_RA register
* @ops: SoC-specific implementations of VC operations
*
- * XXX It is not necessary to have both a *_mask and a *_shift -
- * remove one
*/
struct omap_vc_channel {
const struct omap_vc_common *common;
u32 smps_sa_mask;
u32 smps_volra_mask;
+ u32 cmdra_mask;
u8 cmdval_reg;
- u8 smps_volra_shift;
struct omap_vc_ops *ops;
};
diff --git a/arch/arm/mach-omap2/vc3xxx.c b/arch/arm/mach-omap2/vc3xxx.c
index 020d148..c30c841 100644
--- a/arch/arm/mach-omap2/vc3xxx.c
+++ b/arch/arm/mach-omap2/vc3xxx.c
@@ -40,6 +40,34 @@ static int omap3_vc_set_i2c_slave_addr(struct omap_vc_channel *vc,
return 0;
}
+/**
+ * omap3_vc_set_pmic_reg_addrs - set PMIC register addresses used by VC
+ * @vc: pointer to VC channel
+ * @volt_addr: voltage configuration register address
+ * @cmd_addr: on/retention/off command configuration register address
+ *
+ * Programs @volt_addr to the voltage register address (VOL_RA)
+ * register for the VDD channnel represented by @vc. If @cmd_addr is
+ * non-zero (for PMICs that use different registers for voltage and
+ * command), write that value to the command configuration register
+ * address (CMD_RA) register.
+ */
+static int omap3_vc_set_pmic_reg_addrs(struct omap_vc_channel *vc,
+ u8 volt_addr, u8 cmd_addr)
+{
+ omap3_vc_rmw(vc->smps_volra_mask,
+ volt_addr << ffs(vc->smps_volra_mask),
+ OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET);
+
+ if (cmd_addr)
+ omap3_vc_rmw(vc->cmdra_mask,
+ cmd_addr << ffs(vc->cmdra_mask),
+ OMAP3_PRM_VC_SMPS_CMD_RA_OFFSET);
+
+ return 0;
+}
+
struct omap_vc_ops omap3_vc_ops = {
.set_i2c_slave_addr = omap3_vc_set_i2c_slave_addr,
+ .set_pmic_reg_addrs = omap3_vc_set_pmic_reg_addrs,
};
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index 51aa2b6..de6c7bb 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -31,7 +31,6 @@
*/
static struct omap_vc_common omap3_vc_common = {
.prm_mod = OMAP3430_GR_MOD,
- .smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
.data_shift = OMAP3430_DATA_SHIFT,
.slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT,
@@ -48,8 +47,8 @@ struct omap_vc_channel omap3_vc_mpu = {
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
- .smps_volra_shift = OMAP3430_VOLRA0_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA0_MASK,
+ .cmdra_mask = OMAP3430_CMDRA0_MASK,
.ops = &omap3_vc_ops,
};
@@ -57,7 +56,7 @@ struct omap_vc_channel omap3_vc_core = {
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
- .smps_volra_shift = OMAP3430_VOLRA1_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA1_MASK,
+ .cmdra_mask = OMAP3430_CMDRA1_MASK,
.ops = &omap3_vc_ops,
};
diff --git a/arch/arm/mach-omap2/vc44xx.c b/arch/arm/mach-omap2/vc44xx.c
index f53a6c7..e4a8c8a 100644
--- a/arch/arm/mach-omap2/vc44xx.c
+++ b/arch/arm/mach-omap2/vc44xx.c
@@ -40,6 +40,34 @@ static int omap4_vc_set_i2c_slave_addr(struct omap_vc_channel *vc,
return 0;
}
+/**
+ * omap4_vc_set_pmic_reg_addrs - set PMIC register addresses used by VC
+ * @vc: pointer to VC channel
+ * @volt_addr: voltage configuration register address
+ * @cmd_addr: on/retention/off command configuration register address
+ *
+ * Programs @volt_addr to the voltage register address (VOL_RA)
+ * register for the VDD channnel represented by @vc. If @cmd_addr is
+ * non-zero (for PMICs that use different registers for voltage and
+ * command), write that value to the command configuration register
+ * address (CMD_RA) register.
+ */
+static int omap4_vc_set_pmic_reg_addrs(struct omap_vc_channel *vc,
+ u8 volt_addr, u8 cmd_addr)
+{
+ omap4_vc_rmw(vc->smps_volra_mask,
+ volt_addr << ffs(vc->smps_volra_mask),
+ OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET);
+
+ if (cmd_addr)
+ omap4_vc_rmw(vc->cmdra_mask,
+ cmd_addr << ffs(vc->cmdra_mask),
+ OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET);
+
+ return 0;
+}
+
struct omap_vc_ops omap4_vc_ops = {
.set_i2c_slave_addr = omap4_vc_set_i2c_slave_addr,
+ .set_pmic_reg_addrs = omap4_vc_set_pmic_reg_addrs,
};
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index 9dbf307..e15d170 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -32,7 +32,6 @@
*/
static const struct omap_vc_common omap4_vc_common = {
.prm_mod = OMAP4430_PRM_DEVICE_INST,
- .smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
.data_shift = OMAP4430_DATA_SHIFT,
.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT,
@@ -50,8 +49,8 @@ struct omap_vc_channel omap4_vc_mpu = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
.smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
+ .cmdra_mask = OMAP4430_CMDRA_VDD_MPU_L_MASK,
.ops = &omap4_vc_ops,
};
@@ -59,8 +58,8 @@ struct omap_vc_channel omap4_vc_iva = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
.smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
+ .cmdra_mask = OMAP4430_CMDRA_VDD_IVA_L_MASK,
.ops = &omap4_vc_ops,
};
@@ -68,7 +67,7 @@ struct omap_vc_channel omap4_vc_core = {
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
+ .cmdra_mask = OMAP4430_CMDRA_VDD_CORE_L_MASK,
.ops = &omap4_vc_ops,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* Re: [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (18 preceding siblings ...)
2011-03-24 0:00 ` [PATCH/RFC 19/19] OMAP2+: VC: add SoC-specific op for PMIC register addresses Kevin Hilman
@ 2011-03-25 0:02 ` Kevin Hilman
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: begin spliting out SoC specifics; start with i2c slave addr Kevin Hilman
` (2 more replies)
2011-03-25 8:58 ` Jean Pihet
20 siblings, 3 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 0:02 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Kevin Hilman <khilman@ti.com> writes:
> This series is the begining of a voltage layer cleanup and restruture
> with the primary goal of splitting up voltage domain, voltage
> processor (VP) and voltage controller (VC) code.
>
> The RFC part is for the last 3 patches in the series, and for
> discussion of how/if to split out the SoC specifics. As an example, I
> started on the VC and split out some functionality (setting slave i2c
> addr, setting PMIC register addresses) into hooks that can be
> implemented in SoC specific code. I'd appreciate any input on this
> approach as well as the types of functions/APIs that should exist at
> this level.
Based on some more discussions with Paul, I decided on a slightly
different approach based on a suggestion from Paul.
Rather than create the vc3xxx.c/vc4xxx.c files, instead I create the SoC
specific functions for the VC in the existing SoC specific PRM code
(prm2xxx_3xxx.c and prm4xxx.c.)
This new approach replaces patches 17 & 19 of $SUBJECT series, and I'll
post the two new patches in response to this mail as well.
I've also updated my pm-wip/voltdm branch to contain the new approach.
Comments welcome.
Kevin
^ permalink raw reply [flat|nested] 50+ messages in thread* [PATCH] OMAP2+: VC: begin spliting out SoC specifics; start with i2c slave addr
2011-03-25 0:02 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
@ 2011-03-25 0:09 ` Kevin Hilman
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses Kevin Hilman
2011-03-25 14:37 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Cousson, Benoit
2 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 0:09 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Each VC instance is given a new 'ops' field which contains SoC
specific implementations of various functions. For starters, this
patch adds an operation for setting the i2c slave address.
Changes to VC data structures
- add id field to be used by the SoC-specific PRM VC code
- remove unused smps_sa_reg. This is now part of the SoC specific VC code
- remove smps_sa_shift from VC instance, use ffs(mask) to calculate shift
Special thanks to Paul Walmsley for brainstorming with me and giving
suggestions and guidance for the splitting up of this code.
Cc: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/prm.h | 24 +++++++++++++++++++
arch/arm/mach-omap2/prm2xxx_3xxx.c | 37 ++++++++++++++++++++++++++++++
arch/arm/mach-omap2/prm44xx.c | 44 ++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc.c | 12 ++++-----
arch/arm/mach-omap2/vc.h | 9 ++-----
arch/arm/mach-omap2/vc3xxx_data.c | 10 ++++----
arch/arm/mach-omap2/vc44xx_data.c | 13 +++++-----
7 files changed, 124 insertions(+), 25 deletions(-)
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h
index 39d5621..4daee4a 100644
--- a/arch/arm/mach-omap2/prm.h
+++ b/arch/arm/mach-omap2/prm.h
@@ -16,6 +16,30 @@
#include "prcm-common.h"
/*
+ * Voltage Controller (VC) identifiers.
+ */
+#define OMAP3_PRM_VC_VDD_MPU_ID 0
+#define OMAP3_PRM_VC_VDD_CORE_ID 1
+#define OMAP4_PRM_VC_VDD_MPU_ID 0
+#define OMAP4_PRM_VC_VDD_IVA_ID 1
+#define OMAP4_PRM_VC_VDD_CORE_ID 2
+
+#ifndef __ASSEMBLY__
+
+/**
+ * struct omap_prm_vc_ops - SoC specific implementations of VC functions
+ * @set_i2c_slave_addr: set I2C slave address of PMIC SMPS
+ */
+struct omap_prm_vc_ops {
+ int (*set_i2c_slave_addr)(u8 vc_id, u8 addr);
+};
+
+extern struct omap_prm_vc_ops omap3_prm_vc_ops;
+extern struct omap_prm_vc_ops omap4_prm_vc_ops;
+
+#endif /* __ASSEMBLY__ */
+
+/*
* 24XX: PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP
*
* 2430: PM_PWSTST_MDM
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c
index 051213f..b0cc855 100644
--- a/arch/arm/mach-omap2/prm2xxx_3xxx.c
+++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c
@@ -156,3 +156,40 @@ int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift)
return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0;
}
+
+/*
+ * OMAP3 VC
+ */
+struct omap3_prm_vc {
+ u32 smps_sa_mask;
+};
+
+static struct omap3_prm_vc vc_channels[] = {
+ [OMAP3_PRM_VC_VDD_MPU_ID] = {
+ .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
+ },
+ [OMAP3_PRM_VC_VDD_CORE_ID] = {
+ .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
+ },
+};
+
+#define MAX_VC_ID ARRAY_SIZE(vc_channels)
+
+int omap3_prm_vc_set_i2c_slave_addr(u8 vc_id, u8 slave_addr)
+{
+ struct omap3_prm_vc *vc = &vc_channels[vc_id];
+
+ if (WARN_ON(vc_id > MAX_VC_ID))
+ return -EINVAL;
+
+ omap2_prm_rmw_mod_reg_bits(vc->smps_sa_mask,
+ slave_addr << ffs(vc->smps_sa_mask),
+ OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_SMPS_SA_OFFSET);
+
+ return 0;
+}
+
+struct omap_prm_vc_ops omap3_prm_vc_ops = {
+ .set_i2c_slave_addr = omap3_prm_vc_set_i2c_slave_addr,
+};
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c
index a2a04bf..2e4bdf5 100644
--- a/arch/arm/mach-omap2/prm44xx.c
+++ b/arch/arm/mach-omap2/prm44xx.c
@@ -21,8 +21,11 @@
#include <plat/cpu.h>
#include <plat/prcm.h>
+#include "prm.h"
#include "prm44xx.h"
#include "prm-regbits-44xx.h"
+#include "prminst44xx.h"
+#include "prcm44xx.h"
/*
* Address offset (in bytes) between the reset control and the reset
@@ -193,3 +196,44 @@ void omap4_prm_global_warm_sw_reset(void)
v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
OMAP4_RM_RSTCTRL);
}
+
+/*
+ * OMAP4 VC
+ */
+struct omap4_prm_vc {
+ u32 smps_sa_mask;
+};
+
+static struct omap4_prm_vc vc_channels[] = {
+ [OMAP4_PRM_VC_VDD_MPU_ID] = {
+ .smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
+ },
+ [OMAP4_PRM_VC_VDD_IVA_ID] = {
+ .smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
+ },
+ [OMAP4_PRM_VC_VDD_CORE_ID] = {
+ .smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
+ },
+};
+
+#define MAX_VC_ID ARRAY_SIZE(vc_channels)
+
+int omap4_prm_vc_set_i2c_slave_addr(u8 vc_id, u8 slave_addr)
+{
+ struct omap4_prm_vc *vc = &vc_channels[vc_id];
+
+ if (WARN_ON(vc_id > MAX_VC_ID))
+ return -EINVAL;
+
+ omap4_prminst_rmw_inst_reg_bits(vc->smps_sa_mask,
+ slave_addr << ffs(vc->smps_sa_mask),
+ OMAP4430_PRM_PARTITION,
+ OMAP4430_PRM_DEVICE_INST,
+ OMAP4_PRM_VC_SMPS_SA_OFFSET);
+
+ return 0;
+}
+
+struct omap_prm_vc_ops omap4_prm_vc_ops = {
+ .set_i2c_slave_addr = omap4_prm_vc_set_i2c_slave_addr,
+};
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index 1a4a71c..dd3b8a0 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -243,13 +243,11 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
return;
}
- /* Set up the SMPS_SA(i2c slave address in VC */
- vc_val = vdd->read_reg(vc->common->prm_mod,
- vc->common->smps_sa_reg);
- vc_val &= ~vc->smps_sa_mask;
- vc_val |= vdd->pmic_info->i2c_slave_addr << vc->smps_sa_shift;
- vdd->write_reg(vc_val, vc->common->prm_mod,
- vc->common->smps_sa_reg);
+ if (WARN_ON(!vc->ops))
+ return;
+
+ /* Set up the SMPS i2c slave address in VC */
+ vc->ops->set_i2c_slave_addr(vc->id, vdd->pmic_info->i2c_slave_addr);
/* Setup the VOLRA(pmic reg addr) in VC */
vc_val = vdd->read_reg(vc->common->prm_mod,
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index 40632b6..4770117 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -26,7 +26,6 @@ struct voltagedomain;
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
* @prm_mod: PRM module id used for PRM register access
- * @smps_sa_reg: Offset of PRM_VC_SMPS_SA reg from PRM start
* @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start
* @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
* @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register
@@ -44,7 +43,6 @@ struct omap_vc_common {
u32 cmd_on_mask;
u32 valid;
s16 prm_mod;
- u8 smps_sa_reg;
u8 smps_volra_reg;
u8 bypass_val_reg;
u8 data_shift;
@@ -59,9 +57,7 @@ struct omap_vc_common {
/**
* struct omap_vc_channel - VC per-instance data
* @common: pointer to VC common data for this platform
- * @smps_sa_mask: SA* bitmask in the PRM_VC_SMPS_SA register
* @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register
- * @smps_sa_shift: SA* field shift in the PRM_VC_SMPS_SA register
* @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA register
*
* XXX It is not necessary to have both a *_mask and a *_shift -
@@ -69,11 +65,12 @@ struct omap_vc_common {
*/
struct omap_vc_channel {
const struct omap_vc_common *common;
- u32 smps_sa_mask;
u32 smps_volra_mask;
u8 cmdval_reg;
- u8 smps_sa_shift;
u8 smps_volra_shift;
+
+ u8 id;
+ struct omap_prm_vc_ops *ops;
};
extern struct omap_vc_channel omap3_vc_mpu;
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index 1a17ed4..6d40453 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -21,6 +21,7 @@
#include <plat/common.h>
#include "prm-regbits-34xx.h"
+#include "prm2xxx_3xxx.h"
#include "voltage.h"
#include "vc.h"
@@ -31,7 +32,6 @@
*/
static struct omap_vc_common omap3_vc_common = {
.prm_mod = OMAP3430_GR_MOD,
- .smps_sa_reg = OMAP3_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
.data_shift = OMAP3430_DATA_SHIFT,
@@ -46,19 +46,19 @@ static struct omap_vc_common omap3_vc_common = {
};
struct omap_vc_channel omap3_vc_mpu = {
+ .id = OMAP3_PRM_VC_VDD_MPU_ID,
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
- .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT,
- .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
.smps_volra_shift = OMAP3430_VOLRA0_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA0_MASK,
+ .ops = &omap3_prm_vc_ops,
};
struct omap_vc_channel omap3_vc_core = {
+ .id = OMAP3_PRM_VC_VDD_CORE_ID,
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
- .smps_sa_shift = OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT,
- .smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
.smps_volra_shift = OMAP3430_VOLRA1_SHIFT,
.smps_volra_mask = OMAP3430_VOLRA1_MASK,
+ .ops = &omap3_prm_vc_ops,
};
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index 56f3f4a..5badd08 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -32,7 +32,6 @@
*/
static const struct omap_vc_common omap4_vc_common = {
.prm_mod = OMAP4430_PRM_DEVICE_INST,
- .smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
.data_shift = OMAP4430_DATA_SHIFT,
@@ -48,29 +47,29 @@ static const struct omap_vc_common omap4_vc_common = {
/* VC instance data for each controllable voltage line */
struct omap_vc_channel omap4_vc_mpu = {
+ .id = OMAP4_PRM_VC_VDD_MPU_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT,
- .smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
+ .ops = &omap4_prm_vc_ops,
};
struct omap_vc_channel omap4_vc_iva = {
+ .id = OMAP4_PRM_VC_VDD_IVA_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT,
- .smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
+ .ops = &omap4_prm_vc_ops,
};
struct omap_vc_channel omap4_vc_core = {
+ .id = OMAP4_PRM_VC_VDD_CORE_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
- .smps_sa_shift = OMAP4430_SA_VDD_CORE_L_0_6_SHIFT,
- .smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
.smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT,
.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
+ .ops = &omap4_prm_vc_ops,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses
2011-03-25 0:02 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: begin spliting out SoC specifics; start with i2c slave addr Kevin Hilman
@ 2011-03-25 0:09 ` Kevin Hilman
2011-03-25 9:31 ` Vishwanath Sripathy
2011-03-25 14:37 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Cousson, Benoit
2 siblings, 1 reply; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 0:09 UTC (permalink / raw)
To: linux-omap; +Cc: Paul Walmsely, Benoit Cousson
Add a new SoC-specific operation for setting PMIC register addresses
in the VC for the voltage configuration register and command
configuration register.
Some PMICs use a single register for voltage configuration and
on/retention/off commands, others use separate registers. This patch
adds a VC operation for setting these registers. The voltage
configuration register is required, and the command register may
optionally be zero, meaning it is not used. The command register
address is only written to the VC if it is non-zero.
Signed-off-by: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/prm.h | 1 +
arch/arm/mach-omap2/prm2xxx_3xxx.c | 38 +++++++++++++++++++++++++++++++
arch/arm/mach-omap2/prm44xx.c | 43 ++++++++++++++++++++++++++++++++++++
arch/arm/mach-omap2/vc.c | 9 +------
arch/arm/mach-omap2/vc.h | 6 -----
arch/arm/mach-omap2/vc3xxx_data.c | 5 ----
arch/arm/mach-omap2/vc44xx_data.c | 7 ------
7 files changed, 84 insertions(+), 25 deletions(-)
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h
index 4daee4a..49f9e78 100644
--- a/arch/arm/mach-omap2/prm.h
+++ b/arch/arm/mach-omap2/prm.h
@@ -32,6 +32,7 @@
*/
struct omap_prm_vc_ops {
int (*set_i2c_slave_addr)(u8 vc_id, u8 addr);
+ int (*set_pmic_reg_addrs)(u8 vc_id, u8 volt_addr, u8 cmd_addr);
};
extern struct omap_prm_vc_ops omap3_prm_vc_ops;
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c
index b0cc855..4d7fe1a 100644
--- a/arch/arm/mach-omap2/prm2xxx_3xxx.c
+++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c
@@ -162,14 +162,20 @@ int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift)
*/
struct omap3_prm_vc {
u32 smps_sa_mask;
+ u32 smps_vol_ra_mask;
+ u32 smps_cmd_ra_mask;
};
static struct omap3_prm_vc vc_channels[] = {
[OMAP3_PRM_VC_VDD_MPU_ID] = {
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
+ .smps_vol_ra_mask = OMAP3430_VOLRA0_MASK,
+ .smps_cmd_ra_mask = OMAP3430_CMDRA0_MASK,
},
[OMAP3_PRM_VC_VDD_CORE_ID] = {
.smps_sa_mask = OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
+ .smps_vol_ra_mask = OMAP3430_VOLRA1_MASK,
+ .smps_cmd_ra_mask = OMAP3430_CMDRA1_MASK,
},
};
@@ -190,6 +196,38 @@ int omap3_prm_vc_set_i2c_slave_addr(u8 vc_id, u8 slave_addr)
return 0;
}
+/**
+ * omap3_prm_vc_set_pmic_reg_addrs - set PMIC register addresses used by VC
+ * @vc: pointer to VC channel
+ * @volt_addr: voltage configuration register address
+ * @cmd_addr: on/retention/off command configuration register address
+ *
+ * Programs @volt_addr to the voltage register address (VOL_RA)
+ * register for the VDD channnel @vc_id. If @cmd_addr is
+ * non-zero (for PMICs that use different registers for voltage and
+ * command), write that value to the command configuration register
+ * address (CMD_RA) register.
+ */
+static int omap3_prm_vc_set_pmic_reg_addrs(u8 vc_id, u8 volt_addr, u8 cmd_addr)
+{
+ struct omap3_prm_vc *vc = &vc_channels[vc_id];
+
+ omap2_prm_rmw_mod_reg_bits(vc->smps_vol_ra_mask,
+ volt_addr << ffs(vc->smps_vol_ra_mask),
+ OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET);
+
+ if (cmd_addr)
+ omap2_prm_rmw_mod_reg_bits(vc->smps_cmd_ra_mask,
+ cmd_addr << ffs(vc->smps_cmd_ra_mask),
+ OMAP3430_GR_MOD,
+ OMAP3_PRM_VC_SMPS_CMD_RA_OFFSET);
+
+ return 0;
+}
+
+
struct omap_prm_vc_ops omap3_prm_vc_ops = {
.set_i2c_slave_addr = omap3_prm_vc_set_i2c_slave_addr,
+ .set_pmic_reg_addrs = omap3_prm_vc_set_pmic_reg_addrs,
};
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c
index 2e4bdf5..2758b75 100644
--- a/arch/arm/mach-omap2/prm44xx.c
+++ b/arch/arm/mach-omap2/prm44xx.c
@@ -202,17 +202,25 @@ void omap4_prm_global_warm_sw_reset(void)
*/
struct omap4_prm_vc {
u32 smps_sa_mask;
+ u32 smps_vol_ra_mask;
+ u32 smps_cmd_ra_mask;
};
static struct omap4_prm_vc vc_channels[] = {
[OMAP4_PRM_VC_VDD_MPU_ID] = {
.smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
+ .smps_vol_ra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
+ .smps_cmd_ra_mask = OMAP4430_CMDRA_VDD_MPU_L_MASK,
},
[OMAP4_PRM_VC_VDD_IVA_ID] = {
.smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
+ .smps_vol_ra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
+ .smps_cmd_ra_mask = OMAP4430_CMDRA_VDD_IVA_L_MASK,
},
[OMAP4_PRM_VC_VDD_CORE_ID] = {
.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
+ .smps_vol_ra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
+ .smps_cmd_ra_mask = OMAP4430_CMDRA_VDD_CORE_L_MASK,
},
};
@@ -234,6 +242,41 @@ int omap4_prm_vc_set_i2c_slave_addr(u8 vc_id, u8 slave_addr)
return 0;
}
+/**
+ * omap4_prm_vc_set_pmic_reg_addrs - set PMIC register addresses used by VC
+ * @vc: pointer to VC channel
+ * @volt_addr: voltage configuration register address
+ * @cmd_addr: on/retention/off command configuration register address
+ *
+ * Programs @volt_addr to the voltage register address (VOL_RA)
+ * register for the VDD channnel represented by @vc. If @cmd_addr is
+ * non-zero (for PMICs that use different registers for voltage and
+ * command), write that value to the command configuration register
+ * address (CMD_RA) register.
+ */
+static int omap4_prm_vc_set_pmic_reg_addrs(u8 vc_id,
+ u8 volt_addr, u8 cmd_addr)
+{
+ struct omap4_prm_vc *vc = &vc_channels[vc_id];
+
+ omap4_prminst_rmw_inst_reg_bits(vc->smps_vol_ra_mask,
+ volt_addr << ffs(vc->smps_vol_ra_mask),
+ OMAP4430_PRM_PARTITION,
+ OMAP4430_PRM_DEVICE_INST,
+ OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET);
+
+ if (cmd_addr)
+ omap4_prminst_rmw_inst_reg_bits(vc->smps_cmd_ra_mask,
+ cmd_addr << ffs(vc->smps_cmd_ra_mask),
+ OMAP4430_PRM_PARTITION,
+ OMAP4430_PRM_DEVICE_INST,
+ OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET);
+
+ return 0;
+}
+
+
struct omap_prm_vc_ops omap4_prm_vc_ops = {
.set_i2c_slave_addr = omap4_prm_vc_set_i2c_slave_addr,
+ .set_pmic_reg_addrs = omap4_prm_vc_set_pmic_reg_addrs,
};
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
index dd3b8a0..1ae42609 100644
--- a/arch/arm/mach-omap2/vc.c
+++ b/arch/arm/mach-omap2/vc.c
@@ -249,13 +249,8 @@ void __init omap_vc_init(struct voltagedomain *voltdm)
/* Set up the SMPS i2c slave address in VC */
vc->ops->set_i2c_slave_addr(vc->id, vdd->pmic_info->i2c_slave_addr);
- /* Setup the VOLRA(pmic reg addr) in VC */
- vc_val = vdd->read_reg(vc->common->prm_mod,
- vc->common->smps_volra_reg);
- vc_val &= ~vc->smps_volra_mask;
- vc_val |= vdd->pmic_info->volt_reg_addr << vc->smps_volra_shift;
- vdd->write_reg(vc_val, vc->common->prm_mod,
- vc->common->smps_volra_reg);
+ vc->ops->set_pmic_reg_addrs(vc->id, vdd->pmic_info->volt_reg_addr,
+ vdd->pmic_info->cmd_reg_addr);
/* Configure the setup times */
vc_val = vdd->read_reg(vc->common->prm_mod, vdd->vfsm->voltsetup_reg);
diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
index 4770117..1c34b39 100644
--- a/arch/arm/mach-omap2/vc.h
+++ b/arch/arm/mach-omap2/vc.h
@@ -26,7 +26,6 @@ struct voltagedomain;
* @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
* @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
* @prm_mod: PRM module id used for PRM register access
- * @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM start
* @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
* @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register
* @slaveaddr_shift: SLAVEADDR field shift in PRM_VC_BYPASS_VAL register
@@ -43,7 +42,6 @@ struct omap_vc_common {
u32 cmd_on_mask;
u32 valid;
s16 prm_mod;
- u8 smps_volra_reg;
u8 bypass_val_reg;
u8 data_shift;
u8 slaveaddr_shift;
@@ -57,17 +55,13 @@ struct omap_vc_common {
/**
* struct omap_vc_channel - VC per-instance data
* @common: pointer to VC common data for this platform
- * @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA register
- * @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA register
*
* XXX It is not necessary to have both a *_mask and a *_shift -
* remove one
*/
struct omap_vc_channel {
const struct omap_vc_common *common;
- u32 smps_volra_mask;
u8 cmdval_reg;
- u8 smps_volra_shift;
u8 id;
struct omap_prm_vc_ops *ops;
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c
index 6d40453..e0cf693 100644
--- a/arch/arm/mach-omap2/vc3xxx_data.c
+++ b/arch/arm/mach-omap2/vc3xxx_data.c
@@ -32,7 +32,6 @@
*/
static struct omap_vc_common omap3_vc_common = {
.prm_mod = OMAP3430_GR_MOD,
- .smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
.bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
.data_shift = OMAP3430_DATA_SHIFT,
.slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT,
@@ -49,8 +48,6 @@ struct omap_vc_channel omap3_vc_mpu = {
.id = OMAP3_PRM_VC_VDD_MPU_ID,
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
- .smps_volra_shift = OMAP3430_VOLRA0_SHIFT,
- .smps_volra_mask = OMAP3430_VOLRA0_MASK,
.ops = &omap3_prm_vc_ops,
};
@@ -58,7 +55,5 @@ struct omap_vc_channel omap3_vc_core = {
.id = OMAP3_PRM_VC_VDD_CORE_ID,
.common = &omap3_vc_common,
.cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
- .smps_volra_shift = OMAP3430_VOLRA1_SHIFT,
- .smps_volra_mask = OMAP3430_VOLRA1_MASK,
.ops = &omap3_prm_vc_ops,
};
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c
index 5badd08..4dfdcb7 100644
--- a/arch/arm/mach-omap2/vc44xx_data.c
+++ b/arch/arm/mach-omap2/vc44xx_data.c
@@ -32,7 +32,6 @@
*/
static const struct omap_vc_common omap4_vc_common = {
.prm_mod = OMAP4430_PRM_DEVICE_INST,
- .smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
.data_shift = OMAP4430_DATA_SHIFT,
.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT,
@@ -50,8 +49,6 @@ struct omap_vc_channel omap4_vc_mpu = {
.id = OMAP4_PRM_VC_VDD_MPU_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT,
- .smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
.ops = &omap4_prm_vc_ops,
};
@@ -59,8 +56,6 @@ struct omap_vc_channel omap4_vc_iva = {
.id = OMAP4_PRM_VC_VDD_IVA_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT,
- .smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
.ops = &omap4_prm_vc_ops,
};
@@ -68,8 +63,6 @@ struct omap_vc_channel omap4_vc_core = {
.id = OMAP4_PRM_VC_VDD_CORE_ID,
.common = &omap4_vc_common,
.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
- .smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT,
- .smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
.ops = &omap4_prm_vc_ops,
};
--
1.7.4
^ permalink raw reply related [flat|nested] 50+ messages in thread* RE: [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses Kevin Hilman
@ 2011-03-25 9:31 ` Vishwanath Sripathy
2011-03-25 14:22 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Vishwanath Sripathy @ 2011-03-25 9:31 UTC (permalink / raw)
To: Kevin Hilman, linux-omap; +Cc: Paul Walmsely, Benoit Cousson
> -----Original Message-----
> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
> owner@vger.kernel.org] On Behalf Of Kevin Hilman
> Sent: Friday, March 25, 2011 5:40 AM
> To: linux-omap@vger.kernel.org
> Cc: Paul Walmsely; Benoit Cousson
> Subject: [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register
> addresses
>
> Add a new SoC-specific operation for setting PMIC register addresses
> in the VC for the voltage configuration register and command
> configuration register.
>
> Some PMICs use a single register for voltage configuration and
> on/retention/off commands, others use separate registers. This patch
> adds a VC operation for setting these registers. The voltage
> configuration register is required, and the command register may
> optionally be zero, meaning it is not used. The command register
> address is only written to the VC if it is non-zero.
What about PRM_VC_VAL_BYPASS register? If a PMIC is connected via only
sr-i2c, then PMIC can be configured only via this register. Shouldn't it
be abstracted as part of this patch or patch series?
Vishwa
>
> Signed-off-by: Kevin Hilman <khilman@ti.com>
> ---
> arch/arm/mach-omap2/prm.h | 1 +
> arch/arm/mach-omap2/prm2xxx_3xxx.c | 38
> +++++++++++++++++++++++++++++++
> arch/arm/mach-omap2/prm44xx.c | 43
> ++++++++++++++++++++++++++++++++++++
> arch/arm/mach-omap2/vc.c | 9 +------
> arch/arm/mach-omap2/vc.h | 6 -----
> arch/arm/mach-omap2/vc3xxx_data.c | 5 ----
> arch/arm/mach-omap2/vc44xx_data.c | 7 ------
> 7 files changed, 84 insertions(+), 25 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-
> omap2/prm.h
> index 4daee4a..49f9e78 100644
> --- a/arch/arm/mach-omap2/prm.h
> +++ b/arch/arm/mach-omap2/prm.h
> @@ -32,6 +32,7 @@
> */
> struct omap_prm_vc_ops {
> int (*set_i2c_slave_addr)(u8 vc_id, u8 addr);
> + int (*set_pmic_reg_addrs)(u8 vc_id, u8 volt_addr, u8 cmd_addr);
> };
>
> extern struct omap_prm_vc_ops omap3_prm_vc_ops;
> diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-
> omap2/prm2xxx_3xxx.c
> index b0cc855..4d7fe1a 100644
> --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c
> +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c
> @@ -162,14 +162,20 @@ int omap2_prm_deassert_hardreset(s16
> prm_mod, u8 rst_shift, u8 st_shift)
> */
> struct omap3_prm_vc {
> u32 smps_sa_mask;
> + u32 smps_vol_ra_mask;
> + u32 smps_cmd_ra_mask;
> };
>
> static struct omap3_prm_vc vc_channels[] = {
> [OMAP3_PRM_VC_VDD_MPU_ID] = {
> .smps_sa_mask =
> OMAP3430_PRM_VC_SMPS_SA_SA0_MASK,
> + .smps_vol_ra_mask = OMAP3430_VOLRA0_MASK,
> + .smps_cmd_ra_mask = OMAP3430_CMDRA0_MASK,
> },
> [OMAP3_PRM_VC_VDD_CORE_ID] = {
> .smps_sa_mask =
> OMAP3430_PRM_VC_SMPS_SA_SA1_MASK,
> + .smps_vol_ra_mask = OMAP3430_VOLRA1_MASK,
> + .smps_cmd_ra_mask = OMAP3430_CMDRA1_MASK,
> },
> };
>
> @@ -190,6 +196,38 @@ int omap3_prm_vc_set_i2c_slave_addr(u8
> vc_id, u8 slave_addr)
> return 0;
> }
>
> +/**
> + * omap3_prm_vc_set_pmic_reg_addrs - set PMIC register addresses
> used by VC
> + * @vc: pointer to VC channel
> + * @volt_addr: voltage configuration register address
> + * @cmd_addr: on/retention/off command configuration register
> address
> + *
> + * Programs @volt_addr to the voltage register address (VOL_RA)
> + * register for the VDD channnel @vc_id. If @cmd_addr is
> + * non-zero (for PMICs that use different registers for voltage and
> + * command), write that value to the command configuration register
> + * address (CMD_RA) register.
> + */
> +static int omap3_prm_vc_set_pmic_reg_addrs(u8 vc_id, u8 volt_addr,
> u8 cmd_addr)
> +{
> + struct omap3_prm_vc *vc = &vc_channels[vc_id];
> +
> + omap2_prm_rmw_mod_reg_bits(vc->smps_vol_ra_mask,
> + volt_addr << ffs(vc->smps_vol_ra_mask),
> + OMAP3430_GR_MOD,
> +
> OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET);
> +
> + if (cmd_addr)
> + omap2_prm_rmw_mod_reg_bits(vc-
> >smps_cmd_ra_mask,
> + cmd_addr << ffs(vc-
> >smps_cmd_ra_mask),
> + OMAP3430_GR_MOD,
> +
> OMAP3_PRM_VC_SMPS_CMD_RA_OFFSET);
> +
> + return 0;
> +}
> +
> +
> struct omap_prm_vc_ops omap3_prm_vc_ops = {
> .set_i2c_slave_addr = omap3_prm_vc_set_i2c_slave_addr,
> + .set_pmic_reg_addrs = omap3_prm_vc_set_pmic_reg_addrs,
> };
> diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-
> omap2/prm44xx.c
> index 2e4bdf5..2758b75 100644
> --- a/arch/arm/mach-omap2/prm44xx.c
> +++ b/arch/arm/mach-omap2/prm44xx.c
> @@ -202,17 +202,25 @@ void
> omap4_prm_global_warm_sw_reset(void)
> */
> struct omap4_prm_vc {
> u32 smps_sa_mask;
> + u32 smps_vol_ra_mask;
> + u32 smps_cmd_ra_mask;
> };
>
> static struct omap4_prm_vc vc_channels[] = {
> [OMAP4_PRM_VC_VDD_MPU_ID] = {
> .smps_sa_mask =
> OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
> + .smps_vol_ra_mask =
> OMAP4430_VOLRA_VDD_MPU_L_MASK,
> + .smps_cmd_ra_mask =
> OMAP4430_CMDRA_VDD_MPU_L_MASK,
> },
> [OMAP4_PRM_VC_VDD_IVA_ID] = {
> .smps_sa_mask =
> OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
> + .smps_vol_ra_mask =
> OMAP4430_VOLRA_VDD_IVA_L_MASK,
> + .smps_cmd_ra_mask =
> OMAP4430_CMDRA_VDD_IVA_L_MASK,
> },
> [OMAP4_PRM_VC_VDD_CORE_ID] = {
> .smps_sa_mask =
> OMAP4430_SA_VDD_CORE_L_0_6_MASK,
> + .smps_vol_ra_mask =
> OMAP4430_VOLRA_VDD_CORE_L_MASK,
> + .smps_cmd_ra_mask =
> OMAP4430_CMDRA_VDD_CORE_L_MASK,
> },
> };
>
> @@ -234,6 +242,41 @@ int omap4_prm_vc_set_i2c_slave_addr(u8
> vc_id, u8 slave_addr)
> return 0;
> }
>
> +/**
> + * omap4_prm_vc_set_pmic_reg_addrs - set PMIC register addresses
> used by VC
> + * @vc: pointer to VC channel
> + * @volt_addr: voltage configuration register address
> + * @cmd_addr: on/retention/off command configuration register
> address
> + *
> + * Programs @volt_addr to the voltage register address (VOL_RA)
> + * register for the VDD channnel represented by @vc. If @cmd_addr is
> + * non-zero (for PMICs that use different registers for voltage and
> + * command), write that value to the command configuration register
> + * address (CMD_RA) register.
> + */
> +static int omap4_prm_vc_set_pmic_reg_addrs(u8 vc_id,
> + u8 volt_addr, u8 cmd_addr)
> +{
> + struct omap4_prm_vc *vc = &vc_channels[vc_id];
> +
> + omap4_prminst_rmw_inst_reg_bits(vc->smps_vol_ra_mask,
> + volt_addr << ffs(vc-
> >smps_vol_ra_mask),
> + OMAP4430_PRM_PARTITION,
> + OMAP4430_PRM_DEVICE_INST,
> +
> OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET);
> +
> + if (cmd_addr)
> + omap4_prminst_rmw_inst_reg_bits(vc-
> >smps_cmd_ra_mask,
> + cmd_addr << ffs(vc-
> >smps_cmd_ra_mask),
> + OMAP4430_PRM_PARTITION,
> + OMAP4430_PRM_DEVICE_INST,
> +
> OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET);
> +
> + return 0;
> +}
> +
> +
> struct omap_prm_vc_ops omap4_prm_vc_ops = {
> .set_i2c_slave_addr = omap4_prm_vc_set_i2c_slave_addr,
> + .set_pmic_reg_addrs = omap4_prm_vc_set_pmic_reg_addrs,
> };
> diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c
> index dd3b8a0..1ae42609 100644
> --- a/arch/arm/mach-omap2/vc.c
> +++ b/arch/arm/mach-omap2/vc.c
> @@ -249,13 +249,8 @@ void __init omap_vc_init(struct voltagedomain
> *voltdm)
> /* Set up the SMPS i2c slave address in VC */
> vc->ops->set_i2c_slave_addr(vc->id, vdd->pmic_info-
> >i2c_slave_addr);
>
> - /* Setup the VOLRA(pmic reg addr) in VC */
> - vc_val = vdd->read_reg(vc->common->prm_mod,
> - vc->common->smps_volra_reg);
> - vc_val &= ~vc->smps_volra_mask;
> - vc_val |= vdd->pmic_info->volt_reg_addr << vc-
> >smps_volra_shift;
> - vdd->write_reg(vc_val, vc->common->prm_mod,
> - vc->common->smps_volra_reg);
> + vc->ops->set_pmic_reg_addrs(vc->id, vdd->pmic_info-
> >volt_reg_addr,
> + vdd->pmic_info->cmd_reg_addr);
>
> /* Configure the setup times */
> vc_val = vdd->read_reg(vc->common->prm_mod, vdd->vfsm-
> >voltsetup_reg);
> diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h
> index 4770117..1c34b39 100644
> --- a/arch/arm/mach-omap2/vc.h
> +++ b/arch/arm/mach-omap2/vc.h
> @@ -26,7 +26,6 @@ struct voltagedomain;
> * @cmd_on_mask: ON bitmask in PRM_VC_CMD_VAL* register
> * @valid: VALID bitmask in PRM_VC_BYPASS_VAL register
> * @prm_mod: PRM module id used for PRM register access
> - * @smps_volra_reg: Offset of PRM_VC_SMPS_VOL_RA reg from PRM
> start
> * @bypass_val_reg: Offset of PRM_VC_BYPASS_VAL reg from PRM start
> * @data_shift: DATA field shift in PRM_VC_BYPASS_VAL register
> * @slaveaddr_shift: SLAVEADDR field shift in PRM_VC_BYPASS_VAL
> register
> @@ -43,7 +42,6 @@ struct omap_vc_common {
> u32 cmd_on_mask;
> u32 valid;
> s16 prm_mod;
> - u8 smps_volra_reg;
> u8 bypass_val_reg;
> u8 data_shift;
> u8 slaveaddr_shift;
> @@ -57,17 +55,13 @@ struct omap_vc_common {
> /**
> * struct omap_vc_channel - VC per-instance data
> * @common: pointer to VC common data for this platform
> - * @smps_volra_mask: VOLRA* bitmask in the PRM_VC_VOL_RA
> register
> - * @smps_volra_shift: VOLRA* field shift in the PRM_VC_VOL_RA
> register
> *
> * XXX It is not necessary to have both a *_mask and a *_shift -
> * remove one
> */
> struct omap_vc_channel {
> const struct omap_vc_common *common;
> - u32 smps_volra_mask;
> u8 cmdval_reg;
> - u8 smps_volra_shift;
>
> u8 id;
> struct omap_prm_vc_ops *ops;
> diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-
> omap2/vc3xxx_data.c
> index 6d40453..e0cf693 100644
> --- a/arch/arm/mach-omap2/vc3xxx_data.c
> +++ b/arch/arm/mach-omap2/vc3xxx_data.c
> @@ -32,7 +32,6 @@
> */
> static struct omap_vc_common omap3_vc_common = {
> .prm_mod = OMAP3430_GR_MOD,
> - .smps_volra_reg = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET,
> .bypass_val_reg = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,
> .data_shift = OMAP3430_DATA_SHIFT,
> .slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT,
> @@ -49,8 +48,6 @@ struct omap_vc_channel omap3_vc_mpu = {
> .id = OMAP3_PRM_VC_VDD_MPU_ID,
> .common = &omap3_vc_common,
> .cmdval_reg = OMAP3_PRM_VC_CMD_VAL_0_OFFSET,
> - .smps_volra_shift = OMAP3430_VOLRA0_SHIFT,
> - .smps_volra_mask = OMAP3430_VOLRA0_MASK,
> .ops = &omap3_prm_vc_ops,
> };
>
> @@ -58,7 +55,5 @@ struct omap_vc_channel omap3_vc_core = {
> .id = OMAP3_PRM_VC_VDD_CORE_ID,
> .common = &omap3_vc_common,
> .cmdval_reg = OMAP3_PRM_VC_CMD_VAL_1_OFFSET,
> - .smps_volra_shift = OMAP3430_VOLRA1_SHIFT,
> - .smps_volra_mask = OMAP3430_VOLRA1_MASK,
> .ops = &omap3_prm_vc_ops,
> };
> diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-
> omap2/vc44xx_data.c
> index 5badd08..4dfdcb7 100644
> --- a/arch/arm/mach-omap2/vc44xx_data.c
> +++ b/arch/arm/mach-omap2/vc44xx_data.c
> @@ -32,7 +32,6 @@
> */
> static const struct omap_vc_common omap4_vc_common = {
> .prm_mod = OMAP4430_PRM_DEVICE_INST,
> - .smps_volra_reg =
> OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
> .bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
> .data_shift = OMAP4430_DATA_SHIFT,
> .slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT,
> @@ -50,8 +49,6 @@ struct omap_vc_channel omap4_vc_mpu = {
> .id = OMAP4_PRM_VC_VDD_MPU_ID,
> .common = &omap4_vc_common,
> .cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
> - .smps_volra_shift = OMAP4430_VOLRA_VDD_MPU_L_SHIFT,
> - .smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
> .ops = &omap4_prm_vc_ops,
> };
>
> @@ -59,8 +56,6 @@ struct omap_vc_channel omap4_vc_iva = {
> .id = OMAP4_PRM_VC_VDD_IVA_ID,
> .common = &omap4_vc_common,
> .cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
> - .smps_volra_shift = OMAP4430_VOLRA_VDD_IVA_L_SHIFT,
> - .smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
> .ops = &omap4_prm_vc_ops,
> };
>
> @@ -68,8 +63,6 @@ struct omap_vc_channel omap4_vc_core = {
> .id = OMAP4_PRM_VC_VDD_CORE_ID,
> .common = &omap4_vc_common,
> .cmdval_reg =
> OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
> - .smps_volra_shift = OMAP4430_VOLRA_VDD_CORE_L_SHIFT,
> - .smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
> .ops = &omap4_prm_vc_ops,
> };
>
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread* Re: [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses
2011-03-25 9:31 ` Vishwanath Sripathy
@ 2011-03-25 14:22 ` Kevin Hilman
0 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-25 14:22 UTC (permalink / raw)
To: Vishwanath Sripathy; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
Vishwanath Sripathy <vishwanath.bs@ti.com> writes:
>> -----Original Message-----
>> From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-
>> owner@vger.kernel.org] On Behalf Of Kevin Hilman
>> Sent: Friday, March 25, 2011 5:40 AM
>> To: linux-omap@vger.kernel.org
>> Cc: Paul Walmsely; Benoit Cousson
>> Subject: [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register
>> addresses
>>
>> Add a new SoC-specific operation for setting PMIC register addresses
>> in the VC for the voltage configuration register and command
>> configuration register.
>>
>> Some PMICs use a single register for voltage configuration and
>> on/retention/off commands, others use separate registers. This patch
>> adds a VC operation for setting these registers. The voltage
>> configuration register is required, and the command register may
>> optionally be zero, meaning it is not used. The command register
>> address is only written to the VC if it is non-zero.
>
> What about PRM_VC_VAL_BYPASS register? If a PMIC is connected via only
> sr-i2c, then PMIC can be configured only via this register. Shouldn't it
> be abstracted as part of this patch or patch series?
Yes.
So far this series just splits out the setting of the slave address and
the PMIC register addresses. Once we are happy with this approach
(hence the RFC patches) I will continue splitting out the other
functionality in a similar way.
Kevin
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure
2011-03-25 0:02 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: begin spliting out SoC specifics; start with i2c slave addr Kevin Hilman
2011-03-25 0:09 ` [PATCH] OMAP2+: VC: add SoC-specific op for PMIC register addresses Kevin Hilman
@ 2011-03-25 14:37 ` Cousson, Benoit
2011-03-25 23:02 ` Paul Walmsley
2 siblings, 1 reply; 50+ messages in thread
From: Cousson, Benoit @ 2011-03-25 14:37 UTC (permalink / raw)
To: Hilman, Kevin; +Cc: linux-omap@vger.kernel.org, Paul Walmsely
On 3/25/2011 1:02 AM, Hilman, Kevin wrote:
> Kevin Hilman<khilman@ti.com> writes:
>
>> This series is the begining of a voltage layer cleanup and restruture
>> with the primary goal of splitting up voltage domain, voltage
>> processor (VP) and voltage controller (VC) code.
>>
>> The RFC part is for the last 3 patches in the series, and for
>> discussion of how/if to split out the SoC specifics. As an example, I
>> started on the VC and split out some functionality (setting slave i2c
>> addr, setting PMIC register addresses) into hooks that can be
>> implemented in SoC specific code. I'd appreciate any input on this
>> approach as well as the types of functions/APIs that should exist at
>> this level.
>
> Based on some more discussions with Paul, I decided on a slightly
> different approach based on a suggestion from Paul.
>
> Rather than create the vc3xxx.c/vc4xxx.c files, instead I create the SoC
> specific functions for the VC in the existing SoC specific PRM code
> (prm2xxx_3xxx.c and prm4xxx.c.)
FWIW, I prefer your original approach :-)
I really think we'd better split the PRCM code by functions instead or
trying to map the HW partitioning which is purely arbitrary most of the
time.
This is for that reason that I didn't wanted to split CM to CM1 & CM2.
These 2 partitions are doing exactly the same stuff than what CM used to do.
In this case, the PRM just contain a bunch a various stuff that are not
necessarily related. VP and VC are both standalone IPs, that are just
located in the PRM because if was convenient for the HW folks.
So having dedicated file for each functions inside the PRCM is for my
point of view a much better approach for the long term.
Otherwise, we might end up with one big file that will just mimic the
mess we have inside the HW.
That being said, as soon as we have defined the functions, moving them
here and there should not be a big deal.
Benoit
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure
2011-03-25 14:37 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Cousson, Benoit
@ 2011-03-25 23:02 ` Paul Walmsley
2011-03-26 0:20 ` Kevin Hilman
0 siblings, 1 reply; 50+ messages in thread
From: Paul Walmsley @ 2011-03-25 23:02 UTC (permalink / raw)
To: Hilman, Kevin; +Cc: Cousson, Benoit, linux-omap@vger.kernel.org
Hi Kevin
you might want to consider renaming
OMAP3_PRM_VC_VDD_MPU_ID
etc. to something like:
OMAP3_VC_VDD_MPU_ID
and to define those in some vc.h header file.
Also, I'd suggest moving the struct omap_prm_vc_ops assignments out of the
prm*.c code into the vcXXXX_data.c files, ideally into some initcall, and
renaming the struct omap_prm_vc_ops to simply struct omap_vc_ops.
As long as the VC's low-level registers are in the PRM, those reads/writes
should happen through PRM code, IMHO.
- Paul
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure
2011-03-25 23:02 ` Paul Walmsley
@ 2011-03-26 0:20 ` Kevin Hilman
0 siblings, 0 replies; 50+ messages in thread
From: Kevin Hilman @ 2011-03-26 0:20 UTC (permalink / raw)
To: Paul Walmsley; +Cc: Cousson, Benoit, linux-omap@vger.kernel.org
Paul Walmsley <paul@pwsan.com> writes:
> Hi Kevin
>
> you might want to consider renaming
>
> OMAP3_PRM_VC_VDD_MPU_ID
>
> etc. to something like:
>
> OMAP3_VC_VDD_MPU_ID
>
> and to define those in some vc.h header file.
OK
> Also, I'd suggest moving the struct omap_prm_vc_ops assignments out of the
> prm*.c code into the vcXXXX_data.c files, ideally into some initcall, and
> renaming the struct omap_prm_vc_ops to simply struct omap_vc_ops.
OK
> As long as the VC's low-level registers are in the PRM, those reads/writes
> should happen through PRM code, IMHO.
OK, what I will probably do then is at least create some
omapX_prm_vc_read/write/rmw functions in prmXXXX.c. The prototypes for
these will be identical for OMAP3 & 4, so the read/writes can be called
from SoC independent code (via func ptrs) as needed.
I'll try this approach on Monday.
Kevin
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure
2011-03-24 0:00 [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
` (19 preceding siblings ...)
2011-03-25 0:02 ` [PATCH/RFC 00/19] OMAP: voltage layer cleanup and restructure Kevin Hilman
@ 2011-03-25 8:58 ` Jean Pihet
20 siblings, 0 replies; 50+ messages in thread
From: Jean Pihet @ 2011-03-25 8:58 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Paul Walmsely, Benoit Cousson
On Thu, Mar 24, 2011 at 1:00 AM, Kevin Hilman <khilman@ti.com> wrote:
> This series is the begining of a voltage layer cleanup and restruture
> with the primary goal of splitting up voltage domain, voltage
> processor (VP) and voltage controller (VC) code.
It would be nice to give a bit more detail on what are the VD, VP &
VC. This would help to understand the split/restructure.
>
> The RFC part is for the last 3 patches in the series, and for
> discussion of how/if to split out the SoC specifics. As an example, I
> started on the VC and split out some functionality (setting slave i2c
> addr, setting PMIC register addresses) into hooks that can be
> implemented in SoC specific code. I'd appreciate any input on this
> approach as well as the types of functions/APIs that should exist at
> this level.
>
> Boot tested on 2420/n810, 3630/zoom3 and 4430/panda.
>
> This series applies to my current pm-core branch.
>
> Also, there are known checkpatch/whitespace problems in this series,
> and that's OK for now. That will all eventually be cleaned up as
> well.
A few typos also...
Jean
>
> Kevin
>
>
>
> Benoit Cousson (1):
> OMAP4: powerdomain data: add voltage domains
>
> Kevin Hilman (18):
> OMAP2+: hwmod: remove unused voltagedomain pointer
> OMAP2+: voltage: move PRCM mod offets into VC/VP structures
> OMAP2+: voltage: move prm_irqst_reg from VP into voltage domain
> OMAP2+: voltage: start towards a new voltagedomain layer
> OMAP3: voltage: rename "mpu" voltagedomain to "mpu_iva"
> OMAP3: voltagedomain data: add wakeup domain
> OMAP3: voltage: add scalable flag to voltagedomain
> OMAP2+: powerdomain: add voltagedomain to struct powerdomain
> OMAP2: add voltage domains and connect to powerdomains
> OMAP3: powerdomain data: add voltage domains
> OMAP2+: powerdomain: add voltage domain lookup during register
> OMAP2+: voltage: keep track of powerdomains in each voltagedomain
> OMAP2+: voltage: split voltage controller (VC) code into dedicated
> layer
> OMAP2+: voltage: move VC into struct voltagedomain, misc. renames
> OMAP2+: voltage: split out voltage processor (VP) code into new layer
> OMAP2+: voltage: VC: begin spliting out SoC specifics; start with i2c
> slave addr
> OMAP2+: VC: support PMICs with separate voltage and command registers
> OMAP2+: VC: add SoC-specific op for PMIC register addresses
>
> arch/arm/mach-omap2/Makefile | 10 +-
> arch/arm/mach-omap2/io.c | 5 +
> arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 4 +-
> arch/arm/mach-omap2/omap_twl.c | 20 +-
> arch/arm/mach-omap2/pm.c | 4 +-
> arch/arm/mach-omap2/powerdomain.c | 23 +
> arch/arm/mach-omap2/powerdomain.h | 10 +
> arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c | 2 +
> arch/arm/mach-omap2/powerdomains2xxx_data.c | 4 +
> arch/arm/mach-omap2/powerdomains3xxx_data.c | 16 +
> arch/arm/mach-omap2/powerdomains44xx_data.c | 18 +-
> arch/arm/mach-omap2/sr_device.c | 2 +-
> arch/arm/mach-omap2/vc.c | 265 +++++++
> arch/arm/mach-omap2/vc.h | 67 ++-
> arch/arm/mach-omap2/vc3xxx.c | 73 ++
> arch/arm/mach-omap2/vc3xxx_data.c | 21 +-
> arch/arm/mach-omap2/vc44xx.c | 73 ++
> arch/arm/mach-omap2/vc44xx_data.c | 30 +-
> arch/arm/mach-omap2/voltage.c | 856 +++++-----------------
> arch/arm/mach-omap2/voltage.h | 60 +-
> arch/arm/mach-omap2/voltagedomains2xxx_data.c | 33 +
> arch/arm/mach-omap2/voltagedomains3xxx_data.c | 51 +-
> arch/arm/mach-omap2/voltagedomains44xx_data.c | 58 +-
> arch/arm/mach-omap2/vp.c | 374 ++++++++++
> arch/arm/mach-omap2/vp.h | 14 +-
> arch/arm/mach-omap2/vp3xxx_data.c | 3 +-
> arch/arm/mach-omap2/vp44xx_data.c | 4 +-
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 -
> 28 files changed, 1280 insertions(+), 821 deletions(-)
> create mode 100644 arch/arm/mach-omap2/vc.c
> create mode 100644 arch/arm/mach-omap2/vc3xxx.c
> create mode 100644 arch/arm/mach-omap2/vc44xx.c
> create mode 100644 arch/arm/mach-omap2/voltagedomains2xxx_data.c
> create mode 100644 arch/arm/mach-omap2/vp.c
>
> --
> 1.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread