diff options
| -rw-r--r-- | arch/arm/mach-omap2/vc.c | 17 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/vc.h | 14 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/vc3xxx_data.c | 5 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/vc44xx_data.c | 7 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/voltage.h | 8 | 
5 files changed, 32 insertions, 19 deletions
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index d5e792f20f1..22db6e6764d 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c @@ -243,17 +243,24 @@ void __init omap_vc_init_channel(struct voltagedomain *voltdm)  	/* get PMIC/board specific settings */  	vc->i2c_slave_addr = vdd->pmic_info->i2c_slave_addr; +	vc->volt_reg_addr = vdd->pmic_info->volt_reg_addr; +	vc->cmd_reg_addr = vdd->pmic_info->cmd_reg_addr;  	/* Configure the i2c slave address for this VC */  	voltdm->rmw(vc->smps_sa_mask,  		    vc->i2c_slave_addr << __ffs(vc->smps_sa_mask),  		    vc->common->smps_sa_reg); -	/* Setup the VOLRA(pmic reg addr) in VC */ -	vc_val = voltdm->read(vc->common->smps_volra_reg); -	vc_val &= ~vc->smps_volra_mask; -	vc_val |= vdd->pmic_info->volt_reg_addr << vc->smps_volra_shift; -	voltdm->write(vc_val, vc->common->smps_volra_reg); +	/* +	 * Configure the PMIC register addresses. +	 */ +	voltdm->rmw(vc->smps_volra_mask, +		    vc->volt_reg_addr << __ffs(vc->smps_volra_mask), +		    vc->common->smps_volra_reg); +	if (vc->cmd_reg_addr) +		voltdm->rmw(vc->smps_cmdra_mask, +			    vc->cmd_reg_addr << __ffs(vc->smps_cmdra_mask), +			    vc->common->smps_cmdra_reg);  	/* Configure the setup times */  	vc_val = voltdm->read(vdd->vfsm->voltsetup_reg); diff --git a/arch/arm/mach-omap2/vc.h b/arch/arm/mach-omap2/vc.h index 69ca900aff0..43a0c5c2b07 100644 --- a/arch/arm/mach-omap2/vc.h +++ b/arch/arm/mach-omap2/vc.h @@ -27,6 +27,7 @@ struct voltagedomain;   * @valid: VALID bitmask in PRM_VC_BYPASS_VAL register   * @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 + * @smps_cmdra_reg: Offset of PRM_VC_SMPS_CMD_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 @@ -44,6 +45,7 @@ struct omap_vc_common {  	u32 valid;  	u8 smps_sa_reg;  	u8 smps_volra_reg; +	u8 smps_cmdra_reg;  	u8 bypass_val_reg;  	u8 data_shift;  	u8 slaveaddr_shift; @@ -57,24 +59,26 @@ struct omap_vc_common {  /**   * struct omap_vc_channel - VC per-instance data   * @i2c_slave_addr: I2C slave address of PMIC for this VC channel + * @volt_reg_addr: voltage configuration register address + * @cmd_reg_addr: command configuration register address   * @common: pointer to VC common data for this platform   * @smps_sa_mask: i2c slave address bitmask 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 - * - * XXX It is not necessary to have both a *_mask and a *_shift - - *     remove one + * @smps_cmdra_mask: CMDRA* bitmask in the PRM_VC_CMD_RA register + * @cmdval_reg: register for on/ret/off voltage level values for this channel   */  struct omap_vc_channel {  	/* channel state */  	u16 i2c_slave_addr; +	u16 volt_reg_addr; +	u16 cmd_reg_addr;  	/* register access data */  	const struct omap_vc_common *common;  	u32 smps_sa_mask;  	u32 smps_volra_mask; +	u32 smps_cmdra_mask;  	u8 cmdval_reg; -	u8 smps_volra_shift;  };  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 86be50c263a..df8bd5ead7e 100644 --- a/arch/arm/mach-omap2/vc3xxx_data.c +++ b/arch/arm/mach-omap2/vc3xxx_data.c @@ -32,6 +32,7 @@  static struct omap_vc_common omap3_vc_common = {  	.smps_sa_reg	 = OMAP3_PRM_VC_SMPS_SA_OFFSET,  	.smps_volra_reg	 = OMAP3_PRM_VC_SMPS_VOL_RA_OFFSET, +	.smps_cmdra_reg	 = OMAP3_PRM_VC_SMPS_CMD_RA_OFFSET,  	.bypass_val_reg	 = OMAP3_PRM_VC_BYPASS_VAL_OFFSET,  	.data_shift	 = OMAP3430_DATA_SHIFT,  	.slaveaddr_shift = OMAP3430_SLAVEADDR_SHIFT, @@ -48,14 +49,14 @@ 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, +	.smps_cmdra_mask = OMAP3430_CMDRA0_MASK,  };  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, +	.smps_cmdra_mask = OMAP3430_CMDRA1_MASK,  }; diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c index af922b440e9..5d104ff662b 100644 --- a/arch/arm/mach-omap2/vc44xx_data.c +++ b/arch/arm/mach-omap2/vc44xx_data.c @@ -33,6 +33,7 @@  static const struct omap_vc_common omap4_vc_common = {  	.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,  	.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET, +	.smps_cmdra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET,  	.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,  	.data_shift = OMAP4430_DATA_SHIFT,  	.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT, @@ -50,23 +51,23 @@ 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, +	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_MPU_L_MASK,  };  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, +	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_IVA_L_MASK,  };  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, +	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_CORE_L_MASK,  }; diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h index 59038497827..3f49807a36e 100644 --- a/arch/arm/mach-omap2/voltage.h +++ b/arch/arm/mach-omap2/voltage.h @@ -103,10 +103,10 @@ struct omap_volt_data {   * @slew_rate:	PMIC slew rate (in uv/us)   * @step_size:	PMIC voltage step size (in uv)   * @i2c_slave_addr: I2C slave address of PMIC - * @vsel_to_uv:	PMIC API to convert vsel value to actual voltage in uV. - * @uv_to_vsel:	PMIC API to convert voltage in uV to vsel value.   * @volt_reg_addr: voltage configuration register address   * @cmd_reg_addr: command (on, on-LP, ret, off) configuration register address + * @vsel_to_uv:	PMIC API to convert vsel value to actual voltage in uV. + * @uv_to_vsel:	PMIC API to convert voltage in uV to vsel value.   */  struct omap_volt_pmic_info {  	int slew_rate; @@ -117,14 +117,14 @@ struct omap_volt_pmic_info {  	u32 off_volt;  	u16 volt_setup_time;  	u16 i2c_slave_addr; +	u16 volt_reg_addr; +	u16 cmd_reg_addr;  	u8 vp_erroroffset;  	u8 vp_vstepmin;  	u8 vp_vstepmax;  	u8 vp_vddmin;  	u8 vp_vddmax;  	u8 vp_timeout_us; -	u8 volt_reg_addr; -	u8 cmd_reg_addr;  	unsigned long (*vsel_to_uv) (const u8 vsel);  	u8 (*uv_to_vsel) (unsigned long uV);  };  |