Skip to contentSkip to conversation

drivers:power:max77686: add function to set voltage and mode

PATCH Superseded Piotr Wilczek 4 participants 8 messages May 21, 2013 – Aug 30, 2013

v2 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 drivers:power:max77686: add function to set voltage and mode

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v2:
- changed printf to debug

 drivers/power/pmic/pmic_max77686.c |  186 ++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      |   11 +++
 2 files changed, 197 insertions(+)
drivers/power/pmic/pmic_max77686.c +186 -0
index 7fcb4c0..dabd6b6 100644
@@ -30,6 +30,192 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static const char max77686_buck_addr[] = {
+	0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
+};
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
+{
+	unsigned int hex = 0;
+	const unsigned int max_hex = 0x3f;
+
+	switch (ldo) {
+	case 1:
+	case 2:
+	case 6:
+	case 7:
+	case 8:
+	case 15:
+		hex = (uV - 800000) / 25000;
+		break;
+	default:
+		hex = (uV - 800000) / 50000;
+	}
+
+	if (0 <= hex && hex <= max_hex)
+		return hex;
+
+	debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV, ldo);
+	return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
+{
+	unsigned int val, ret, hex, adr, mask;
+
+	if (ldo < 1 && 26 < ldo) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+	mask = 0x3f;
+	hex = max77686_ldo_volt2hex(ldo, uV);
+
+	if (!hex)
+		return -1;
+
+	ret = pmic_reg_read(p, adr, &val);
+	val &= ~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, mask, adr, mode;
+
+	if (ldo < 1 && 26 < ldo) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+	/* mask */
+	mask = 0xc0;
+
+	/* mode */
+	if (opmode == OPMODE_OFF) {
+		mode = 0x00;
+	} else if (opmode == OPMODE_STANDBY) {
+		switch (ldo) {
+		case 2:
+		case 6:
+		case 7:
+		case 8:
+		case 10:
+		case 11:
+		case 12:
+		case 14:
+		case 15:
+		case 16:
+			mode = 0x40;
+			break;
+		default:
+			mode = 0xff;
+		}
+	} else if (opmode == OPMODE_LPM) {
+		mode = 0x80;
+	} else if (opmode == OPMODE_ON) {
+		mode = 0xc0;
+	} else {
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on LDO%d\n",
+		       __func__, opmode, ldo);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	val &= ~mask;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode)
+{
+	unsigned int val, ret, mask, adr, size, mode;
+
+	size = sizeof(max77686_buck_addr) / sizeof(*max77686_buck_addr);
+	if (buck >= size) {
+		printf("%s: %d is wrong buck number\n", __func__, buck);
+		return -1;
+	}
+
+	adr = max77686_buck_addr[buck];
+
+	/* mask */
+	switch (buck) {
+	case 2:
+	case 3:
+	case 4:
+		mask = 0x30;
+		break;
+	default:
+		mask = 0x03;
+	}
+
+	/* mode */
+	if (opmode == OPMODE_OFF) {
+		mode = 0x00;
+	} else if (opmode == OPMODE_STANDBY) {
+		switch (buck) {
+		case 1:
+			mode = 0x01;
+			break;
+		case 2:
+		case 3:
+		case 4:
+			mode = 0x10;
+			break;
+		default:
+			mode = 0xff;
+		}
+	} else if (opmode == OPMODE_LPM) {
+		switch (buck) {
+		case 2:
+		case 3:
+		case 4:
+			mode = 0x20;
+			break;
+		default:
+			mode = 0xff;
+		}
+	} else if (opmode == OPMODE_ON) {
+		switch (buck) {
+		case 2:
+		case 3:
+		case 4:
+			mode = 0x30;
+			break;
+		default:
+			mode = 0x03;
+		}
+	} else {
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on BUCK%d\n",
+		       __func__, opmode, buck);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	val &= ~mask;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
 int pmic_init(unsigned char bus)
 {
 	static const char name[] = "MAX77686_PMIC";
include/power/max77686_pmic.h +11 -0
index fdc7ca9..ce58c02 100644
@@ -155,6 +155,17 @@ enum {
 	EN_LDO = (0x3 << 6),
 };
 
+enum {
+	OPMODE_OFF = 0,
+	OPMODE_STANDBY,
+	OPMODE_LPM,
+	OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
 /* Buck1 1 volt value */
 #define MAX77686_BUCK1OUT_1V	0x5
 #define MAX77686_BUCK1CTRL_EN	(3 << 0)
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH v2 1/1 drivers:power:max77686: add function to set voltage and mode

Dear Piotr Wilczek,

Quoted 25 lines · Piotr Wilczek

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v2:
- changed printf to debug

 drivers/power/pmic/pmic_max77686.c |  186
++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      |   11 +++
 2 files changed, 197 insertions(+)
drivers/power/pmic/pmic_max77686.c +0 -0
index 7fcb4c0..dabd6b6 100644
@@ -30,6 +30,192 @@
 
 DECLARE_GLOBAL_DATA_PTR;

drivers/power/pmic/pmic_max77686.c line 41

Quoted 10 lines
drivers/power/pmic/pmic_max77686.c +8 -0
 
+static const char max77686_buck_addr[] = {
+       0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
+};
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
+{
+       unsigned int hex = 0;
+       const unsigned int max_hex = 0x3f;
 

Is it constant? then please define it.

+

Quoted 5 lines
drivers/power/pmic/pmic_max77686.c +5 -0
+       switch (ldo) {
+       case 1:
+       case 2:
+       case 6:
+       case 7:

drivers/power/pmic/pmic_max77686.c

Quoted 10 lines
drivers/power/pmic/pmic_max77686.c +9 -0
+       case 8:
+       case 15:
+               hex = (uV - 800000) / 25000;
+               break;
+       default:
+               hex = (uV - 800000) / 50000;
+       }
+
+       if (0 <= hex && hex <= max_hex)
 

I think, hex >= 0 looks more comfortable.

drivers/power/pmic/pmic_max77686.c line 66

Quoted 13 lines
drivers/power/pmic/pmic_max77686.c +11 -0
+               return hex;
+
+       debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV,
 ldo);
+       return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
+{
+       unsigned int val, ret, hex, adr, mask;
+
+       if (ldo < 1 && 26 < ldo) {

ditto.

drivers/power/pmic/pmic_max77686.c line 78

Quoted 13 lines
drivers/power/pmic/pmic_max77686.c +12 -0
+               printf("%s: %d is wrong ldo number\n", __func__, ldo);
+               return -1;
+       }
+
+       adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+       mask = 0x3f;
+       hex = max77686_ldo_volt2hex(ldo, uV);
+
+       if (!hex)
+               return -1;
+
+       ret = pmic_reg_read(p, adr, &val);

I think.. if you got error while read the register then please return error without writing.

+ val &= ~mask;

drivers/power/pmic/pmic_max77686.c line 82

Quoted 3 lines
drivers/power/pmic/pmic_max77686.c +2 -0
+       val |= hex;
+       ret |= pmic_reg_write(p, adr, val);

+

Quoted 7 lines
drivers/power/pmic/pmic_max77686.c +6 -0
+       return ret;
+}
+
+int max77686_set_ldo_mode(struct pmic *p, int ldo, char opmode)
+{
+       unsigned int val, ret, mask, adr, mode;

drivers/power/pmic/pmic_max77686.c line 98

Quoted 10 lines
drivers/power/pmic/pmic_max77686.c +10 -0
+
+       if (ldo < 1 && 26 < ldo) {
+               printf("%s: %d is wrong ldo number\n", __func__, ldo);
+               return -1;
+       }
+
+       adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+       /* mask */
+       mask = 0xc0;

Is it constant? then please define it.

Quoted 7 lines
drivers/power/pmic/pmic_max77686.c +7 -0
+
+       /* mode */
+       if (opmode == OPMODE_OFF) {
+               mode = 0x00;
+       } else if (opmode == OPMODE_STANDBY) {
+               switch (ldo) {
+               case 2:

drivers/power/pmic/pmic_max77686.c line 115

Quoted 10 lines
drivers/power/pmic/pmic_max77686.c +10 -0
+               case 6:
+               case 7:
+               case 8:
+               case 10:
+               case 11:
+               case 12:
+               case 14:
+               case 15:
+               case 16:
+                       mode = 0x40;

+ break;

drivers/power/pmic/pmic_max77686.c line 126

Quoted 11 lines
drivers/power/pmic/pmic_max77686.c +10 -0
+               default:
+                       mode = 0xff;
+               }
+       } else if (opmode == OPMODE_LPM) {
+               mode = 0x80;
+       } else if (opmode == OPMODE_ON) {
+               mode = 0xc0;
+       } else {
+               mode = 0xff;
+       }

switch case?
What means 0x40 and 0x80, 0xc0?

There are so many magic values in this patch.
I'll not mentioned about it anymore.
Please fix it globally.

drivers/power/pmic/pmic_max77686.c line 134

Quoted 9 lines
drivers/power/pmic/pmic_max77686.c +8 -0
+
+       if (mode == 0xff) {
+               printf("%s: %d is not supported on LDO%d\n",
+                      __func__, opmode, ldo);
+               return -1;
+       }
+
+       ret = pmic_reg_read(p, adr, &val);

ditto.

drivers/power/pmic/pmic_max77686.c line 146

Quoted 13 lines
drivers/power/pmic/pmic_max77686.c +12 -0
+       val &= ~mask;
+       val |= mode;
+       ret |= pmic_reg_write(p, adr, val);
+
+       return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode)
+{
+       unsigned int val, ret, mask, adr, size, mode;
+
+       size = sizeof(max77686_buck_addr) / sizeof(*max77686_buck_addr);

ARRAY_SIZE()?

Quoted 100 lines
drivers/power/pmic/pmic_max77686.c +72 -0
+       if (buck >= size) {
+               printf("%s: %d is wrong buck number\n", __func__, buck);
+               return -1;
+       }
+
+       adr = max77686_buck_addr[buck];
+
+       /* mask */
+       switch (buck) {
+       case 2:
+       case 3:
+       case 4:
+               mask = 0x30;
+               break;
+       default:
+               mask = 0x03;
+       }
+
+       /* mode */
+       if (opmode == OPMODE_OFF) {
+               mode = 0x00;
+       } else if (opmode == OPMODE_STANDBY) {
+               switch (buck) {
+               case 1:
+                       mode = 0x01;
+                       break;
+               case 2:
+               case 3:
+               case 4:
+                       mode = 0x10;
+                       break;
+               default:
+                       mode = 0xff;
+               }
+       } else if (opmode == OPMODE_LPM) {
+               switch (buck) {
+               case 2:
+               case 3:
+               case 4:
+                       mode = 0x20;
+                       break;
+               default:
+                       mode = 0xff;
+               }
+       } else if (opmode == OPMODE_ON) {
+               switch (buck) {
+               case 2:
+               case 3:
+               case 4:
+                       mode = 0x30;
+                       break;
+               default:
+                       mode = 0x03;
+               }
+       } else {
+               mode = 0xff;
+       }
+
+       if (mode == 0xff) {
+               printf("%s: %d is not supported on BUCK%d\n",
+                      __func__, opmode, buck);
+               return -1;
+       }
+
+       ret = pmic_reg_read(p, adr, &val);
+       val &= ~mask;
+       val |= mode;
+       ret |= pmic_reg_write(p, adr, val);
+
+       return ret;
+}
+
 int pmic_init(unsigned char bus)
 {
        static const char name[] = "MAX77686_PMIC";
include/power/max77686_pmic.h +11 -1
index fdc7ca9..ce58c02 100644
@@ -155,6 +155,17 @@ enum {
        EN_LDO = (0x3 << 6),
 };
 
+enum {
+       OPMODE_OFF = 0,
+       OPMODE_STANDBY,
+       OPMODE_LPM,
+       OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
 /* Buck1 1 volt value */
 #define MAX77686_BUCK1OUT_1V   0x5
 #define MAX77686_BUCK1CTRL_EN  (3 << 0)
--

1.7.9.5

Quoted 5 lines

_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Thanks,
Minkyu Kang.

Signature · 2 lines
from. prom.
www.promsoft.net
#2 lore raw

PATCH v2 1/1 drivers:power:max77686: add function to set voltage and mode

Dear Minkyu Kang,

Thank you for comments. I agree with all of them.

Best regards,

Piotr Wilczek

From: Minkyu Kang [mailto:promsoft at gmail.com]
Sent: Friday, June 21, 2013 6:24 PM
To: Piotr Wilczek
Cc: u-boot at lists.denx.de; Kyungmin Park; Rajeshwari Shinde
Subject: Re: [U-Boot] [PATCH V2] drivers:power:max77686: add function to set voltage and mode

Dear Piotr Wilczek,

On 21 May 2013 21:54, Piotr Wilczek <[email protected]> wrote:

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v2:
- changed printf to debug

 drivers/power/pmic/pmic_max77686.c |  186
++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      |   11 +++
 2 files changed, 197 insertions(+)
(quoted diff) +0 -0

b/drivers/power/pmic/pmic_max77686.c
index 7fcb4c0..dabd6b6 100644

drivers/power/pmic/pmic_max77686.c +8 -0
@@ -30,6 +30,192 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static const char max77686_buck_addr[] = {
+       0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
+};
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
+{
+       unsigned int hex = 0;
+       const unsigned int max_hex = 0x3f;
 
 
 

Is it constant? then please define it.

+

+       switch (ldo) {
+       case 1:
+       case 2:
+       case 6:
+       case 7:
+       case 8:
+       case 15:

+ hex = (uV - 800000) / 25000;
+ break;
+ default:
+ hex = (uV - 800000) / 50000;
+ }
+
+ if (0 <= hex && hex <= max_hex)

I think, hex >= 0 looks more comfortable.

+ return hex;
+
+ debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV,
ldo);
+ return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV) +{
+ unsigned int val, ret, hex, adr, mask;
+
+ if (ldo < 1 && 26 < ldo) {

ditto.

+ printf("%s: %d is wrong ldo number\n", __func__, ldo);
+ return -1;
+ }
+

+       adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+       mask = 0x3f;
+       hex = max77686_ldo_volt2hex(ldo, uV);

+
+ if (!hex)
+ return -1;
+
+ ret = pmic_reg_read(p, adr, &val);

I think.. if you got error while read the register then please return error without writing.

+       val &= ~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, mask, adr, mode;
+
+ if (ldo < 1 && 26 < ldo) {
+ printf("%s: %d is wrong ldo number\n", __func__, ldo);
+ return -1;
+ }
+
+ adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+ /* mask */
+ mask = 0xc0;

Is it constant? then please define it.

+
+ /* mode */
+ if (opmode == OPMODE_OFF) {
+ mode = 0x00;
+ } else if (opmode == OPMODE_STANDBY) {

+               switch (ldo) {
+               case 2:
+               case 6:
+               case 7:
+               case 8:
+               case 10:
+               case 11:
+               case 12:
+               case 14:
+               case 15:
+               case 16:

+ mode = 0x40;

+ break;
+ default:
+ mode = 0xff;
+ }
+ } else if (opmode == OPMODE_LPM) {
+ mode = 0x80;
+ } else if (opmode == OPMODE_ON) {
+ mode = 0xc0;
+ } else {
+ mode = 0xff;
+ }

switch case?

What means 0x40 and 0x80, 0xc0?

There are so many magic values in this patch.

I'll not mentioned about it anymore.

Please fix it globally.

+
+ if (mode == 0xff) {
+ printf("%s: %d is not supported on LDO%d\n",
+ __func__, opmode, ldo);
+ return -1;
+ }
+
+ ret = pmic_reg_read(p, adr, &val);

ditto.

+       val &= ~mask;
+       val |= mode;
+       ret |= pmic_reg_write(p, adr, val);

+
+ return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode) +{
+ unsigned int val, ret, mask, adr, size, mode;
+
+ size = sizeof(max77686_buck_addr) / sizeof(*max77686_buck_addr);

ARRAY_SIZE()?

+ if (buck >= size) {
+ printf("%s: %d is wrong buck number\n", __func__, buck);
+ return -1;
+ }
+
+ adr = max77686_buck_addr[buck];
+

+       /* mask */
+       switch (buck) {
+       case 2:
+       case 3:
+       case 4:

+ mask = 0x30;
+ break;
+ default:
+ mask = 0x03;
+ }
+
+ /* mode */
+ if (opmode == OPMODE_OFF) {
+ mode = 0x00;
+ } else if (opmode == OPMODE_STANDBY) {
+ switch (buck) {
+ case 1:
+ mode = 0x01;
+ break;

+               case 2:
+               case 3:
+               case 4:

+ mode = 0x10;
+ break;
+ default:
+ mode = 0xff;
+ }
+ } else if (opmode == OPMODE_LPM) {

+               switch (buck) {
+               case 2:
+               case 3:
+               case 4:

+ mode = 0x20;
+ break;
+ default:
+ mode = 0xff;
+ }
+ } else if (opmode == OPMODE_ON) {

+               switch (buck) {
+               case 2:
+               case 3:
+               case 4:

+ mode = 0x30;
+ break;
+ default:
+ mode = 0x03;
+ }
+ } else {
+ mode = 0xff;
+ }
+
+ if (mode == 0xff) {
+ printf("%s: %d is not supported on BUCK%d\n",
+ __func__, opmode, buck);
+ return -1;
+ }
+

+       ret = pmic_reg_read(p, adr, &val);
+       val &= ~mask;
+       val |= mode;
+       ret |= pmic_reg_write(p, adr, val);

+
+ return ret;
+}
+
int pmic_init(unsigned char bus)

 {
        static const char name[] = "MAX77686_PMIC";
include/power/max77686_pmic.h +11 -0
index fdc7ca9..ce58c02 100644
@@ -155,6 +155,17 @@ enum {
        EN_LDO = (0x3 << 6),
 };
 
+enum {
+       OPMODE_OFF = 0,
+       OPMODE_STANDBY,
+       OPMODE_LPM,
+       OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
 /* Buck1 1 volt value */
 #define MAX77686_BUCK1OUT_1V   0x5
 #define MAX77686_BUCK1CTRL_EN  (3 << 0)

--
1.7.9.5

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Thanks,

Minkyu Kang.

Signature · 2 lines
from. prom.
www.promsoft.net 
#3 lore raw

PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode

In reply to Piotr Wilczek

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v3:
- removed magic values
- used ARRAY_SIZE() for array size calculation
- used switch case instead if else if
- added return when pmic read error occurs

Changes in v2:
- changed printf to debug

 drivers/power/pmic/pmic_max77686.c |  192 ++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      |   26 +++++
 2 files changed, 218 insertions(+)
drivers/power/pmic/pmic_max77686.c +192 -0
index 7fcb4c0..3960ca9 100644
@@ -30,6 +30,198 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static const char max77686_buck_addr[] = {
+	0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
+};
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
+{
+	unsigned int hex = 0;
+
+	switch (ldo) {
+	case 1:
+	case 2:
+	case 6:
+	case 7:
+	case 8:
+	case 15:
+		hex = (uV - 800000) / 25000;
+		break;
+	default:
+		hex = (uV - 800000) / 50000;
+	}
+
+	if (hex >= 0 && hex <= MAX77686_LDO_VOLT_MAX_HEX)
+		return hex;
+
+	debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV, ldo);
+	return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
+{
+	unsigned int val, ret, hex, adr;
+
+	if (ldo < 1 && ldo > 26) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+	hex = max77686_ldo_volt2hex(ldo, uV);
+
+	if (!hex)
+		return -1;
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_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;
+
+	if (ldo < 1 && 26 < ldo) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_LDO_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (ldo) {
+		case 2:
+		case 6:
+		case 7:
+		case 8:
+		case 10:
+		case 11:
+		case 12:
+		case 14:
+		case 15:
+		case 16:
+			mode = MAX77686_LDO_MODE_STANDBY;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		mode = MAX77686_LDO_MODE_LPM;
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_LDO_MODE_ON;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on LDO%d\n",
+		       __func__, opmode, ldo);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_MODE_MASK;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode)
+{
+	unsigned int val, ret, mask, adr, size, mode, mode_shift;
+
+	size = ARRAY_SIZE(max77686_buck_addr);
+	if (buck >= size) {
+		printf("%s: %d is wrong buck number\n", __func__, buck);
+		return -1;
+	}
+
+	adr = max77686_buck_addr[buck];
+
+	/* mask */
+	switch (buck) {
+	case 2:
+	case 3:
+	case 4:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_2;
+		break;
+	default:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_1;
+	}
+
+	mask = MAX77686_BUCK_MODE_MASK << mode_shift;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_BUCK_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (buck) {
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_STANDBY << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		switch (buck) {
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_LPM << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_BUCK_MODE_ON << mode_shift;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on BUCK%d\n",
+		       __func__, opmode, buck);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~mask;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
 int pmic_init(unsigned char bus)
 {
 	static const char name[] = "MAX77686_PMIC";
include/power/max77686_pmic.h +26 -0
index 1c374a9..7339a3e 100644
@@ -155,6 +155,32 @@ enum {
 	EN_LDO = (0x3 << 6),
 };
 
+enum {
+	OPMODE_OFF = 0,
+	OPMODE_STANDBY,
+	OPMODE_LPM,
+	OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
+#define MAX77686_LDO_VOLT_MAX_HEX	0x3f
+#define MAX77686_LDO_VOLT_MASK		0x3f
+#define MAX77686_LDO_MODE_MASK		0xc0
+#define MAX77686_LDO_MODE_OFF		(0x00 << 0x06)
+#define MAX77686_LDO_MODE_STANDBY	(0x01 << 0x06)
+#define MAX77686_LDO_MODE_LPM		(0x02 << 0x06)
+#define MAX77686_LDO_MODE_ON		(0x03 << 0x06)
+#define MAX77686_BUCK_MODE_MASK		0x03
+#define MAX77686_BUCK_MODE_SHIFT_1	0x00
+#define MAX77686_BUCK_MODE_SHIFT_2	0x04
+#define MAX77686_BUCK_MODE_OFF		0x00
+#define MAX77686_BUCK_MODE_STANDBY	0x01
+#define MAX77686_BUCK_MODE_LPM		0x02
+#define MAX77686_BUCK_MODE_ON		0x03
+
 /* Buck1 1 volt value */
 #define MAX77686_BUCK1OUT_1V	0x5
 /* Buck1 1.05 volt value */
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode

Dear Minkyu Kang,

Please let me know if you have any more comments on this patch.

Also, there is another patchset to review:
http://patchwork.ozlabs.org/patch/245307/

Best regards,
Piotr Wilczek

Quoted 271 lines

-----Original Message-----
From: Piotr Wilczek [mailto:p.wilczek at samsung.com]
Sent: Tuesday, June 25, 2013 10:00 AM
To: u-boot at lists.denx.de
Cc: Minkyu Kang; Kyungmin Park; Lukasz Majewski; Piotr Wilczek; Rajeshwari Shinde
Subject: [PATCH v3] drivers:power:max77686: add function to set voltage and mode

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v3:
- removed magic values
- used ARRAY_SIZE() for array size calculation
- used switch case instead if else if
- added return when pmic read error occurs

Changes in v2:
- changed printf to debug

 drivers/power/pmic/pmic_max77686.c |  192
++++++++++++++++++++++++++++++++++++
 include/power/max77686_pmic.h      |   26 +++++
 2 files changed, 218 insertions(+)
drivers/power/pmic/pmic_max77686.c +187 -0
index 7fcb4c0..3960ca9 100644
@@ -30,6 +30,198 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static const char max77686_buck_addr[] = {
+	0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38 };
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV) {
+	unsigned int hex = 0;
+
+	switch (ldo) {
+	case 1:
+	case 2:
+	case 6:
+	case 7:
+	case 8:
+	case 15:
+		hex = (uV - 800000) / 25000;
+		break;
+	default:
+		hex = (uV - 800000) / 50000;
+	}
+
+	if (hex >= 0 && hex <= MAX77686_LDO_VOLT_MAX_HEX)
+		return hex;
+
+	debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV,
 ldo);
+	return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV) {
+	unsigned int val, ret, hex, adr;
+
+	if (ldo < 1 && ldo > 26) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+	hex = max77686_ldo_volt2hex(ldo, uV);
+
+	if (!hex)
+		return -1;
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_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;
+
+	if (ldo < 1 && 26 < ldo) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_LDO_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (ldo) {
+		case 2:
+		case 6:
+		case 7:
+		case 8:
+		case 10:
+		case 11:
+		case 12:
+		case 14:
+		case 15:
+		case 16:
+			mode = MAX77686_LDO_MODE_STANDBY;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		mode = MAX77686_LDO_MODE_LPM;
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_LDO_MODE_ON;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on LDO%d\n",
+		       __func__, opmode, ldo);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_MODE_MASK;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode) {
+	unsigned int val, ret, mask, adr, size, mode, mode_shift;
+
+	size = ARRAY_SIZE(max77686_buck_addr);
+	if (buck >= size) {
+		printf("%s: %d is wrong buck number\n", __func__, buck);
+		return -1;
+	}
+
+	adr = max77686_buck_addr[buck];
+
+	/* mask */
+	switch (buck) {
+	case 2:
+	case 3:
+	case 4:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_2;
+		break;
+	default:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_1;
+	}
+
+	mask = MAX77686_BUCK_MODE_MASK << mode_shift;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_BUCK_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (buck) {
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_STANDBY << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		switch (buck) {
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_LPM << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_BUCK_MODE_ON << mode_shift;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on BUCK%d\n",
+		       __func__, opmode, buck);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~mask;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
 int pmic_init(unsigned char bus)
 {
 	static const char name[] = "MAX77686_PMIC"; diff --git

a/include/power/max77686_pmic.h b/include/power/max77686_pmic.h index 1c374a9..7339a3e 100644

include/power/max77686_pmic.h +26 -1
@@ -155,6 +155,32 @@ enum {
 	EN_LDO = (0x3 << 6),
 };
 
+enum {
+	OPMODE_OFF = 0,
+	OPMODE_STANDBY,
+	OPMODE_LPM,
+	OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
+#define MAX77686_LDO_VOLT_MAX_HEX	0x3f
+#define MAX77686_LDO_VOLT_MASK		0x3f
+#define MAX77686_LDO_MODE_MASK		0xc0
+#define MAX77686_LDO_MODE_OFF		(0x00 << 0x06)
+#define MAX77686_LDO_MODE_STANDBY	(0x01 << 0x06)
+#define MAX77686_LDO_MODE_LPM		(0x02 << 0x06)
+#define MAX77686_LDO_MODE_ON		(0x03 << 0x06)
+#define MAX77686_BUCK_MODE_MASK		0x03
+#define MAX77686_BUCK_MODE_SHIFT_1	0x00
+#define MAX77686_BUCK_MODE_SHIFT_2	0x04
+#define MAX77686_BUCK_MODE_OFF		0x00
+#define MAX77686_BUCK_MODE_STANDBY	0x01
+#define MAX77686_BUCK_MODE_LPM		0x02
+#define MAX77686_BUCK_MODE_ON		0x03
+
 /* Buck1 1 volt value */
 #define MAX77686_BUCK1OUT_1V	0x5
 /* Buck1 1.05 volt value */
--

1.7.9.5

#5 lore raw

PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode

In reply to Piotr Wilczek

Dear Tom,

This patch is delegated to you. Could you review this patch for the next release?

Best regards,
Piotr Wilczek

--
Samsung R&D Institute Poland (SRPOL)

Quoted 263 lines · Piotr Wilczek

This patch add new functions to pmic max77686 to set voltage and mode.

---
Changes in v3:
- removed magic values
- used ARRAY_SIZE() for array size calculation
- used switch case instead if else if
- added return when pmic read error occurs

Changes in v2:
- changed printf to debug

  drivers/power/pmic/pmic_max77686.c |  192 ++++++++++++++++++++++++++++++++++++
  include/power/max77686_pmic.h      |   26 +++++
  2 files changed, 218 insertions(+)
drivers/power/pmic/pmic_max77686.c +192 -0
index 7fcb4c0..3960ca9 100644
@@ -30,6 +30,198 @@
 
  DECLARE_GLOBAL_DATA_PTR;
 
+static const char max77686_buck_addr[] = {
+	0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
+};
+
+static unsigned int max77686_ldo_volt2hex(int ldo, ulong uV)
+{
+	unsigned int hex = 0;
+
+	switch (ldo) {
+	case 1:
+	case 2:
+	case 6:
+	case 7:
+	case 8:
+	case 15:
+		hex = (uV - 800000) / 25000;
+		break;
+	default:
+		hex = (uV - 800000) / 50000;
+	}
+
+	if (hex >= 0 && hex <= MAX77686_LDO_VOLT_MAX_HEX)
+		return hex;
+
+	debug("%s: %ld is wrong voltage value for LDO%d\n", __func__, uV, ldo);
+	return 0;
+}
+
+int max77686_set_ldo_voltage(struct pmic *p, int ldo, ulong uV)
+{
+	unsigned int val, ret, hex, adr;
+
+	if (ldo < 1 && ldo > 26) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+	hex = max77686_ldo_volt2hex(ldo, uV);
+
+	if (!hex)
+		return -1;
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_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;
+
+	if (ldo < 1 && 26 < ldo) {
+		printf("%s: %d is wrong ldo number\n", __func__, ldo);
+		return -1;
+	}
+
+	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_LDO_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (ldo) {
+		case 2:
+		case 6:
+		case 7:
+		case 8:
+		case 10:
+		case 11:
+		case 12:
+		case 14:
+		case 15:
+		case 16:
+			mode = MAX77686_LDO_MODE_STANDBY;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		mode = MAX77686_LDO_MODE_LPM;
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_LDO_MODE_ON;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on LDO%d\n",
+		       __func__, opmode, ldo);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~MAX77686_LDO_MODE_MASK;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
+int max77686_set_buck_mode(struct pmic *p, int buck, char opmode)
+{
+	unsigned int val, ret, mask, adr, size, mode, mode_shift;
+
+	size = ARRAY_SIZE(max77686_buck_addr);
+	if (buck >= size) {
+		printf("%s: %d is wrong buck number\n", __func__, buck);
+		return -1;
+	}
+
+	adr = max77686_buck_addr[buck];
+
+	/* mask */
+	switch (buck) {
+	case 2:
+	case 3:
+	case 4:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_2;
+		break;
+	default:
+		mode_shift = MAX77686_BUCK_MODE_SHIFT_1;
+	}
+
+	mask = MAX77686_BUCK_MODE_MASK << mode_shift;
+
+	/* mode */
+	switch (opmode) {
+	case OPMODE_OFF:
+		mode = MAX77686_BUCK_MODE_OFF;
+		break;
+	case OPMODE_STANDBY:
+		switch (buck) {
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_STANDBY << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_LPM:
+		switch (buck) {
+		case 2:
+		case 3:
+		case 4:
+			mode = MAX77686_BUCK_MODE_LPM << mode_shift;
+			break;
+		default:
+			mode = 0xff;
+		}
+		break;
+	case OPMODE_ON:
+		mode = MAX77686_BUCK_MODE_ON << mode_shift;
+		break;
+	default:
+		mode = 0xff;
+	}
+
+	if (mode == 0xff) {
+		printf("%s: %d is not supported on BUCK%d\n",
+		       __func__, opmode, buck);
+		return -1;
+	}
+
+	ret = pmic_reg_read(p, adr, &val);
+	if (ret)
+		return ret;
+
+	val &= ~mask;
+	val |= mode;
+	ret |= pmic_reg_write(p, adr, val);
+
+	return ret;
+}
+
  int pmic_init(unsigned char bus)
  {
  	static const char name[] = "MAX77686_PMIC";
include/power/max77686_pmic.h +26 -0
index 1c374a9..7339a3e 100644
@@ -155,6 +155,32 @@ enum {
  	EN_LDO = (0x3 << 6),
  };
 
+enum {
+	OPMODE_OFF = 0,
+	OPMODE_STANDBY,
+	OPMODE_LPM,
+	OPMODE_ON,
+};
+
+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_mode(struct pmic *p, int buck, char opmode);
+
+#define MAX77686_LDO_VOLT_MAX_HEX	0x3f
+#define MAX77686_LDO_VOLT_MASK		0x3f
+#define MAX77686_LDO_MODE_MASK		0xc0
+#define MAX77686_LDO_MODE_OFF		(0x00 << 0x06)
+#define MAX77686_LDO_MODE_STANDBY	(0x01 << 0x06)
+#define MAX77686_LDO_MODE_LPM		(0x02 << 0x06)
+#define MAX77686_LDO_MODE_ON		(0x03 << 0x06)
+#define MAX77686_BUCK_MODE_MASK		0x03
+#define MAX77686_BUCK_MODE_SHIFT_1	0x00
+#define MAX77686_BUCK_MODE_SHIFT_2	0x04
+#define MAX77686_BUCK_MODE_OFF		0x00
+#define MAX77686_BUCK_MODE_STANDBY	0x01
+#define MAX77686_BUCK_MODE_LPM		0x02
+#define MAX77686_BUCK_MODE_ON		0x03
+
  /* Buck1 1 volt value */
  #define MAX77686_BUCK1OUT_1V	0x5
  /* Buck1 1.05 volt value */
#6 lore raw

PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode

In reply to Piotr Wilczek
Quoted 8 lines · Piotr Wilczek

This patch add new functions to pmic max77686 to set voltage and mode.

And re-assigned to Minkyu as I assume there's other patches needed that enable this on a samsung board of some sort.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20130715/4809be88/attachment.pgp>
#7 lore raw

PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode

Quoted 9 lines · Tom Rini
Quoted 7 lines · Piotr Wilczek

This patch add new functions to pmic max77686 to set voltage and mode.

Quoted 6 lines
Quoted 1 line

And re-assigned to Minkyu as I assume there's other patches needed that enable this on a samsung board of some sort.

applied to u-boot-samsung.

Thanks,
Minkyu Kang.