[U-Boot] [PATCH v1 1/2] odroid: pmic77686: allow bucket voltage settings
Przemyslaw Marczak
p.marczak at samsung.com
Thu Oct 2 16:31:11 CEST 2014
Dear Suriyan,
I will try to test it after the weekend.
I'm working on a PMIC framework V3 with Trats2 as a base and the buck
mode/voltage for Max77686 are yet implemented in my code.
But this is okay because the new driver is fully reworked into new file
and the support to the old PMIC framework will be still keept before
move all the drivers to PMIC v3.
The RFC will send soon.
On 10/02/2014 03:45 PM, Suriyan Ramasami wrote:
> Allow to set the bucket voltage for the max77686.
> This will be used to reset the SMC LAN9730 ethernet on the odroids.
>
> Signed-off-by: Suriyan Ramasami <suriyan.r at gmail.com>
> ---
> drivers/power/pmic/pmic_max77686.c | 48 +++++++++++++++++++++++++++++++++++++-
> include/power/max77686_pmic.h | 3 +++
> 2 files changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/power/pmic/pmic_max77686.c b/drivers/power/pmic/pmic_max77686.c
> index df1fd91..1aeadb4 100644
> --- a/drivers/power/pmic/pmic_max77686.c
> +++ b/drivers/power/pmic/pmic_max77686.c
> @@ -42,6 +42,25 @@ static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
> return 0;
> }
>
> +static unsigned int max77686_buck_volt2hex(int buck, ulong uV)
> +{
> + unsigned int hex = 0;
> +
> + if (buck < 5 || buck > 9) {
> + debug("%s: buck %d is not supported\n", __func__, buck);
> + return 0;
> + }
> +
> + hex = (uV - 750000) / 50000;
> +
> + if (hex >= 0 && hex <= MAX77686_BUCK_VOLT_MAX_HEX)
> + return hex;
> +
> + debug("%s: %ld is wrong voltage value for BUCK%d\n",
> + __func__, uV, buck);
> + return MAX77686_BUCK_VOLT_MAX_HEX + 1;
> +}
> +
> int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
> {
> unsigned int val, ret, hex, adr;
> @@ -68,6 +87,33 @@ int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
> return ret;
> }
>
> +int max77686_set_buck_voltage(struct pmic *p, int buck, ulong uV)
> +{
> + unsigned int val, ret, hex, adr;
> +
> + if (buck < 5 && buck > 9) {
> + printf("%s: %d is an unsupported bucket number\n",
> + __func__, buck);
> + return -1;
> + }
> +
> + adr = max77686_buck_addr[buck] + 1;
> + hex = max77686_buck_volt2hex(buck, uV);
> +
> + if (hex == MAX77686_BUCK_VOLT_MAX_HEX + 1)
> + return -1;
> +
> + ret = pmic_reg_read(p, adr, &val);
> + if (ret)
> + return ret;
> +
> + val &= ~MAX77686_BUCK_VOLT_MASK;
> + val |= hex;
> + ret |= pmic_reg_write(p, adr, val);
> +
> + return ret;
> +}
> +
> int max77686_set_ldo_mode(struct pmic *p, int ldo, char opmode)
> {
> unsigned int val, ret, adr, mode;
> @@ -157,7 +203,7 @@ int max77686_set_buck_mode(struct pmic *p, int buck, char opmode)
> /* mode */
> switch (opmode) {
> case OPMODE_OFF:
> - mode = MAX77686_BUCK_MODE_OFF;
> + mode = MAX77686_BUCK_MODE_OFF << mode_shift;
> break;
> case OPMODE_STANDBY:
> switch (buck) {
> diff --git a/include/power/max77686_pmic.h b/include/power/max77686_pmic.h
> index c2a772a..b0e4255 100644
> --- a/include/power/max77686_pmic.h
> +++ b/include/power/max77686_pmic.h
> @@ -150,6 +150,7 @@ enum {
>
> int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV);
> int max77686_set_ldo_mode(struct pmic *p, int ldo, char opmode);
> +int max77686_set_buck_voltage(struct pmic *p, int buck, ulong uV);
> int max77686_set_buck_mode(struct pmic *p, int buck, char opmode);
>
> #define MAX77686_LDO_VOLT_MAX_HEX 0x3f
> @@ -159,6 +160,8 @@ int max77686_set_buck_mode(struct pmic *p, int buck, char opmode);
> #define MAX77686_LDO_MODE_STANDBY (0x01 << 0x06)
> #define MAX77686_LDO_MODE_LPM (0x02 << 0x06)
> #define MAX77686_LDO_MODE_ON (0x03 << 0x06)
> +#define MAX77686_BUCK_VOLT_MAX_HEX 0x3f
> +#define MAX77686_BUCK_VOLT_MASK 0x3f
> #define MAX77686_BUCK_MODE_MASK 0x03
> #define MAX77686_BUCK_MODE_SHIFT_1 0x00
> #define MAX77686_BUCK_MODE_SHIFT_2 0x04
>
Best regards,
--
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com
More information about the U-Boot
mailing list