drivers:power:max77686: add function to set voltage and mode
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
@@ -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
@@ -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
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.
Signed-off-by Piotr Wilczek <[email protected]>Signed-off-by Kyungmin Park <[email protected]>CC Minkyu Kang <[email protected]>CC Rajeshwari Shinde <[email protected]>---
Changes in v2:
- changed printf to debugdrivers/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@@ -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@@ -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
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
@@ -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
PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode
In reply to Piotr WilczekThis 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
@@ -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
@@ -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
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 modeThis patch add new functions to pmic max77686 to set voltage and mode.
Signed-off-by Piotr Wilczek <[email protected]>Signed-off-by Kyungmin Park <[email protected]>CC Minkyu Kang <[email protected]>CC Rajeshwari Shinde <[email protected]>---
Changes in v3:
- removed magic values
- usedARRAY_SIZE()for array size calculation
- used switch case instead if else if
- added return when pmic read error occursChanges in v2:
- changed printf to debugdrivers/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@@ -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.hb/include/power/max77686_pmic.hindex 1c374a9..7339a3e 100644include/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
PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode
In reply to Piotr WilczekDear 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.
Signed-off-by Piotr Wilczek <[email protected]>Signed-off-by Kyungmin Park <[email protected]>CC Minkyu Kang <[email protected]>CC Rajeshwari Shinde <[email protected]>---
Changes in v3:
- removed magic values
- usedARRAY_SIZE()for array size calculation
- used switch case instead if else if
- added return when pmic read error occursChanges in v2:
- changed printf to debugdrivers/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@@ -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@@ -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 */
PATCH v3 1/1 drivers:power:max77686: add function to set voltage and mode
In reply to Piotr WilczekQuoted 8 lines · Piotr Wilczek
This patch add new functions to pmic max77686 to set voltage and mode.
Signed-off-by Piotr Wilczek <[email protected]>Signed-off-by Kyungmin Park <[email protected]>CC Minkyu Kang <[email protected]>CC Rajeshwari Shinde <[email protected]>
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>
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.
Signed-off-by Piotr Wilczek <[email protected]>Signed-off-by Kyungmin Park <[email protected]>CC Minkyu Kang <[email protected]>CC Rajeshwari Shinde <[email protected]>
Quoted 6 lines
Quoted 1 line
Acked-by Tom Rini <[email protected]>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.