Re: [pm-wip/voltdm_nm][PATCH 07/10] OMAP3+: PM: VP: use uV for max and min voltage limits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Nishanth Menon <nm@xxxxxx> writes:

> Every PMIC has it's own eccentricities, For example, one of the
> PMIC has MSB set to 1 for a specific function - voltage enable!
> using an hardcoded value specific for TWL when copied over to
> such an implementation causes the system to crash as the MSB bit
> was 0 and the voltage got disabled!.
>
> Instead we use actual values and depend on the convertion routines
> to abstract out the eccentricities of each PMIC.
>
> With this, we can now move the voltages to a common location in
> voltage.h as they are no longer dependent on PMICs and expect the
> PMIC's conversion routines to set a cap if the voltage is out of
> reach for the PMIC.
>
> The corresponding voltage values are arrived at by using the
> following pre-existing equations:
> TWL4030/5030 for OMAP3430/OMAP3630:(twl4030_vsel_to_uv)
> 	(((vsel * 125) + 6000)) * 100
> TWL6030 (OMAP4430):(twl6030_uv_to_vsel)
> 	((((vsel - 1) * 1266) + 70900)) * 10
>
> Reported-by: Jon Hunter <jon-hunter@xxxxxx>
> Signed-off-by: Nishanth Menon <nm@xxxxxx>

Nice!

A reference to where these voltages values came from would be good to
have in the code as well.

Kevin

> ---
>  arch/arm/mach-omap2/omap_twl.c |   17 -----------------
>  arch/arm/mach-omap2/voltage.h  |   22 ++++++++++++++++++++--
>  arch/arm/mach-omap2/vp.c       |    4 ++--
>  3 files changed, 22 insertions(+), 21 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_twl.c b/arch/arm/mach-omap2/omap_twl.c
> index f515a1a..df4e7c3 100644
> --- a/arch/arm/mach-omap2/omap_twl.c
> +++ b/arch/arm/mach-omap2/omap_twl.c
> @@ -30,16 +30,6 @@
>  #define OMAP3_VP_VSTEPMAX_VSTEPMAX	0x04
>  #define OMAP3_VP_VLIMITTO_TIMEOUT_US	200
>  
> -#define OMAP3430_VP1_VLIMITTO_VDDMIN	0x14
> -#define OMAP3430_VP1_VLIMITTO_VDDMAX	0x42
> -#define OMAP3430_VP2_VLIMITTO_VDDMIN	0x18
> -#define OMAP3430_VP2_VLIMITTO_VDDMAX	0x2c
> -
> -#define OMAP3630_VP1_VLIMITTO_VDDMIN	0x18
> -#define OMAP3630_VP1_VLIMITTO_VDDMAX	0x3c
> -#define OMAP3630_VP2_VLIMITTO_VDDMIN	0x18
> -#define OMAP3630_VP2_VLIMITTO_VDDMAX	0x30
> -
>  #define OMAP4_SRI2C_SLAVE_ADDR		0x12
>  #define OMAP4_VDD_MPU_SR_VOLT_REG	0x55
>  #define OMAP4_VDD_MPU_SR_CMD_REG	0x56
> @@ -53,13 +43,6 @@
>  #define OMAP4_VP_VSTEPMAX_VSTEPMAX	0x04
>  #define OMAP4_VP_VLIMITTO_TIMEOUT_US	200
>  
> -#define OMAP4_VP_MPU_VLIMITTO_VDDMIN	0xA
> -#define OMAP4_VP_MPU_VLIMITTO_VDDMAX	0x39
> -#define OMAP4_VP_IVA_VLIMITTO_VDDMIN	0xA
> -#define OMAP4_VP_IVA_VLIMITTO_VDDMAX	0x2D
> -#define OMAP4_VP_CORE_VLIMITTO_VDDMIN	0xA
> -#define OMAP4_VP_CORE_VLIMITTO_VDDMAX	0x28
> -
>  static bool is_offset_valid;
>  static u8 smps_offset;
>  /*
> diff --git a/arch/arm/mach-omap2/voltage.h b/arch/arm/mach-omap2/voltage.h
> index 0a4232f..b3349a0 100644
> --- a/arch/arm/mach-omap2/voltage.h
> +++ b/arch/arm/mach-omap2/voltage.h
> @@ -118,6 +118,24 @@ struct omap_volt_data {
>   */
>  #define USE_DEFAULT_CHANNEL_I2C_PARAM  0x8000
>  
> +/* Min and max voltages from OMAP perspective */
> +#define OMAP3430_VP1_VLIMITTO_VDDMIN	850000
> +#define OMAP3430_VP1_VLIMITTO_VDDMAX	1425000
> +#define OMAP3430_VP2_VLIMITTO_VDDMIN	900000
> +#define OMAP3430_VP2_VLIMITTO_VDDMAX	1150000
> +
> +#define OMAP3630_VP1_VLIMITTO_VDDMIN	900000
> +#define OMAP3630_VP1_VLIMITTO_VDDMAX	1350000
> +#define OMAP3630_VP2_VLIMITTO_VDDMIN	900000
> +#define OMAP3630_VP2_VLIMITTO_VDDMAX	1200000
> +
> +#define OMAP4_VP_MPU_VLIMITTO_VDDMIN	830000
> +#define OMAP4_VP_MPU_VLIMITTO_VDDMAX	1410000
> +#define OMAP4_VP_IVA_VLIMITTO_VDDMIN	830000
> +#define OMAP4_VP_IVA_VLIMITTO_VDDMAX	1260000
> +#define OMAP4_VP_CORE_VLIMITTO_VDDMIN	830000
> +#define OMAP4_VP_CORE_VLIMITTO_VDDMAX	1200000
> +
>  /**
>   * struct omap_voltdm_pmic - PMIC specific data required by voltage driver.
>   * @slew_rate:	PMIC slew rate (in uv/us)
> @@ -138,8 +156,8 @@ struct omap_voltdm_pmic {
>  	u8 vp_erroroffset;
>  	u8 vp_vstepmin;
>  	u8 vp_vstepmax;
> -	u8 vp_vddmin;
> -	u8 vp_vddmax;
> +	u32 vp_vddmin;
> +	u32 vp_vddmax;
>  	u8 vp_timeout_us;
>  	u16 i2c_slave_addr;
>  	u16 volt_reg_addr;
> diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
> index 3807620..4677921 100644
> --- a/arch/arm/mach-omap2/vp.c
> +++ b/arch/arm/mach-omap2/vp.c
> @@ -64,8 +64,8 @@ void __init omap_vp_init(struct voltagedomain *voltdm)
>  	sys_clk_rate = voltdm->sys_clk.rate / 1000;
>  
>  	timeout = (sys_clk_rate * voltdm->pmic->vp_timeout_us) / 1000;
> -	vddmin = voltdm->pmic->vp_vddmin;
> -	vddmax = voltdm->pmic->vp_vddmax;
> +	vddmin = voltdm->pmic->uv_to_vsel(voltdm->pmic->vp_vddmin);
> +	vddmax = voltdm->pmic->uv_to_vsel(voltdm->pmic->vp_vddmax);
>  
>  	waittime = ((voltdm->pmic->step_size / voltdm->pmic->slew_rate) *
>  		    sys_clk_rate) / 1000;
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux