Patchwork [U-Boot,1/4] pmic: max77686: add pmic_set_voltage api for max77686

login
register
mail settings
Submitter Akshay Saraswat
Date April 3, 2013, 6:27 a.m.
Message ID <1364970440-25942-2-git-send-email-akshay.s@samsung.com>
Download mbox | patch
Permalink /patch/233292/
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Comments

Akshay Saraswat - April 3, 2013, 6:27 a.m.
This patch adds pmic_set_voltage api in max77686.
As the name suggests, this api is required for switching
voltage from one level to another.

Signed-off-by: Akshay Saraswat <akshay.s@samsung.com>
---
 drivers/power/pmic/pmic_max77686.c | 61 ++++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      | 12 ++++++++
 include/power/pmic.h               |  1 +
 3 files changed, 74 insertions(+)
Simon Glass - May 11, 2013, 6:45 p.m.
Hi Akshay,

On Wed, Apr 3, 2013 at 12:27 AM, Akshay Saraswat <akshay.s@samsung.com> wrote:
> This patch adds pmic_set_voltage api in max77686.
> As the name suggests, this api is required for switching
> voltage from one level to another.
>
> Signed-off-by: Akshay Saraswat <akshay.s@samsung.com>
> ---
>  drivers/power/pmic/pmic_max77686.c | 61 ++++++++++++++++++++++++++++++++++++++
>  include/power/max77686_pmic.h      | 12 ++++++++
>  include/power/pmic.h               |  1 +
>  3 files changed, 74 insertions(+)
>
> diff --git a/drivers/power/pmic/pmic_max77686.c b/drivers/power/pmic/pmic_max77686.c
> index 7fcb4c0..d8782f8 100644
> --- a/drivers/power/pmic/pmic_max77686.c
> +++ b/drivers/power/pmic/pmic_max77686.c
> @@ -77,3 +77,64 @@ int pmic_init(unsigned char bus)
>
>         return 0;
>  }
> +
> +int pmic_set_voltage(u32 new_voltage)
> +{
> +       struct pmic *p;
> +       u32 read_data, volt_level, ret;
> +
> +       p = pmic_get("MAX77686_PMIC");
> +       if (!p)
> +               return -ENODEV;
> +
> +       /* Read BUCK2 DVS1 value */
> +       ret = pmic_reg_read(p, MAX77686_REG_PMIC_BUCK2DVS1, &read_data);
> +       if (ret != 0) {
> +               debug("CPUFREQ: max77686 BUCK2 DVS1 register read failed.\n");
> +               return -1;
> +       }
> +
> +       /* Calculate voltage level */
> +       volt_level = new_voltage - MAX77686_BUCK2_VOL_MIN * 1000;
> +
> +       if (volt_level < 0) {
> +               debug("CPUFREQ: Not a valid voltage level to set\n");
> +               return -1;
> +       }
> +
> +       volt_level /= MAX77686_BUCK2_VOL_DIV;
> +
> +       /* Update voltage level in BUCK2 DVS1 register value */
> +       clrsetbits_8(&read_data,
> +                    MAX77686_BUCK2_VOL_BITMASK << MAX77686_BUCK2_VOL_BITPOS,
> +                    volt_level << MAX77686_BUCK2_VOL_BITPOS);
> +
> +       /* Write new value in BUCK2 DVS1 */
> +       ret = pmic_reg_write(p, MAX77686_REG_PMIC_BUCK2DVS1, read_data);
> +       if (ret != 0) {
> +               debug("CPUFREQ: max77686 BUCK2 DVS1 register write failed.\n");
> +               return -1;
> +       }
> +
> +       /* Set ENABLE BUCK2 register bits */
> +       read_data = 0;
> +       ret = pmic_reg_read(p, MAX77686_BUCK2_VOL_ENADDR, &read_data);
> +       if (ret != 0) {
> +               debug("CPUFREQ: max77686 BUCK2 enable address read failed.\n");
> +               return -1;
> +       }
> +
> +       clrsetbits_8(&read_data,
> +                    (MAX77686_BUCK2_VOL_ENBITMASK
> +                    << MAX77686_BUCK2_VOL_ENBITPOS),
> +                    (MAX77686_BUCK2_VOL_ENBITON
> +                    << MAX77686_BUCK2_VOL_ENBITPOS));
> +
> +       ret = pmic_reg_write(p, MAX77686_BUCK2_VOL_ENADDR, read_data);
> +       if (ret != 0) {
> +               debug("CPUFREQ: max77686 BUCK2 enable address write failed.\n");
> +               return -1;
> +       }
> +
> +       return 0;
> +}
> diff --git a/include/power/max77686_pmic.h b/include/power/max77686_pmic.h
> index fdc7ca9..2780f17 100644
> --- a/include/power/max77686_pmic.h
> +++ b/include/power/max77686_pmic.h
> @@ -175,6 +175,18 @@ enum {
>  #define MAX77686_LD05CTRL1_1_8V        0x14
>  /* LDO10 1.8 volt value */
>  #define MAX77686_LD10CTRL1_1_8V        0x14
> +
> +/* BUCK2 voltage parameter values */
> +#define MAX77686_BUCK2_VOL_BITPOS      0x0
> +#define MAX77686_BUCK2_VOL_BITMASK     0xff
> +#define MAX77686_BUCK2_VOL_ENBITPOS    0x4
> +#define MAX77686_BUCK2_VOL_ENBITMASK   0x3
> +#define MAX77686_BUCK2_VOL_ENADDR      0x12
> +#define MAX77686_BUCK2_VOL_ENBITON     0x1
> +#define MAX77686_BUCK2_VOL_ENBITOFF    0x0
> +#define MAX77686_BUCK2_VOL_MIN         925
> +#define MAX77686_BUCK2_VOL_DIV         12500
> +
>  /*
>   * MAX77686_REG_PMIC_32KHZ set to 32KH CP
>   * output is activated
> diff --git a/include/power/pmic.h b/include/power/pmic.h
> index 1ecfc05..02f6f11 100644
> --- a/include/power/pmic.h
> +++ b/include/power/pmic.h
> @@ -99,6 +99,7 @@ int pmic_probe(struct pmic *p);
>  int pmic_reg_read(struct pmic *p, u32 reg, u32 *val);
>  int pmic_reg_write(struct pmic *p, u32 reg, u32 val);
>  int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);
> +int pmic_set_voltage(u32 new_voltage);

Please can you document what 'new_voltage' means in a function
comment? Is it microvolts, or something else?

Regards,
Simon

>
>  #define pmic_i2c_addr (p->hw.i2c.addr)
>  #define pmic_i2c_tx_num (p->hw.i2c.tx_num)
> --
> 1.8.0
>

Patch

diff --git a/drivers/power/pmic/pmic_max77686.c b/drivers/power/pmic/pmic_max77686.c
index 7fcb4c0..d8782f8 100644
--- a/drivers/power/pmic/pmic_max77686.c
+++ b/drivers/power/pmic/pmic_max77686.c
@@ -77,3 +77,64 @@  int pmic_init(unsigned char bus)
 
 	return 0;
 }
+
+int pmic_set_voltage(u32 new_voltage)
+{
+	struct pmic *p;
+	u32 read_data, volt_level, ret;
+
+	p = pmic_get("MAX77686_PMIC");
+	if (!p)
+		return -ENODEV;
+
+	/* Read BUCK2 DVS1 value */
+	ret = pmic_reg_read(p, MAX77686_REG_PMIC_BUCK2DVS1, &read_data);
+	if (ret != 0) {
+		debug("CPUFREQ: max77686 BUCK2 DVS1 register read failed.\n");
+		return -1;
+	}
+
+	/* Calculate voltage level */
+	volt_level = new_voltage - MAX77686_BUCK2_VOL_MIN * 1000;
+
+	if (volt_level < 0) {
+		debug("CPUFREQ: Not a valid voltage level to set\n");
+		return -1;
+	}
+
+	volt_level /= MAX77686_BUCK2_VOL_DIV;
+
+	/* Update voltage level in BUCK2 DVS1 register value */
+	clrsetbits_8(&read_data,
+		     MAX77686_BUCK2_VOL_BITMASK << MAX77686_BUCK2_VOL_BITPOS,
+		     volt_level << MAX77686_BUCK2_VOL_BITPOS);
+
+	/* Write new value in BUCK2 DVS1 */
+	ret = pmic_reg_write(p, MAX77686_REG_PMIC_BUCK2DVS1, read_data);
+	if (ret != 0) {
+		debug("CPUFREQ: max77686 BUCK2 DVS1 register write failed.\n");
+		return -1;
+	}
+
+	/* Set ENABLE BUCK2 register bits */
+	read_data = 0;
+	ret = pmic_reg_read(p, MAX77686_BUCK2_VOL_ENADDR, &read_data);
+	if (ret != 0) {
+		debug("CPUFREQ: max77686 BUCK2 enable address read failed.\n");
+		return -1;
+	}
+
+	clrsetbits_8(&read_data,
+		     (MAX77686_BUCK2_VOL_ENBITMASK
+		     << MAX77686_BUCK2_VOL_ENBITPOS),
+		     (MAX77686_BUCK2_VOL_ENBITON
+		     << MAX77686_BUCK2_VOL_ENBITPOS));
+
+	ret = pmic_reg_write(p, MAX77686_BUCK2_VOL_ENADDR, read_data);
+	if (ret != 0) {
+		debug("CPUFREQ: max77686 BUCK2 enable address write failed.\n");
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/include/power/max77686_pmic.h b/include/power/max77686_pmic.h
index fdc7ca9..2780f17 100644
--- a/include/power/max77686_pmic.h
+++ b/include/power/max77686_pmic.h
@@ -175,6 +175,18 @@  enum {
 #define MAX77686_LD05CTRL1_1_8V	0x14
 /* LDO10 1.8 volt value */
 #define MAX77686_LD10CTRL1_1_8V	0x14
+
+/* BUCK2 voltage parameter values */
+#define MAX77686_BUCK2_VOL_BITPOS	0x0
+#define MAX77686_BUCK2_VOL_BITMASK	0xff
+#define MAX77686_BUCK2_VOL_ENBITPOS	0x4
+#define MAX77686_BUCK2_VOL_ENBITMASK	0x3
+#define MAX77686_BUCK2_VOL_ENADDR	0x12
+#define MAX77686_BUCK2_VOL_ENBITON	0x1
+#define MAX77686_BUCK2_VOL_ENBITOFF	0x0
+#define MAX77686_BUCK2_VOL_MIN		925
+#define MAX77686_BUCK2_VOL_DIV		12500
+
 /*
  * MAX77686_REG_PMIC_32KHZ set to 32KH CP
  * output is activated
diff --git a/include/power/pmic.h b/include/power/pmic.h
index 1ecfc05..02f6f11 100644
--- a/include/power/pmic.h
+++ b/include/power/pmic.h
@@ -99,6 +99,7 @@  int pmic_probe(struct pmic *p);
 int pmic_reg_read(struct pmic *p, u32 reg, u32 *val);
 int pmic_reg_write(struct pmic *p, u32 reg, u32 val);
 int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);
+int pmic_set_voltage(u32 new_voltage);
 
 #define pmic_i2c_addr (p->hw.i2c.addr)
 #define pmic_i2c_tx_num (p->hw.i2c.tx_num)