All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices
@ 2012-10-05  8:16 Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 01/21] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
                   ` (20 more replies)
  0 siblings, 21 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

PMIC framework has been redesigned to support multiple instances of power related devices
(e.g. fuel gauge, PMICs, chargers, micro USB IC, battery).

Due to that, code at other architectures and boards have been adjusted properly.

New power_board_init() method at ./lib/board.c file has been introduced. It is meant
to be an architecture dependent function to support advanced power management.
Since PMIC framework uses lists internally to link different devices, its initialization
must be done just after malloc initialization.

Please consider commits from this patch set as the example of advanced power management for a
particular HW (Trats board in this case).

In the new approach PMICs are selected with their names (e.g. 'pmic dump MAX8997_PMIC')
Presented patch set is a first step to change 'pmic' command to more generic (i.e. power)
to provide control for multiple devices.

Moreover device's battery is treated as an oridinary "power" device (like PMIC). Due to
that, framework unification is possible.


Dependencies:
1. gpio:fix: Proper handling of GPIO subsystem parts at Samsung devices
http://patchwork.ozlabs.org/patch/181768/

Test HW:
 - Exynos4210 Trats development board


Lukasz Majewski (21):
  pmic:i2c: Handle PMIC I2C transmission comprising of two bytes
  pmic:i2c: Add I2C byte order to PMIC framework
  pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C
  pmic: Extend PMIC framework to support multiple instances of PMIC
    devices
  pmic: Introduce power_board_init() method at ./lib/board.c file
  pmic: Enable power_board_init() support at TRATS
  pmic:chrg: Common information about charger and battery
    (power_chrg.h)
  pmic: Move pmic related code to ./drivers/power directory
  pmic: Extend struct pmic to support battery and charger related
    operations
  pmic:battery: Support for Trats Battery at PMIC framework
  pmic:muic: Support for MUIC built into MAX8997 device
  pmic:fuel-gauge: Support for MAX17042 fuel-gauge
  pmic:max8997: Function for calculating LDO internal register value
  arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's
    TRATS board
  arm:trats:pmic: Enable MUIC (MAX8997) at Samsung's TRATS board
  arm:trats:pmic: Enable fuel-gauge (MAX17042) at Samsung's TRATS board
  arm:trats:pmic: Enable battery support at Samsung's TRATS board
  pmic:max8997: Support for MAX8997 internal charger control
  arm:trats:pmic: Power consumption reduction state for Samsung's TRATS
    board
  arm:trats:pmic: Support for charging battery at Samsung's TRATS board
  pmic: Extend PMIC framework to support battery related commands

 arch/arm/lib/board.c                               |    4 +
 board/davedenx/qong/qong.c                         |    6 +-
 board/freescale/mx31pdk/mx31pdk.c                  |    6 +-
 board/freescale/mx35pdk/mx35pdk.c                  |    8 +-
 board/freescale/mx51evk/mx51evk.c                  |    6 +-
 board/freescale/mx53evk/mx53evk.c                  |    6 +-
 board/freescale/mx53loco/mx53loco.c                |   10 +-
 board/hale/tt01/tt01.c                             |    6 +-
 board/samsung/goni/goni.c                          |    9 +-
 board/samsung/trats/trats.c                        |  249 +++++++++++++++++++-
 board/samsung/universal_c210/universal.c           |   10 +-
 board/ttcontrol/vision2/vision2.c                  |    6 +-
 drivers/misc/Makefile                              |    7 -
 drivers/misc/pmic_core.c                           |  147 ------------
 drivers/power/Makefile                             |   11 +
 drivers/power/battery/bat_trats.c                  |   79 ++++++
 drivers/power/max17042/fg_max17042.c               |  251 ++++++++++++++++++++
 drivers/power/max8997/muic_max8997.c               |   91 +++++++
 drivers/power/max8997/pmic_max8997.c               |  124 ++++++++++
 drivers/{misc => power/max8998}/pmic_max8998.c     |   10 +-
 drivers/power/pmic_core.c                          |  230 ++++++++++++++++++
 drivers/{misc => power}/pmic_dialog.c              |    8 +-
 drivers/{misc => power}/pmic_fsl.c                 |    8 +-
 drivers/{misc => power}/pmic_i2c.c                 |   40 +++-
 drivers/{misc => power}/pmic_spi.c                 |    4 +-
 drivers/rtc/mc13xxx-rtc.c                          |    6 +-
 include/common.h                                   |    3 +
 include/configs/trats.h                            |    7 +
 include/pmic.h                                     |   72 ------
 .../misc/pmic_max8997.c => include/power/battery.h |   29 +--
 include/power/fg_battery_cell_params.h             |   90 +++++++
 include/power/max17042_fg.h                        |   74 ++++++
 include/power/max8997_muic.h                       |   61 +++++
 include/{ => power}/max8997_pmic.h                 |   26 ++-
 include/{ => power}/max8998_pmic.h                 |    0
 include/power/pmic.h                               |  102 ++++++++
 .../pmic_max8997.c => include/power/power_chrg.h   |   34 ++--
 37 files changed, 1508 insertions(+), 332 deletions(-)
 delete mode 100644 drivers/misc/pmic_core.c
 create mode 100644 drivers/power/battery/bat_trats.c
 create mode 100644 drivers/power/max17042/fg_max17042.c
 create mode 100644 drivers/power/max8997/muic_max8997.c
 create mode 100644 drivers/power/max8997/pmic_max8997.c
 rename drivers/{misc => power/max8998}/pmic_max8998.c (89%)
 create mode 100644 drivers/power/pmic_core.c
 rename drivers/{misc => power}/pmic_dialog.c (89%)
 rename drivers/{misc => power}/pmic_fsl.c (94%)
 rename drivers/{misc => power}/pmic_i2c.c (70%)
 rename drivers/{misc => power}/pmic_spi.c (97%)
 delete mode 100644 include/pmic.h
 copy drivers/misc/pmic_max8997.c => include/power/battery.h (71%)
 create mode 100644 include/power/fg_battery_cell_params.h
 create mode 100644 include/power/max17042_fg.h
 create mode 100644 include/power/max8997_muic.h
 rename include/{ => power}/max8997_pmic.h (88%)
 rename include/{ => power}/max8998_pmic.h (100%)
 create mode 100644 include/power/pmic.h
 rename drivers/misc/pmic_max8997.c => include/power/power_chrg.h (71%)

-- 
1.7.2.3

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 01/21] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework Lukasz Majewski
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

This patch adds support for proper handling of a PMIC I2C transmission
comprising of two bytes.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- None
---
 drivers/misc/pmic_i2c.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
index 95a3365..e74c372 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -44,6 +44,10 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
 		buf[1] = (val >> 8) & 0xff;
 		buf[2] = val & 0xff;
 		break;
+	case 2:
+		buf[0] = (val >> 8) & 0xff;
+		buf[1] = val & 0xff;
+		break;
 	case 1:
 		buf[0] = val & 0xff;
 		break;
@@ -73,6 +77,9 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
 	case 3:
 		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
 		break;
+	case 2:
+		ret_val = buf[0] << 8 | buf[1];
+		break;
 	case 1:
 		ret_val = buf[0];
 		break;
@@ -88,7 +95,7 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
 int pmic_probe(struct pmic *p)
 {
 	I2C_SET_BUS(p->bus);
-	debug("PMIC:%s probed!\n", p->name);
+	debug("Bus: %d PMIC:%s probed!\n", p->bus, p->name);
 	if (i2c_probe(pmic_i2c_addr)) {
 		printf("Can't find PMIC:%s\n", p->name);
 		return -1;
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 01/21] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-09  8:36   ` Stefano Babic
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 03/21] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
                   ` (18 subsequent siblings)
  20 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Since the pmic_reg_read is the u32 value, the order in which bytes
are placed to form u32 value is important.

This commit adds the reverse (which is default) and normal byte order.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>

---
Changes for v2:
- Move byte_order variable to struct pmic
---
 drivers/misc/pmic_i2c.c |   31 ++++++++++++++++++++++++-------
 include/pmic.h          |    2 ++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
index e74c372..6b1487b 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -40,13 +40,24 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
 
 	switch (pmic_i2c_tx_num) {
 	case 3:
-		buf[0] = (val >> 16) & 0xff;
-		buf[1] = (val >> 8) & 0xff;
-		buf[2] = val & 0xff;
+		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
+			buf[2] = (val >> 16) & 0xff;
+			buf[1] = (val >> 8) & 0xff;
+			buf[0] = val & 0xff;
+		} else {
+			buf[0] = (val >> 16) & 0xff;
+			buf[1] = (val >> 8) & 0xff;
+			buf[2] = val & 0xff;
+		}
 		break;
 	case 2:
-		buf[0] = (val >> 8) & 0xff;
-		buf[1] = val & 0xff;
+		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
+			buf[1] = (val >> 8) & 0xff;
+			buf[0] = val & 0xff;
+		} else {
+			buf[0] = (val >> 8) & 0xff;
+			buf[1] = val & 0xff;
+		}
 		break;
 	case 1:
 		buf[0] = val & 0xff;
@@ -75,10 +86,16 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
 
 	switch (pmic_i2c_tx_num) {
 	case 3:
-		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
+		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
+			ret_val = buf[2] << 16 | buf[1] << 8 | buf[0];
+		else
+			ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
 		break;
 	case 2:
-		ret_val = buf[0] << 8 | buf[1];
+		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
+			ret_val = buf[1] << 8 | buf[0];
+		else
+			ret_val = buf[0] << 8 | buf[1];
 		break;
 	case 1:
 		ret_val = buf[0];
diff --git a/include/pmic.h b/include/pmic.h
index 6a05b40..71b7d13 100644
--- a/include/pmic.h
+++ b/include/pmic.h
@@ -27,6 +27,7 @@
 enum { PMIC_I2C, PMIC_SPI, };
 enum { I2C_PMIC, I2C_NUM, };
 enum { PMIC_READ, PMIC_WRITE, };
+enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
 
 struct p_i2c {
 	unsigned char addr;
@@ -47,6 +48,7 @@ struct pmic {
 	const char *name;
 	unsigned char bus;
 	unsigned char interface;
+	unsigned char byte_order;
 	unsigned char number_of_regs;
 	union hw {
 		struct p_i2c i2c;
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 03/21] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 01/21] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 04/21] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

PMIC MAX8997 is now ready to work with single and multibus soft I2C
implementation.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- None
---
 drivers/misc/pmic_max8997.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c
index 62dbc05..4943f66 100644
--- a/drivers/misc/pmic_max8997.c
+++ b/drivers/misc/pmic_max8997.c
@@ -24,6 +24,7 @@
 #include <common.h>
 #include <pmic.h>
 #include <max8997_pmic.h>
+#include <i2c.h>
 
 int pmic_init(void)
 {
@@ -37,7 +38,7 @@ int pmic_init(void)
 	p->number_of_regs = PMIC_NUM_OF_REGS;
 	p->hw.i2c.addr = MAX8997_I2C_ADDR;
 	p->hw.i2c.tx_num = 1;
-	p->bus = I2C_PMIC;
+	p->bus = I2C_0;
 
 	return 0;
 }
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 04/21] pmic: Extend PMIC framework to support multiple instances of PMIC devices
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (2 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 03/21] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file Lukasz Majewski
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

The PMIC framework has been extended to support multiple instances of
the variety of devices responsible for power management.
This change allows supporting of e.g. fuel gauge, charger, MUIC (Micro USB
Interface Circuit).
Power related includes have been moved to ./include/power directory.
This is a first of a series of patches - in the future "pmic" will be
replaced with "power".

Two important issues:
1. The PMIC needs to be initialized just after malloc is configured
2. It uses list to hold information about available PMIC devices

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- None
---
 board/davedenx/qong/qong.c               |    6 +-
 board/freescale/mx31pdk/mx31pdk.c        |    6 +-
 board/freescale/mx35pdk/mx35pdk.c        |    8 +-
 board/freescale/mx51evk/mx51evk.c        |    6 +-
 board/freescale/mx53evk/mx53evk.c        |    6 +-
 board/freescale/mx53loco/mx53loco.c      |   10 ++--
 board/hale/tt01/tt01.c                   |    6 +-
 board/samsung/goni/goni.c                |    9 ++-
 board/samsung/trats/trats.c              |   12 ++--
 board/samsung/universal_c210/universal.c |   10 ++--
 board/ttcontrol/vision2/vision2.c        |    6 +-
 drivers/misc/pmic_core.c                 |  108 ++++++++++++++++++++++--------
 drivers/misc/pmic_dialog.c               |    8 +-
 drivers/misc/pmic_fsl.c                  |    8 +-
 drivers/misc/pmic_i2c.c                  |    6 +-
 drivers/misc/pmic_max8997.c              |   10 ++--
 drivers/misc/pmic_max8998.c              |   10 ++--
 drivers/misc/pmic_spi.c                  |    4 +-
 drivers/rtc/mc13xxx-rtc.c                |    6 +-
 include/{ => power}/max8997_pmic.h       |   15 ++++-
 include/{ => power}/max8998_pmic.h       |    0
 include/{ => power}/pmic.h               |   17 +++--
 22 files changed, 175 insertions(+), 102 deletions(-)
 rename include/{ => power}/max8997_pmic.h (92%)
 rename include/{ => power}/max8998_pmic.h (100%)
 rename include/{ => power}/pmic.h (86%)

diff --git a/board/davedenx/qong/qong.c b/board/davedenx/qong/qong.c
index c41f11d..e8c23f8 100644
--- a/board/davedenx/qong/qong.c
+++ b/board/davedenx/qong/qong.c
@@ -28,7 +28,7 @@
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
 #include <nand.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 #include <asm/gpio.h>
 #include "qong_fpga.h"
@@ -173,8 +173,8 @@ int board_late_init(void)
 	u32 val;
 	struct pmic *p;
 
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* Enable RTC battery */
 	pmic_reg_read(p, REG_POWER_CTL0, &val);
diff --git a/board/freescale/mx31pdk/mx31pdk.c b/board/freescale/mx31pdk/mx31pdk.c
index 9f8bc53..24c0a1e 100644
--- a/board/freescale/mx31pdk/mx31pdk.c
+++ b/board/freescale/mx31pdk/mx31pdk.c
@@ -30,7 +30,7 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
 #include <watchdog.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -84,8 +84,8 @@ int board_late_init(void)
 	u32 val;
 	struct pmic *p;
 
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* Enable RTC battery */
 	pmic_reg_read(p, REG_POWER_CTL0, &val);
diff --git a/board/freescale/mx35pdk/mx35pdk.c b/board/freescale/mx35pdk/mx35pdk.c
index 7cb6b30..7b3970b 100644
--- a/board/freescale/mx35pdk/mx35pdk.c
+++ b/board/freescale/mx35pdk/mx35pdk.c
@@ -30,7 +30,7 @@
 #include <asm/arch/mx35_pins.h>
 #include <asm/arch/iomux.h>
 #include <i2c.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
@@ -206,7 +206,7 @@ int board_init(void)
 static inline int pmic_detect(void)
 {
 	unsigned int id;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("FSL_PMIC");
 
 	pmic_reg_read(p, REG_IDENTIFICATION, &id);
 
@@ -231,9 +231,9 @@ int board_late_init(void)
 	u32 pmic_val;
 	struct pmic *p;
 
-	pmic_init();
+	pmic_init(I2C_PMIC);
 	if (pmic_detect()) {
-		p = get_pmic();
+		p = pmic_get("FSL_PMIC");
 		mxc_request_iomux(MX35_PIN_WATCHDOG_RST, MUX_CONFIG_SION |
 					MUX_CONFIG_ALT1);
 
diff --git a/board/freescale/mx51evk/mx51evk.c b/board/freescale/mx51evk/mx51evk.c
index 7a0682a..4496ce9 100644
--- a/board/freescale/mx51evk/mx51evk.c
+++ b/board/freescale/mx51evk/mx51evk.c
@@ -32,7 +32,7 @@
 #include <i2c.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 #include <mc13892.h>
 #include <usb/ehci-fsl.h>
@@ -244,8 +244,8 @@ static void power_init(void)
 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;
 	struct pmic *p;
 
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* Write needed to Power Gate 2 register */
 	pmic_reg_read(p, REG_POWER_MISC, &val);
diff --git a/board/freescale/mx53evk/mx53evk.c b/board/freescale/mx53evk/mx53evk.c
index b11a94c..e2d8b61 100644
--- a/board/freescale/mx53evk/mx53evk.c
+++ b/board/freescale/mx53evk/mx53evk.c
@@ -33,7 +33,7 @@
 #include <i2c.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 #include <asm/gpio.h>
 #include <mc13892.h>
@@ -123,8 +123,8 @@ void power_init(void)
 	unsigned int val;
 	struct pmic *p;
 
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* Set VDDA to 1.25V */
 	pmic_reg_read(p, REG_SW_2, &val);
diff --git a/board/freescale/mx53loco/mx53loco.c b/board/freescale/mx53loco/mx53loco.c
index 8f82125..d69769f 100644
--- a/board/freescale/mx53loco/mx53loco.c
+++ b/board/freescale/mx53loco/mx53loco.c
@@ -36,7 +36,7 @@
 #include <mmc.h>
 #include <fsl_esdhc.h>
 #include <asm/gpio.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <dialog_pmic.h>
 #include <fsl_pmic.h>
 #include <linux/fb.h>
@@ -343,8 +343,8 @@ static int power_init(void)
 	struct pmic *p;
 
 	if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
-		pmic_dialog_init();
-		p = get_pmic();
+		pmic_dialog_init(I2C_PMIC);
+		p = pmic_get("DIALOG_PMIC");
 
 		/* Set VDDA to 1.25V */
 		val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
@@ -360,8 +360,8 @@ static int power_init(void)
 	}
 
 	if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
-		pmic_init();
-		p = get_pmic();
+		pmic_init(I2C_PMIC);
+		p = pmic_get("DIALOG_PMIC");
 
 		/* Set VDDGP to 1.25V for 1GHz on SW1 */
 		pmic_reg_read(p, REG_SW_0, &val);
diff --git a/board/hale/tt01/tt01.c b/board/hale/tt01/tt01.c
index 02e75ed..6e885c5 100644
--- a/board/hale/tt01/tt01.c
+++ b/board/hale/tt01/tt01.c
@@ -25,7 +25,7 @@
 #include <common.h>
 #include <netdev.h>
 #include <command.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 #include <mc13783.h>
 #include <asm/arch/clock.h>
@@ -201,8 +201,8 @@ int board_mmc_init(bd_t *bis)
 	* pmic_init() here. board_late_init() is too late for
 	* the MMC driver.
 	*/
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* configure pins for SDHC1 only */
 	mx31_gpio_mux(IOMUX_MODE(MUX_CTL_SD1_CLK, MUX_CTL_FUNC));
diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c
index e8fb1ea..94731e4a 100644
--- a/board/samsung/goni/goni.c
+++ b/board/samsung/goni/goni.c
@@ -25,10 +25,10 @@
 #include <common.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <usb/s3c_udc.h>
 #include <asm/arch/cpu.h>
-#include <max8998_pmic.h>
+#include <power/max8998_pmic.h>
 DECLARE_GLOBAL_DATA_PTR;
 
 static struct s5pc110_gpio *s5pc110_gpio;
@@ -42,8 +42,9 @@ int board_init(void)
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
 #if defined(CONFIG_PMIC)
-	pmic_init();
+	pmic_init(I2C_5);
 #endif
+
 	return 0;
 }
 
@@ -108,7 +109,7 @@ static int s5pc1xx_phy_control(int on)
 {
 	int ret;
 	static int status;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8998_PMIC");
 
 	if (pmic_probe(p))
 		return -1;
diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index e11a892..80ec4ad 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -34,9 +34,9 @@
 #include <asm/arch/mipi_dsim.h>
 #include <asm/arch/watchdog.h>
 #include <asm/arch/power.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <usb/s3c_udc.h>
-#include <max8997_pmic.h>
+#include <power/max8997_pmic.h>
 #include <libtizen.h>
 
 #include "setup.h"
@@ -69,7 +69,7 @@ int board_init(void)
 	printf("HW Revision:\t0x%x\n", board_rev);
 
 #if defined(CONFIG_PMIC)
-	pmic_init();
+	pmic_init(I2C_5);
 #endif
 
 	return 0;
@@ -238,7 +238,7 @@ static int s5pc210_phy_control(int on)
 {
 	int ret = 0;
 	u32 val = 0;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8997_PMIC");
 
 	if (pmic_probe(p))
 		return -1;
@@ -413,7 +413,7 @@ static void lcd_reset(void)
 static int lcd_power(void)
 {
 	int ret = 0;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8997_PMIC");
 
 	if (pmic_probe(p))
 		return 0;
@@ -473,7 +473,7 @@ static struct mipi_dsim_lcd_device mipi_lcd_device = {
 static int mipi_power(void)
 {
 	int ret = 0;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8997_PMIC");
 
 	if (pmic_probe(p))
 		return 0;
diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c
index 90fff5c..80a7346 100644
--- a/board/samsung/universal_c210/universal.c
+++ b/board/samsung/universal_c210/universal.c
@@ -27,10 +27,10 @@
 #include <asm/arch/adc.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <usb/s3c_udc.h>
 #include <asm/arch/cpu.h>
-#include <max8998_pmic.h>
+#include <power/max8998_pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -59,7 +59,7 @@ int board_init(void)
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
 #if defined(CONFIG_PMIC)
-	pmic_init();
+	pmic_init(I2C_5);
 #endif
 
 	check_hw_revision();
@@ -112,7 +112,7 @@ static unsigned short get_adc_value(int channel)
 static int adc_power_control(int on)
 {
 	int ret;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8998_PMIC");
 
 	if (pmic_probe(p))
 		return -1;
@@ -280,7 +280,7 @@ int board_mmc_init(bd_t *bis)
 static int s5pc210_phy_control(int on)
 {
 	int ret = 0;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("MAX8998_PMIC");
 
 	if (pmic_probe(p))
 		return -1;
diff --git a/board/ttcontrol/vision2/vision2.c b/board/ttcontrol/vision2/vision2.c
index f28eab0..3cfa7dc 100644
--- a/board/ttcontrol/vision2/vision2.c
+++ b/board/ttcontrol/vision2/vision2.c
@@ -33,7 +33,7 @@
 #include <asm/arch/sys_proto.h>
 #include <i2c.h>
 #include <mmc.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_esdhc.h>
 #include <fsl_pmic.h>
 #include <mc13892.h>
@@ -306,8 +306,8 @@ static void power_init_mx51(void)
 	unsigned int val;
 	struct pmic *p;
 
-	pmic_init();
-	p = get_pmic();
+	pmic_init(I2C_PMIC);
+	p = pmic_get("FSL_PMIC");
 
 	/* Write needed to Power Gate 2 register */
 	pmic_reg_read(p, REG_POWER_MISC, &val);
diff --git a/drivers/misc/pmic_core.c b/drivers/misc/pmic_core.c
index 5d62a56..2908f66 100644
--- a/drivers/misc/pmic_core.c
+++ b/drivers/misc/pmic_core.c
@@ -27,18 +27,21 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <linux/types.h>
-#include <pmic.h>
+#include <linux/list.h>
+#include <power/pmic.h>
 
-static struct pmic pmic;
+static LIST_HEAD(pmic_list);
 
-int check_reg(u32 reg)
+int check_reg(struct pmic *p, u32 reg)
 {
-	if (reg >= pmic.number_of_regs) {
+	if (reg >= p->number_of_regs) {
 		printf("<reg num> = %d is invalid. Should be less than %d\n",
-		       reg, pmic.number_of_regs);
+		       reg, p->number_of_regs);
 		return -1;
 	}
+
 	return 0;
 }
 
@@ -65,11 +68,16 @@ static void pmic_show_info(struct pmic *p)
 	printf("PMIC: %s\n", p->name);
 }
 
-static void pmic_dump(struct pmic *p)
+static int pmic_dump(struct pmic *p)
 {
 	int i, ret;
 	u32 val;
 
+	if (!p) {
+		puts("Wrong PMIC name!\n");
+		return -1;
+	}
+
 	pmic_show_info(p);
 	for (i = 0; i < p->number_of_regs; i++) {
 		ret = pmic_reg_read(p, i, &val);
@@ -82,36 +90,79 @@ static void pmic_dump(struct pmic *p)
 		printf("%08x ", val);
 	}
 	puts("\n");
+	return 0;
 }
 
-struct pmic *get_pmic(void)
+struct pmic *pmic_alloc(void)
 {
-	return &pmic;
+	struct pmic *p;
+
+	p = calloc(sizeof(*p), 1);
+	if (!p) {
+		printf("%s: No available memory for allocation!\n", __func__);
+		return NULL;
+	}
+
+	list_add_tail(&p->list, &pmic_list);
+
+	debug("%s: new pmic struct: 0x%p\n", __func__, p);
+
+	return p;
+}
+
+struct pmic *pmic_get(const char *s)
+{
+	struct pmic *p;
+
+	list_for_each_entry(p, &pmic_list, list) {
+		if (strcmp(p->name, s) == 0) {
+			debug("%s: pmic %s -> 0x%p\n", __func__, p->name, p);
+			return p;
+		}
+	}
+
+	return NULL;
+}
+
+static void pmic_list_names(void)
+{
+	struct pmic *p;
+
+	puts("PMIC devices:\n");
+	list_for_each_entry(p, &pmic_list, list) {
+		printf("name: %s\n", p->name);
+	}
 }
 
 int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	u32 ret, reg, val;
+	struct pmic *p;
 	char *cmd;
 
-	struct pmic *p = &pmic;
-
 	/* at least two arguments please */
 	if (argc < 2)
-		return cmd_usage(cmdtp);
+		return CMD_RET_USAGE;
 
 	cmd = argv[1];
+
+	if (strcmp(cmd, "list") == 0) {
+		pmic_list_names();
+		return CMD_RET_SUCCESS;
+	}
+
 	if (strcmp(cmd, "dump") == 0) {
-		pmic_dump(p);
-		return 0;
+		if (pmic_dump(pmic_get(argv[2])))
+			return CMD_RET_FAILURE;
+		return CMD_RET_SUCCESS;
 	}
 
 	if (strcmp(cmd, "read") == 0) {
-		if (argc < 3)
-			return cmd_usage(cmdtp);
-
-		reg = simple_strtoul(argv[2], NULL, 16);
+		if (argc < 4)
+			return CMD_RET_USAGE;
 
+		reg = simple_strtoul(argv[3], NULL, 16);
+		p = pmic_get(argv[2]);
 		ret = pmic_reg_read(p, reg, &val);
 
 		if (ret)
@@ -119,29 +170,30 @@ int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 		printf("\n0x%02x: 0x%08x\n", reg, val);
 
-		return 0;
+		return CMD_RET_SUCCESS;
 	}
 
 	if (strcmp(cmd, "write") == 0) {
-		if (argc < 4)
-			return cmd_usage(cmdtp);
-
-		reg = simple_strtoul(argv[2], NULL, 16);
-		val = simple_strtoul(argv[3], NULL, 16);
+		if (argc < 5)
+			return CMD_RET_USAGE;
 
+		reg = simple_strtoul(argv[3], NULL, 16);
+		val = simple_strtoul(argv[4], NULL, 16);
+		p = pmic_get(argv[2]);
 		pmic_reg_write(p, reg, val);
 
-		return 0;
+		return CMD_RET_SUCCESS;
 	}
 
 	/* No subcommand found */
-	return 1;
+	return CMD_RET_SUCCESS;
 }
 
 U_BOOT_CMD(
 	pmic,	CONFIG_SYS_MAXARGS, 1, do_pmic,
 	"PMIC",
-	"dump - dump PMIC registers\n"
-	"pmic read <reg> - read register\n"
-	"pmic write <reg> <value> - write register"
+	"list - list available PMICs\n"
+	"pmic dump name - dump named PMIC registers\n"
+	"pmic name read <reg> - read register\n"
+	"pmic name write <reg> <value> - write register"
 );
diff --git a/drivers/misc/pmic_dialog.c b/drivers/misc/pmic_dialog.c
index e97af1d..d972211 100644
--- a/drivers/misc/pmic_dialog.c
+++ b/drivers/misc/pmic_dialog.c
@@ -17,12 +17,12 @@
  */
 
 #include <common.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <dialog_pmic.h>
 
-int pmic_dialog_init(void)
+int pmic_dialog_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_alloc();
 	static const char name[] = "DIALOG_PMIC";
 
 	p->name = name;
@@ -31,7 +31,7 @@ int pmic_dialog_init(void)
 	p->interface = PMIC_I2C;
 	p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR;
 	p->hw.i2c.tx_num = 1;
-	p->bus = I2C_PMIC;
+	p->bus = bus;
 
 	return 0;
 }
diff --git a/drivers/misc/pmic_fsl.c b/drivers/misc/pmic_fsl.c
index 0ff75ed..868c3c4 100644
--- a/drivers/misc/pmic_fsl.c
+++ b/drivers/misc/pmic_fsl.c
@@ -23,7 +23,7 @@
 
 #include <common.h>
 #include <spi.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 
 #if defined(CONFIG_PMIC_SPI)
@@ -33,9 +33,9 @@ static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)
 }
 #endif
 
-int pmic_init(void)
+int pmic_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_alloc();
 	static const char name[] = "FSL_PMIC";
 
 	p->name = name;
@@ -54,7 +54,7 @@ int pmic_init(void)
 	p->interface = PMIC_I2C;
 	p->hw.i2c.addr = CONFIG_SYS_FSL_PMIC_I2C_ADDR;
 	p->hw.i2c.tx_num = 3;
-	p->bus = I2C_PMIC;
+	p->bus = bus;
 #else
 #error "You must select CONFIG_PMIC_SPI or CONFIG_PMIC_I2C"
 #endif
diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
index 6b1487b..63a7cf6 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -28,14 +28,14 @@
 
 #include <common.h>
 #include <linux/types.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <i2c.h>
 
 int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
 {
 	unsigned char buf[4] = { 0 };
 
-	if (check_reg(reg))
+	if (check_reg(p, reg))
 		return -1;
 
 	switch (pmic_i2c_tx_num) {
@@ -78,7 +78,7 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
 	unsigned char buf[4] = { 0 };
 	u32 ret_val = 0;
 
-	if (check_reg(reg))
+	if (check_reg(p, reg))
 		return -1;
 
 	if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num))
diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c
index 4943f66..4e8283a 100644
--- a/drivers/misc/pmic_max8997.c
+++ b/drivers/misc/pmic_max8997.c
@@ -22,13 +22,13 @@
  */
 
 #include <common.h>
-#include <pmic.h>
-#include <max8997_pmic.h>
+#include <power/pmic.h>
+#include <power/max8997_pmic.h>
 #include <i2c.h>
 
-int pmic_init(void)
+int pmic_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_alloc();
 	static const char name[] = "MAX8997_PMIC";
 
 	puts("Board PMIC init\n");
@@ -38,7 +38,7 @@ int pmic_init(void)
 	p->number_of_regs = PMIC_NUM_OF_REGS;
 	p->hw.i2c.addr = MAX8997_I2C_ADDR;
 	p->hw.i2c.tx_num = 1;
-	p->bus = I2C_0;
+	p->bus = bus;
 
 	return 0;
 }
diff --git a/drivers/misc/pmic_max8998.c b/drivers/misc/pmic_max8998.c
index cc69fd7..3cad60d 100644
--- a/drivers/misc/pmic_max8998.c
+++ b/drivers/misc/pmic_max8998.c
@@ -22,12 +22,12 @@
  */
 
 #include <common.h>
-#include <pmic.h>
-#include <max8998_pmic.h>
+#include <power/pmic.h>
+#include <power/max8998_pmic.h>
 
-int pmic_init(void)
+int pmic_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_alloc();
 	static const char name[] = "MAX8998_PMIC";
 
 	puts("Board PMIC init\n");
@@ -37,7 +37,7 @@ int pmic_init(void)
 	p->number_of_regs = PMIC_NUM_OF_REGS;
 	p->hw.i2c.addr = MAX8998_I2C_ADDR;
 	p->hw.i2c.tx_num = 1;
-	p->bus = I2C_PMIC;
+	p->bus = bus;
 
 	return 0;
 }
diff --git a/drivers/misc/pmic_spi.c b/drivers/misc/pmic_spi.c
index 5a0dd22..27488ea 100644
--- a/drivers/misc/pmic_spi.c
+++ b/drivers/misc/pmic_spi.c
@@ -28,7 +28,7 @@
 
 #include <common.h>
 #include <linux/types.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <spi.h>
 
 static struct spi_slave *slave;
@@ -59,7 +59,7 @@ static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write)
 			return -1;
 	}
 
-	if (check_reg(reg))
+	if (check_reg(p, reg))
 		return -1;
 
 	if (spi_claim_bus(slave))
diff --git a/drivers/rtc/mc13xxx-rtc.c b/drivers/rtc/mc13xxx-rtc.c
index 70ea8a1..1a10588 100644
--- a/drivers/rtc/mc13xxx-rtc.c
+++ b/drivers/rtc/mc13xxx-rtc.c
@@ -23,14 +23,14 @@
 #include <common.h>
 #include <rtc.h>
 #include <spi.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
 
 int rtc_get(struct rtc_time *rtc)
 {
 	u32 day1, day2, time;
 	int tim, i = 0;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("FSL_PMIC");
 	int ret;
 
 	do {
@@ -61,7 +61,7 @@ int rtc_get(struct rtc_time *rtc)
 int rtc_set(struct rtc_time *rtc)
 {
 	u32 time, day;
-	struct pmic *p = get_pmic();
+	struct pmic *p = pmic_get("FSL_PMIC");
 
 	time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
 		      rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
diff --git a/include/max8997_pmic.h b/include/power/max8997_pmic.h
similarity index 92%
rename from include/max8997_pmic.h
rename to include/power/max8997_pmic.h
index 17ae24e..1db7deb 100644
--- a/include/max8997_pmic.h
+++ b/include/power/max8997_pmic.h
@@ -111,7 +111,7 @@ enum {
 	MAX8997_REG_MBCCTRL6	= 0x55,
 	MAX8997_REG_OTPCGHCVS	= 0x56,
 
-	MAX8997_REG_SAFEOUTCTRL	= 0x5a,
+	MAX8997_REG_SAFEOUTCTRL = 0x5a,
 
 	MAX8997_REG_LBCNFG1	= 0x5e,
 	MAX8997_REG_LBCNFG2	= 0x5f,
@@ -171,9 +171,22 @@ enum {
 	PMIC_NUM_OF_REGS = 0x9b,
 };
 
+#define ACTDISSAFEO1 (1 << 4)
+#define ACTDISSAFEO2 (1 << 5)
 #define ENSAFEOUT1 (1 << 6)
 #define ENSAFEOUT2 (1 << 7)
 
+/* Charger */
+enum {CHARGER_ENABLE, CHARGER_DISABLE};
+#define DETBAT                  (1 << 2)
+#define MBCICHFCSET             (1 << 4)
+#define MBCHOSTEN               (1 << 6)
+#define VCHGR_FC                (1 << 7)
+
+#define CHARGER_MIN_CURRENT 200
+#define CHARGER_MAX_CURRENT 950
+#define CHARGER_CURRENT_RESOLUTION 50
+
 #define MAX8997_I2C_ADDR        (0xCC >> 1)
 #define MAX8997_RTC_ADDR	(0x0C >> 1)
 #define MAX8997_MUIC_ADDR	(0x4A >> 1)
diff --git a/include/max8998_pmic.h b/include/power/max8998_pmic.h
similarity index 100%
rename from include/max8998_pmic.h
rename to include/power/max8998_pmic.h
diff --git a/include/pmic.h b/include/power/pmic.h
similarity index 86%
rename from include/pmic.h
rename to include/power/pmic.h
index 71b7d13..3583342 100644
--- a/include/pmic.h
+++ b/include/power/pmic.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2011 Samsung Electronics
+ *  Copyright (C) 2011-2012 Samsung Electronics
  *  Lukasz Majewski <l.majewski@samsung.com>
  *
  * See file CREDITS for list of people who contributed to this
@@ -24,6 +24,10 @@
 #ifndef __CORE_PMIC_H_
 #define __CORE_PMIC_H_
 
+#include <common.h>
+#include <linux/list.h>
+#include <i2c.h>
+
 enum { PMIC_I2C, PMIC_SPI, };
 enum { I2C_PMIC, I2C_NUM, };
 enum { PMIC_READ, PMIC_WRITE, };
@@ -49,17 +53,20 @@ struct pmic {
 	unsigned char bus;
 	unsigned char interface;
 	unsigned char byte_order;
-	unsigned char number_of_regs;
+	unsigned int number_of_regs;
 	union hw {
 		struct p_i2c i2c;
 		struct p_spi spi;
 	} hw;
+
+	struct list_head list;
 };
 
-int pmic_init(void);
+int pmic_init(unsigned char bus);
 int pmic_dialog_init(void);
-int check_reg(u32 reg);
-struct pmic *get_pmic(void);
+int check_reg(struct pmic *p, u32 reg);
+struct pmic *pmic_alloc(void);
+struct pmic *pmic_get(const char *s);
 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);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (3 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 04/21] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-09  8:54   ` Stefano Babic
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
                   ` (15 subsequent siblings)
  20 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

It is necessary to introduce a new system wide function- power_board_init()

It turns out, that power initialization must be done as early as possible.
In the case of PMIC framework redesign, which aims to support multiple
instances of PMIC devices the initialization shall be performed just
after malloc configuration.

The arch_early_init_r() could be used instead, but it doesn't reflect
that the "power" subsystem is going to be initialized.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- None
---
 arch/arm/lib/board.c |    4 ++++
 include/common.h     |    3 +++
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 109a1ac..431ef5b 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -513,6 +513,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	arch_early_init_r();
 #endif
 
+#ifdef CONFIG_POWER_INIT
+	power_board_init();
+#endif
+
 #if !defined(CONFIG_SYS_NO_FLASH)
 	puts("Flash: ");
 
diff --git a/include/common.h b/include/common.h
index a7fb05e..5cc859f 100644
--- a/include/common.h
+++ b/include/common.h
@@ -487,6 +487,9 @@ int board_late_init (void);
 int board_postclk_init (void); /* after clocks/timebase, before env/serial */
 int board_early_init_r (void);
 void board_poweroff (void);
+#ifdef CONFIG_POWER_INIT
+int power_board_init(void);
+#endif
 
 #if defined(CONFIG_SYS_DRAM_TEST)
 int testdram(void);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (4 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-09  8:56   ` Stefano Babic
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 07/21] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
                   ` (14 subsequent siblings)
  20 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Enable support for power_board_init() method at TRATS board.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- None
---
 board/samsung/trats/trats.c |   15 +++++++++++----
 include/configs/trats.h     |    1 +
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 80ec4ad..0285668 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -68,10 +68,6 @@ int board_init(void)
 	check_hw_revision();
 	printf("HW Revision:\t0x%x\n", board_rev);
 
-#if defined(CONFIG_PMIC)
-	pmic_init(I2C_5);
-#endif
-
 	return 0;
 }
 
@@ -90,6 +86,17 @@ void i2c_init_board(void)
 	s5p_gpio_direction_output(&gpio2->y4, 1, 1);
 }
 
+#ifdef CONFIG_POWER_INIT
+int power_board_init(void)
+{
+
+#ifdef CONFIG_PMIC
+	pmic_init(I2C_5);
+#endif
+	return 0;
+}
+#endif
+
 int dram_init(void)
 {
 	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) +
diff --git a/include/configs/trats.h b/include/configs/trats.h
index b3b5a3d..37a655a 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -235,6 +235,7 @@
 #define CONFIG_SOFT_I2C_GPIO_SDA get_multi_sda_pin()
 #define I2C_INIT multi_i2c_init()
 
+#define CONFIG_POWER_INIT
 #define CONFIG_PMIC
 #define CONFIG_PMIC_I2C
 #define CONFIG_PMIC_MAX8997
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 07/21] pmic:chrg: Common information about charger and battery (power_chrg.h)
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (5 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

New power_chrg.h file has been added to "bind" together common
information about charging battery available in the system.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- Move struct battery elements to a separate file
---
 include/power/power_chrg.h |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)
 create mode 100644 include/power/power_chrg.h

diff --git a/include/power/power_chrg.h b/include/power/power_chrg.h
new file mode 100644
index 0000000..24c4cde
--- /dev/null
+++ b/include/power/power_chrg.h
@@ -0,0 +1,43 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __POWER_CHARGER_H_
+#define __POWER_CHARGER_H_
+
+/* Type of available chargers */
+enum {
+	CHARGER_NO = 0,
+	CHARGER_TA,
+	CHARGER_USB,
+	CHARGER_TA_500,
+	CHARGER_UNKNOWN,
+};
+
+enum {
+	UNKNOWN,
+	EXT_SOURCE,
+	CHARGE,
+	NORMAL,
+};
+
+#endif /* __POWER_CHARGER_H_ */
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (6 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 07/21] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-09  8:58   ` Stefano Babic
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
                   ` (12 subsequent siblings)
  20 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

The PMIC framework has been moved to its more natural place
./drivers/power from ./drivers/misc directory.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- New patch for v2
---
 drivers/misc/Makefile                          |    7 -------
 drivers/power/Makefile                         |    8 ++++++++
 drivers/{misc => power/max8997}/pmic_max8997.c |    0
 drivers/{misc => power/max8998}/pmic_max8998.c |    0
 drivers/{misc => power}/pmic_core.c            |    0
 drivers/{misc => power}/pmic_dialog.c          |    0
 drivers/{misc => power}/pmic_fsl.c             |    0
 drivers/{misc => power}/pmic_i2c.c             |    0
 drivers/{misc => power}/pmic_spi.c             |    0
 9 files changed, 8 insertions(+), 7 deletions(-)
 rename drivers/{misc => power/max8997}/pmic_max8997.c (100%)
 rename drivers/{misc => power/max8998}/pmic_max8998.c (100%)
 rename drivers/{misc => power}/pmic_core.c (100%)
 rename drivers/{misc => power}/pmic_dialog.c (100%)
 rename drivers/{misc => power}/pmic_fsl.c (100%)
 rename drivers/{misc => power}/pmic_i2c.c (100%)
 rename drivers/{misc => power}/pmic_spi.c (100%)

diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 271463c..cdec88b 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -34,13 +34,6 @@ COBJS-$(CONFIG_NS87308) += ns87308.o
 COBJS-$(CONFIG_PDSP188x) += pdsp188x.o
 COBJS-$(CONFIG_STATUS_LED) += status_led.o
 COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o
-COBJS-$(CONFIG_PMIC) += pmic_core.o
-COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
-COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
-COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
-COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
-COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
-COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 6bf388c..7016d5b 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -31,6 +31,14 @@ COBJS-$(CONFIG_TWL4030_POWER)	+= twl4030.o
 COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o
 COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o
 
+COBJS-$(CONFIG_PMIC) += pmic_core.o
+COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
+COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
+COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
+COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
+COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
+COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
+
 COBJS	:= $(COBJS-y)
 SRCS 	:= $(COBJS:.o=.c)
 OBJS 	:= $(addprefix $(obj),$(COBJS))
diff --git a/drivers/misc/pmic_max8997.c b/drivers/power/max8997/pmic_max8997.c
similarity index 100%
rename from drivers/misc/pmic_max8997.c
rename to drivers/power/max8997/pmic_max8997.c
diff --git a/drivers/misc/pmic_max8998.c b/drivers/power/max8998/pmic_max8998.c
similarity index 100%
rename from drivers/misc/pmic_max8998.c
rename to drivers/power/max8998/pmic_max8998.c
diff --git a/drivers/misc/pmic_core.c b/drivers/power/pmic_core.c
similarity index 100%
rename from drivers/misc/pmic_core.c
rename to drivers/power/pmic_core.c
diff --git a/drivers/misc/pmic_dialog.c b/drivers/power/pmic_dialog.c
similarity index 100%
rename from drivers/misc/pmic_dialog.c
rename to drivers/power/pmic_dialog.c
diff --git a/drivers/misc/pmic_fsl.c b/drivers/power/pmic_fsl.c
similarity index 100%
rename from drivers/misc/pmic_fsl.c
rename to drivers/power/pmic_fsl.c
diff --git a/drivers/misc/pmic_i2c.c b/drivers/power/pmic_i2c.c
similarity index 100%
rename from drivers/misc/pmic_i2c.c
rename to drivers/power/pmic_i2c.c
diff --git a/drivers/misc/pmic_spi.c b/drivers/power/pmic_spi.c
similarity index 100%
rename from drivers/misc/pmic_spi.c
rename to drivers/power/pmic_spi.c
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (7 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-11  7:52   ` Stefano Babic
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 10/21] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
                   ` (11 subsequent siblings)
  20 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Now it is possible to provide specific function per PMIC/power
device instance.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- New at patch v2
---
 include/power/battery.h |   38 ++++++++++++++++++++++++++++++++++++++
 include/power/pmic.h    |   23 ++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 1 deletions(-)
 create mode 100644 include/power/battery.h

diff --git a/include/power/battery.h b/include/power/battery.h
new file mode 100644
index 0000000..e2fec68
--- /dev/null
+++ b/include/power/battery.h
@@ -0,0 +1,38 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __POWER_BATTERY_H_
+#define __POWER_BATTERY_H_
+
+struct battery {
+	unsigned int version;
+	unsigned int state_of_chrg;
+	unsigned int time_to_empty;
+	unsigned int capacity;
+	unsigned int voltage_uV;
+
+	unsigned int state;
+};
+
+int power_bat_init(unsigned char bus);
+#endif /* __POWER_BATTERY_H_ */
diff --git a/include/power/pmic.h b/include/power/pmic.h
index 3583342..5ec7bae 100644
--- a/include/power/pmic.h
+++ b/include/power/pmic.h
@@ -27,8 +27,9 @@
 #include <common.h>
 #include <linux/list.h>
 #include <i2c.h>
+#include <power/power_chrg.h>
 
-enum { PMIC_I2C, PMIC_SPI, };
+enum { PMIC_I2C, PMIC_SPI, PMIC_NONE};
 enum { I2C_PMIC, I2C_NUM, };
 enum { PMIC_READ, PMIC_WRITE, };
 enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
@@ -48,6 +49,21 @@ struct p_spi {
 	u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);
 };
 
+struct pmic;
+struct power_battery {
+	struct battery *bat;
+
+	int (*fg_battery_check) (struct pmic *p, struct pmic *bat);
+	int (*fg_battery_update) (struct pmic *p, struct pmic *bat);
+
+	int (*chrg_type) (struct pmic *p);
+	int (*chrg_bat_present) (struct pmic *p);
+	int (*chrg_state) (struct pmic *p, int state, int current);
+
+	/* Keep info about power devices involved with battery operation */
+	struct pmic *chrg, *fg, *muic;
+};
+
 struct pmic {
 	const char *name;
 	unsigned char bus;
@@ -59,6 +75,11 @@ struct pmic {
 		struct p_spi spi;
 	} hw;
 
+	struct power_battery *pwr_bat;
+	int (*battery_init) (struct pmic *p, struct pmic *bat);
+	int (*battery_charge) (struct pmic *bat);
+	void (*low_power_mode) (void);
+
 	struct list_head list;
 };
 
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 10/21] pmic:battery: Support for Trats Battery at PMIC framework
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (8 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 11/21] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Trats battery is now treated in the same way as other power related
devices. This approach allows for more unified handling of all devices
responsible for power management.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- New patch at v2.
---
 drivers/power/Makefile            |    1 +
 drivers/power/battery/bat_trats.c |   79 +++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 0 deletions(-)
 create mode 100644 drivers/power/battery/bat_trats.c

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 7016d5b..74a0990 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -38,6 +38,7 @@ COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
 COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
 COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
 COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
+COBJS-$(CONFIG_POWER_BATTERY_TRATS) += battery/bat_trats.o
 
 COBJS	:= $(COBJS-y)
 SRCS 	:= $(COBJS:.o=.c)
diff --git a/drivers/power/battery/bat_trats.c b/drivers/power/battery/bat_trats.c
new file mode 100644
index 0000000..d6f01da
--- /dev/null
+++ b/drivers/power/battery/bat_trats.c
@@ -0,0 +1,79 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <power/pmic.h>
+#include <power/battery.h>
+#include <power/max8997_pmic.h>
+
+static struct battery battery_trats;
+
+static int power_battery_charge(struct pmic *bat)
+{
+	struct power_battery *p_bat = bat->pwr_bat;
+	struct battery *battery = p_bat->bat;
+	int k;
+
+	if (p_bat->chrg_state(p_bat->chrg, CHARGER_ENABLE, 450))
+		return -1;
+
+	for (k = 0; p_bat->chrg_bat_present(p_bat->chrg) &&
+		     p_bat->chrg_type(p_bat->muic) &&
+		     battery->state_of_chrg < 5; k++) {
+		udelay(10000000);
+		puts(".");
+		p_bat->fg_battery_update(p_bat->fg, bat);
+
+		if (k == 100) {
+			debug(" %d [V]", battery->voltage_uV);
+			puts("\n");
+			k = 0;
+		}
+
+	}
+
+	p_bat->chrg_state(p_bat->chrg, CHARGER_DISABLE, 0);
+
+	return 0;
+}
+
+static struct power_battery trats_bat = {
+	.bat = &battery_trats,
+};
+
+int power_bat_init(unsigned char bus)
+{
+	struct pmic *p = pmic_alloc();
+	static const char name[] = "BAT_TRATS";
+
+	debug("Board BAT init\n");
+
+	p->interface = PMIC_NONE;
+	p->name = name;
+	p->bus = bus;
+
+	p->pwr_bat = &trats_bat;
+	p->battery_charge = power_battery_charge;
+
+	return 0;
+}
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 11/21] pmic:muic: Support for MUIC built into MAX8997 device
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (9 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 10/21] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 12/21] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Support for MUIC (Micro USB Integrated Circuit) built into the MAX8997
power management device.

The MUIC device will work with redesigned PMIC framework.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>

---
Changes for v2:
- power_init_battery now available as a callback from MUIC struct pmic
  instance
---
 drivers/power/Makefile               |    1 +
 drivers/power/max8997/muic_max8997.c |   91 ++++++++++++++++++++++++++++++++++
 include/power/max8997_muic.h         |   61 +++++++++++++++++++++++
 3 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 drivers/power/max8997/muic_max8997.c
 create mode 100644 include/power/max8997_muic.h

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 74a0990..f07644c 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -39,6 +39,7 @@ COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
 COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
 COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
 COBJS-$(CONFIG_POWER_BATTERY_TRATS) += battery/bat_trats.o
+COBJS-$(CONFIG_POWER_MUIC_MAX8997) += max8997/muic_max8997.o
 
 COBJS	:= $(COBJS-y)
 SRCS 	:= $(COBJS:.o=.c)
diff --git a/drivers/power/max8997/muic_max8997.c b/drivers/power/max8997/muic_max8997.c
new file mode 100644
index 0000000..e2da067
--- /dev/null
+++ b/drivers/power/max8997/muic_max8997.c
@@ -0,0 +1,91 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <power/pmic.h>
+#include <power/power_chrg.h>
+#include <power/max8997_muic.h>
+#include <i2c.h>
+
+static int power_chrg_get_type(struct pmic *p)
+{
+	unsigned int val;
+	unsigned char charge_type, charger;
+
+	if (pmic_probe(p))
+		return CHARGER_NO;
+
+	pmic_reg_read(p, MAX8997_MUIC_STATUS2, &val);
+	charge_type = val & MAX8997_MUIC_CHG_MASK;
+
+	switch (charge_type) {
+	case MAX8997_MUIC_CHG_NO:
+		charger = CHARGER_NO;
+		break;
+	case MAX8997_MUIC_CHG_USB:
+	case MAX8997_MUIC_CHG_USB_D:
+		charger = CHARGER_USB;
+		break;
+	case MAX8997_MUIC_CHG_TA:
+	case MAX8997_MUIC_CHG_TA_1A:
+		charger = CHARGER_TA;
+		break;
+	case MAX8997_MUIC_CHG_TA_500:
+		charger = CHARGER_TA_500;
+		break;
+	default:
+		charger = CHARGER_UNKNOWN;
+		break;
+	}
+
+	return charger;
+}
+
+static int power_init_battery(struct pmic *p, struct pmic *bat)
+{
+	struct power_battery *pb = bat->pwr_bat;
+
+	pb->chrg_type = power_chrg_get_type;
+	pb->muic = p;
+
+	return 0;
+}
+
+int power_muic_init(unsigned int bus)
+{
+	struct pmic *p = pmic_alloc();
+	static const char name[] = "MAX8997_MUIC";
+
+	debug("Board Micro USB Interface Controller init\n");
+
+	p->name = name;
+	p->interface = PMIC_I2C;
+	p->number_of_regs = MUIC_NUM_OF_REGS;
+	p->hw.i2c.addr = MAX8997_MUIC_I2C_ADDR;
+	p->hw.i2c.tx_num = 1;
+	p->bus = bus;
+
+	p->battery_init = power_init_battery;
+
+	return 0;
+}
diff --git a/include/power/max8997_muic.h b/include/power/max8997_muic.h
new file mode 100644
index 0000000..0149c12
--- /dev/null
+++ b/include/power/max8997_muic.h
@@ -0,0 +1,61 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __MAX8997_MUIC_H_
+#define __MAX8997_MUIC_H_
+
+#include <power/power_chrg.h>
+
+/* MAX8997_MUIC_STATUS2 */
+#define MAX8997_MUIC_CHG_NO	0x00
+#define MAX8997_MUIC_CHG_USB	0x01
+#define MAX8997_MUIC_CHG_USB_D	0x02
+#define MAX8997_MUIC_CHG_TA	0x03
+#define MAX8997_MUIC_CHG_TA_500 0x04
+#define MAX8997_MUIC_CHG_TA_1A	0x05
+#define MAX8997_MUIC_CHG_MASK	0x07
+
+/* MAX 8997 MUIC registers */
+enum {
+	MAX8997_MUIC_ID         = 0x00,
+	MAX8997_MUIC_INT1	= 0x01,
+	MAX8997_MUIC_INT2	= 0x02,
+	MAX8997_MUIC_INT3	= 0x03,
+	MAX8997_MUIC_STATUS1	= 0x04,
+	MAX8997_MUIC_STATUS2	= 0x05,
+	MAX8997_MUIC_STATUS3	= 0x06,
+	MAX8997_MUIC_INTMASK1	= 0x07,
+	MAX8997_MUIC_INTMASK2	= 0x08,
+	MAX8997_MUIC_INTMASK3	= 0x09,
+	MAX8997_MUIC_CDETCTRL	= 0x0A,
+	MAX8997_MUIC_CONTROL1	= 0x0C,
+	MAX8997_MUIC_CONTROL2	= 0x0D,
+	MAX8997_MUIC_CONTROL3	= 0x0E,
+
+	MUIC_NUM_OF_REGS = 0x0F,
+};
+
+#define MAX8997_MUIC_I2C_ADDR	(0x4A >> 1)
+
+int power_muic_init(unsigned int bus);
+#endif /* __MAX8997_MUIC_H_ */
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 12/21] pmic:fuel-gauge: Support for MAX17042 fuel-gauge
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (10 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 11/21] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 13/21] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Support for MAX17042 fuel-gauge (FG), which is built into the MAX8997
power management device.
Special file - fg_battery_cell_params.h with cells characteristics
added.

The FG device will work with redesigned PMIC framework.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>

---
Changes for v2:
- File moved to separate directory at ./drivers/power
- {check|update}_battery available as callbacks from struct power_battery
---
 drivers/power/Makefile                 |    1 +
 drivers/power/max17042/fg_max17042.c   |  251 ++++++++++++++++++++++++++++++++
 include/power/fg_battery_cell_params.h |   90 ++++++++++++
 include/power/max17042_fg.h            |   74 ++++++++++
 4 files changed, 416 insertions(+), 0 deletions(-)
 create mode 100644 drivers/power/max17042/fg_max17042.c
 create mode 100644 include/power/fg_battery_cell_params.h
 create mode 100644 include/power/max17042_fg.h

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index f07644c..46989ad 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -40,6 +40,7 @@ COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
 COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
 COBJS-$(CONFIG_POWER_BATTERY_TRATS) += battery/bat_trats.o
 COBJS-$(CONFIG_POWER_MUIC_MAX8997) += max8997/muic_max8997.o
+COBJS-$(CONFIG_POWER_FG_MAX17042) += max17042/fg_max17042.o
 
 COBJS	:= $(COBJS-y)
 SRCS 	:= $(COBJS:.o=.c)
diff --git a/drivers/power/max17042/fg_max17042.c b/drivers/power/max17042/fg_max17042.c
new file mode 100644
index 0000000..8b2e36a
--- /dev/null
+++ b/drivers/power/max17042/fg_max17042.c
@@ -0,0 +1,251 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <power/pmic.h>
+#include <power/max17042_fg.h>
+#include <i2c.h>
+#include <power/max8997_pmic.h>
+#include <power/power_chrg.h>
+#include <power/battery.h>
+#include <power/fg_battery_cell_params.h>
+
+static int fg_write_regs(struct pmic *p, u8 addr, u16 *data, int num)
+{
+	int ret = 0;
+	int i;
+
+	for (i = 0; i < num; i++, addr++)
+		ret |= pmic_reg_write(p, addr, *(data + i));
+
+	return ret;
+}
+
+static int fg_read_regs(struct pmic *p, u8 addr, u16 *data, int num)
+{
+	int ret = 0;
+	int i;
+
+	for (i = 0; i < num; i++, addr++)
+		ret |= pmic_reg_read(p, addr, (u32 *) (data + i));
+
+	return ret;
+}
+
+static int fg_write_and_verify(struct pmic *p, u8 addr, u16 data)
+{
+	unsigned int val = data;
+	int ret = 0;
+
+	ret |= pmic_reg_write(p, addr, val);
+	ret |= pmic_reg_read(p, addr, &val);
+
+	if (ret)
+		return ret;
+
+	if (((u16) val) == data)
+		return 0;
+
+	return -1;
+}
+
+static void por_fuelgauge_init(struct pmic *p)
+{
+	u16 r_data0[16], r_data1[16], r_data2[16];
+	u32 rewrite_count = 5, i = 0;
+	unsigned int val;
+	int ret = 0;
+
+	/* Delay 500 ms */
+	mdelay(500);
+	/* Initilize Configuration */
+	pmic_reg_write(p, MAX17042_CONFIG, 0x2310);
+
+rewrite_model:
+	/* Unlock Model Access */
+	pmic_reg_write(p, MAX17042_MLOCKReg1, MODEL_UNLOCK1);
+	pmic_reg_write(p, MAX17042_MLOCKReg2, MODEL_UNLOCK2);
+
+	/* Write/Read/Verify the Custom Model */
+	ret |= fg_write_regs(p, MAX17042_MODEL1, cell_character0,
+			     ARRAY_SIZE(cell_character0));
+	ret |= fg_write_regs(p, MAX17042_MODEL2, cell_character1,
+			     ARRAY_SIZE(cell_character1));
+	ret |= fg_write_regs(p, MAX17042_MODEL3, cell_character2,
+			     ARRAY_SIZE(cell_character2));
+
+	if (ret) {
+		printf("%s: Cell parameters write failed!\n", __func__);
+		return;
+	}
+
+	ret |= fg_read_regs(p, MAX17042_MODEL1, r_data0, ARRAY_SIZE(r_data0));
+	ret |= fg_read_regs(p, MAX17042_MODEL2, r_data1, ARRAY_SIZE(r_data1));
+	ret |= fg_read_regs(p, MAX17042_MODEL3, r_data2, ARRAY_SIZE(r_data2));
+
+	if (ret)
+		printf("%s: Cell parameters read failed!\n", __func__);
+
+	for (i = 0; i < 16; i++) {
+		if ((cell_character0[i] != r_data0[i])
+		    || (cell_character1[i] != r_data1[i])
+		    || (cell_character2[i] != r_data2[i]))
+			goto rewrite_model;
+		}
+
+	/* Lock model access */
+	pmic_reg_write(p, MAX17042_MLOCKReg1, MODEL_LOCK1);
+	pmic_reg_write(p, MAX17042_MLOCKReg2, MODEL_LOCK2);
+
+	/* Verify the model access is locked */
+	ret |= fg_read_regs(p, MAX17042_MODEL1, r_data0, ARRAY_SIZE(r_data0));
+	ret |= fg_read_regs(p, MAX17042_MODEL2, r_data1, ARRAY_SIZE(r_data1));
+	ret |= fg_read_regs(p, MAX17042_MODEL3, r_data2, ARRAY_SIZE(r_data2));
+
+	if (ret) {
+		printf("%s: Cell parameters read failed!\n", __func__);
+		return;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(r_data0); i++) {
+		/* Check if model locked */
+		if (r_data0[i] || r_data1[i] || r_data2[i]) {
+			/* Rewrite model data - prevent from endless loop */
+			if (rewrite_count--) {
+				puts("FG - Lock model access failed!\n");
+				goto rewrite_model;
+			}
+		}
+	}
+
+	/* Write Custom Parameters */
+	fg_write_and_verify(p, MAX17042_RCOMP0, RCOMP0);
+	fg_write_and_verify(p, MAX17042_TEMPCO, TempCo);
+
+	/* Delay at least 350mS */
+	mdelay(350);
+
+	/* Initialization Complete */
+	pmic_reg_read(p, MAX17042_STATUS, &val);
+	/* Write and Verify Status with POR bit Cleared */
+	fg_write_and_verify(p, MAX17042_STATUS, val & ~MAX17042_POR);
+
+	/* Delay@least 350 ms */
+	mdelay(350);
+}
+
+static int power_update_battery(struct pmic *p, struct pmic *bat)
+{
+	struct power_battery *pb = bat->pwr_bat;
+	unsigned int val;
+	int ret = 0;
+
+	if (pmic_probe(p)) {
+		puts("Can't find max17042 fuel gauge\n");
+		return -1;
+	}
+
+	ret |= pmic_reg_read(p, MAX17042_VFSOC, &val);
+	pb->bat->state_of_chrg = (val >> 8);
+
+	pmic_reg_read(p, MAX17042_VCELL, &val);
+	debug("vfsoc: 0x%x\n", val);
+	pb->bat->voltage_uV = ((val & 0xFFUL) >> 3) + ((val & 0xFF00) >> 3);
+	pb->bat->voltage_uV = (pb->bat->voltage_uV * 625);
+
+	pmic_reg_read(p, 0x05, &val);
+	pb->bat->capacity = val >> 2;
+
+	return ret;
+}
+
+static int power_check_battery(struct pmic *p, struct pmic *bat)
+{
+	struct power_battery *pb = bat->pwr_bat;
+	unsigned int val;
+	int ret = 0;
+
+	if (pmic_probe(p)) {
+		puts("Can't find max17042 fuel gauge\n");
+		return -1;
+	}
+
+	ret |= pmic_reg_read(p, MAX17042_STATUS, &val);
+	debug("fg status: 0x%x\n", val);
+
+	if (val == MAX17042_POR)
+		por_fuelgauge_init(p);
+
+	ret |= pmic_reg_read(p, MAX17042_VERSION, &val);
+	pb->bat->version = val;
+
+	power_update_battery(p, bat);
+	debug("fg ver: 0x%x\n", pb->bat->version);
+	printf("BAT: state_of_charge(SOC):%d%%\n",
+	       pb->bat->state_of_chrg);
+
+	printf("     voltage: %d.%6.6d [V] (expected to be %d [mAh])\n",
+	       pb->bat->voltage_uV / 1000000,
+	       pb->bat->voltage_uV % 1000000,
+	       pb->bat->capacity);
+
+	if (pb->bat->voltage_uV > 3850000)
+		pb->bat->state = EXT_SOURCE;
+	else if (pb->bat->voltage_uV < 3600000 || pb->bat->state_of_chrg < 5)
+		pb->bat->state = CHARGE;
+	else
+		pb->bat->state = NORMAL;
+
+	return ret;
+}
+
+static int power_init_battery(struct pmic *p, struct pmic *bat)
+{
+	struct power_battery *pb = bat->pwr_bat;
+
+	pb->fg_battery_check = power_check_battery;
+	pb->fg_battery_update = power_update_battery;
+	pb->fg = p;
+
+	return 0;
+}
+
+int power_fg_init(unsigned char bus)
+{
+	struct pmic *p = pmic_alloc();
+	static const char name[] = "MAX17042_FG";
+
+	debug("Board Fuel Gauge init\n");
+
+	p->name = name;
+	p->interface = PMIC_I2C;
+	p->number_of_regs = FG_NUM_OF_REGS;
+	p->hw.i2c.addr = MAX17042_I2C_ADDR;
+	p->hw.i2c.tx_num = 2;
+	p->byte_order = PMIC_BYTE_ORDER_NORMAL;
+	p->bus = bus;
+
+	p->battery_init = power_init_battery;
+
+	return 0;
+}
diff --git a/include/power/fg_battery_cell_params.h b/include/power/fg_battery_cell_params.h
new file mode 100644
index 0000000..7ddf6f2
--- /dev/null
+++ b/include/power/fg_battery_cell_params.h
@@ -0,0 +1,90 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __FG_BATTERY_CELL_PARAMS_H_
+#define __FG_BATTERY_CELL_PARAMS_H_
+
+#if  defined(CONFIG_POWER_FG_MAX17042) && defined(CONFIG_TRATS)
+
+/* Cell characteristics - Exynos4 TRATS development board */
+/* Shall be written to addr 0x80h */
+u16 cell_character0[16] = {
+	0xA2A0,
+	0xB6E0,
+	0xB850,
+	0xBAD0,
+	0xBB20,
+	0xBB70,
+	0xBBC0,
+	0xBC20,
+	0xBC80,
+	0xBCE0,
+	0xBD80,
+	0xBE20,
+	0xC090,
+	0xC420,
+	0xC910,
+	0xD070
+};
+
+/* Shall be written to addr 0x90h */
+u16 cell_character1[16] = {
+	0x0090,
+	0x1A50,
+	0x02F0,
+	0x2060,
+	0x2060,
+	0x2E60,
+	0x26A0,
+	0x2DB0,
+	0x2DB0,
+	0x1870,
+	0x2A20,
+	0x16F0,
+	0x08F0,
+	0x0D40,
+	0x08C0,
+	0x08C0
+};
+
+/* Shall be written to addr 0xA0h */
+u16 cell_character2[16] = {
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100,
+	0x0100
+};
+#endif
+#endif /* __FG_BATTERY_CELL_PARAMS_H_ */
diff --git a/include/power/max17042_fg.h b/include/power/max17042_fg.h
new file mode 100644
index 0000000..1103a48
--- /dev/null
+++ b/include/power/max17042_fg.h
@@ -0,0 +1,74 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __MAX17042_FG_H_
+#define __MAX17042_FG_H_
+
+/* MAX 17042 registers */
+enum {
+	MAX17042_STATUS         = 0x00,
+	MAX17042_SOCREP         = 0x06,
+	MAX17042_VCELL          = 0x09,
+	MAX17042_CURRENT        = 0x0A,
+	MAX17042_AVG_CURRENT	= 0x0B,
+	MAX17042_SOCMIX	= 0x0D,
+	MAX17042_SOCAV		= 0x0E,
+	MAX17042_DESIGN_CAP	= 0x18,
+	MAX17042_AVG_VCELL	= 0x19,
+	MAX17042_CONFIG	= 0x1D,
+	MAX17042_VERSION	= 0x21,
+	MAX17042_LEARNCFG       = 0x28,
+	MAX17042_FILTERCFG	= 0x29,
+	MAX17042_RELAXCFG	= 0x2A,
+	MAX17042_MISCCFG	= 0x2B,
+	MAX17042_CGAIN		= 0x2E,
+	MAX17042_COFF		= 0x2F,
+	MAX17042_RCOMP0	= 0x38,
+	MAX17042_TEMPCO	= 0x39,
+	MAX17042_FSTAT		= 0x3D,
+	MAX17042_MLOCKReg1	= 0x62,
+	MAX17042_MLOCKReg2	= 0x63,
+	MAX17042_MODEL1         = 0x80,
+	MAX17042_MODEL2         = 0x90,
+	MAX17042_MODEL3         = 0xA0,
+	MAX17042_VFOCV		= 0xFB,
+	MAX17042_VFSOC		= 0xFF,
+
+	FG_NUM_OF_REGS = 0x100,
+};
+
+#define RCOMP0			0x0060
+#define TempCo			0x1015
+
+
+#define MAX17042_POR (1 << 1)
+
+#define MODEL_UNLOCK1		0x0059
+#define MODEL_UNLOCK2		0x00c4
+#define MODEL_LOCK1		0x0000
+#define MODEL_LOCK2		0x0000
+
+#define MAX17042_I2C_ADDR	(0x6C >> 1)
+
+int power_fg_init(unsigned char bus);
+#endif /* __MAX17042_FG_H_ */
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 13/21] pmic:max8997: Function for calculating LDO internal register value
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (11 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 12/21] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 14/21] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Function for calculating LDO internal register value from passed micro
Volt.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- MAX8997_LDO_MAX_VAL defined
---
 drivers/power/max8997/pmic_max8997.c |   16 ++++++++++++++++
 include/power/max8997_pmic.h         |    2 ++
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/drivers/power/max8997/pmic_max8997.c b/drivers/power/max8997/pmic_max8997.c
index 4e8283a..47ef7f6 100644
--- a/drivers/power/max8997/pmic_max8997.c
+++ b/drivers/power/max8997/pmic_max8997.c
@@ -26,6 +26,22 @@
 #include <power/max8997_pmic.h>
 #include <i2c.h>
 
+unsigned char max8997_reg_ldo(int uV)
+{
+	unsigned char ret;
+	if (uV <= 800000)
+		return 0;
+	if (uV >= 3950000)
+		return MAX8997_LDO_MAX_VAL;
+	ret = (uV - 800000) / 50000;
+	if (ret > MAX8997_LDO_MAX_VAL) {
+		printf("MAX8997 LDO SETTING ERROR (%duV) -> %u\n", uV, ret);
+		ret = MAX8997_LDO_MAX_VAL;
+	}
+
+	return ret;
+}
+
 int pmic_init(unsigned char bus)
 {
 	struct pmic *p = pmic_alloc();
diff --git a/include/power/max8997_pmic.h b/include/power/max8997_pmic.h
index 1db7deb..03cac04 100644
--- a/include/power/max8997_pmic.h
+++ b/include/power/max8997_pmic.h
@@ -200,4 +200,6 @@ enum {
 	EN_LDO = (0x3 << 6),
 };
 
+#define MAX8997_LDO_MAX_VAL 0x3F
+unsigned char max8997_reg_ldo(int uV);
 #endif /* __MAX8997_PMIC_H_ */
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 14/21] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (12 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 13/21] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 15/21] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Default PMIC (MAX8997) initialization for Samsung's TRATS development board.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>

---
Changes for v2:
- None
---
 board/samsung/trats/trats.c  |  150 ++++++++++++++++++++++++++++++++++++++++++
 include/power/max8997_pmic.h |    9 +++
 2 files changed, 159 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 0285668..bb83b94 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -86,6 +86,155 @@ void i2c_init_board(void)
 	s5p_gpio_direction_output(&gpio2->y4, 1, 1);
 }
 
+static int pmic_init_max8997(void)
+{
+	struct pmic *p = pmic_get("MAX8997_PMIC");
+	int i = 0, ret = 0;
+	u32 val;
+
+	if (pmic_probe(p))
+		return -1;
+
+	/* BUCK1 VARM: 1.2V */
+	val = (1200000 - 650000) / 25000;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK1DVS1, val);
+	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK1CTRL, val);
+
+	/* BUCK2 VINT: 1.1V */
+	val = (1100000 - 650000) / 25000;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK2DVS1, val);
+	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK2CTRL, val);
+
+
+	/* BUCK3 G3D: 1.1V - OFF */
+	ret |= pmic_reg_read(p, MAX8997_REG_BUCK3CTRL, &val);
+	val &= ~ENBUCK;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK3CTRL, val);
+
+	val = (1100000 - 750000) / 50000;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK3DVS, val);
+
+	/* BUCK4 CAMISP: 1.2V - OFF */
+	ret |= pmic_reg_read(p, MAX8997_REG_BUCK4CTRL, &val);
+	val &= ~ENBUCK;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK4CTRL, val);
+
+	val = (1200000 - 650000) / 25000;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK4DVS, val);
+
+	/* BUCK5 VMEM: 1.2V */
+	val = (1200000 - 650000) / 25000;
+	for (i = 0; i < 8; i++)
+		ret |= pmic_reg_write(p, MAX8997_REG_BUCK5DVS1 + i, val);
+
+	val = ENBUCK | ACTIVE_DISCHARGE;		/* DVS OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK5CTRL, val);
+
+	/* BUCK6 CAM AF: 2.8V */
+	/* No Voltage Setting Register */
+	/* GNSLCT 3.0X */
+	val = GNSLCT;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK6CTRL, val);
+
+	/* BUCK7 VCC_SUB: 2.0V */
+	val = (2000000 - 750000) / 50000;
+	ret |= pmic_reg_write(p, MAX8997_REG_BUCK7DVS, val);
+
+	/* LDO1 VADC: 3.3V */
+	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO1CTRL, val);
+
+	/* LDO1 Disable active discharging */
+	ret |= pmic_reg_read(p, MAX8997_REG_LDO1CONFIG, &val);
+	val &= ~LDO_ADE;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO1CONFIG, val);
+
+	/* LDO2 VALIVE: 1.1V */
+	val = max8997_reg_ldo(1100000) | EN_LDO;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO2CTRL, val);
+
+	/* LDO3 VUSB/MIPI: 1.1V */
+	val = max8997_reg_ldo(1100000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, val);
+
+	/* LDO4 VMIPI: 1.8V */
+	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO4CTRL, val);
+
+	/* LDO5 VHSIC: 1.2V */
+	val = max8997_reg_ldo(1200000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO5CTRL, val);
+
+	/* LDO6 VCC_1.8V_PDA: 1.8V */
+	val = max8997_reg_ldo(1800000) | EN_LDO;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO6CTRL, val);
+
+	/* LDO7 CAM_ISP: 1.8V */
+	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO7CTRL, val);
+
+	/* LDO8 VDAC/VUSB: 3.3V */
+	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, val);
+
+	/* LDO9 VCC_2.8V_PDA: 2.8V */
+	val = max8997_reg_ldo(2800000) | EN_LDO;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO9CTRL, val);
+
+	/* LDO10 VPLL: 1.1V */
+	val = max8997_reg_ldo(1100000) | EN_LDO;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO10CTRL, val);
+
+	/* LDO11 TOUCH: 2.8V */
+	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO11CTRL, val);
+
+	/* LDO12 VTCAM: 1.8V */
+	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO12CTRL, val);
+
+	/* LDO13 VCC_3.0_LCD: 3.0V */
+	val = max8997_reg_ldo(3000000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO13CTRL, val);
+
+	/* LDO14 MOTOR: 3.0V */
+	val = max8997_reg_ldo(3000000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO14CTRL, val);
+
+	/* LDO15 LED_A: 2.8V */
+	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO15CTRL, val);
+
+	/* LDO16 CAM_SENSOR: 1.8V */
+	val = max8997_reg_ldo(1800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO16CTRL, val);
+
+	/* LDO17 VTF: 2.8V */
+	val = max8997_reg_ldo(2800000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO17CTRL, val);
+
+	/* LDO18 TOUCH_LED 3.3V */
+	val = max8997_reg_ldo(3300000) | DIS_LDO;	/* OFF */
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO18CTRL, val);
+
+	/* LDO21 VDDQ: 1.2V */
+	val = max8997_reg_ldo(1200000) | EN_LDO;
+	ret |= pmic_reg_write(p, MAX8997_REG_LDO21CTRL, val);
+
+	/* SAFEOUT for both 1 and 2: 4.9V, Active discharge, Enable */
+	val = (SAFEOUT_4_90V << 0) | (SAFEOUT_4_90V << 2) |
+		ACTDISSAFEO1 | ACTDISSAFEO2 | ENSAFEOUT1 | ENSAFEOUT2;
+	ret |= pmic_reg_write(p, MAX8997_REG_SAFEOUTCTRL, val);
+
+	if (ret) {
+		puts("MAX8997 PMIC setting error!\n");
+		return -1;
+	}
+	return 0;
+}
+
 #ifdef CONFIG_POWER_INIT
 int power_board_init(void)
 {
@@ -93,6 +242,7 @@ int power_board_init(void)
 #ifdef CONFIG_PMIC
 	pmic_init(I2C_5);
 #endif
+	pmic_init_max8997();
 	return 0;
 }
 #endif
diff --git a/include/power/max8997_pmic.h b/include/power/max8997_pmic.h
index 03cac04..5d2d94d 100644
--- a/include/power/max8997_pmic.h
+++ b/include/power/max8997_pmic.h
@@ -176,6 +176,15 @@ enum {
 #define ENSAFEOUT1 (1 << 6)
 #define ENSAFEOUT2 (1 << 7)
 
+#define ENBUCK (1 << 0)
+#define ACTIVE_DISCHARGE (1 << 3)
+#define GNSLCT (1 << 2)
+#define LDO_ADE (1 << 1)
+#define SAFEOUT_4_85V 0x00
+#define SAFEOUT_4_90V 0x01
+#define SAFEOUT_4_95V 0x02
+#define SAFEOUT_3_30V 0x03
+
 /* Charger */
 enum {CHARGER_ENABLE, CHARGER_DISABLE};
 #define DETBAT                  (1 << 2)
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 15/21] arm:trats:pmic: Enable MUIC (MAX8997) at Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (13 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 14/21] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 16/21] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

MUIC IC built into the MAX8997 device is enabled at TRATS.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- None
---
 board/samsung/trats/trats.c |    2 ++
 include/configs/trats.h     |    2 ++
 2 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index bb83b94..c729fb8 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -38,6 +38,7 @@
 #include <usb/s3c_udc.h>
 #include <power/max8997_pmic.h>
 #include <libtizen.h>
+#include <power/max8997_muic.h>
 
 #include "setup.h"
 
@@ -243,6 +244,7 @@ int power_board_init(void)
 	pmic_init(I2C_5);
 #endif
 	pmic_init_max8997();
+	power_muic_init(I2C_5);
 	return 0;
 }
 #endif
diff --git a/include/configs/trats.h b/include/configs/trats.h
index 37a655a..faaf27b 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -240,6 +240,8 @@
 #define CONFIG_PMIC_I2C
 #define CONFIG_PMIC_MAX8997
 
+#define CONFIG_POWER_MUIC
+#define CONFIG_POWER_MUIC_MAX8997
 #define CONFIG_USB_GADGET
 #define CONFIG_USB_GADGET_S3C_UDC_OTG
 #define CONFIG_USB_GADGET_DUALSPEED
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 16/21] arm:trats:pmic: Enable fuel-gauge (MAX17042) at Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (14 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 15/21] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 17/21] arm:trats:pmic: Enable battery support " Lukasz Majewski
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

FG IC built into the MAX8997 device (compliant to MAX17042) is enabled
at TRATS.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- None
---
 board/samsung/trats/trats.c |    2 ++
 include/configs/trats.h     |    2 ++
 2 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index c729fb8..6462b30 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -39,6 +39,7 @@
 #include <power/max8997_pmic.h>
 #include <libtizen.h>
 #include <power/max8997_muic.h>
+#include <power/max17042_fg.h>
 
 #include "setup.h"
 
@@ -244,6 +245,7 @@ int power_board_init(void)
 	pmic_init(I2C_5);
 #endif
 	pmic_init_max8997();
+	power_fg_init(I2C_9);
 	power_muic_init(I2C_5);
 	return 0;
 }
diff --git a/include/configs/trats.h b/include/configs/trats.h
index faaf27b..c33dd66 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -240,6 +240,8 @@
 #define CONFIG_PMIC_I2C
 #define CONFIG_PMIC_MAX8997
 
+#define CONFIG_POWER_FG
+#define CONFIG_POWER_FG_MAX17042
 #define CONFIG_POWER_MUIC
 #define CONFIG_POWER_MUIC_MAX8997
 #define CONFIG_USB_GADGET
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 17/21] arm:trats:pmic: Enable battery support at Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (15 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 16/21] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 18/21] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Support for TRATS battery has been added. It is treated as a "normal"
power related device and thereof controlled by pmic/power subsystem.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- New patch for v2.
---
 board/samsung/trats/trats.c |    2 ++
 include/configs/trats.h     |    2 ++
 2 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 6462b30..d976940 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -39,6 +39,7 @@
 #include <power/max8997_pmic.h>
 #include <libtizen.h>
 #include <power/max8997_muic.h>
+#include <power/battery.h>
 #include <power/max17042_fg.h>
 
 #include "setup.h"
@@ -247,6 +248,7 @@ int power_board_init(void)
 	pmic_init_max8997();
 	power_fg_init(I2C_9);
 	power_muic_init(I2C_5);
+	power_bat_init(0);
 	return 0;
 }
 #endif
diff --git a/include/configs/trats.h b/include/configs/trats.h
index c33dd66..cb140de 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -244,6 +244,8 @@
 #define CONFIG_POWER_FG_MAX17042
 #define CONFIG_POWER_MUIC
 #define CONFIG_POWER_MUIC_MAX8997
+#define CONFIG_POWER_BATTERY
+#define CONFIG_POWER_BATTERY_TRATS
 #define CONFIG_USB_GADGET
 #define CONFIG_USB_GADGET_S3C_UDC_OTG
 #define CONFIG_USB_GADGET_DUALSPEED
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 18/21] pmic:max8997: Support for MAX8997 internal charger control
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (16 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 17/21] arm:trats:pmic: Enable battery support " Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 19/21] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Support for MAX8997 built-in charger.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- power_init_battery() method added to be called from MAX8997 struct pmic
  instance
---
 drivers/power/max8997/pmic_max8997.c |   66 +++++++++++++++++++++++++++++++++-
 1 files changed, 65 insertions(+), 1 deletions(-)

diff --git a/drivers/power/max8997/pmic_max8997.c b/drivers/power/max8997/pmic_max8997.c
index 47ef7f6..08c2284 100644
--- a/drivers/power/max8997/pmic_max8997.c
+++ b/drivers/power/max8997/pmic_max8997.c
@@ -42,12 +42,74 @@ unsigned char max8997_reg_ldo(int uV)
 	return ret;
 }
 
+static int pmic_charger_state(struct pmic *p, int state, int current)
+{
+	unsigned char fc;
+	u32 val = 0;
+
+	if (pmic_probe(p))
+		return -1;
+
+	if (state == CHARGER_DISABLE) {
+		puts("Disable the charger.\n");
+		pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val);
+		val &= ~(MBCHOSTEN | VCHGR_FC);
+		pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val);
+
+		return -1;
+	}
+
+	if (current < CHARGER_MIN_CURRENT || current > CHARGER_MAX_CURRENT) {
+		printf("%s: Wrong charge current: %d [mA]\n",
+		       __func__, current);
+		return -1;
+	}
+
+	fc = (current - CHARGER_MIN_CURRENT) / CHARGER_CURRENT_RESOLUTION;
+	fc = fc & 0xf; /* up to 950 mA */
+
+	printf("Enable the charger @ %d [mA]\n", fc * CHARGER_CURRENT_RESOLUTION
+	       + CHARGER_MIN_CURRENT);
+
+	val = fc | MBCICHFCSET;
+	pmic_reg_write(p, MAX8997_REG_MBCCTRL4, val);
+
+	pmic_reg_read(p, MAX8997_REG_MBCCTRL2, &val);
+	val = MBCHOSTEN | VCHGR_FC; /* enable charger & fast charge */
+	pmic_reg_write(p, MAX8997_REG_MBCCTRL2, val);
+
+	return 0;
+}
+
+static int pmic_charger_bat_present(struct pmic *p)
+{
+	u32 val;
+
+	if (pmic_probe(p))
+		return -1;
+
+	pmic_reg_read(p, MAX8997_REG_STATUS4, &val);
+
+	return !(val & DETBAT);
+}
+
+static int power_init_battery(struct pmic *p, struct pmic *bat)
+{
+	struct power_battery *pb = bat->pwr_bat;
+
+	pb->chrg_bat_present = pmic_charger_bat_present;
+	pb->chrg_state = pmic_charger_state;
+	pb->chrg = p;
+
+	return 0;
+}
+
 int pmic_init(unsigned char bus)
 {
 	struct pmic *p = pmic_alloc();
 	static const char name[] = "MAX8997_PMIC";
 
-	puts("Board PMIC init\n");
+	debug("Board PMIC init\n");
 
 	p->name = name;
 	p->interface = PMIC_I2C;
@@ -56,5 +118,7 @@ int pmic_init(unsigned char bus)
 	p->hw.i2c.tx_num = 1;
 	p->bus = bus;
 
+	p->battery_init = power_init_battery;
+
 	return 0;
 }
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 19/21] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (17 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 18/21] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 20/21] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 21/21] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

When charging battery is necessary, the development board needs to
be turned into low power mode for better efficiency.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- None
---
 board/samsung/trats/trats.c |   41 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index d976940..f6a62d0 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -89,6 +89,47 @@ void i2c_init_board(void)
 	s5p_gpio_direction_output(&gpio2->y4, 1, 1);
 }
 
+static void trats_low_power_mode(void)
+{
+	struct exynos4_clock *clk =
+	    (struct exynos4_clock *)samsung_get_base_clock();
+	struct exynos4_power *pwr =
+	    (struct exynos4_power *)samsung_get_base_power();
+
+	/* Power down CORE1 */
+	writel(0x0, &pwr->arm_core1_configuration);
+
+	/* Change the APLL frequency */
+	writel(0xa0c80604, &clk->apll_con0);
+	/* Change CPU0 clock divider */
+	writel(0x00000100, &clk->div_cpu0);
+	/* CLK_DIV_STAT_CPU0 - wait until clock gets stable */
+	while (readl(&clk->div_stat_cpu0) & 0x1111111)
+		;
+
+	/* Change clock divider ratio for DMC */
+	writel(0x13113117, &clk->div_dmc0);
+	while (readl(&clk->div_stat_dmc0) & 0x11111111)
+		;
+
+	/* Turn off unnecessary power domains */
+	writel(0x0, &pwr->xxti_configuration);	/* XXTI */
+	writel(0x0, &pwr->cam_configuration);	/* CAM */
+	writel(0x0, &pwr->tv_configuration);    /* TV */
+	writel(0x0, &pwr->mfc_configuration);   /* MFC */
+	writel(0x0, &pwr->g3d_configuration);   /* G3D */
+	writel(0x0, &pwr->gps_configuration);   /* GPS */
+	writel(0x0, &pwr->gps_alive_configuration);	/* GPS_ALIVE */
+
+	/* Turn off unnecessary clocks */
+	writel(0x0, &clk->gate_ip_cam);	/* CAM */
+	writel(0x0, &clk->gate_ip_tv);          /* TV */
+	writel(0x0, &clk->gate_ip_mfc);	/* MFC */
+	writel(0x0, &clk->gate_ip_g3d);	/* G3D */
+	writel(0x0, &clk->gate_ip_image);	/* IMAGE */
+	writel(0x0, &clk->gate_ip_gps);	/* GPS */
+}
+
 static int pmic_init_max8997(void)
 {
 	struct pmic *p = pmic_get("MAX8997_PMIC");
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 20/21] arm:trats:pmic: Support for charging battery at Samsung's TRATS board
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (18 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 19/21] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 21/21] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

The battery connected to Samsung's Trats development board is now
charged when voltage drops below threshold.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- Define separate *p_{} pointer instances for each power device available
  at Trats
- Only basic checks performed
- Core responsible for battery charging moved to separate file -
  ./drivers/power/bat_trats.c
---
 board/samsung/trats/trats.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index f6a62d0..cda5af7 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -282,6 +282,9 @@ static int pmic_init_max8997(void)
 #ifdef CONFIG_POWER_INIT
 int power_board_init(void)
 {
+	int chrg;
+	struct power_battery *pb;
+	struct pmic *p_fg, *p_chrg, *p_muic, *p_bat;
 
 #ifdef CONFIG_PMIC
 	pmic_init(I2C_5);
@@ -290,6 +293,30 @@ int power_board_init(void)
 	power_fg_init(I2C_9);
 	power_muic_init(I2C_5);
 	power_bat_init(0);
+	p_fg = pmic_get("MAX17042_FG");
+	p_chrg = pmic_get("MAX8997_PMIC");
+	p_muic = pmic_get("MAX8997_MUIC");
+	p_bat = pmic_get("BAT_TRATS");
+
+	p_fg->battery_init(p_fg, p_bat);
+	p_chrg->battery_init(p_chrg, p_bat);
+	p_muic->battery_init(p_muic, p_bat);
+
+	p_bat->low_power_mode = trats_low_power_mode;
+	pb = p_bat->pwr_bat;
+	chrg = pb->chrg_type(pb->muic);
+	debug("CHARGER TYPE: %d\n", chrg);
+
+	if (!pb->chrg_bat_present(pb->chrg)) {
+		puts("No battery detected\n");
+		return -1;
+	}
+
+	pb->fg_battery_check(pb->fg, p_bat);
+
+	if (pb->bat->state == CHARGE && chrg == CHARGER_USB)
+		puts("CHARGE Battery !\n");
+
 	return 0;
 }
 #endif
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 21/21] pmic: Extend PMIC framework to support battery related commands
  2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (19 preceding siblings ...)
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 20/21] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
@ 2012-10-05  8:16 ` Lukasz Majewski
  20 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-05  8:16 UTC (permalink / raw)
  To: u-boot

Two extra commands:
"pmic name bat state" and "pmic name bat charge" has been added to
pmic framework. Those provides state display and charge capabilities
to named batteries.

The pmic_core.c file has been refactored to more consistent name scheme.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Stefano Babic <sbabic@denx.de>
---
Changes for v2:
- New patch to v2.
---
 drivers/power/pmic_core.c |   51 ++++++++++++++++++++++++++++++++++++--------
 1 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/drivers/power/pmic_core.c b/drivers/power/pmic_core.c
index 2908f66..85a00b5 100644
--- a/drivers/power/pmic_core.c
+++ b/drivers/power/pmic_core.c
@@ -124,35 +124,46 @@ struct pmic *pmic_get(const char *s)
 	return NULL;
 }
 
+const char *power_get_interface(int interface)
+{
+	const char *power_interface[] = {"I2C", "SPI", "|+|-|"};
+	return power_interface[interface];
+}
+
 static void pmic_list_names(void)
 {
 	struct pmic *p;
 
 	puts("PMIC devices:\n");
 	list_for_each_entry(p, &pmic_list, list) {
-		printf("name: %s\n", p->name);
+		printf("name: %s bus: %s_%d\n", p->name,
+		       power_get_interface(p->interface), p->bus);
 	}
 }
 
 int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	u32 ret, reg, val;
+	char *cmd, *name;
 	struct pmic *p;
-	char *cmd;
 
 	/* at least two arguments please */
 	if (argc < 2)
 		return CMD_RET_USAGE;
 
-	cmd = argv[1];
-
-	if (strcmp(cmd, "list") == 0) {
+	if (strcmp(argv[1], "list") == 0) {
 		pmic_list_names();
 		return CMD_RET_SUCCESS;
 	}
 
+	name = argv[1];
+	cmd = argv[2];
+
+	debug("%s: name: %s cmd: %s\n", __func__, name, cmd);
+	p = pmic_get(name);
+
 	if (strcmp(cmd, "dump") == 0) {
-		if (pmic_dump(pmic_get(argv[2])))
+		if (pmic_dump(p))
 			return CMD_RET_FAILURE;
 		return CMD_RET_SUCCESS;
 	}
@@ -162,7 +173,6 @@ int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 			return CMD_RET_USAGE;
 
 		reg = simple_strtoul(argv[3], NULL, 16);
-		p = pmic_get(argv[2]);
 		ret = pmic_reg_read(p, reg, &val);
 
 		if (ret)
@@ -179,12 +189,31 @@ int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 		reg = simple_strtoul(argv[3], NULL, 16);
 		val = simple_strtoul(argv[4], NULL, 16);
-		p = pmic_get(argv[2]);
 		pmic_reg_write(p, reg, val);
 
 		return CMD_RET_SUCCESS;
 	}
 
+	if (strcmp(cmd, "bat") == 0) {
+		if (argc < 4)
+			return CMD_RET_USAGE;
+
+		if (strcmp(argv[3], "state") == 0)
+			p->pwr_bat->fg_battery_check(p->pwr_bat->fg, p);
+
+		if (strcmp(argv[3], "charge") == 0) {
+			if (p->pwr_bat) {
+				printf("PRINT BAT charge %s\n", p->name);
+				if (p->low_power_mode)
+					p->low_power_mode();
+				if (p->battery_charge)
+					p->battery_charge(p);
+			}
+		}
+
+		return CMD_RET_SUCCESS;
+	}
+
 	/* No subcommand found */
 	return CMD_RET_SUCCESS;
 }
@@ -193,7 +222,9 @@ U_BOOT_CMD(
 	pmic,	CONFIG_SYS_MAXARGS, 1, do_pmic,
 	"PMIC",
 	"list - list available PMICs\n"
-	"pmic dump name - dump named PMIC registers\n"
+	"pmic name dump - dump named PMIC registers\n"
 	"pmic name read <reg> - read register\n"
-	"pmic name write <reg> <value> - write register"
+	"pmic name write <reg> <value> - write register\n"
+	"pmic name bat state - write register\n"
+	"pmic name bat charge - write register\n"
 );
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework Lukasz Majewski
@ 2012-10-09  8:36   ` Stefano Babic
  2012-10-09  9:52     ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09  8:36 UTC (permalink / raw)
  To: u-boot

On 05/10/2012 10:16, Lukasz Majewski wrote:
> Since the pmic_reg_read is the u32 value, the order in which bytes
> are placed to form u32 value is important.
> 
> This commit adds the reverse (which is default) and normal byte order.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> 
> ---

Hi Lucasz,

> Changes for v2:
> - Move byte_order variable to struct pmic

Is the byte reversal you introduce here only another way for the endianess ?

It seems to me you have a PMIC whose endianess is different as the SOC's
endianess, and that must be changed.

I can suppose that "normal byte" and "reverse byte" works only with ARM
SOC, as they are (normally, but not always) little endian, but not for
example on PowerPC (big endian).

If this is correct, then I think we need a parameter in the structure to
indicate the endianess, and instead using custom way you could use the
cpu_to_le or cpu_to_be functions.



> ---
>  drivers/misc/pmic_i2c.c |   31 ++++++++++++++++++++++++-------
>  include/pmic.h          |    2 ++
>  2 files changed, 26 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
> index e74c372..6b1487b 100644
> --- a/drivers/misc/pmic_i2c.c
> +++ b/drivers/misc/pmic_i2c.c
> @@ -40,13 +40,24 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
>  
>  	switch (pmic_i2c_tx_num) {
>  	case 3:
> -		buf[0] = (val >> 16) & 0xff;
> -		buf[1] = (val >> 8) & 0xff;
> -		buf[2] = val & 0xff;
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> +			buf[2] = (val >> 16) & 0xff;
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[0] = val & 0xff;
> +		} else {
> +			buf[0] = (val >> 16) & 0xff;
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[2] = val & 0xff;
> +		}
>  		break;
>  	case 2:
> -		buf[0] = (val >> 8) & 0xff;
> -		buf[1] = val & 0xff;
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> +			buf[1] = (val >> 8) & 0xff;
> +			buf[0] = val & 0xff;
> +		} else {
> +			buf[0] = (val >> 8) & 0xff;
> +			buf[1] = val & 0xff;
> +		}
>  		break;
>  	case 1:
>  		buf[0] = val & 0xff;
> @@ -75,10 +86,16 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
>  
>  	switch (pmic_i2c_tx_num) {
>  	case 3:
> -		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> +			ret_val = buf[2] << 16 | buf[1] << 8 | buf[0];
> +		else
> +			ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
>  		break;
>  	case 2:
> -		ret_val = buf[0] << 8 | buf[1];
> +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> +			ret_val = buf[1] << 8 | buf[0];
> +		else
> +			ret_val = buf[0] << 8 | buf[1];
>  		break;
>  	case 1:
>  		ret_val = buf[0];
> diff --git a/include/pmic.h b/include/pmic.h
> index 6a05b40..71b7d13 100644
> --- a/include/pmic.h
> +++ b/include/pmic.h
> @@ -27,6 +27,7 @@
>  enum { PMIC_I2C, PMIC_SPI, };
>  enum { I2C_PMIC, I2C_NUM, };
>  enum { PMIC_READ, PMIC_WRITE, };
> +enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
>  
>  struct p_i2c {
>  	unsigned char addr;
> @@ -47,6 +48,7 @@ struct pmic {
>  	const char *name;
>  	unsigned char bus;
>  	unsigned char interface;
> +	unsigned char byte_order;
>  	unsigned char number_of_regs;
>  	union hw {
>  		struct p_i2c i2c;
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file Lukasz Majewski
@ 2012-10-09  8:54   ` Stefano Babic
  2012-10-09 10:25     ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09  8:54 UTC (permalink / raw)
  To: u-boot

On 05/10/2012 10:16, Lukasz Majewski wrote:
> It is necessary to introduce a new system wide function- power_board_init()
> 
> It turns out, that power initialization must be done as early as possible.
> In the case of PMIC framework redesign, which aims to support multiple
> instances of PMIC devices the initialization shall be performed just
> after malloc configuration.
> 
> The arch_early_init_r() could be used instead, but it doesn't reflect
> that the "power" subsystem is going to be initialized.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
> Changes for v2:
> - None

Hi Lucasz,

only to make some order. We have already several entries that calls
board specific functions.

There is at least board_init() and board_late_init(). The last one was
use mostly for the pmic initialization up nowm because it is called
after malloc_init().

Now you want to add a new one. This means we have cases where the PMIC
must be initialized before flash, right ?

We use often the "weak" mechanism to avoid that a board maintainer is
constrained to implement an empty function only to make happy the
linker. It is better to declare the function as weak and call it with
the same schema, such as board_power_init() (several board_* are weak)

> ---
>  arch/arm/lib/board.c |    4 ++++
>  include/common.h     |    3 +++
>  2 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
> index 109a1ac..431ef5b 100644
> --- a/arch/arm/lib/board.c
> +++ b/arch/arm/lib/board.c
> @@ -513,6 +513,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
>  	arch_early_init_r();
>  #endif
>  
> +#ifdef CONFIG_POWER_INIT
> +	power_board_init();

Do we need a config option only for calling this ? I think that the
decision can be taken with CONFIG_PMIC, declaring the function as weak.

> +#endif
> +
>  #if !defined(CONFIG_SYS_NO_FLASH)
>  	puts("Flash: ");
>  
> diff --git a/include/common.h b/include/common.h
> index a7fb05e..5cc859f 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -487,6 +487,9 @@ int board_late_init (void);
>  int board_postclk_init (void); /* after clocks/timebase, before env/serial */
>  int board_early_init_r (void);
>  void board_poweroff (void);
> +#ifdef CONFIG_POWER_INIT
> +int power_board_init(void);
> +#endif
>  
>  #if defined(CONFIG_SYS_DRAM_TEST)
>  int testdram(void);
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
@ 2012-10-09  8:56   ` Stefano Babic
  2012-10-09 10:30     ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09  8:56 UTC (permalink / raw)
  To: u-boot

On 05/10/2012 10:16, Lukasz Majewski wrote:
> Enable support for power_board_init() method at TRATS board.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
> Changes for v2:
> - None
> ---
>  board/samsung/trats/trats.c |   15 +++++++++++----
>  include/configs/trats.h     |    1 +
>  2 files changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
> index 80ec4ad..0285668 100644
> --- a/board/samsung/trats/trats.c
> +++ b/board/samsung/trats/trats.c
> @@ -68,10 +68,6 @@ int board_init(void)
>  	check_hw_revision();
>  	printf("HW Revision:\t0x%x\n", board_rev);
>  
> -#if defined(CONFIG_PMIC)
> -	pmic_init(I2C_5);
> -#endif
> -
>  	return 0;
>  }
>  


> @@ -90,6 +86,17 @@ void i2c_init_board(void)
>  	s5p_gpio_direction_output(&gpio2->y4, 1, 1);
>  }
>  
> +#ifdef CONFIG_POWER_INIT
> +int power_board_init(void)
> +{
> +
> +#ifdef CONFIG_PMIC
> +	pmic_init(I2C_5);
> +#endif
> +	return 0;
> +}
> +#endif
> +

This enforces my comment in previous patch. We have two CONFIG_ options,
both must be turned on. So at least one is redundant.IMHO you can drop
both of them if power_board_init() is declared weak.

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
@ 2012-10-09  8:58   ` Stefano Babic
  2012-10-09 10:37     ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09  8:58 UTC (permalink / raw)
  To: u-boot

On 05/10/2012 10:16, Lukasz Majewski wrote:
> The PMIC framework has been moved to its more natural place
> ./drivers/power from ./drivers/misc directory.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
> Changes for v2:
> - New patch for v2
> ---
>  drivers/misc/Makefile                          |    7 -------
>  drivers/power/Makefile                         |    8 ++++++++
>  drivers/{misc => power/max8997}/pmic_max8997.c |    0
>  drivers/{misc => power/max8998}/pmic_max8998.c |    0
>  drivers/{misc => power}/pmic_core.c            |    0
>  drivers/{misc => power}/pmic_dialog.c          |    0
>  drivers/{misc => power}/pmic_fsl.c             |    0
>  drivers/{misc => power}/pmic_i2c.c             |    0
>  drivers/{misc => power}/pmic_spi.c             |    0
>  9 files changed, 8 insertions(+), 7 deletions(-)
>  rename drivers/{misc => power/max8997}/pmic_max8997.c (100%)
>  rename drivers/{misc => power/max8998}/pmic_max8998.c (100%)
>  rename drivers/{misc => power}/pmic_core.c (100%)
>  rename drivers/{misc => power}/pmic_dialog.c (100%)
>  rename drivers/{misc => power}/pmic_fsl.c (100%)
>  rename drivers/{misc => power}/pmic_i2c.c (100%)
>  rename drivers/{misc => power}/pmic_spi.c (100%)
> 
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index 271463c..cdec88b 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -34,13 +34,6 @@ COBJS-$(CONFIG_NS87308) += ns87308.o
>  COBJS-$(CONFIG_PDSP188x) += pdsp188x.o
>  COBJS-$(CONFIG_STATUS_LED) += status_led.o
>  COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o
> -COBJS-$(CONFIG_PMIC) += pmic_core.o
> -COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
> -COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
> -COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
> -COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
> -COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
> -COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
>  
>  COBJS	:= $(COBJS-y)
>  SRCS	:= $(COBJS:.o=.c)
> diff --git a/drivers/power/Makefile b/drivers/power/Makefile
> index 6bf388c..7016d5b 100644
> --- a/drivers/power/Makefile
> +++ b/drivers/power/Makefile
> @@ -31,6 +31,14 @@ COBJS-$(CONFIG_TWL4030_POWER)	+= twl4030.o
>  COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o
>  COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o
>  
> +COBJS-$(CONFIG_PMIC) += pmic_core.o
> +COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
> +COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
> +COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
> +COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
> +COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
> +COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
> +
>  COBJS	:= $(COBJS-y)
>  SRCS 	:= $(COBJS:.o=.c)
>  OBJS 	:= $(addprefix $(obj),$(COBJS))
> diff --git a/drivers/misc/pmic_max8997.c b/drivers/power/max8997/pmic_max8997.c
> similarity index 100%
> rename from drivers/misc/pmic_max8997.c
> rename to drivers/power/max8997/pmic_max8997.c
> diff --git a/drivers/misc/pmic_max8998.c b/drivers/power/max8998/pmic_max8998.c
> similarity index 100%
> rename from drivers/misc/pmic_max8998.c
> rename to drivers/power/max8998/pmic_max8998.c
> diff --git a/drivers/misc/pmic_core.c b/drivers/power/pmic_core.c
> similarity index 100%
> rename from drivers/misc/pmic_core.c
> rename to drivers/power/pmic_core.c
> diff --git a/drivers/misc/pmic_dialog.c b/drivers/power/pmic_dialog.c
> similarity index 100%
> rename from drivers/misc/pmic_dialog.c
> rename to drivers/power/pmic_dialog.c
> diff --git a/drivers/misc/pmic_fsl.c b/drivers/power/pmic_fsl.c
> similarity index 100%
> rename from drivers/misc/pmic_fsl.c
> rename to drivers/power/pmic_fsl.c
> diff --git a/drivers/misc/pmic_i2c.c b/drivers/power/pmic_i2c.c
> similarity index 100%
> rename from drivers/misc/pmic_i2c.c
> rename to drivers/power/pmic_i2c.c
> diff --git a/drivers/misc/pmic_spi.c b/drivers/power/pmic_spi.c
> similarity index 100%
> rename from drivers/misc/pmic_spi.c
> rename to drivers/power/pmic_spi.c
> 

Fully agree.

Acked-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework
  2012-10-09  8:36   ` Stefano Babic
@ 2012-10-09  9:52     ` Lukasz Majewski
  2012-10-09 11:02       ` Stefano Babic
  0 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-09  9:52 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> On 05/10/2012 10:16, Lukasz Majewski wrote:
> > Since the pmic_reg_read is the u32 value, the order in which bytes
> > are placed to form u32 value is important.
> > 
> > This commit adds the reverse (which is default) and normal byte
> > order.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > 
> > ---
> 
> Hi Lucasz,
> 
> > Changes for v2:
> > - Move byte_order variable to struct pmic
> 
> Is the byte reversal you introduce here only another way for the
> endianess ?
> 
> It seems to me you have a PMIC whose endianess is different as the
> SOC's endianess, and that must be changed.
> 
> I can suppose that "normal byte" and "reverse byte" works only with
> ARM SOC, as they are (normally, but not always) little endian, but
> not for example on PowerPC (big endian).

This procedure was necessary since, some sensor produces output of 2B
and those bytes are in a big endian.
For simplicity reason I decided to make the switch on received bytes.

I suppose that witch some luck :-), proper cpu_to_le16|be16 (le32|be32)
functions can be used to avoid repetition.

To make the code working at both ARM and PPC we shall use the 
__BYTE_ORDER == __LITTLE_ENDIAN check, which is CPU dependent. Hence,
the interpretation of stored data would be consistent from CPU point of
view.

To sum up - two options possible:
1. Use cpu_to_le|be functions (hack cpu_to_le32 to handle 3B input) 
2. Perform switch (as it was done in this patch) with explicit check of 
__BYTE_ORDER == __LITTLE_ENDIAN.

I would opt for 1 here.

> 
> If this is correct, then I think we need a parameter in the structure
> to indicate the endianess, 

We need also the endiness of data coming out from sensor as it is
defined in this patch:
enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
I admit, that name could be more appropriate here (like
SENSOR_BYTE_ORDER).

In this patch I've added a "byte_order" variable to struct pmic to
indicate the endiantess of device (I2C connected) to which we are
talking to. It is per sensor defined (as the struct pmic is)

Please feel free to comment other patches, so I could prepare v3 of
this series :-). 

> and instead using custom way you could use
> the cpu_to_le or cpu_to_be functions.
> 
> 
> 
> > ---
> >  drivers/misc/pmic_i2c.c |   31 ++++++++++++++++++++++++-------
> >  include/pmic.h          |    2 ++
> >  2 files changed, 26 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
> > index e74c372..6b1487b 100644
> > --- a/drivers/misc/pmic_i2c.c
> > +++ b/drivers/misc/pmic_i2c.c
> > @@ -40,13 +40,24 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32
> > val) 
> >  	switch (pmic_i2c_tx_num) {
> >  	case 3:
> > -		buf[0] = (val >> 16) & 0xff;
> > -		buf[1] = (val >> 8) & 0xff;
> > -		buf[2] = val & 0xff;
> > +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> > +			buf[2] = (val >> 16) & 0xff;
> > +			buf[1] = (val >> 8) & 0xff;
> > +			buf[0] = val & 0xff;
> > +		} else {
> > +			buf[0] = (val >> 16) & 0xff;
> > +			buf[1] = (val >> 8) & 0xff;
> > +			buf[2] = val & 0xff;
> > +		}
> >  		break;
> >  	case 2:
> > -		buf[0] = (val >> 8) & 0xff;
> > -		buf[1] = val & 0xff;
> > +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL) {
> > +			buf[1] = (val >> 8) & 0xff;
> > +			buf[0] = val & 0xff;
> > +		} else {
> > +			buf[0] = (val >> 8) & 0xff;
> > +			buf[1] = val & 0xff;
> > +		}
> >  		break;
> >  	case 1:
> >  		buf[0] = val & 0xff;
> > @@ -75,10 +86,16 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32
> > *val) 
> >  	switch (pmic_i2c_tx_num) {
> >  	case 3:
> > -		ret_val = buf[0] << 16 | buf[1] << 8 | buf[2];
> > +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> > +			ret_val = buf[2] << 16 | buf[1] << 8 |
> > buf[0];
> > +		else
> > +			ret_val = buf[0] << 16 | buf[1] << 8 |
> > buf[2]; break;
> >  	case 2:
> > -		ret_val = buf[0] << 8 | buf[1];
> > +		if (p->byte_order == PMIC_BYTE_ORDER_NORMAL)
> > +			ret_val = buf[1] << 8 | buf[0];
> > +		else
> > +			ret_val = buf[0] << 8 | buf[1];
> >  		break;
> >  	case 1:
> >  		ret_val = buf[0];
> > diff --git a/include/pmic.h b/include/pmic.h
> > index 6a05b40..71b7d13 100644
> > --- a/include/pmic.h
> > +++ b/include/pmic.h
> > @@ -27,6 +27,7 @@
> >  enum { PMIC_I2C, PMIC_SPI, };
> >  enum { I2C_PMIC, I2C_NUM, };
> >  enum { PMIC_READ, PMIC_WRITE, };
> > +enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
> >  
> >  struct p_i2c {
> >  	unsigned char addr;
> > @@ -47,6 +48,7 @@ struct pmic {
> >  	const char *name;
> >  	unsigned char bus;
> >  	unsigned char interface;
> > +	unsigned char byte_order;
> >  	unsigned char number_of_regs;
> >  	union hw {
> >  		struct p_i2c i2c;
> > 
> 
> Best regards,
> Stefano Babic
> 



-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-09  8:54   ` Stefano Babic
@ 2012-10-09 10:25     ` Lukasz Majewski
  2012-10-09 11:34       ` Stefano Babic
  0 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-09 10:25 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> On 05/10/2012 10:16, Lukasz Majewski wrote:
> > It is necessary to introduce a new system wide function-
> > power_board_init()
> > 
> > It turns out, that power initialization must be done as early as
> > possible. In the case of PMIC framework redesign, which aims to
> > support multiple instances of PMIC devices the initialization shall
> > be performed just after malloc configuration.
> > 
> > The arch_early_init_r() could be used instead, but it doesn't
> > reflect that the "power" subsystem is going to be initialized.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > ---
> > Changes for v2:
> > - None
> 
> Hi Lucasz,
> 
> only to make some order. We have already several entries that calls
> board specific functions.
> 
> There is at least board_init() and board_late_init(). The last one was
> use mostly for the pmic initialization up nowm because it is called
> after malloc_init().
> 
> Now you want to add a new one. This means we have cases where the PMIC
> must be initialized before flash, right ?

The case is that PMIC (and other devices) needs to be setup after
malloc init and before MMC (in our case).
The board_init() is before malloc init and board_late_init() is after
MMC initialization for which working PMIC is necessary.
PMIC_v1 works since there is a single, static instance of PMIC device
(no lists needed).


Filling the above gap was my motivation to define special callback
for power.

In the ./arch/arm/lib/board.c there is 
#ifdef CONFIG_ARCH_EARLY_INIT_R
	arch_early_init_r();
#endif

Which could be used and defined at e.g. ./boards/samsung/trats.c
However it is only ARM specific (not available at PPC) and the name is
a bit misleading. (frankly speaking it is a dead code).



> 
> We use often the "weak" mechanism to avoid that a board maintainer is
> constrained to implement an empty function only to make happy the
> linker. It is better to declare the function as weak and call it with
> the same schema, such as board_power_init() (several board_* are weak)

Correct me if I'm wrong, but weren't we recently trying to remove
functions defined as weak? One of arguments was that weak function will
allow to build a u-boot.bin, which then crash at null pointer
dereference when proper CONFIG not selected.  

> 
> > ---
> >  arch/arm/lib/board.c |    4 ++++
> >  include/common.h     |    3 +++
> >  2 files changed, 7 insertions(+), 0 deletions(-)
> > 
> > diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
> > index 109a1ac..431ef5b 100644
> > --- a/arch/arm/lib/board.c
> > +++ b/arch/arm/lib/board.c
> > @@ -513,6 +513,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
> >  	arch_early_init_r();
> >  #endif
> >  
> > +#ifdef CONFIG_POWER_INIT
> > +	power_board_init();
> 
> Do we need a config option only for calling this ? I think that the
> decision can be taken with CONFIG_PMIC, declaring the function as
> weak.

This is one of options -> __weak power_board_init() would be defined
when no CONFIG_PMIC defined.
Good idea, since one CONFIG_POWER_* option would be removed. 

> 
> > +#endif
> > +
> >  #if !defined(CONFIG_SYS_NO_FLASH)
> >  	puts("Flash: ");
> >  
> > diff --git a/include/common.h b/include/common.h
> > index a7fb05e..5cc859f 100644
> > --- a/include/common.h
> > +++ b/include/common.h
> > @@ -487,6 +487,9 @@ int board_late_init (void);
> >  int board_postclk_init (void); /* after clocks/timebase, before
> > env/serial */ int board_early_init_r (void);
> >  void board_poweroff (void);
> > +#ifdef CONFIG_POWER_INIT
> > +int power_board_init(void);
> > +#endif
> >  
> >  #if defined(CONFIG_SYS_DRAM_TEST)
> >  int testdram(void);
> > 
> 
> Best regards,
> Stefano Babic
> 



-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS
  2012-10-09  8:56   ` Stefano Babic
@ 2012-10-09 10:30     ` Lukasz Majewski
  2012-10-09 11:37       ` Stefano Babic
  0 siblings, 1 reply; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-09 10:30 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> On 05/10/2012 10:16, Lukasz Majewski wrote:
> > Enable support for power_board_init() method at TRATS board.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > ---
> > Changes for v2:
> > - None
> > ---
> >  board/samsung/trats/trats.c |   15 +++++++++++----
> >  include/configs/trats.h     |    1 +
> >  2 files changed, 12 insertions(+), 4 deletions(-)
> > 
> > diff --git a/board/samsung/trats/trats.c
> > b/board/samsung/trats/trats.c index 80ec4ad..0285668 100644
> > --- a/board/samsung/trats/trats.c
> > +++ b/board/samsung/trats/trats.c
> > @@ -68,10 +68,6 @@ int board_init(void)
> >  	check_hw_revision();
> >  	printf("HW Revision:\t0x%x\n", board_rev);
> >  
> > -#if defined(CONFIG_PMIC)
> > -	pmic_init(I2C_5);
> > -#endif
> > -
> >  	return 0;
> >  }
> >  
> 
> 
> > @@ -90,6 +86,17 @@ void i2c_init_board(void)
> >  	s5p_gpio_direction_output(&gpio2->y4, 1, 1);
> >  }
> >  
> > +#ifdef CONFIG_POWER_INIT
> > +int power_board_init(void)
> > +{
> > +
> > +#ifdef CONFIG_PMIC
> > +	pmic_init(I2C_5);
> > +#endif
> > +	return 0;
> > +}
> > +#endif
> > +
> 
> This enforces my comment in previous patch. We have two CONFIG_
> options, both must be turned on. So at least one is redundant.IMHO
> you can drop both of them if power_board_init() is declared weak.

I can define power_board_init() as __weak if you are OK with this :-).
In this case for sure CONFIG_POWER_INIT could be removed. 

I agree that CONFIG_PMIC can be removed from this piece of code. 

> 
> Best regards,
> Stefano Babic
> 



-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory
  2012-10-09  8:58   ` Stefano Babic
@ 2012-10-09 10:37     ` Lukasz Majewski
  0 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-09 10:37 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> On 05/10/2012 10:16, Lukasz Majewski wrote:
> > The PMIC framework has been moved to its more natural place
> > ./drivers/power from ./drivers/misc directory.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > ---
> > Changes for v2:
> > - New patch for v2
> > ---
> >  drivers/misc/Makefile                          |    7 -------
> >  drivers/power/Makefile                         |    8 ++++++++
> >  drivers/{misc => power/max8997}/pmic_max8997.c |    0
> >  drivers/{misc => power/max8998}/pmic_max8998.c |    0
> >  drivers/{misc => power}/pmic_core.c            |    0
> >  drivers/{misc => power}/pmic_dialog.c          |    0
> >  drivers/{misc => power}/pmic_fsl.c             |    0
> >  drivers/{misc => power}/pmic_i2c.c             |    0
> >  drivers/{misc => power}/pmic_spi.c             |    0
> >  9 files changed, 8 insertions(+), 7 deletions(-)
> >  rename drivers/{misc => power/max8997}/pmic_max8997.c (100%)
> >  rename drivers/{misc => power/max8998}/pmic_max8998.c (100%)
> >  rename drivers/{misc => power}/pmic_core.c (100%)
> >  rename drivers/{misc => power}/pmic_dialog.c (100%)
> >  rename drivers/{misc => power}/pmic_fsl.c (100%)
> >  rename drivers/{misc => power}/pmic_i2c.c (100%)
> >  rename drivers/{misc => power}/pmic_spi.c (100%)
> > 
> > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> > index 271463c..cdec88b 100644
> > --- a/drivers/misc/Makefile
> > +++ b/drivers/misc/Makefile
> > @@ -34,13 +34,6 @@ COBJS-$(CONFIG_NS87308) += ns87308.o
> >  COBJS-$(CONFIG_PDSP188x) += pdsp188x.o
> >  COBJS-$(CONFIG_STATUS_LED) += status_led.o
> >  COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o
> > -COBJS-$(CONFIG_PMIC) += pmic_core.o
> > -COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
> > -COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
> > -COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
> > -COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
> > -COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
> > -COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
> >  
> >  COBJS	:= $(COBJS-y)
> >  SRCS	:= $(COBJS:.o=.c)
> > diff --git a/drivers/power/Makefile b/drivers/power/Makefile
> > index 6bf388c..7016d5b 100644
> > --- a/drivers/power/Makefile
> > +++ b/drivers/power/Makefile
> > @@ -31,6 +31,14 @@ COBJS-$(CONFIG_TWL4030_POWER)	+= twl4030.o
> >  COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o
> >  COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o
> >  
> > +COBJS-$(CONFIG_PMIC) += pmic_core.o
> > +COBJS-$(CONFIG_DIALOG_PMIC) += pmic_dialog.o
> > +COBJS-$(CONFIG_PMIC_FSL) += pmic_fsl.o
> > +COBJS-$(CONFIG_PMIC_I2C) += pmic_i2c.o
> > +COBJS-$(CONFIG_PMIC_SPI) += pmic_spi.o
> > +COBJS-$(CONFIG_PMIC_MAX8998) += max8998/pmic_max8998.o
> > +COBJS-$(CONFIG_PMIC_MAX8997) += max8997/pmic_max8997.o
> > +
> >  COBJS	:= $(COBJS-y)
> >  SRCS 	:= $(COBJS:.o=.c)
> >  OBJS 	:= $(addprefix $(obj),$(COBJS))
> > diff --git a/drivers/misc/pmic_max8997.c
> > b/drivers/power/max8997/pmic_max8997.c similarity index 100%
> > rename from drivers/misc/pmic_max8997.c
> > rename to drivers/power/max8997/pmic_max8997.c
> > diff --git a/drivers/misc/pmic_max8998.c
> > b/drivers/power/max8998/pmic_max8998.c similarity index 100%
> > rename from drivers/misc/pmic_max8998.c
> > rename to drivers/power/max8998/pmic_max8998.c
> > diff --git a/drivers/misc/pmic_core.c b/drivers/power/pmic_core.c
> > similarity index 100%
> > rename from drivers/misc/pmic_core.c
> > rename to drivers/power/pmic_core.c
> > diff --git a/drivers/misc/pmic_dialog.c
> > b/drivers/power/pmic_dialog.c similarity index 100%
> > rename from drivers/misc/pmic_dialog.c
> > rename to drivers/power/pmic_dialog.c
> > diff --git a/drivers/misc/pmic_fsl.c b/drivers/power/pmic_fsl.c
> > similarity index 100%
> > rename from drivers/misc/pmic_fsl.c
> > rename to drivers/power/pmic_fsl.c
> > diff --git a/drivers/misc/pmic_i2c.c b/drivers/power/pmic_i2c.c
> > similarity index 100%
> > rename from drivers/misc/pmic_i2c.c
> > rename to drivers/power/pmic_i2c.c
> > diff --git a/drivers/misc/pmic_spi.c b/drivers/power/pmic_spi.c
> > similarity index 100%
> > rename from drivers/misc/pmic_spi.c
> > rename to drivers/power/pmic_spi.c
> > 
> 
> Fully agree.
> 
> Acked-by: Stefano Babic <sbabic@denx.de>

Some names haven't been changed (e.g. pmic_core.c -> power_core.c). This
is to reduce number of changes in the patch series and keep the PMIC
subsystem working.

Further rename (PMIC->POWER) will be performed when the initial
PMIC_v2.0 would be merged to mainline.

I simply want to avoid changing too many things at a time (now the
patch series counts of 21 patches).

-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework
  2012-10-09  9:52     ` Lukasz Majewski
@ 2012-10-09 11:02       ` Stefano Babic
  0 siblings, 0 replies; 39+ messages in thread
From: Stefano Babic @ 2012-10-09 11:02 UTC (permalink / raw)
  To: u-boot

On 09/10/2012 11:52, Lukasz Majewski wrote:
> Hi Stefano,
> 
>> On 05/10/2012 10:16, Lukasz Majewski wrote:
>>> Since the pmic_reg_read is the u32 value, the order in which bytes
>>> are placed to form u32 value is important.
>>>
>>> This commit adds the reverse (which is default) and normal byte
>>> order.
>>>
>>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>>> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
>>>
>>> ---
>>
>> Hi Lucasz,
>>
>>> Changes for v2:
>>> - Move byte_order variable to struct pmic
>>
>> Is the byte reversal you introduce here only another way for the
>> endianess ?
>>
>> It seems to me you have a PMIC whose endianess is different as the
>> SOC's endianess, and that must be changed.
>>
>> I can suppose that "normal byte" and "reverse byte" works only with
>> ARM SOC, as they are (normally, but not always) little endian, but
>> not for example on PowerPC (big endian).
> 
> This procedure was necessary since, some sensor produces output of 2B
> and those bytes are in a big endian.

Right. So we have the endianess of the SOC and the endianess of the
PMIC, and they can differ.

> For simplicity reason I decided to make the switch on received bytes.
> 
> I suppose that witch some luck :-), proper cpu_to_le16|be16 (le32|be32)
> functions can be used to avoid repetition.

I hope so.

> 
> To make the code working at both ARM and PPC we shall use the 
> __BYTE_ORDER == __LITTLE_ENDIAN check, which is CPU dependent. Hence,
> the interpretation of stored data would be consistent from CPU point of
> view.
> 
> To sum up - two options possible:
> 1. Use cpu_to_le|be functions (hack cpu_to_le32 to handle 3B input) 
> 2. Perform switch (as it was done in this patch) with explicit check of 
> __BYTE_ORDER == __LITTLE_ENDIAN.
> 
> I would opt for 1 here.

I vote for 1, too. I think generally in u-boot and kernel there is no
use of the explicit check, but I have not grepped in code.

> 
>>
>> If this is correct, then I think we need a parameter in the structure
>> to indicate the endianess, 
> 
> We need also the endiness of data coming out from sensor as it is
> defined in this patch:
> enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
> I admit, that name could be more appropriate here (like
> SENSOR_BYTE_ORDER).

Yes. The name is misleading. Which is "normal" nowadays ?


> 
> In this patch I've added a "byte_order" variable to struct pmic to
> indicate the endiantess of device (I2C connected) to which we are
> talking to. It is per sensor defined (as the struct pmic is)

I think the procedure is correct. The endianess is stored in the pmic
structure, and then calling appropriate cpu_to_le/be function we should
have the bytes in the right order.

> 
> Please feel free to comment other patches, so I could prepare v3 of
> this series :-). 

I will do..

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-09 10:25     ` Lukasz Majewski
@ 2012-10-09 11:34       ` Stefano Babic
  2012-10-09 18:05         ` Tom Rini
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09 11:34 UTC (permalink / raw)
  To: u-boot

On 09/10/2012 12:25, Lukasz Majewski wrote:

>> Now you want to add a new one. This means we have cases where the PMIC
>> must be initialized before flash, right ?
> 
> The case is that PMIC (and other devices) needs to be setup after
> malloc init and before MMC (in our case).
> The board_init() is before malloc init and board_late_init() is after
> MMC initialization for which working PMIC is necessary.
> PMIC_v1 works since there is a single, static instance of PMIC device
> (no lists needed).

Ok

> 
> 
> Filling the above gap was my motivation to define special callback
> for power.
> 
> In the ./arch/arm/lib/board.c there is 
> #ifdef CONFIG_ARCH_EARLY_INIT_R
> 	arch_early_init_r();
> #endif

arch_early_init_r has nothing to do with power management

> 
> Which could be used and defined at e.g. ./boards/samsung/trats.c
> However it is only ARM specific (not available at PPC) and the name is
> a bit misleading. (frankly speaking it is a dead code).

Agree

>>
>> We use often the "weak" mechanism to avoid that a board maintainer is
>> constrained to implement an empty function only to make happy the
>> linker. It is better to declare the function as weak and call it with
>> the same schema, such as board_power_init() (several board_* are weak)
> 
> Correct me if I'm wrong, but weren't we recently trying to remove
> functions defined as weak?

I am not aware of it. I see several patches in last days adding weak
function. Several weak function are present in the recent added SPL
framework.

> One of arguments was that weak function will
> allow to build a u-boot.bin, which then crash at null pointer
> dereference when proper CONFIG not selected.  

I think that if there is a general agreement to drop the weak functions,
this must be done coherent for the whole code. However, I have not seen
that weak functions are rejected, and they are currently used in many parts.


>> Do we need a config option only for calling this ? I think that the
>> decision can be taken with CONFIG_PMIC, declaring the function as
>> weak.
> 
> This is one of options -> __weak power_board_init() would be defined
> when no CONFIG_PMIC defined.
> Good idea, since one CONFIG_POWER_* option would be removed. 

Right


Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS
  2012-10-09 10:30     ` Lukasz Majewski
@ 2012-10-09 11:37       ` Stefano Babic
  2012-10-09 12:06         ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Stefano Babic @ 2012-10-09 11:37 UTC (permalink / raw)
  To: u-boot

On 09/10/2012 12:30, Lukasz Majewski wrote:

>> This enforces my comment in previous patch. We have two CONFIG_
>> options, both must be turned on. So at least one is redundant.IMHO
>> you can drop both of them if power_board_init() is declared weak.
> 
> I can define power_board_init() as __weak if you are OK with this :-).

IMHO yes, and call it board_power_init(). We know directly from the name
that board_* function are often declared weak.


> In this case for sure CONFIG_POWER_INIT could be removed. 
> 
> I agree that CONFIG_PMIC can be removed from this piece of code. 
> 
>>

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS
  2012-10-09 11:37       ` Stefano Babic
@ 2012-10-09 12:06         ` Lukasz Majewski
  0 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-09 12:06 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> On 09/10/2012 12:30, Lukasz Majewski wrote:
> 
> >> This enforces my comment in previous patch. We have two CONFIG_
> >> options, both must be turned on. So at least one is redundant.IMHO
> >> you can drop both of them if power_board_init() is declared weak.
> > 
> > I can define power_board_init() as __weak if you are OK with
> > this :-).
> 
> IMHO yes, and call it board_power_init(). We know directly from the
> name that board_* function are often declared weak.

Ok, I will prepare v3 of this patch set.

> 
> 
> > In this case for sure CONFIG_POWER_INIT could be removed. 
> > 
> > I agree that CONFIG_PMIC can be removed from this piece of code. 
> > 
> >>
> 
> Best regards,
> Stefano Babic
> 
> 



-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-09 11:34       ` Stefano Babic
@ 2012-10-09 18:05         ` Tom Rini
  2012-10-10  6:24           ` Lukasz Majewski
  0 siblings, 1 reply; 39+ messages in thread
From: Tom Rini @ 2012-10-09 18:05 UTC (permalink / raw)
  To: u-boot

On Tue, Oct 09, 2012 at 01:34:35PM +0200, Stefano Babic wrote:
> On 09/10/2012 12:25, Lukasz Majewski wrote:
[snip]
> >> We use often the "weak" mechanism to avoid that a board maintainer is
> >> constrained to implement an empty function only to make happy the
> >> linker. It is better to declare the function as weak and call it with
> >> the same schema, such as board_power_init() (several board_* are weak)
> > 
> > Correct me if I'm wrong, but weren't we recently trying to remove
> > functions defined as weak?
> 
> I am not aware of it. I see several patches in last days adding weak
> function. Several weak function are present in the recent added SPL
> framework.

We should use weak functions when we can provide a functioning in many
cases default but need to allow for overrides in some cases.  We
shouldn't use them when everyone needs to define the function and it has
to do something.

-- 
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/20121009/1401dfdb/attachment.pgp>

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file
  2012-10-09 18:05         ` Tom Rini
@ 2012-10-10  6:24           ` Lukasz Majewski
  0 siblings, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-10  6:24 UTC (permalink / raw)
  To: u-boot

Hi Tom,

> On Tue, Oct 09, 2012 at 01:34:35PM +0200, Stefano Babic wrote:
> > On 09/10/2012 12:25, Lukasz Majewski wrote:
> [snip]
> > >> We use often the "weak" mechanism to avoid that a board
> > >> maintainer is constrained to implement an empty function only to
> > >> make happy the linker. It is better to declare the function as
> > >> weak and call it with the same schema, such as
> > >> board_power_init() (several board_* are weak)
> > > 
> > > Correct me if I'm wrong, but weren't we recently trying to remove
> > > functions defined as weak?
> > 
> > I am not aware of it. I see several patches in last days adding weak
> > function. Several weak function are present in the recent added SPL
> > framework.
> 
> We should use weak functions when we can provide a functioning in many
> cases default but need to allow for overrides in some cases.  We
> shouldn't use them when everyone needs to define the function and it
> has to do something.
> 

Ok, thanks for clarification :-).

I will define and use board_power_init() as a __weak function.


-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations
  2012-10-05  8:16 ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
@ 2012-10-11  7:52   ` Stefano Babic
  2012-10-12  7:54     ` Lukasz Majewski
  2012-10-18 16:09     ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations [explanation] Lukasz Majewski
  0 siblings, 2 replies; 39+ messages in thread
From: Stefano Babic @ 2012-10-11  7:52 UTC (permalink / raw)
  To: u-boot

Am 05/10/2012 10:16, schrieb Lukasz Majewski:
> Now it is possible to provide specific function per PMIC/power
> device instance.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> ---
> Changes for v2:
> - New at patch v2
> ---

Hi Lucasz,

>  include/power/battery.h |   38 ++++++++++++++++++++++++++++++++++++++
>  include/power/pmic.h    |   23 ++++++++++++++++++++++-
>  2 files changed, 60 insertions(+), 1 deletions(-)
>  create mode 100644 include/power/battery.h
> 
> diff --git a/include/power/battery.h b/include/power/battery.h
> new file mode 100644
> index 0000000..e2fec68
> --- /dev/null
> +++ b/include/power/battery.h
> @@ -0,0 +1,38 @@
> +/*
> + *  Copyright (C) 2012 Samsung Electronics
> + *  Lukasz Majewski <l.majewski@samsung.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef __POWER_BATTERY_H_
> +#define __POWER_BATTERY_H_
> +
> +struct battery {
> +	unsigned int version;
> +	unsigned int state_of_chrg;
> +	unsigned int time_to_empty;
> +	unsigned int capacity;
> +	unsigned int voltage_uV;
> +
> +	unsigned int state;
> +};
> +
> +int power_bat_init(unsigned char bus);
> +#endif /* __POWER_BATTERY_H_ */
> diff --git a/include/power/pmic.h b/include/power/pmic.h
> index 3583342..5ec7bae 100644
> --- a/include/power/pmic.h
> +++ b/include/power/pmic.h
> @@ -27,8 +27,9 @@
>  #include <common.h>
>  #include <linux/list.h>
>  #include <i2c.h>
> +#include <power/power_chrg.h>
>  
> -enum { PMIC_I2C, PMIC_SPI, };
> +enum { PMIC_I2C, PMIC_SPI, PMIC_NONE};
>  enum { I2C_PMIC, I2C_NUM, };
>  enum { PMIC_READ, PMIC_WRITE, };
>  enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
> @@ -48,6 +49,21 @@ struct p_spi {
>  	u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);
>  };
>  
> +struct pmic;
> +struct power_battery {
> +	struct battery *bat;
> +
> +	int (*fg_battery_check) (struct pmic *p, struct pmic *bat);
> +	int (*fg_battery_update) (struct pmic *p, struct pmic *bat);
> +
> +	int (*chrg_type) (struct pmic *p);
> +	int (*chrg_bat_present) (struct pmic *p);
> +	int (*chrg_state) (struct pmic *p, int state, int current);
> +
> +	/* Keep info about power devices involved with battery operation */
> +	struct pmic *chrg, *fg, *muic;
> +};
> +
>  struct pmic {
>  	const char *name;
>  	unsigned char bus;
> @@ -59,6 +75,11 @@ struct pmic {
>  		struct p_spi spi;
>  	} hw;
>  
> +	struct power_battery *pwr_bat;
> +	int (*battery_init) (struct pmic *p, struct pmic *bat);

If we add entry points to the pmic structure, I do not expect to pass
the pointer of the structure itself, or I could call the function with
another pointer:

	p->battery_init(p1, bat);

So p should be hide, stored during the initialization of PMIC itself.

> +	int (*battery_charge) (struct pmic *bat);
> +	void (*low_power_mode) (void);
> +
>  	struct list_head list;
>  };
>  

I have some concerns regarding this structure. It seems to me very
coupled to the PMIC you are using.

Reading this and the next patches it seems to me that is due because
your PMIC includes other three PMICs. However, IMHO the interface
presented before this patch is very clear.

I have expected something as:

	P = get_pmic("CHRG");
	p->chrg_state(current);

And if the problem is that this PMIC really descend from another one, we
could add a "struct pmic *parent" in the pmic itself. You already
introduced lists, and we can work with pointer instead of hard-code the
subpmics as in :
	struct pmic *chrg, *fg, *muic;

In this case, if we have a pmic that logically can be seen with a
different number of pmics, we can still support.
You introduce PMIC_NONE to tell that this pmic does not have an own data
transfer and rely on another one. But again, this could be solved using

	if (p->parent)
		p->i2c....

or something like this to use the transfer method of the "main" PMIC.

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations
  2012-10-11  7:52   ` Stefano Babic
@ 2012-10-12  7:54     ` Lukasz Majewski
  2012-10-18 16:09     ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations [explanation] Lukasz Majewski
  1 sibling, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-12  7:54 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

> Am 05/10/2012 10:16, schrieb Lukasz Majewski:
> > Now it is possible to provide specific function per PMIC/power
> > device instance.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > ---
> > Changes for v2:
> > - New at patch v2
> > ---
> 
> Hi Lucasz,
> 
> >  include/power/battery.h |   38
> > ++++++++++++++++++++++++++++++++++++++ include/power/pmic.h    |
> > 23 ++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1
> > deletions(-) create mode 100644 include/power/battery.h
> > 
> > diff --git a/include/power/battery.h b/include/power/battery.h
> > new file mode 100644
> > index 0000000..e2fec68
> > --- /dev/null
> > +++ b/include/power/battery.h
> > @@ -0,0 +1,38 @@
> > +/*
> > + *  Copyright (C) 2012 Samsung Electronics
> > + *  Lukasz Majewski <l.majewski@samsung.com>
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public
> > License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#ifndef __POWER_BATTERY_H_
> > +#define __POWER_BATTERY_H_
> > +
> > +struct battery {
> > +	unsigned int version;
> > +	unsigned int state_of_chrg;
> > +	unsigned int time_to_empty;
> > +	unsigned int capacity;
> > +	unsigned int voltage_uV;
> > +
> > +	unsigned int state;
> > +};
> > +
> > +int power_bat_init(unsigned char bus);
> > +#endif /* __POWER_BATTERY_H_ */
> > diff --git a/include/power/pmic.h b/include/power/pmic.h
> > index 3583342..5ec7bae 100644
> > --- a/include/power/pmic.h
> > +++ b/include/power/pmic.h
> > @@ -27,8 +27,9 @@
> >  #include <common.h>
> >  #include <linux/list.h>
> >  #include <i2c.h>
> > +#include <power/power_chrg.h>
> >  
> > -enum { PMIC_I2C, PMIC_SPI, };
> > +enum { PMIC_I2C, PMIC_SPI, PMIC_NONE};
> >  enum { I2C_PMIC, I2C_NUM, };
> >  enum { PMIC_READ, PMIC_WRITE, };
> >  enum { PMIC_BYTE_ORDER_REVERSED, PMIC_BYTE_ORDER_NORMAL, };
> > @@ -48,6 +49,21 @@ struct p_spi {
> >  	u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);
> >  };
> >  
> > +struct pmic;
> > +struct power_battery {
> > +	struct battery *bat;
> > +
> > +	int (*fg_battery_check) (struct pmic *p, struct pmic *bat);
> > +	int (*fg_battery_update) (struct pmic *p, struct pmic
> > *bat); +
> > +	int (*chrg_type) (struct pmic *p);
> > +	int (*chrg_bat_present) (struct pmic *p);
> > +	int (*chrg_state) (struct pmic *p, int state, int current);
> > +
> > +	/* Keep info about power devices involved with battery
> > operation */
> > +	struct pmic *chrg, *fg, *muic;
> > +};
> > +
> >  struct pmic {
> >  	const char *name;
> >  	unsigned char bus;
> > @@ -59,6 +75,11 @@ struct pmic {
> >  		struct p_spi spi;
> >  	} hw;
> >  
> > +	struct power_battery *pwr_bat;
> > +	int (*battery_init) (struct pmic *p, struct pmic *bat);
> 
> If we add entry points to the pmic structure, I do not expect to pass
> the pointer of the structure itself, or I could call the function with
> another pointer:
> 
> 	p->battery_init(p1, bat);
> 
> So p should be hide, stored during the initialization of PMIC itself
> 
> > +	int (*battery_charge) (struct pmic *bat);
> > +	void (*low_power_mode) (void);
> > +
> >  	struct list_head list;
> >  };
> >  
> 
> I have some concerns regarding this structure. It seems to me very
> coupled to the PMIC you are using.
> 
> Reading this and the next patches it seems to me that is due because
> your PMIC includes other three PMICs. However, IMHO the interface
> presented before this patch is very clear.
> 
> I have expected something as:
> 
> 	P = get_pmic("CHRG");
> 	p->chrg_state(current);

I use explicit name to get access to e.g. charger (instead of "CHRG"
I use "MAX8997_PMIC"). We can define the "CHRG"
at ./include/configs/{board.h} file as #define CHRG MAX8997_PMIC. This
is not a problem.

> 
> And if the problem is that this PMIC really descend from another one,
> we could add a "struct pmic *parent" in the pmic itself. You already
> introduced lists, and we can work with pointer instead of hard-code
> the subpmics as in :
> 	struct pmic *chrg, *fg, *muic;

I've considered using of "parents" there. But for the sake of simpler
code (or rather simpler logical view), I wanted to use the "flat"
structure.

The "flat" structure is OK with PMIC, MUIC, Fuel gauge (since those are
in the same "level".

The problem is with battery, since it hasn't got an physical interface
(I2C) and uses other PMIC devices to retain its state (charging state)

> 
> In this case, if we have a pmic that logically can be seen with a
> different number of pmics, we can still support.
> You introduce PMIC_NONE to tell that this pmic does not have an own
> data transfer and rely on another one. But again, this could be
> solved using
> 
> 	if (p->parent)
> 		p->i2c....
> 
> or something like this to use the transfer method of the "main" PMIC.

I will think how redesign the proposed code to use "parent" child
structure.

(I hope that the patch series won't grow much more then :-) )


-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations [explanation]
  2012-10-11  7:52   ` Stefano Babic
  2012-10-12  7:54     ` Lukasz Majewski
@ 2012-10-18 16:09     ` Lukasz Majewski
  1 sibling, 0 replies; 39+ messages in thread
From: Lukasz Majewski @ 2012-10-18 16:09 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

I'd like to present an overview of my idea (pseudo code):

struct battery {
	int (* battery_charge) ()
	struct pmic *fg, *muic, *chrg
}

struct chrg {
	int (*chrg_type) ()
	int (*chrg_bat_present) ()
	int (*chrg_state) ()
}

struct fg {
	int (*fg_bat_check) ()
	int (*fg_bat_update) ()
}

struct muic {

}

Then extend struct pmic:

struct pmic {

struct battery *bat_p;
struct chrg *chrg_p;
struct fg *fg_p;
struct muic *muic_p;

struct pmic *parent;
void (*low_power_mode) ();
}

The struct [battery|chrg|fg|muic] is provided during pmic device
initialization (it is defined as a static in a device's translation unit
- e.g. fg_max17042.c)


To solve the problem with multi instances of the same devices (e.g. two
identical HW devices - MAX17042 are connected to SOC), methods defined
for pmic/power devices accept struct pmic *p of the device instance.

You have suggested, that pmic device shall be a parent. However, I see
it differently (at least from my HW):

			struct pmic *fg, *muic, *chrg
			-----------------
		--------| BAT		|------------
		|	|		|	    |
		|	-----------------	    |
		|		|		    |
	       \|/	       \|/		   \|/
	-----------	-----------------	---------
	|FG       |	|MUIC		|	|CHRG	|
	|         |	|		| 	|	|
	-----------	-----------------	---------
  	struct	pmic *parent = &bat (for FG, MUIC, CHRG)

(PMIC is also connected to the rest via list)


I think that BAT is parent here, since when we want to e.g. charge the
battery we would look for it with:
p_bat = pmic_get("BAT_TRATS");

In my opinion it is natural to call p_bat->battery_charge(p_bat)
to enable charging and in the same time don't be concerned with "helper"
devices (like FG, MUIC, CHRG) - which provide methods to check if
battery is charged properly.

Moreover BAT shall be treated as a PMIC device and thereof has its own
instance of struct pmic. It is desirable to have all power related
devices connected in the list.

The __real__ problem here is how to "connect" functionality provided by
FG, CHRG, MUIC with battery, to have easy access:
p_bat->battery_charge(p_bat).

One option would be to fill: 
struct battery *bat_p;
struct chrg *chrg_p;
struct fg *fg_p;
struct muic *muic_p;

for struct pmic bat.

Then we could access relevant functions just from p_bat. 


-- 
Best regards,

Lukasz Majewski

Samsung Poland R&D Center | Linux Platform Group

^ permalink raw reply	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2012-10-18 16:09 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-05  8:16 [U-Boot] [PATCH v2 00/21] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 01/21] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 02/21] pmic:i2c: Add I2C byte order to PMIC framework Lukasz Majewski
2012-10-09  8:36   ` Stefano Babic
2012-10-09  9:52     ` Lukasz Majewski
2012-10-09 11:02       ` Stefano Babic
2012-10-05  8:16 ` [U-Boot] [PATCH v2 03/21] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 04/21] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 05/21] pmic: Introduce power_board_init() method at ./lib/board.c file Lukasz Majewski
2012-10-09  8:54   ` Stefano Babic
2012-10-09 10:25     ` Lukasz Majewski
2012-10-09 11:34       ` Stefano Babic
2012-10-09 18:05         ` Tom Rini
2012-10-10  6:24           ` Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 06/21] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
2012-10-09  8:56   ` Stefano Babic
2012-10-09 10:30     ` Lukasz Majewski
2012-10-09 11:37       ` Stefano Babic
2012-10-09 12:06         ` Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 07/21] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 08/21] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
2012-10-09  8:58   ` Stefano Babic
2012-10-09 10:37     ` Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
2012-10-11  7:52   ` Stefano Babic
2012-10-12  7:54     ` Lukasz Majewski
2012-10-18 16:09     ` [U-Boot] [PATCH v2 09/21] pmic: Extend struct pmic to support battery and charger related operations [explanation] Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 10/21] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 11/21] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 12/21] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 13/21] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 14/21] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 15/21] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 16/21] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 17/21] arm:trats:pmic: Enable battery support " Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 18/21] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 19/21] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 20/21] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
2012-10-05  8:16 ` [U-Boot] [PATCH v2 21/21] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.