public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices
@ 2012-11-13 13:21 Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 01/26] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
                   ` (27 more replies)
  0 siblings, 28 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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_init_board() 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.
For even more versalite design, each power device instance can specify its parent.

For trats one can build a following scheme (it can de different for other boards):
                        -----------------
                --------| BAT           |------------
                |       |               |           |
                |       -----------------           |
                |               |                   |
               \|/             \|/                 \|/
        -----------     -----------------       ---------
        |FG       |     |MUIC           |       |CHRG   |
        |         |     |               |       |       |
        -----------     -----------------       ---------

Finally, this patch series also comprises of a "namespace" cleanup - an attempt to rename
"pmic" to "power" to better reflect generality of this framework.



Test HW:
 - Exynos4210 Trats development board
 - Exynos3 (C110) Goni development board


Lukasz Majewski (26):
  pmic:i2c: Handle PMIC I2C transmission comprising of two bytes
  pmic:i2c: Add I2C sensor byte order (big/little) 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_init_board() 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
  power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_*
    files
  power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER
  power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER
  arm:goni:pmic: Adjust GONI target platform board to new PMIC
    framework
  arm:universal_c210:pmic: Adjust C210 Universal target platform board
    to new PMIC framework

 Makefile                                           |    5 +-
 arch/arm/lib/board.c                               |    8 +
 board/davedenx/qong/qong.c                         |   12 +-
 board/freescale/mx31pdk/mx31pdk.c                  |   12 +-
 board/freescale/mx35pdk/mx35pdk.c                  |   14 +-
 board/freescale/mx51evk/mx51evk.c                  |   12 +-
 board/freescale/mx53evk/mx53evk.c                  |   12 +-
 board/freescale/mx53loco/mx53loco.c                |   21 +-
 board/genesi/mx51_efikamx/efikamx.c                |   12 +-
 board/hale/tt01/tt01.c                             |   14 +-
 board/samsung/goni/goni.c                          |   22 +-
 board/samsung/trats/trats.c                        |  292 +++++++++++++++++++-
 board/samsung/universal_c210/universal.c           |   27 ++-
 board/ttcontrol/vision2/vision2.c                  |   12 +-
 drivers/misc/Makefile                              |    7 -
 drivers/misc/pmic_core.c                           |  147 ----------
 drivers/misc/pmic_i2c.c                            |   98 -------
 drivers/misc/pmic_max8997.c                        |   43 ---
 drivers/power/Makefile                             |   12 +-
 drivers/power/battery/Makefile                     |   47 ++++
 drivers/power/battery/bat_trats.c                  |  100 +++++++
 drivers/power/fuel_gauge/Makefile                  |   47 ++++
 drivers/power/fuel_gauge/fg_max17042.c             |  250 +++++++++++++++++
 drivers/power/pmic/Makefile                        |   49 ++++
 drivers/power/pmic/muic_max8997.c                  |   90 ++++++
 drivers/power/pmic/pmic_max8997.c                  |  123 ++++++++
 drivers/{misc => power/pmic}/pmic_max8998.c        |   16 +-
 drivers/power/power_core.c                         |  232 ++++++++++++++++
 .../{misc/pmic_dialog.c => power/power_dialog.c}   |   14 +-
 drivers/{misc/pmic_fsl.c => power/power_fsl.c}     |   22 +-
 drivers/power/power_i2c.c                          |  125 +++++++++
 drivers/{misc/pmic_spi.c => power/power_spi.c}     |    4 +-
 drivers/rtc/mc13xxx-rtc.c                          |   10 +-
 include/configs/imx31_litekit.h                    |    6 +-
 include/configs/mx31ads.h                          |    6 +-
 include/configs/mx31pdk.h                          |    6 +-
 include/configs/mx35pdk.h                          |    6 +-
 include/configs/mx51_efikamx.h                     |    6 +-
 include/configs/mx51evk.h                          |    6 +-
 include/configs/mx53evk.h                          |    6 +-
 include/configs/mx53loco.h                         |    8 +-
 include/configs/qong.h                             |    6 +-
 include/configs/s5p_goni.h                         |    6 +-
 include/configs/s5pc210_universal.h                |    6 +-
 include/configs/trats.h                            |   14 +-
 include/configs/tt01.h                             |    6 +-
 include/configs/vision2.h                          |    6 +-
 include/pmic.h                                     |   72 -----
 include/power/battery.h                            |   38 +++
 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                               |  109 ++++++++
 include/power/power_chrg.h                         |   43 +++
 56 files changed, 2027 insertions(+), 491 deletions(-)
 delete mode 100644 drivers/misc/pmic_core.c
 delete mode 100644 drivers/misc/pmic_i2c.c
 delete mode 100644 drivers/misc/pmic_max8997.c
 create mode 100644 drivers/power/battery/Makefile
 create mode 100644 drivers/power/battery/bat_trats.c
 create mode 100644 drivers/power/fuel_gauge/Makefile
 create mode 100644 drivers/power/fuel_gauge/fg_max17042.c
 create mode 100644 drivers/power/pmic/Makefile
 create mode 100644 drivers/power/pmic/muic_max8997.c
 create mode 100644 drivers/power/pmic/pmic_max8997.c
 rename drivers/{misc => power/pmic}/pmic_max8998.c (82%)
 create mode 100644 drivers/power/power_core.c
 rename drivers/{misc/pmic_dialog.c => power/power_dialog.c} (81%)
 rename drivers/{misc/pmic_fsl.c => power/power_fsl.c} (81%)
 create mode 100644 drivers/power/power_i2c.c
 rename drivers/{misc/pmic_spi.c => power/power_spi.c} (97%)
 delete mode 100644 include/pmic.h
 create mode 100644 include/power/battery.h
 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
 create mode 100644 include/power/power_chrg.h

-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 01/26] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 02/26] pmic:i2c: Add I2C sensor byte order (big/little) to PMIC framework Lukasz Majewski
                   ` (26 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- 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] 31+ messages in thread

* [U-Boot] [PATCH v7 02/26] pmic:i2c: Add I2C sensor byte order (big/little) to PMIC framework
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 01/26] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 03/26] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
                   ` (25 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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.

Support for big and little sensor endianess is added.

Moreover calls to [leXX|beXX]_to_cpu have been added to support
little and big endian SoCs.

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
Changes for v3:
- New names for sensor endianess (more readable)
- Support for SoCs with different endianess
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 drivers/misc/pmic_i2c.c |   38 +++++++++++++++++++++++++++++---------
 include/pmic.h          |    2 ++
 2 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
index e74c372..1064bfe 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -30,6 +30,7 @@
 #include <linux/types.h>
 #include <pmic.h>
 #include <i2c.h>
+#include <compiler.h>
 
 int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
 {
@@ -40,16 +41,27 @@ 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->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) {
+			buf[2] = (cpu_to_le32(val) >> 16) & 0xff;
+			buf[1] = (cpu_to_le32(val) >> 8) & 0xff;
+			buf[0] = cpu_to_le32(val) & 0xff;
+		} else {
+			buf[0] = (cpu_to_le32(val) >> 16) & 0xff;
+			buf[1] = (cpu_to_le32(val) >> 8) & 0xff;
+			buf[2] = cpu_to_le32(val) & 0xff;
+		}
 		break;
 	case 2:
-		buf[0] = (val >> 8) & 0xff;
-		buf[1] = val & 0xff;
+		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) {
+			buf[1] = (cpu_to_le32(val) >> 8) & 0xff;
+			buf[0] = cpu_to_le32(val) & 0xff;
+		} else {
+			buf[0] = (cpu_to_le32(val) >> 8) & 0xff;
+			buf[1] = cpu_to_le32(val) & 0xff;
+		}
 		break;
 	case 1:
-		buf[0] = val & 0xff;
+		buf[0] = cpu_to_le32(val) & 0xff;
 		break;
 	default:
 		printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num);
@@ -75,13 +87,21 @@ 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->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG)
+			ret_val = le32_to_cpu(buf[2] << 16
+					      | buf[1] << 8 | buf[0]);
+		else
+			ret_val = le32_to_cpu(buf[0] << 16 |
+					      buf[1] << 8 | buf[2]);
 		break;
 	case 2:
-		ret_val = buf[0] << 8 | buf[1];
+		if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG)
+			ret_val = le32_to_cpu(buf[1] << 8 | buf[0]);
+		else
+			ret_val = le32_to_cpu(buf[0] << 8 | buf[1]);
 		break;
 	case 1:
-		ret_val = buf[0];
+		ret_val = le32_to_cpu(buf[0]);
 		break;
 	default:
 		printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num);
diff --git a/include/pmic.h b/include/pmic.h
index 6a05b40..1a2db05 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_SENSOR_BYTE_ORDER_LITTLE, PMIC_SENSOR_BYTE_ORDER_BIG, };
 
 struct p_i2c {
 	unsigned char addr;
@@ -47,6 +48,7 @@ struct pmic {
 	const char *name;
 	unsigned char bus;
 	unsigned char interface;
+	unsigned char sensor_byte_order;
 	unsigned char number_of_regs;
 	union hw {
 		struct p_i2c i2c;
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 03/26] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 01/26] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 02/26] pmic:i2c: Add I2C sensor byte order (big/little) to PMIC framework Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 04/26] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
                   ` (24 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- 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] 31+ messages in thread

* [U-Boot] [PATCH v7 04/26] pmic: Extend PMIC framework to support multiple instances of PMIC devices
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (2 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 03/26] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 05/26] pmic: Introduce power_init_board() method at ./lib/board.c file Lukasz Majewski
                   ` (23 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- Convert mx51_efikamx board from genesi to new pmic/power framework
Changes for v6:
- None
Changes for v7:
- Check pmic_alloc() return value (to prevent NULL pointer dereference)
- Check pmic_init() return value
- Check pmic_get() return value
---
 board/davedenx/qong/qong.c               |   12 +++-
 board/freescale/mx31pdk/mx31pdk.c        |   12 +++-
 board/freescale/mx35pdk/mx35pdk.c        |   14 +++-
 board/freescale/mx51evk/mx51evk.c        |   12 +++-
 board/freescale/mx53evk/mx53evk.c        |   12 +++-
 board/freescale/mx53loco/mx53loco.c      |   21 ++++--
 board/genesi/mx51_efikamx/efikamx.c      |   12 +++-
 board/hale/tt01/tt01.c                   |   14 +++-
 board/samsung/goni/goni.c                |   11 ++-
 board/samsung/trats/trats.c              |   18 +++--
 board/samsung/universal_c210/universal.c |   14 +++--
 board/ttcontrol/vision2/vision2.c        |   12 +++-
 drivers/misc/pmic_core.c                 |  116 ++++++++++++++++++++++-------
 drivers/misc/pmic_dialog.c               |   14 +++-
 drivers/misc/pmic_fsl.c                  |   14 +++-
 drivers/misc/pmic_i2c.c                  |    6 +-
 drivers/misc/pmic_max8997.c              |   16 +++--
 drivers/misc/pmic_max8998.c              |   16 +++--
 drivers/misc/pmic_spi.c                  |    4 +-
 drivers/rtc/mc13xxx-rtc.c                |   10 ++-
 include/{ => power}/max8997_pmic.h       |   15 ++++-
 include/{ => power}/max8998_pmic.h       |    0
 include/{ => power}/pmic.h               |   19 ++++--
 23 files changed, 288 insertions(+), 106 deletions(-)
 rename include/{ => power}/max8997_pmic.h (92%)
 rename include/{ => power}/max8998_pmic.h (100%)
 rename include/{ => power}/pmic.h (84%)

diff --git a/board/davedenx/qong/qong.c b/board/davedenx/qong/qong.c
index c41f11d..a3079db 100644
--- a/board/davedenx/qong/qong.c
+++ b/board/davedenx/qong/qong.c
@@ -28,11 +28,12 @@
 #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"
 #include <watchdog.h>
+#include <errno.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -172,10 +173,15 @@ int board_late_init(void)
 {
 	u32 val;
 	struct pmic *p;
+	int ret;
 
-	pmic_init();
-	p = get_pmic();
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return ret;
 
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return -ENODEV;
 	/* Enable RTC battery */
 	pmic_reg_read(p, REG_POWER_CTL0, &val);
 	pmic_reg_write(p, REG_POWER_CTL0, val | COINCHEN);
diff --git a/board/freescale/mx31pdk/mx31pdk.c b/board/freescale/mx31pdk/mx31pdk.c
index 9f8bc53..bc60632 100644
--- a/board/freescale/mx31pdk/mx31pdk.c
+++ b/board/freescale/mx31pdk/mx31pdk.c
@@ -30,8 +30,9 @@
 #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>
+#include <errno.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -83,10 +84,15 @@ int board_late_init(void)
 {
 	u32 val;
 	struct pmic *p;
+	int ret;
 
-	pmic_init();
-	p = get_pmic();
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return ret;
 
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return -ENODEV;
 	/* Enable RTC battery */
 	pmic_reg_read(p, REG_POWER_CTL0, &val);
 	pmic_reg_write(p, REG_POWER_CTL0, val | COINCHEN);
diff --git a/board/freescale/mx35pdk/mx35pdk.c b/board/freescale/mx35pdk/mx35pdk.c
index a12531f..c835b0e 100644
--- a/board/freescale/mx35pdk/mx35pdk.c
+++ b/board/freescale/mx35pdk/mx35pdk.c
@@ -31,7 +31,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>
@@ -207,7 +207,9 @@ 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");
+	if (!p)
+		return -ENODEV;
 
 	pmic_reg_read(p, REG_IDENTIFICATION, &id);
 
@@ -231,10 +233,14 @@ int board_late_init(void)
 	u8 val;
 	u32 pmic_val;
 	struct pmic *p;
+	int ret;
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return ret;
 
-	pmic_init();
 	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 421d8c2..5504636 100644
--- a/board/freescale/mx51evk/mx51evk.c
+++ b/board/freescale/mx51evk/mx51evk.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 <mc13892.h>
 #include <usb/ehci-fsl.h>
@@ -252,9 +252,15 @@ static void power_init(void)
 	unsigned int val;
 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;
 	struct pmic *p;
+	int ret;
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return;
 
-	pmic_init();
-	p = get_pmic();
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return;
 
 	/* 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 bb4621d..1273501 100644
--- a/board/freescale/mx53evk/mx53evk.c
+++ b/board/freescale/mx53evk/mx53evk.c
@@ -34,7 +34,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,9 +123,15 @@ void power_init(void)
 {
 	unsigned int val;
 	struct pmic *p;
+	int ret;
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return;
 
-	pmic_init();
-	p = get_pmic();
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return;
 
 	/* 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 a11e883..f4a9b08 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>
@@ -344,10 +344,16 @@ static int power_init(void)
 	unsigned int val;
 	int ret = -1;
 	struct pmic *p;
+	int retval;
 
 	if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
-		pmic_dialog_init();
-		p = get_pmic();
+		retval = pmic_dialog_init(I2C_PMIC);
+		if (retval)
+			return retval;
+
+		p = pmic_get("DIALOG_PMIC");
+		if (!p)
+			return -ENODEV;
 
 		/* Set VDDA to 1.25V */
 		val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
@@ -363,8 +369,13 @@ static int power_init(void)
 	}
 
 	if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
-		pmic_init();
-		p = get_pmic();
+		retval = pmic_init(I2C_PMIC);
+		if (retval)
+			return retval;
+
+		p = pmic_get("DIALOG_PMIC");
+		if (!p)
+			return -ENODEV;
 
 		/* Set VDDGP to 1.25V for 1GHz on SW1 */
 		pmic_reg_read(p, REG_SW_0, &val);
diff --git a/board/genesi/mx51_efikamx/efikamx.c b/board/genesi/mx51_efikamx/efikamx.c
index c2b2823..69d41db 100644
--- a/board/genesi/mx51_efikamx/efikamx.c
+++ b/board/genesi/mx51_efikamx/efikamx.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 <mc13892.h>
 
@@ -173,9 +173,15 @@ static void power_init(void)
 	unsigned int val;
 	struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)MXC_CCM_BASE;
 	struct pmic *p;
+	int ret;
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return;
 
-	pmic_init();
-	p = get_pmic();
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return;
 
 	/* Write needed to Power Gate 2 register */
 	pmic_reg_read(p, REG_POWER_MISC, &val);
diff --git a/board/hale/tt01/tt01.c b/board/hale/tt01/tt01.c
index 143fcef..0c2cb79 100644
--- a/board/hale/tt01/tt01.c
+++ b/board/hale/tt01/tt01.c
@@ -25,12 +25,13 @@
 #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>
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
+#include <errno.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -195,14 +196,21 @@ int board_mmc_init(bd_t *bis)
 {
 	u32 val;
 	struct pmic *p;
+	int ret;
 
 	/*
 	* this is the first driver to use the pmic, so call
 	* pmic_init() here. board_late_init() is too late for
 	* the MMC driver.
 	*/
-	pmic_init();
-	p = get_pmic();
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return ret;
+
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return -ENODEV;
 
 	/* 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..71ed618 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,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return -1;
diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index e11a892..e0a9890 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,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return -1;
@@ -413,7 +415,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return 0;
@@ -473,7 +477,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return 0;
diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c
index 90fff5c..c4950dd 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,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return -1;
@@ -280,7 +282,9 @@ 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 (!p)
+		return -ENODEV;
 
 	if (pmic_probe(p))
 		return -1;
diff --git a/board/ttcontrol/vision2/vision2.c b/board/ttcontrol/vision2/vision2.c
index abdd1aa..a471fec 100644
--- a/board/ttcontrol/vision2/vision2.c
+++ b/board/ttcontrol/vision2/vision2.c
@@ -34,7 +34,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,9 +306,15 @@ static void power_init_mx51(void)
 {
 	unsigned int val;
 	struct pmic *p;
+	int ret;
+
+	ret = pmic_init(I2C_PMIC);
+	if (ret)
+		return;
 
-	pmic_init();
-	p = get_pmic();
+	p = pmic_get("FSL_PMIC");
+	if (!p)
+		return;
 
 	/* 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..4066b15 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,35 +90,84 @@ 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;
+		p = pmic_get(argv[2]);
+		if (!p)
+			return CMD_RET_FAILURE;
+		if (pmic_dump(p))
+			return CMD_RET_FAILURE;
+		return CMD_RET_SUCCESS;
 	}
 
 	if (strcmp(cmd, "read") == 0) {
-		if (argc < 3)
-			return cmd_usage(cmdtp);
+		if (argc < 4)
+			return CMD_RET_USAGE;
 
-		reg = simple_strtoul(argv[2], NULL, 16);
+		reg = simple_strtoul(argv[3], NULL, 16);
+		p = pmic_get(argv[2]);
+		if (!p)
+			return CMD_RET_FAILURE;
 
 		ret = pmic_reg_read(p, reg, &val);
 
@@ -119,29 +176,32 @@ 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]);
+		if (!p)
+			return CMD_RET_FAILURE;
 		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..d7ebd15 100644
--- a/drivers/misc/pmic_dialog.c
+++ b/drivers/misc/pmic_dialog.c
@@ -17,13 +17,19 @@
  */
 
 #include <common.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <dialog_pmic.h>
+#include <errno.h>
 
-int pmic_dialog_init(void)
+int pmic_dialog_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
 	static const char name[] = "DIALOG_PMIC";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
 
 	p->name = name;
 	p->number_of_regs = DIALOG_NUM_OF_REGS;
@@ -31,7 +37,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..0275fd9 100644
--- a/drivers/misc/pmic_fsl.c
+++ b/drivers/misc/pmic_fsl.c
@@ -23,8 +23,9 @@
 
 #include <common.h>
 #include <spi.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <fsl_pmic.h>
+#include <errno.h>
 
 #if defined(CONFIG_PMIC_SPI)
 static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)
@@ -33,10 +34,15 @@ 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();
 	static const char name[] = "FSL_PMIC";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
 
 	p->name = name;
 	p->number_of_regs = PMIC_NUM_OF_REGS;
@@ -54,7 +60,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 1064bfe..3e5a784 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -28,7 +28,7 @@
 
 #include <common.h>
 #include <linux/types.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <i2c.h>
 #include <compiler.h>
 
@@ -36,7 +36,7 @@ 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) {
@@ -79,7 +79,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..7fe1b53 100644
--- a/drivers/misc/pmic_max8997.c
+++ b/drivers/misc/pmic_max8997.c
@@ -22,14 +22,20 @@
  */
 
 #include <common.h>
-#include <pmic.h>
-#include <max8997_pmic.h>
+#include <power/pmic.h>
+#include <power/max8997_pmic.h>
 #include <i2c.h>
+#include <errno.h>
 
-int pmic_init(void)
+int pmic_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
 	static const char name[] = "MAX8997_PMIC";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
 
 	puts("Board PMIC init\n");
 
@@ -38,7 +44,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..452e1c8 100644
--- a/drivers/misc/pmic_max8998.c
+++ b/drivers/misc/pmic_max8998.c
@@ -22,13 +22,19 @@
  */
 
 #include <common.h>
-#include <pmic.h>
-#include <max8998_pmic.h>
+#include <power/pmic.h>
+#include <power/max8998_pmic.h>
+#include <errno.h>
 
-int pmic_init(void)
+int pmic_init(unsigned char bus)
 {
-	struct pmic *p = get_pmic();
 	static const char name[] = "MAX8998_PMIC";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
 
 	puts("Board PMIC init\n");
 
@@ -37,7 +43,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..e79f462 100644
--- a/drivers/rtc/mc13xxx-rtc.c
+++ b/drivers/rtc/mc13xxx-rtc.c
@@ -23,16 +23,18 @@
 #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;
 
+	if (!p)
+		return -1;
 	do {
 		ret = pmic_reg_read(p, REG_RTC_DAY, &day1);
 		if (ret < 0)
@@ -61,7 +63,9 @@ 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");
+	if (!p)
+		return -1;
 
 	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 84%
rename from include/pmic.h
rename to include/power/pmic.h
index 1a2db05..e9affc8 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 sensor_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_dialog_init(void);
-int check_reg(u32 reg);
-struct pmic *get_pmic(void);
+int pmic_init(unsigned char bus);
+int pmic_dialog_init(unsigned char bus);
+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] 31+ messages in thread

* [U-Boot] [PATCH v7 05/26] pmic: Introduce power_init_board() method at ./lib/board.c file
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (3 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 04/26] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 06/26] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
                   ` (22 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 UTC (permalink / raw)
  To: u-boot

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

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 power_init_board function is a weak function with default implementation.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes for v2:
- None
Changes for v3:
- rename power_board_init to power_init_board
- power_init_board() defined as __weak function with default implementation
- CONFIG_POWER_INIT flag removed since it is not needed
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 arch/arm/lib/board.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 92cad9a..22a4d9c 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -224,6 +224,13 @@ int __arch_cpu_init(void)
 int arch_cpu_init(void)
 	__attribute__((weak, alias("__arch_cpu_init")));
 
+int __power_init_board(void)
+{
+	return 0;
+}
+int power_init_board(void)
+	__attribute__((weak, alias("__power_init_board")));
+
 init_fnc_t *init_sequence[] = {
 	arch_cpu_init,		/* basic arch cpu dependent setup */
 
@@ -525,6 +532,7 @@ void board_init_r(gd_t *id, ulong dest_addr)
 #ifdef CONFIG_ARCH_EARLY_INIT_R
 	arch_early_init_r();
 #endif
+	power_init_board();
 
 #if !defined(CONFIG_SYS_NO_FLASH)
 	puts("Flash: ");
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 06/26] pmic: Enable power_board_init() support at TRATS
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (4 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 05/26] pmic: Introduce power_init_board() method at ./lib/board.c file Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 07/26] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
                   ` (21 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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>
Cc: Minkyu Kang <mk7.kang@samsung.com>
---
Changes for v2:
- None
Changes for v3:
- Remove CONFIG_POWER_INIT flag
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check pmic_init() return value
---
 board/samsung/trats/trats.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index e0a9890..1fa10ef 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);
 }
 
+int power_init_board(void)
+{
+	int ret;
+
+	ret = pmic_init(I2C_5);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 int dram_init(void)
 {
 	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) +
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 07/26] pmic:chrg: Common information about charger and battery (power_chrg.h)
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (5 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 06/26] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 08/26] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
                   ` (20 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 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] 31+ messages in thread

* [U-Boot] [PATCH v7 08/26] pmic: Move pmic related code to ./drivers/power directory
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (6 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 07/26] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
@ 2012-11-13 13:21 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 09/26] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
                   ` (19 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:21 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
Changes for v3:
- None
Changes for v4:
- Move PMIC related code (max8997.c and max8998.c) to power/pmic
- Define ./power/pmic/libpmic.o library
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 Makefile                                    |    3 +-
 drivers/misc/Makefile                       |    7 ----
 drivers/power/Makefile                      |   12 +++++--
 drivers/power/pmic/Makefile                 |   48 +++++++++++++++++++++++++++
 drivers/{misc => power/pmic}/pmic_max8997.c |    0
 drivers/{misc => power/pmic}/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
 11 files changed, 59 insertions(+), 11 deletions(-)
 create mode 100644 drivers/power/pmic/Makefile
 rename drivers/{misc => power/pmic}/pmic_max8997.c (100%)
 rename drivers/{misc => power/pmic}/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/Makefile b/Makefile
index 9dc89f9..aa8ace8 100644
--- a/Makefile
+++ b/Makefile
@@ -293,7 +293,8 @@ LIBS-y += drivers/net/libnet.o
 LIBS-y += drivers/net/phy/libphy.o
 LIBS-y += drivers/pci/libpci.o
 LIBS-y += drivers/pcmcia/libpcmcia.o
-LIBS-y += drivers/power/libpower.o
+LIBS-y += drivers/power/libpower.o \
+	drivers/power/pmic/libpmic.o
 LIBS-y += drivers/spi/libspi.o
 LIBS-y += drivers/dfu/libdfu.o
 ifeq ($(CPU),mpc83xx)
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..7fc5554 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -23,7 +23,7 @@
 
 include $(TOPDIR)/config.mk
 
-LIB 	:= $(obj)libpower.o
+LIB	:= $(obj)libpower.o
 
 COBJS-$(CONFIG_FTPMU010_POWER)	+= ftpmu010.o
 COBJS-$(CONFIG_TPS6586X_POWER)	+= tps6586x.o
@@ -31,9 +31,15 @@ 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	:= $(COBJS-y)
-SRCS 	:= $(COBJS:.o=.c)
-OBJS 	:= $(addprefix $(obj),$(COBJS))
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
 
 all:	$(LIB)
 
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
new file mode 100644
index 0000000..8ccd6e9
--- /dev/null
+++ b/drivers/power/pmic/Makefile
@@ -0,0 +1,48 @@
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB	:= $(obj)libpmic.o
+
+COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
+COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
+
+COBJS	:= $(COBJS-y)
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
+
+all:	$(LIB)
+
+$(LIB):	$(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+########################################################################
diff --git a/drivers/misc/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c
similarity index 100%
rename from drivers/misc/pmic_max8997.c
rename to drivers/power/pmic/pmic_max8997.c
diff --git a/drivers/misc/pmic_max8998.c b/drivers/power/pmic/pmic_max8998.c
similarity index 100%
rename from drivers/misc/pmic_max8998.c
rename to drivers/power/pmic/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] 31+ messages in thread

* [U-Boot] [PATCH v7 09/26] pmic: Extend struct pmic to support battery and charger related operations
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (7 preceding siblings ...)
  2012-11-13 13:21 ` [U-Boot] [PATCH v7 08/26] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 10/26] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
                   ` (18 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- separate power_{battery|chrg|fg} structures to provide battery ops
- struct pmic *parent pointer added
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 include/power/battery.h |   38 ++++++++++++++++++++++++++++++++++++++
 include/power/pmic.h    |   30 +++++++++++++++++++++++++++++-
 2 files changed, 67 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 e9affc8..1ecfc05 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_SENSOR_BYTE_ORDER_LITTLE, PMIC_SENSOR_BYTE_ORDER_BIG, };
@@ -48,6 +49,27 @@ struct p_spi {
 	u32 (*prepare_tx)(u32 reg, u32 *val, u32 write);
 };
 
+struct pmic;
+struct power_fg {
+	int (*fg_battery_check) (struct pmic *p, struct pmic *bat);
+	int (*fg_battery_update) (struct pmic *p, struct pmic *bat);
+};
+
+struct power_chrg {
+	int (*chrg_type) (struct pmic *p);
+	int (*chrg_bat_present) (struct pmic *p);
+	int (*chrg_state) (struct pmic *p, int state, int current);
+};
+
+struct power_battery {
+	struct battery *bat;
+	int (*battery_init) (struct pmic *bat, struct pmic *p1,
+			     struct pmic *p2, struct pmic *p3);
+	int (*battery_charge) (struct pmic *bat);
+	/* Keep info about power devices involved with battery operation */
+	struct pmic *chrg, *fg, *muic;
+};
+
 struct pmic {
 	const char *name;
 	unsigned char bus;
@@ -59,6 +81,12 @@ struct pmic {
 		struct p_spi spi;
 	} hw;
 
+	void (*low_power_mode) (void);
+	struct power_battery *pbat;
+	struct power_chrg *chrg;
+	struct power_fg *fg;
+
+	struct pmic *parent;
 	struct list_head list;
 };
 
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 10/26] pmic:battery: Support for Trats Battery at PMIC framework
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (8 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 09/26] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 11/26] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
                   ` (17 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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.
Changes for v3:
- only battery dependent battery_init method added
- change code according to struct pmic redesign
Changes for v4:
- Adding ./power/battery/Makefile
- Introduce the libbattery.o at Makefile
- Change the state of charge value from 5 to 100
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check pmic_alloc() return value (to prevent NULL pointer dereference)
---
 Makefile                          |    3 +-
 drivers/power/battery/Makefile    |   47 +++++++++++++++++
 drivers/power/battery/bat_trats.c |  100 +++++++++++++++++++++++++++++++++++++
 3 files changed, 149 insertions(+), 1 deletions(-)
 create mode 100644 drivers/power/battery/Makefile
 create mode 100644 drivers/power/battery/bat_trats.c

diff --git a/Makefile b/Makefile
index aa8ace8..2a8a098 100644
--- a/Makefile
+++ b/Makefile
@@ -294,7 +294,8 @@ LIBS-y += drivers/net/phy/libphy.o
 LIBS-y += drivers/pci/libpci.o
 LIBS-y += drivers/pcmcia/libpcmcia.o
 LIBS-y += drivers/power/libpower.o \
-	drivers/power/pmic/libpmic.o
+	drivers/power/pmic/libpmic.o \
+	drivers/power/battery/libbattery.o
 LIBS-y += drivers/spi/libspi.o
 LIBS-y += drivers/dfu/libdfu.o
 ifeq ($(CPU),mpc83xx)
diff --git a/drivers/power/battery/Makefile b/drivers/power/battery/Makefile
new file mode 100644
index 0000000..b176701
--- /dev/null
+++ b/drivers/power/battery/Makefile
@@ -0,0 +1,47 @@
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB	:= $(obj)libbattery.o
+
+COBJS-$(CONFIG_POWER_BATTERY_TRATS) += bat_trats.o
+
+COBJS	:= $(COBJS-y)
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
+
+all:	$(LIB)
+
+$(LIB):	$(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+########################################################################
diff --git a/drivers/power/battery/bat_trats.c b/drivers/power/battery/bat_trats.c
new file mode 100644
index 0000000..ca0d214
--- /dev/null
+++ b/drivers/power/battery/bat_trats.c
@@ -0,0 +1,100 @@
+/*
+ *  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>
+#include <errno.h>
+
+static struct battery battery_trats;
+
+static int power_battery_charge(struct pmic *bat)
+{
+	struct power_battery *p_bat = bat->pbat;
+	struct battery *battery = p_bat->bat;
+	int k;
+
+	if (bat->chrg->chrg_state(p_bat->chrg, CHARGER_ENABLE, 450))
+		return -1;
+
+	for (k = 0; bat->chrg->chrg_bat_present(p_bat->chrg) &&
+		     bat->chrg->chrg_type(p_bat->muic) &&
+		     battery->state_of_chrg < 100; k++) {
+		udelay(10000000);
+		puts(".");
+		bat->fg->fg_battery_update(p_bat->fg, bat);
+
+		if (k == 100) {
+			debug(" %d [V]", battery->voltage_uV);
+			puts("\n");
+			k = 0;
+		}
+
+	}
+
+	bat->chrg->chrg_state(p_bat->chrg, CHARGER_DISABLE, 0);
+
+	return 0;
+}
+
+static int power_battery_init_trats(struct pmic *bat_,
+				    struct pmic *fg_,
+				    struct pmic *chrg_,
+				    struct pmic *muic_)
+{
+	bat_->pbat->fg = fg_;
+	bat_->pbat->chrg = chrg_;
+	bat_->pbat->muic = muic_;
+
+	bat_->fg = fg_->fg;
+	bat_->chrg = chrg_->chrg;
+	bat_->chrg->chrg_type = muic_->chrg->chrg_type;
+	return 0;
+}
+
+static struct power_battery power_bat_trats = {
+	.bat = &battery_trats,
+	.battery_init = power_battery_init_trats,
+	.battery_charge = power_battery_charge,
+};
+
+int power_bat_init(unsigned char bus)
+{
+	static const char name[] = "BAT_TRATS";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
+
+	debug("Board BAT init\n");
+
+	p->interface = PMIC_NONE;
+	p->name = name;
+	p->bus = bus;
+
+	p->pbat = &power_bat_trats;
+	return 0;
+}
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 11/26] pmic:muic: Support for MUIC built into MAX8997 device
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (9 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 10/26] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 12/26] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
                   ` (16 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- change code according to struct pmic redesign
Changes for v4:
- Move muic code to ./drivers/power/pmic directory
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check pmic_alloc() return value (to prevent NULL pointer dereference)
---
 drivers/power/pmic/Makefile       |    1 +
 drivers/power/pmic/muic_max8997.c |   90 +++++++++++++++++++++++++++++++++++++
 include/power/max8997_muic.h      |   61 +++++++++++++++++++++++++
 3 files changed, 152 insertions(+), 0 deletions(-)
 create mode 100644 drivers/power/pmic/muic_max8997.c
 create mode 100644 include/power/max8997_muic.h

diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index 8ccd6e9..9b71e55 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -27,6 +27,7 @@ LIB	:= $(obj)libpmic.o
 
 COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
 COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
+COBJS-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/power/pmic/muic_max8997.c b/drivers/power/pmic/muic_max8997.c
new file mode 100644
index 0000000..d5095c8
--- /dev/null
+++ b/drivers/power/pmic/muic_max8997.c
@@ -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
+ */
+
+#include <common.h>
+#include <power/pmic.h>
+#include <power/power_chrg.h>
+#include <power/max8997_muic.h>
+#include <i2c.h>
+#include <errno.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 struct power_chrg power_chrg_muic_ops = {
+	.chrg_type = power_chrg_get_type,
+};
+
+int power_muic_init(unsigned int bus)
+{
+	static const char name[] = "MAX8997_MUIC";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
+
+	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->chrg = &power_chrg_muic_ops;
+	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] 31+ messages in thread

* [U-Boot] [PATCH v7 12/26] pmic:fuel-gauge: Support for MAX17042 fuel-gauge
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (10 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 11/26] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 13/26] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
                   ` (15 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- change code according to struct pmic redesign
Changes for v4:
- Introduce libfuel_gauge.o at ./Makefile
- Move fg_max17042.c file to ./drivers/power/fuel_gauge directory
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check pmic_alloc() return value (to prevent NULL pointer dereference)
---
 Makefile                               |    1 +
 drivers/power/fuel_gauge/Makefile      |   47 ++++++
 drivers/power/fuel_gauge/fg_max17042.c |  250 ++++++++++++++++++++++++++++++++
 include/power/fg_battery_cell_params.h |   90 ++++++++++++
 include/power/max17042_fg.h            |   74 ++++++++++
 5 files changed, 462 insertions(+), 0 deletions(-)
 create mode 100644 drivers/power/fuel_gauge/Makefile
 create mode 100644 drivers/power/fuel_gauge/fg_max17042.c
 create mode 100644 include/power/fg_battery_cell_params.h
 create mode 100644 include/power/max17042_fg.h

diff --git a/Makefile b/Makefile
index 2a8a098..5336531 100644
--- a/Makefile
+++ b/Makefile
@@ -294,6 +294,7 @@ LIBS-y += drivers/net/phy/libphy.o
 LIBS-y += drivers/pci/libpci.o
 LIBS-y += drivers/pcmcia/libpcmcia.o
 LIBS-y += drivers/power/libpower.o \
+	drivers/power/fuel_gauge/libfuel_gauge.o \
 	drivers/power/pmic/libpmic.o \
 	drivers/power/battery/libbattery.o
 LIBS-y += drivers/spi/libspi.o
diff --git a/drivers/power/fuel_gauge/Makefile b/drivers/power/fuel_gauge/Makefile
new file mode 100644
index 0000000..da15414
--- /dev/null
+++ b/drivers/power/fuel_gauge/Makefile
@@ -0,0 +1,47 @@
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB	:= $(obj)libfuel_gauge.o
+
+COBJS-$(CONFIG_POWER_FG_MAX17042) += fg_max17042.o
+
+COBJS	:= $(COBJS-y)
+SRCS	:= $(COBJS:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS))
+
+all:	$(LIB)
+
+$(LIB):	$(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+########################################################################
diff --git a/drivers/power/fuel_gauge/fg_max17042.c b/drivers/power/fuel_gauge/fg_max17042.c
new file mode 100644
index 0000000..9b7c184
--- /dev/null
+++ b/drivers/power/fuel_gauge/fg_max17042.c
@@ -0,0 +1,250 @@
+/*
+ *  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>
+#include <errno.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->pbat;
+	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->pbat;
+	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 struct power_fg power_fg_ops = {
+	.fg_battery_check = power_check_battery,
+	.fg_battery_update = power_update_battery,
+};
+
+int power_fg_init(unsigned char bus)
+{
+	static const char name[] = "MAX17042_FG";
+	struct pmic *p = pmic_alloc();
+
+	if (!p) {
+		printf("%s: POWER allocation error!\n", __func__);
+		return -ENOMEM;
+	}
+
+	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->sensor_byte_order = PMIC_SENSOR_BYTE_ORDER_BIG;
+	p->bus = bus;
+
+	p->fg = &power_fg_ops;
+	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] 31+ messages in thread

* [U-Boot] [PATCH v7 13/26] pmic:max8997: Function for calculating LDO internal register value
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (11 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 12/26] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 14/26] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
                   ` (14 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 drivers/power/pmic/pmic_max8997.c |   16 ++++++++++++++++
 include/power/max8997_pmic.h      |    2 ++
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/drivers/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c
index 7fe1b53..2e46884 100644
--- a/drivers/power/pmic/pmic_max8997.c
+++ b/drivers/power/pmic/pmic_max8997.c
@@ -27,6 +27,22 @@
 #include <i2c.h>
 #include <errno.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)
 {
 	static const char name[] = "MAX8997_PMIC";
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] 31+ messages in thread

* [U-Boot] [PATCH v7 14/26] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (12 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 13/26] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 15/26] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
                   ` (13 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check return value from pmic_init_max8997() function
---
 board/samsung/trats/trats.c  |  151 ++++++++++++++++++++++++++++++++++++++++++
 include/power/max8997_pmic.h |    9 +++
 2 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 1fa10ef..ebbc7ab 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -86,11 +86,162 @@ 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;
+}
+
 int power_init_board(void)
 {
 	int ret;
 
 	ret = pmic_init(I2C_5);
+	ret |= pmic_init_max8997();
+
 	if (ret)
 		return ret;
 
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] 31+ messages in thread

* [U-Boot] [PATCH v7 15/26] arm:trats:pmic: Enable MUIC (MAX8997) at Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (13 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 14/26] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 16/26] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
                   ` (12 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check return value of power_muic_init() function
---
 board/samsung/trats/trats.c |    3 ++-
 include/configs/trats.h     |    2 ++
 2 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index ebbc7ab..2359a99 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"
 
@@ -241,7 +242,7 @@ int power_init_board(void)
 
 	ret = pmic_init(I2C_5);
 	ret |= pmic_init_max8997();
-
+	ret |= power_muic_init(I2C_5);
 	if (ret)
 		return ret;
 
diff --git a/include/configs/trats.h b/include/configs/trats.h
index d7808aa..74c4a23 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -238,6 +238,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] 31+ messages in thread

* [U-Boot] [PATCH v7 16/26] arm:trats:pmic: Enable fuel-gauge (MAX17042) at Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (14 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 15/26] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 17/26] arm:trats:pmic: Enable battery support " Lukasz Majewski
                   ` (11 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check return value from power_fg_init()
---
 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 2359a99..6c2f199 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"
 
@@ -242,6 +243,7 @@ int power_init_board(void)
 
 	ret = pmic_init(I2C_5);
 	ret |= pmic_init_max8997();
+	ret |= power_fg_init(I2C_9);
 	ret |= power_muic_init(I2C_5);
 	if (ret)
 		return ret;
diff --git a/include/configs/trats.h b/include/configs/trats.h
index 74c4a23..0bc1f3a 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -238,6 +238,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] 31+ messages in thread

* [U-Boot] [PATCH v7 17/26] arm:trats:pmic: Enable battery support at Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (15 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 16/26] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 18/26] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
                   ` (10 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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.
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check return value of power_bat_init() function
---
 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 6c2f199..94bf5c0 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"
@@ -245,6 +246,7 @@ int power_init_board(void)
 	ret |= pmic_init_max8997();
 	ret |= power_fg_init(I2C_9);
 	ret |= power_muic_init(I2C_5);
+	ret |= power_bat_init(0);
 	if (ret)
 		return ret;
 
diff --git a/include/configs/trats.h b/include/configs/trats.h
index 0bc1f3a..2fdc597 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -242,6 +242,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] 31+ messages in thread

* [U-Boot] [PATCH v7 18/26] pmic:max8997: Support for MAX8997 internal charger control
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (16 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 17/26] arm:trats:pmic: Enable battery support " Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 19/26] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
                   ` (9 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- change code according to struct pmic redesign
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 drivers/power/pmic/pmic_max8997.c |   59 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/drivers/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c
index 2e46884..4e5c6d6 100644
--- a/drivers/power/pmic/pmic_max8997.c
+++ b/drivers/power/pmic/pmic_max8997.c
@@ -43,6 +43,62 @@ 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 struct power_chrg power_chrg_pmic_ops = {
+	.chrg_bat_present = pmic_charger_bat_present,
+	.chrg_state = pmic_charger_state,
+};
+
 int pmic_init(unsigned char bus)
 {
 	static const char name[] = "MAX8997_PMIC";
@@ -53,7 +109,7 @@ int pmic_init(unsigned char bus)
 		return -ENOMEM;
 	}
 
-	puts("Board PMIC init\n");
+	debug("Board PMIC init\n");
 
 	p->name = name;
 	p->interface = PMIC_I2C;
@@ -62,5 +118,6 @@ int pmic_init(unsigned char bus)
 	p->hw.i2c.tx_num = 1;
 	p->bus = bus;
 
+	p->chrg = &power_chrg_pmic_ops;
 	return 0;
 }
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 19/26] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (17 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 18/26] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 20/26] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
                   ` (8 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- None
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- Explanation of a magic numbers (APLL, CLOCK)
Changes for v7:
- None
---
 board/samsung/trats/trats.c |   58 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 94bf5c0..226b529 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -89,6 +89,64 @@ 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 */
+	/* LOCAL_PWR_CFG [1:0] 0x3 EN, 0x0 DIS */
+	writel(0x0, &pwr->arm_core1_configuration);
+
+	/* Change the APLL frequency */
+	/* ENABLE (1 enable) | LOCKED (1 locked)  */
+	/* [31]              | [29]               */
+	/* FSEL      | MDIV          | PDIV            | SDIV */
+	/* [27]      | [25:16]       | [13:8]          | [2:0]      */
+	writel(0xa0c80604, &clk->apll_con0);
+
+	/* Change CPU0 clock divider */
+	/* CORE2_RATIO  | APLL_RATIO   | PCLK_DBG_RATIO | ATB_RATIO  */
+	/* [30:28]      | [26:24]      | [22:20]        | [18:16]    */
+	/* PERIPH_RATIO | COREM1_RATIO | COREM0_RATIO   | CORE_RATIO */
+	/* [14:12]      | [10:8]       | [6:4]          | [2:0]      */
+	writel(0x00000100, &clk->div_cpu0);
+
+	/* CLK_DIV_STAT_CPU0 - wait until clock gets stable (0 = stable) */
+	while (readl(&clk->div_stat_cpu0) & 0x1111111)
+		continue;
+
+	/* Change clock divider ratio for DMC */
+	/* DMCP_RATIO                  | DMCD_RATIO  */
+	/* [22:20]                     | [18:16]     */
+	/* DMC_RATIO | DPHY_RATIO | ACP_PCLK_RATIO   | ACP_RATIO */
+	/* [14:12]   | [10:8]     | [6:4]            | [2:0]     */
+	writel(0x13113117, &clk->div_dmc0);
+
+	/* CLK_DIV_STAT_DMC0 - wait until clock gets stable (0 = stable) */
+	while (readl(&clk->div_stat_dmc0) & 0x11111111)
+		continue;
+
+	/* 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] 31+ messages in thread

* [U-Boot] [PATCH v7 20/26] arm:trats:pmic: Support for charging battery at Samsung's TRATS board
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (18 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 19/26] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 21/26] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski
                   ` (7 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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
Changes for v3:
- change code according to struct pmic redesign
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- Code indentation improvement
Changes for v7:
- Check return value from pmic_get()
---
 board/samsung/trats/trats.c |   49 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c
index 226b529..e540190 100644
--- a/board/samsung/trats/trats.c
+++ b/board/samsung/trats/trats.c
@@ -298,7 +298,9 @@ static int pmic_init_max8997(void)
 
 int power_init_board(void)
 {
-	int ret;
+	int chrg, ret;
+	struct power_battery *pb;
+	struct pmic *p_fg, *p_chrg, *p_muic, *p_bat;
 
 	ret = pmic_init(I2C_5);
 	ret |= pmic_init_max8997();
@@ -308,6 +310,51 @@ int power_init_board(void)
 	if (ret)
 		return ret;
 
+	p_fg = pmic_get("MAX17042_FG");
+	if (!p_fg) {
+		puts("MAX17042_FG: Not found\n");
+		return -ENODEV;
+	}
+
+	p_chrg = pmic_get("MAX8997_PMIC");
+	if (!p_chrg) {
+		puts("MAX8997_PMIC: Not found\n");
+		return -ENODEV;
+	}
+
+	p_muic = pmic_get("MAX8997_MUIC");
+	if (!p_muic) {
+		puts("MAX8997_MUIC: Not found\n");
+		return -ENODEV;
+	}
+
+	p_bat = pmic_get("BAT_TRATS");
+	if (!p_bat) {
+		puts("BAT_TRATS: Not found\n");
+		return -ENODEV;
+	}
+
+	p_fg->parent =  p_bat;
+	p_chrg->parent = p_bat;
+	p_muic->parent = p_bat;
+
+	p_bat->low_power_mode = trats_low_power_mode;
+	p_bat->pbat->battery_init(p_bat, p_fg, p_chrg, p_muic);
+
+	pb = p_bat->pbat;
+	chrg = p_muic->chrg->chrg_type(p_muic);
+	debug("CHARGER TYPE: %d\n", chrg);
+
+	if (!p_chrg->chrg->chrg_bat_present(p_chrg)) {
+		puts("No battery detected\n");
+		return -1;
+	}
+
+	p_fg->fg->fg_battery_check(p_fg, p_bat);
+
+	if (pb->bat->state == CHARGE && chrg == CHARGER_USB)
+		puts("CHARGE Battery !\n");
+
 	return 0;
 }
 
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 21/26] pmic: Extend PMIC framework to support battery related commands
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (19 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 20/26] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 22/26] power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_* files Lukasz Majewski
                   ` (6 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 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.
Changes for v3:
- change code according to struct pmic redesign
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- Check return value from pmic_get()
---
 drivers/power/pmic_core.c |   59 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/drivers/power/pmic_core.c b/drivers/power/pmic_core.c
index 4066b15..90df2c5 100644
--- a/drivers/power/pmic_core.c
+++ b/drivers/power/pmic_core.c
@@ -124,37 +124,47 @@ 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 (!p)
+		return CMD_RET_FAILURE;
+
 	if (strcmp(cmd, "dump") == 0) {
-		p = pmic_get(argv[2]);
-		if (!p)
-			return CMD_RET_FAILURE;
 		if (pmic_dump(p))
 			return CMD_RET_FAILURE;
 		return CMD_RET_SUCCESS;
@@ -165,10 +175,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]);
-		if (!p)
-			return CMD_RET_FAILURE;
-
 		ret = pmic_reg_read(p, reg, &val);
 
 		if (ret)
@@ -185,14 +191,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]);
-		if (!p)
-			return CMD_RET_FAILURE;
 		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->fg->fg_battery_check(p->pbat->fg, p);
+
+		if (strcmp(argv[3], "charge") == 0) {
+			if (p->pbat) {
+				printf("PRINT BAT charge %s\n", p->name);
+				if (p->low_power_mode)
+					p->low_power_mode();
+				if (p->pbat->battery_charge)
+					p->pbat->battery_charge(p);
+			}
+		}
+
+		return CMD_RET_SUCCESS;
+	}
+
 	/* No subcommand found */
 	return CMD_RET_SUCCESS;
 }
@@ -201,7 +224,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] 31+ messages in thread

* [U-Boot] [PATCH v7 22/26] power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_* files
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (20 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 21/26] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 23/26] power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER Lukasz Majewski
                   ` (5 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 UTC (permalink / raw)
  To: u-boot

Rename pmic/power related files at ./drivers/power directory

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 v3:
    - New patch at v3.
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 drivers/power/Makefile                          |   10 +++++-----
 drivers/power/{pmic_core.c => power_core.c}     |    0
 drivers/power/{pmic_dialog.c => power_dialog.c} |    0
 drivers/power/{pmic_fsl.c => power_fsl.c}       |    0
 drivers/power/{pmic_i2c.c => power_i2c.c}       |    0
 drivers/power/{pmic_spi.c => power_spi.c}       |    0
 6 files changed, 5 insertions(+), 5 deletions(-)
 rename drivers/power/{pmic_core.c => power_core.c} (100%)
 rename drivers/power/{pmic_dialog.c => power_dialog.c} (100%)
 rename drivers/power/{pmic_fsl.c => power_fsl.c} (100%)
 rename drivers/power/{pmic_i2c.c => power_i2c.c} (100%)
 rename drivers/power/{pmic_spi.c => power_spi.c} (100%)

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 7fc5554..7733e01 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -31,11 +31,11 @@ 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) += power_core.o
+COBJS-$(CONFIG_DIALOG_PMIC) += power_dialog.o
+COBJS-$(CONFIG_PMIC_FSL) += power_fsl.o
+COBJS-$(CONFIG_PMIC_I2C) += power_i2c.o
+COBJS-$(CONFIG_PMIC_SPI) += power_spi.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/power/pmic_core.c b/drivers/power/power_core.c
similarity index 100%
rename from drivers/power/pmic_core.c
rename to drivers/power/power_core.c
diff --git a/drivers/power/pmic_dialog.c b/drivers/power/power_dialog.c
similarity index 100%
rename from drivers/power/pmic_dialog.c
rename to drivers/power/power_dialog.c
diff --git a/drivers/power/pmic_fsl.c b/drivers/power/power_fsl.c
similarity index 100%
rename from drivers/power/pmic_fsl.c
rename to drivers/power/power_fsl.c
diff --git a/drivers/power/pmic_i2c.c b/drivers/power/power_i2c.c
similarity index 100%
rename from drivers/power/pmic_i2c.c
rename to drivers/power/power_i2c.c
diff --git a/drivers/power/pmic_spi.c b/drivers/power/power_spi.c
similarity index 100%
rename from drivers/power/pmic_spi.c
rename to drivers/power/power_spi.c
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 23/26] power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (21 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 22/26] power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_* files Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 24/26] power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER Lukasz Majewski
                   ` (4 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 UTC (permalink / raw)
  To: u-boot

Rename all CONFIG_PMIC* defines to CONFIG_POWER*

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 v3:
- New patch at v3.
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 board/samsung/goni/goni.c                |    2 +-
 board/samsung/universal_c210/universal.c |    2 +-
 drivers/power/Makefile                   |    8 ++++----
 drivers/power/pmic/Makefile              |    4 ++--
 drivers/power/power_fsl.c                |    8 ++++----
 include/configs/imx31_litekit.h          |    6 +++---
 include/configs/mx31ads.h                |    6 +++---
 include/configs/mx31pdk.h                |    6 +++---
 include/configs/mx35pdk.h                |    6 +++---
 include/configs/mx51_efikamx.h           |    6 +++---
 include/configs/mx51evk.h                |    6 +++---
 include/configs/mx53evk.h                |    6 +++---
 include/configs/mx53loco.h               |    6 +++---
 include/configs/qong.h                   |    6 +++---
 include/configs/s5p_goni.h               |    6 +++---
 include/configs/s5pc210_universal.h      |    6 +++---
 include/configs/trats.h                  |    6 +++---
 include/configs/tt01.h                   |    6 +++---
 include/configs/vision2.h                |    6 +++---
 19 files changed, 54 insertions(+), 54 deletions(-)

diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c
index 71ed618..50e9210 100644
--- a/board/samsung/goni/goni.c
+++ b/board/samsung/goni/goni.c
@@ -41,7 +41,7 @@ int board_init(void)
 	gd->bd->bi_arch_number = MACH_TYPE_GONI;
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
-#if defined(CONFIG_PMIC)
+#if defined(CONFIG_POWER)
 	pmic_init(I2C_5);
 #endif
 
diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c
index c4950dd..9849c6d 100644
--- a/board/samsung/universal_c210/universal.c
+++ b/board/samsung/universal_c210/universal.c
@@ -58,7 +58,7 @@ int board_init(void)
 	gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
-#if defined(CONFIG_PMIC)
+#if defined(CONFIG_POWER)
 	pmic_init(I2C_5);
 #endif
 
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 7733e01..2723724 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -31,11 +31,11 @@ COBJS-$(CONFIG_TWL4030_POWER)	+= twl4030.o
 COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o
 COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o
 
-COBJS-$(CONFIG_PMIC) += power_core.o
+COBJS-$(CONFIG_POWER) += power_core.o
 COBJS-$(CONFIG_DIALOG_PMIC) += power_dialog.o
-COBJS-$(CONFIG_PMIC_FSL) += power_fsl.o
-COBJS-$(CONFIG_PMIC_I2C) += power_i2c.o
-COBJS-$(CONFIG_PMIC_SPI) += power_spi.o
+COBJS-$(CONFIG_POWER_FSL) += power_fsl.o
+COBJS-$(CONFIG_POWER_I2C) += power_i2c.o
+COBJS-$(CONFIG_POWER_SPI) += power_spi.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index 9b71e55..e19a9a8 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -25,8 +25,8 @@ include $(TOPDIR)/config.mk
 
 LIB	:= $(obj)libpmic.o
 
-COBJS-$(CONFIG_PMIC_MAX8998) += pmic_max8998.o
-COBJS-$(CONFIG_PMIC_MAX8997) += pmic_max8997.o
+COBJS-$(CONFIG_POWER_MAX8998) += pmic_max8998.o
+COBJS-$(CONFIG_POWER_MAX8997) += pmic_max8997.o
 COBJS-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o
 
 COBJS	:= $(COBJS-y)
diff --git a/drivers/power/power_fsl.c b/drivers/power/power_fsl.c
index 0275fd9..651f88f 100644
--- a/drivers/power/power_fsl.c
+++ b/drivers/power/power_fsl.c
@@ -27,7 +27,7 @@
 #include <fsl_pmic.h>
 #include <errno.h>
 
-#if defined(CONFIG_PMIC_SPI)
+#if defined(CONFIG_POWER_SPI)
 static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)
 {
 	return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF);
@@ -47,7 +47,7 @@ int pmic_init(unsigned char bus)
 	p->name = name;
 	p->number_of_regs = PMIC_NUM_OF_REGS;
 
-#if defined(CONFIG_PMIC_SPI)
+#if defined(CONFIG_POWER_SPI)
 	p->interface = PMIC_SPI;
 	p->bus = CONFIG_FSL_PMIC_BUS;
 	p->hw.spi.cs = CONFIG_FSL_PMIC_CS;
@@ -56,13 +56,13 @@ int pmic_init(unsigned char bus)
 	p->hw.spi.bitlen = CONFIG_FSL_PMIC_BITLEN;
 	p->hw.spi.flags = SPI_XFER_BEGIN | SPI_XFER_END;
 	p->hw.spi.prepare_tx = pmic_spi_prepare_tx;
-#elif defined(CONFIG_PMIC_I2C)
+#elif defined(CONFIG_POWER_I2C)
 	p->interface = PMIC_I2C;
 	p->hw.i2c.addr = CONFIG_SYS_FSL_PMIC_I2C_ADDR;
 	p->hw.i2c.tx_num = 3;
 	p->bus = bus;
 #else
-#error "You must select CONFIG_PMIC_SPI or CONFIG_PMIC_I2C"
+#error "You must select CONFIG_POWER_SPI or CONFIG_PMIC_I2C"
 #endif
 
 	return 0;
diff --git a/include/configs/imx31_litekit.h b/include/configs/imx31_litekit.h
index 6ae764a..8fc3942 100644
--- a/include/configs/imx31_litekit.h
+++ b/include/configs/imx31_litekit.h
@@ -72,9 +72,9 @@
 #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	1
 #define CONFIG_FSL_PMIC_CS	0
 #define CONFIG_FSL_PMIC_CLK	1000000
diff --git a/include/configs/mx31ads.h b/include/configs/mx31ads.h
index 9d9f4a7..9e4006b4 100644
--- a/include/configs/mx31ads.h
+++ b/include/configs/mx31ads.h
@@ -68,9 +68,9 @@
 #define CONFIG_MXC_GPIO
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	1
 #define CONFIG_FSL_PMIC_CS	0
 #define CONFIG_FSL_PMIC_CLK	1000000
diff --git a/include/configs/mx31pdk.h b/include/configs/mx31pdk.h
index 223b5b0..3b86c9e 100644
--- a/include/configs/mx31pdk.h
+++ b/include/configs/mx31pdk.h
@@ -69,9 +69,9 @@
 #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	1
 #define CONFIG_FSL_PMIC_CS	2
 #define CONFIG_FSL_PMIC_CLK	1000000
diff --git a/include/configs/mx35pdk.h b/include/configs/mx35pdk.h
index 826c912..342d53f 100644
--- a/include/configs/mx35pdk.h
+++ b/include/configs/mx35pdk.h
@@ -65,9 +65,9 @@
 /*
  * PMIC Configs
  */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_FSL
 #define CONFIG_SYS_FSL_PMIC_I2C_ADDR	0x08
 #define CONFIG_RTC_MC13XXX
 
diff --git a/include/configs/mx51_efikamx.h b/include/configs/mx51_efikamx.h
index ffe771f..3c1c056 100644
--- a/include/configs/mx51_efikamx.h
+++ b/include/configs/mx51_efikamx.h
@@ -127,9 +127,9 @@
 #endif
 
 /* SPI PMIC */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS		0
 #define CONFIG_FSL_PMIC_CS		(0 | 120 << 8)
 #define CONFIG_FSL_PMIC_CLK		25000000
diff --git a/include/configs/mx51evk.h b/include/configs/mx51evk.h
index 225d359..f00cec2 100644
--- a/include/configs/mx51evk.h
+++ b/include/configs/mx51evk.h
@@ -69,9 +69,9 @@
 #define CONFIG_MXC_SPI
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	0
 #define CONFIG_FSL_PMIC_CS	0
 #define CONFIG_FSL_PMIC_CLK	2500000
diff --git a/include/configs/mx53evk.h b/include/configs/mx53evk.h
index d1f684c..1916b85 100644
--- a/include/configs/mx53evk.h
+++ b/include/configs/mx53evk.h
@@ -55,9 +55,9 @@
 #define CONFIG_SYS_I2C_SPEED            100000
 
 /* PMIC Configs */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_FSL
 #define CONFIG_SYS_FSL_PMIC_I2C_ADDR    8
 #define CONFIG_RTC_MC13XXX
 
diff --git a/include/configs/mx53loco.h b/include/configs/mx53loco.h
index a1b27ce..d16de33 100644
--- a/include/configs/mx53loco.h
+++ b/include/configs/mx53loco.h
@@ -89,10 +89,10 @@
 #define CONFIG_SYS_I2C_SPEED		100000
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
 #define CONFIG_DIALOG_PMIC
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER_FSL
 #define CONFIG_SYS_DIALOG_PMIC_I2C_ADDR	0x48
 #define CONFIG_SYS_FSL_PMIC_I2C_ADDR	0x8
 
diff --git a/include/configs/qong.h b/include/configs/qong.h
index e43a021..d9bf201 100644
--- a/include/configs/qong.h
+++ b/include/configs/qong.h
@@ -58,9 +58,9 @@
 #define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_0 | SPI_CS_HIGH)
 #define CONFIG_RTC_MC13XXX
 
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	1
 #define CONFIG_FSL_PMIC_CS	0
 #define CONFIG_FSL_PMIC_CLK	100000
diff --git a/include/configs/s5p_goni.h b/include/configs/s5p_goni.h
index 7e0b302..56e8347 100644
--- a/include/configs/s5p_goni.h
+++ b/include/configs/s5p_goni.h
@@ -215,9 +215,9 @@
 
 #define CONFIG_SYS_CACHELINE_SIZE       64
 
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_MAX8998
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_MAX8998
 
 #include <asm/arch/gpio.h>
 /*
diff --git a/include/configs/s5pc210_universal.h b/include/configs/s5pc210_universal.h
index 5fc6136..894f38b 100644
--- a/include/configs/s5pc210_universal.h
+++ b/include/configs/s5pc210_universal.h
@@ -253,9 +253,9 @@
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_MAX_I2C_BUS	7
 
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_MAX8998
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_MAX8998
 
 #define CONFIG_USB_GADGET
 #define CONFIG_USB_GADGET_S3C_UDC_OTG
diff --git a/include/configs/trats.h b/include/configs/trats.h
index 2fdc597..355029e 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -234,9 +234,9 @@
 #define CONFIG_SOFT_I2C_GPIO_SDA get_multi_sda_pin()
 #define I2C_INIT multi_i2c_init()
 
-#define CONFIG_PMIC
-#define CONFIG_PMIC_I2C
-#define CONFIG_PMIC_MAX8997
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_MAX8997
 
 #define CONFIG_POWER_FG
 #define CONFIG_POWER_FG_MAX17042
diff --git a/include/configs/tt01.h b/include/configs/tt01.h
index f46efa5..9f8f240 100644
--- a/include/configs/tt01.h
+++ b/include/configs/tt01.h
@@ -149,9 +149,9 @@
 #define CONFIG_MXC_GPIO
 
 /* MC13783 connected to CSPI3 and SS0 */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 
 #define CONFIG_FSL_PMIC_BUS		2
 #define CONFIG_FSL_PMIC_CS		0
diff --git a/include/configs/vision2.h b/include/configs/vision2.h
index 848df88..a72010f 100644
--- a/include/configs/vision2.h
+++ b/include/configs/vision2.h
@@ -87,9 +87,9 @@
 #define CONFIG_ENV_IS_IN_SPI_FLASH
 
 /* PMIC Controller */
-#define CONFIG_PMIC
-#define CONFIG_PMIC_SPI
-#define CONFIG_PMIC_FSL
+#define CONFIG_POWER
+#define CONFIG_POWER_SPI
+#define CONFIG_POWER_FSL
 #define CONFIG_FSL_PMIC_BUS	0
 #define CONFIG_FSL_PMIC_CS	0
 #define CONFIG_FSL_PMIC_CLK	2500000
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 24/26] power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (22 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 23/26] power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 25/26] arm:goni:pmic: Adjust GONI target platform board to new PMIC framework Lukasz Majewski
                   ` (3 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 UTC (permalink / raw)
  To: u-boot

Rename CONFIG_DIALOG_PMIC to CONFIG_DIALOG_POWER

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 v3:
- New patch at v3.
Changes for v4:
- None
Changes for v5:
- None
Changes for v6:
- None
Changes for v7:
- None
---
 drivers/power/Makefile     |    2 +-
 include/configs/mx53loco.h |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 2723724..8c71901 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -32,7 +32,7 @@ COBJS-$(CONFIG_TWL6030_POWER)	+= twl6030.o
 COBJS-$(CONFIG_TWL6035_POWER)	+= twl6035.o
 
 COBJS-$(CONFIG_POWER) += power_core.o
-COBJS-$(CONFIG_DIALOG_PMIC) += power_dialog.o
+COBJS-$(CONFIG_DIALOG_POWER) += power_dialog.o
 COBJS-$(CONFIG_POWER_FSL) += power_fsl.o
 COBJS-$(CONFIG_POWER_I2C) += power_i2c.o
 COBJS-$(CONFIG_POWER_SPI) += power_spi.o
diff --git a/include/configs/mx53loco.h b/include/configs/mx53loco.h
index d16de33..a110176 100644
--- a/include/configs/mx53loco.h
+++ b/include/configs/mx53loco.h
@@ -91,7 +91,7 @@
 /* PMIC Controller */
 #define CONFIG_POWER
 #define CONFIG_POWER_I2C
-#define CONFIG_DIALOG_PMIC
+#define CONFIG_DIALOG_POWER
 #define CONFIG_POWER_FSL
 #define CONFIG_SYS_DIALOG_PMIC_I2C_ADDR	0x48
 #define CONFIG_SYS_FSL_PMIC_I2C_ADDR	0x8
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 25/26] arm:goni:pmic: Adjust GONI target platform board to new PMIC framework
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (23 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 24/26] power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 26/26] arm:universal_c210:pmic: Adjust C210 Universal " Lukasz Majewski
                   ` (2 subsequent siblings)
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 UTC (permalink / raw)
  To: u-boot

Move pmic_init() function call from board_init() to power_init_board()
to work with new PMIC/POWER framework.

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 v5:
- New patch at v5.
Changes for v6:
- None
Changes for v7:
- Check pmic_init() return value
---
 board/samsung/goni/goni.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c
index 50e9210..ff76963 100644
--- a/board/samsung/goni/goni.c
+++ b/board/samsung/goni/goni.c
@@ -41,9 +41,16 @@ int board_init(void)
 	gd->bd->bi_arch_number = MACH_TYPE_GONI;
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
-#if defined(CONFIG_POWER)
-	pmic_init(I2C_5);
-#endif
+	return 0;
+}
+
+int power_init_board(void)
+{
+	int ret;
+
+	ret = pmic_init(I2C_5);
+	if (ret)
+		return ret;
 
 	return 0;
 }
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 26/26] arm:universal_c210:pmic: Adjust C210 Universal target platform board to new PMIC framework
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (24 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 25/26] arm:goni:pmic: Adjust GONI target platform board to new PMIC framework Lukasz Majewski
@ 2012-11-13 13:22 ` Lukasz Majewski
  2012-11-14 10:32 ` [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Anatolij Gustschin
  2014-04-07 12:34 ` [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework Lukasz Majewski
  27 siblings, 0 replies; 31+ messages in thread
From: Lukasz Majewski @ 2012-11-13 13:22 UTC (permalink / raw)
  To: u-boot

Move pmic_init() function call from board_init() to power_init_board()
to work with new PMIC/POWER framework.

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 v5:
- New patch at v5.
Changes for v6:
- None
Changes for v7:
- Check pmic_init() return value
---
 board/samsung/universal_c210/universal.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c
index 9849c6d..36a0472 100644
--- a/board/samsung/universal_c210/universal.c
+++ b/board/samsung/universal_c210/universal.c
@@ -58,16 +58,23 @@ int board_init(void)
 	gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;
 	gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 
-#if defined(CONFIG_POWER)
-	pmic_init(I2C_5);
-#endif
-
 	check_hw_revision();
 	printf("HW Revision:\t0x%x\n", board_rev);
 
 	return 0;
 }
 
+int power_init_board(void)
+{
+	int ret;
+
+	ret = pmic_init(I2C_5);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 int dram_init(void)
 {
 	gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) +
-- 
1.7.2.3

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

* [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (25 preceding siblings ...)
  2012-11-13 13:22 ` [U-Boot] [PATCH v7 26/26] arm:universal_c210:pmic: Adjust C210 Universal " Lukasz Majewski
@ 2012-11-14 10:32 ` Anatolij Gustschin
  2014-04-07 12:34 ` [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework Lukasz Majewski
  27 siblings, 0 replies; 31+ messages in thread
From: Anatolij Gustschin @ 2012-11-14 10:32 UTC (permalink / raw)
  To: u-boot

Hi,

On Tue, 13 Nov 2012 14:21:51 +0100
Lukasz Majewski <l.majewski@samsung.com> wrote:
...
> Lukasz Majewski (26):
>   pmic:i2c: Handle PMIC I2C transmission comprising of two bytes
>   pmic:i2c: Add I2C sensor byte order (big/little) 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_init_board() 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
>   power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_*
>     files
>   power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER
>   power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER
>   arm:goni:pmic: Adjust GONI target platform board to new PMIC
>     framework
>   arm:universal_c210:pmic: Adjust C210 Universal target platform board
>     to new PMIC framework
> 
>  Makefile                                           |    5 +-
>  arch/arm/lib/board.c                               |    8 +
>  board/davedenx/qong/qong.c                         |   12 +-
>  board/freescale/mx31pdk/mx31pdk.c                  |   12 +-
>  board/freescale/mx35pdk/mx35pdk.c                  |   14 +-
>  board/freescale/mx51evk/mx51evk.c                  |   12 +-
>  board/freescale/mx53evk/mx53evk.c                  |   12 +-
>  board/freescale/mx53loco/mx53loco.c                |   21 +-
>  board/genesi/mx51_efikamx/efikamx.c                |   12 +-
>  board/hale/tt01/tt01.c                             |   14 +-
>  board/samsung/goni/goni.c                          |   22 +-
>  board/samsung/trats/trats.c                        |  292 +++++++++++++++++++-
>  board/samsung/universal_c210/universal.c           |   27 ++-
>  board/ttcontrol/vision2/vision2.c                  |   12 +-
>  drivers/misc/Makefile                              |    7 -
>  drivers/misc/pmic_core.c                           |  147 ----------
>  drivers/misc/pmic_i2c.c                            |   98 -------
>  drivers/misc/pmic_max8997.c                        |   43 ---
>  drivers/power/Makefile                             |   12 +-
>  drivers/power/battery/Makefile                     |   47 ++++
>  drivers/power/battery/bat_trats.c                  |  100 +++++++
>  drivers/power/fuel_gauge/Makefile                  |   47 ++++
>  drivers/power/fuel_gauge/fg_max17042.c             |  250 +++++++++++++++++
>  drivers/power/pmic/Makefile                        |   49 ++++
>  drivers/power/pmic/muic_max8997.c                  |   90 ++++++
>  drivers/power/pmic/pmic_max8997.c                  |  123 ++++++++
>  drivers/{misc => power/pmic}/pmic_max8998.c        |   16 +-
>  drivers/power/power_core.c                         |  232 ++++++++++++++++
>  .../{misc/pmic_dialog.c => power/power_dialog.c}   |   14 +-
>  drivers/{misc/pmic_fsl.c => power/power_fsl.c}     |   22 +-
>  drivers/power/power_i2c.c                          |  125 +++++++++
>  drivers/{misc/pmic_spi.c => power/power_spi.c}     |    4 +-
>  drivers/rtc/mc13xxx-rtc.c                          |   10 +-
>  include/configs/imx31_litekit.h                    |    6 +-
>  include/configs/mx31ads.h                          |    6 +-
>  include/configs/mx31pdk.h                          |    6 +-
>  include/configs/mx35pdk.h                          |    6 +-
>  include/configs/mx51_efikamx.h                     |    6 +-
>  include/configs/mx51evk.h                          |    6 +-
>  include/configs/mx53evk.h                          |    6 +-
>  include/configs/mx53loco.h                         |    8 +-
>  include/configs/qong.h                             |    6 +-
>  include/configs/s5p_goni.h                         |    6 +-
>  include/configs/s5pc210_universal.h                |    6 +-
>  include/configs/trats.h                            |   14 +-
>  include/configs/tt01.h                             |    6 +-
>  include/configs/vision2.h                          |    6 +-
>  include/pmic.h                                     |   72 -----
>  include/power/battery.h                            |   38 +++
>  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                               |  109 ++++++++
>  include/power/power_chrg.h                         |   43 +++
>  56 files changed, 2027 insertions(+), 491 deletions(-)
>  delete mode 100644 drivers/misc/pmic_core.c
>  delete mode 100644 drivers/misc/pmic_i2c.c
>  delete mode 100644 drivers/misc/pmic_max8997.c
>  create mode 100644 drivers/power/battery/Makefile
>  create mode 100644 drivers/power/battery/bat_trats.c
>  create mode 100644 drivers/power/fuel_gauge/Makefile
>  create mode 100644 drivers/power/fuel_gauge/fg_max17042.c
>  create mode 100644 drivers/power/pmic/Makefile
>  create mode 100644 drivers/power/pmic/muic_max8997.c
>  create mode 100644 drivers/power/pmic/pmic_max8997.c
>  rename drivers/{misc => power/pmic}/pmic_max8998.c (82%)
>  create mode 100644 drivers/power/power_core.c
>  rename drivers/{misc/pmic_dialog.c => power/power_dialog.c} (81%)
>  rename drivers/{misc/pmic_fsl.c => power/power_fsl.c} (81%)
>  create mode 100644 drivers/power/power_i2c.c
>  rename drivers/{misc/pmic_spi.c => power/power_spi.c} (97%)
>  delete mode 100644 include/pmic.h
>  create mode 100644 include/power/battery.h
>  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
>  create mode 100644 include/power/power_chrg.h

Appied this series to staging/agust at denx.de, thanks!

Anatolij

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

* [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework
  2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
                   ` (26 preceding siblings ...)
  2012-11-14 10:32 ` [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Anatolij Gustschin
@ 2014-04-07 12:34 ` Lukasz Majewski
  2014-04-07 16:08   ` Simon Glass
  2014-04-18 21:01   ` [U-Boot] " Tom Rini
  27 siblings, 2 replies; 31+ messages in thread
From: Lukasz Majewski @ 2014-04-07 12:34 UTC (permalink / raw)
  To: u-boot

Well written documentation for PMIC framework was missing and hence
it has been probably difficult and time consuming for other developers
to understand rationale for key design decisions and overall design
structure.
This commit provides proper documentation entry.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
---
 doc/README.power-framework |  166 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 166 insertions(+)
 create mode 100644 doc/README.power-framework

diff --git a/doc/README.power-framework b/doc/README.power-framework
new file mode 100644
index 0000000..1f6fd43
--- /dev/null
+++ b/doc/README.power-framework
@@ -0,0 +1,166 @@
+#
+# (C) Copyright 2014 Samsung Electronics
+# Lukasz Majewski <l.majewski@samsung.com>
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+Introduction
+------------
+
+This document describes the second version of the u-boot's PMIC (Power
+Management IC) framework. As a reference boards please consider Samsungs' Trats
+and Trats2.
+
+Background
+----------
+
+Boards supported by u-boot are getting increasingly complex. Developers and
+designers strive to cut down power consumption. Hence several different types of
+devices are now available on the board - namely power managers (PMIC), fuel
+gauges (FG), micro USB interface controllers (MUIC), batteries, multi-function
+devices (MFD).
+
+Explanation of key design decisions
+-----------------------------------
+
+One package can integrate PMIC and MUIC with different addresses on the I2C bus.
+The same device - e.g. MAX8997 uses two different I2C busses and addresses.
+
+Power devices use not only I2C for communication, but SPI as well. Additionally
+different ICs use different endianess. For this reason struct pmic holds
+information about I2C/SPI transmission, which is used with generic
+pmic_req_write() function.
+
+The "flat" hierarchy for power devices works well when each device performs only
+one operation - e.g. PMIC enables LDO.
+
+The problem emerges when we have a device (battery) which conceptually shall be
+the master and uses methods exported by other devices. We need to control MUIC
+to start charging the battery, use PMIC to reduce board's overall power
+consumption (by disabling not needed LDOs, BUCKs) and get current state of
+energy on the battery from FG.
+Up till now u-boot doesn't support device model, so a simple one had to be
+added.
+
+The directory hierarchy has following structure:
+./include/power/<device_name>_<device_function>.h
+e.g. ./include/power/max8997_pmic.h
+
+./drivers/power/pmic/power_{core files}.c
+e.g. ./drivers/power/pmic/power_core.c
+
+./drivers/power/pmic/<device_function>/<device_function>_<device_name>.c
+e.g. ./drivers/power/pmic/pmic_max8997.c
+e.g. ./drivers/power/battery/trats/bat_trats.c
+e.g. ./drivers/power/fuel_gauge/fg_max17042.c
+
+The framework classifies devices by their function - separate directories should
+be maintained for different classes of devices.
+
+Current design
+--------------
+
+Everything is a power device described by struct pmic. Even battery is
+considered as a valid power device. This helps for better management of those
+devices.
+
+- Block diagram of the hierarchy:
+			-----------------
+		--------| BAT           |------------
+		|       |               |           |
+		|       -----------------           |
+		|               |                   |
+	       \|/             \|/                 \|/
+	-----------     -----------------       ---------
+	|FG       |     |MUIC           |       |CHRG   |
+	|         |     |               |       |       |
+	-----------     -----------------       ---------
+
+
+1. When hierarchy is not needed (no complex battery charge):
+
+Definition of the struct pmic is only required with proper name and parameters
+for communication. This is enough to use the "pmic" command in the u-boot
+prompt to change values of device's register (enable/disable LDO, BUCK).
+
+The PG, MUIC and CHRG above are regarded to be in the same level in the
+hierarchy.
+
+2. Complex battery charging.
+
+To charge a battery, information from several "abstract" power devices is
+needed (defined at ./include/power/pmic.h):
+- FG device (struct power_fg):
+	     -- *fg_battery_check - check if battery is not above its limits
+	     -- *fg_battery_update - update the pmic framework with current
+				     battery state(voltage and current capacity)
+
+- Charger device (struct power_chrq):
+	     -- *chrg_type - type/capacity of the charger (including information
+			     about USB cable disconnection)
+	     -- *chrg_bat_present - detection if battery to be charged is
+				    present
+	     -- *chrg_state - status of the charger - if it is enabled or
+			      disabled
+
+- Battery device (struct power_battery):
+	     -- *battery_init - assign proper callbacks to be used by top
+				hierarchy battery device
+	     -- *battery_charge - called from "pmic" command, responsible
+				  for performing the charging
+
+Now two batteries are supported; trats and trats2 [*]. Those differ in the way
+how they handle the exact charging. Trats uses polling (MAX8997) and trats2
+relies on the PMIC/MUIC HW completely (MAX77693).
+
+__Example for trats (this can be very different for other board):__
+	     -- *fg_battery_check       -> FG device (fg_max17042.c)
+	     -- *fg_battery_update      -> FG device (fg_max17042.c)
+	     -- *chrg_type              -> MUIC device (muic_max8997.c)
+	     -- *chrg_bat_present       -> PMIC device (pmic_max8997.c)
+	     -- *chrg_state             -> PMIC device (pmic_max8997.c)
+	     -- *battery_init           -> BAT device (bat_trats.c)
+	     -- *battery_charge         -> BAT device (bat_trats.c)
+
+Also the struct pmic holds method (*low_power_mode) for reducing board's
+power consumption when one calls "pmic BAT_TRATS bat charge" command.
+
+How to add a new power device
+-----------------------------
+
+1. Simple device should be added with creation of file
+<pmic_function>_<pmic_name>.c, <pmic_name>_<pmic_function>.h  according to the
+proposed and described above scheme.
+
+Then "pmic" command supports reading/writing/dump of device's internal
+registers.
+
+2. Charging battery with hierarchy
+Define devices as listed at 1.
+
+Define battery file (bat_<board>.c). Please also note that one might need a
+corresponding battery model description for FG.
+
+For points 1 and 2 use a generic function power_init_board() to initialise the
+power framework on your board.
+
+For reference, please look into the trats/trats2 boards.
+
+TO DO list (for PMICv3) - up till v2014.04
+------------------------------------------
+
+1. Description of the devices related to power via device tree is not available.
+This is the main problem when a developer tries to build a multi-boot u-boot
+binary. The best would be to parse the DTS from Linux kernel.
+
+2. To support many instances of the same IC, like two MAX8997, one needs to
+copy the corresponding pmic_max8997.c file with changed name to "MAX8997_PMICX",
+where X is the device number. This problem will be addressed when extended
+pmic_core.c will support storing available devices in a list.
+
+3. Definition of batteries [*] (for trats/trats2) should be excluded from the
+code responsible for charging them and since it in fact describes the charging
+profile it should be put to a separate file.
+
+4. Adjust the framework to work with the device model.
-- 
1.7.10.4

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

* [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework
  2014-04-07 12:34 ` [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework Lukasz Majewski
@ 2014-04-07 16:08   ` Simon Glass
  2014-04-18 21:01   ` [U-Boot] " Tom Rini
  1 sibling, 0 replies; 31+ messages in thread
From: Simon Glass @ 2014-04-07 16:08 UTC (permalink / raw)
  To: u-boot

Hi Lukasz,

On 7 April 2014 06:34, Lukasz Majewski <l.majewski@samsung.com> wrote:

> Well written documentation for PMIC framework was missing and hence
> it has been probably difficult and time consuming for other developers
> to understand rationale for key design decisions and overall design
> structure.
> This commit provides proper documentation entry.
>
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>

Acked-by: Simon Glass <sjg@chromium.org>

But it would be good to say "U-Boot"

Regards,
Simon

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

* [U-Boot] doc:power:pmic: Add doc entry for PMIC(v2) framework
  2014-04-07 12:34 ` [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework Lukasz Majewski
  2014-04-07 16:08   ` Simon Glass
@ 2014-04-18 21:01   ` Tom Rini
  1 sibling, 0 replies; 31+ messages in thread
From: Tom Rini @ 2014-04-18 21:01 UTC (permalink / raw)
  To: u-boot

On Mon, Apr 07, 2014 at 02:34:44PM +0200, ?ukasz Majewski wrote:

> Well written documentation for PMIC framework was missing and hence
> it has been probably difficult and time consuming for other developers
> to understand rationale for key design decisions and overall design
> structure.
> This commit provides proper documentation entry.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Acked-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!

-- 
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/20140418/c2319406/attachment.pgp>

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

end of thread, other threads:[~2014-04-18 21:01 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-13 13:21 [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 01/26] pmic:i2c: Handle PMIC I2C transmission comprising of two bytes Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 02/26] pmic:i2c: Add I2C sensor byte order (big/little) to PMIC framework Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 03/26] pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 04/26] pmic: Extend PMIC framework to support multiple instances of PMIC devices Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 05/26] pmic: Introduce power_init_board() method at ./lib/board.c file Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 06/26] pmic: Enable power_board_init() support at TRATS Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 07/26] pmic:chrg: Common information about charger and battery (power_chrg.h) Lukasz Majewski
2012-11-13 13:21 ` [U-Boot] [PATCH v7 08/26] pmic: Move pmic related code to ./drivers/power directory Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 09/26] pmic: Extend struct pmic to support battery and charger related operations Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 10/26] pmic:battery: Support for Trats Battery at PMIC framework Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 11/26] pmic:muic: Support for MUIC built into MAX8997 device Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 12/26] pmic:fuel-gauge: Support for MAX17042 fuel-gauge Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 13/26] pmic:max8997: Function for calculating LDO internal register value Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 14/26] arm:trats:pmic: Default PMIC(MAX8997) initialization for Samsung's TRATS board Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 15/26] arm:trats:pmic: Enable MUIC (MAX8997) at " Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 16/26] arm:trats:pmic: Enable fuel-gauge (MAX17042) " Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 17/26] arm:trats:pmic: Enable battery support " Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 18/26] pmic:max8997: Support for MAX8997 internal charger control Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 19/26] arm:trats:pmic: Power consumption reduction state for Samsung's TRATS board Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 20/26] arm:trats:pmic: Support for charging battery at " Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 21/26] pmic: Extend PMIC framework to support battery related commands Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 22/26] power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_* files Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 23/26] power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 24/26] power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 25/26] arm:goni:pmic: Adjust GONI target platform board to new PMIC framework Lukasz Majewski
2012-11-13 13:22 ` [U-Boot] [PATCH v7 26/26] arm:universal_c210:pmic: Adjust C210 Universal " Lukasz Majewski
2012-11-14 10:32 ` [U-Boot] [PATCH v7 00/26] pmic: Redesign PMIC framework to support multiple instances of devices Anatolij Gustschin
2014-04-07 12:34 ` [U-Boot] [PATCH] doc:power:pmic: Add doc entry for PMIC(v2) framework Lukasz Majewski
2014-04-07 16:08   ` Simon Glass
2014-04-18 21:01   ` [U-Boot] " Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox