From b5bf9cafea246a6572c122bb3971cb48f50fc9ce Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:21:52 +0000 Subject: pmic:i2c: Handle PMIC I2C transmission comprising of two bytes This patch adds support for proper handling of a PMIC I2C transmission comprising of two bytes. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/misc/pmic_i2c.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c index 95a3365b9fc..e74c3727cdc 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; -- cgit v1.3.1 From 86879d7120ab4000d924b12315c01d57506af832 Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:21:53 +0000 Subject: pmic:i2c: Add I2C sensor byte order (big/little) to PMIC framework 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 Signed-off-by: Kyungmin Park --- drivers/misc/pmic_i2c.c | 38 +++++++++++++++++++++++++++++--------- include/pmic.h | 2 ++ 2 files changed, 31 insertions(+), 9 deletions(-) (limited to 'drivers') diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c index e74c3727cdc..1064bfe993d 100644 --- a/drivers/misc/pmic_i2c.c +++ b/drivers/misc/pmic_i2c.c @@ -30,6 +30,7 @@ #include #include #include +#include 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 6a05b40aefe..1a2db051109 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; -- cgit v1.3.1 From 452329f1d57fe7cbc54e65617e84d5bb1f93f631 Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:21:54 +0000 Subject: pmic:max8997: Switch the MAX8997 PMIC to be used with multibus I2C PMIC MAX8997 is now ready to work with single and multibus soft I2C implementation. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- drivers/misc/pmic_max8997.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c index 62dbc05311c..4943f667b51 100644 --- a/drivers/misc/pmic_max8997.c +++ b/drivers/misc/pmic_max8997.c @@ -24,6 +24,7 @@ #include #include #include +#include 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; } -- cgit v1.3.1 From c7336815078ff3745e3130aeff35991e3e98e61e Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:21:55 +0000 Subject: pmic: Extend PMIC framework to support multiple instances of PMIC devices 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 Signed-off-by: Kyungmin Park Cc: Stefano Babic --- 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/max8997_pmic.h | 190 ----------------------------- include/max8998_pmic.h | 86 ------------- include/pmic.h | 74 ----------- include/power/max8997_pmic.h | 203 +++++++++++++++++++++++++++++++ include/power/max8998_pmic.h | 86 +++++++++++++ include/power/pmic.h | 81 ++++++++++++ 26 files changed, 631 insertions(+), 449 deletions(-) delete mode 100644 include/max8997_pmic.h delete mode 100644 include/max8998_pmic.h delete mode 100644 include/pmic.h create mode 100644 include/power/max8997_pmic.h create mode 100644 include/power/max8998_pmic.h create mode 100644 include/power/pmic.h (limited to 'drivers') diff --git a/board/davedenx/qong/qong.c b/board/davedenx/qong/qong.c index c41f11d60c7..a3079dbca36 100644 --- a/board/davedenx/qong/qong.c +++ b/board/davedenx/qong/qong.c @@ -28,11 +28,12 @@ #include #include #include -#include +#include #include #include #include "qong_fpga.h" #include +#include 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 9f8bc53e711..bc60632aa0b 100644 --- a/board/freescale/mx31pdk/mx31pdk.c +++ b/board/freescale/mx31pdk/mx31pdk.c @@ -30,8 +30,9 @@ #include #include #include -#include +#include #include +#include 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 a12531fb892..c835b0edeb5 100644 --- a/board/freescale/mx35pdk/mx35pdk.c +++ b/board/freescale/mx35pdk/mx35pdk.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -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 421d8c22444..5504636ddf4 100644 --- a/board/freescale/mx51evk/mx51evk.c +++ b/board/freescale/mx51evk/mx51evk.c @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include #include @@ -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 bb4621d62ec..12735014767 100644 --- a/board/freescale/mx53evk/mx53evk.c +++ b/board/freescale/mx53evk/mx53evk.c @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -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 a11e8831866..f4a9b084208 100644 --- a/board/freescale/mx53loco/mx53loco.c +++ b/board/freescale/mx53loco/mx53loco.c @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include @@ -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 c2b2823ef9d..69d41db530d 100644 --- a/board/genesi/mx51_efikamx/efikamx.c +++ b/board/genesi/mx51_efikamx/efikamx.c @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -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 143fcefedf5..0c2cb795dd6 100644 --- a/board/hale/tt01/tt01.c +++ b/board/hale/tt01/tt01.c @@ -25,12 +25,13 @@ #include #include #include -#include +#include #include #include #include #include #include +#include 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 e8fb1ea4130..71ed618c6fd 100644 --- a/board/samsung/goni/goni.c +++ b/board/samsung/goni/goni.c @@ -25,10 +25,10 @@ #include #include #include -#include +#include #include #include -#include +#include 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 e11a8922fca..e0a98901f73 100644 --- a/board/samsung/trats/trats.c +++ b/board/samsung/trats/trats.c @@ -34,9 +34,9 @@ #include #include #include -#include +#include #include -#include +#include #include #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 90fff5cf5e1..c4950ddc269 100644 --- a/board/samsung/universal_c210/universal.c +++ b/board/samsung/universal_c210/universal.c @@ -27,10 +27,10 @@ #include #include #include -#include +#include #include #include -#include +#include 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 abdd1aac2b5..a471fec23dd 100644 --- a/board/ttcontrol/vision2/vision2.c +++ b/board/ttcontrol/vision2/vision2.c @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -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 5d62a56d346..4066b15adcd 100644 --- a/drivers/misc/pmic_core.c +++ b/drivers/misc/pmic_core.c @@ -27,18 +27,21 @@ */ #include +#include #include -#include +#include +#include -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(" = %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 - read register\n" - "pmic write - write register" + "list - list available PMICs\n" + "pmic dump name - dump named PMIC registers\n" + "pmic name read - read register\n" + "pmic name write - write register" ); diff --git a/drivers/misc/pmic_dialog.c b/drivers/misc/pmic_dialog.c index e97af1d1d01..d7ebd1583e8 100644 --- a/drivers/misc/pmic_dialog.c +++ b/drivers/misc/pmic_dialog.c @@ -17,13 +17,19 @@ */ #include -#include +#include #include +#include -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 0ff75ed76e5..0275fd9891a 100644 --- a/drivers/misc/pmic_fsl.c +++ b/drivers/misc/pmic_fsl.c @@ -23,8 +23,9 @@ #include #include -#include +#include #include +#include #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 1064bfe993d..3e5a784cf53 100644 --- a/drivers/misc/pmic_i2c.c +++ b/drivers/misc/pmic_i2c.c @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -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 4943f667b51..7fe1b53ff07 100644 --- a/drivers/misc/pmic_max8997.c +++ b/drivers/misc/pmic_max8997.c @@ -22,14 +22,20 @@ */ #include -#include -#include +#include +#include #include +#include -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 cc69fd70803..452e1c8d862 100644 --- a/drivers/misc/pmic_max8998.c +++ b/drivers/misc/pmic_max8998.c @@ -22,13 +22,19 @@ */ #include -#include -#include +#include +#include +#include -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 5a0dd22e290..27488ea5d92 100644 --- a/drivers/misc/pmic_spi.c +++ b/drivers/misc/pmic_spi.c @@ -28,7 +28,7 @@ #include #include -#include +#include #include 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 70ea8a15898..e79f4621d3f 100644 --- a/drivers/rtc/mc13xxx-rtc.c +++ b/drivers/rtc/mc13xxx-rtc.c @@ -23,16 +23,18 @@ #include #include #include -#include +#include #include 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/max8997_pmic.h deleted file mode 100644 index 17ae24ea6a0..00000000000 --- a/include/max8997_pmic.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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_PMIC_H_ -#define __MAX8997_PMIC_H_ - -/* MAX 8997 registers */ -enum { - MAX8997_REG_PMIC_ID0 = 0x00, - MAX8997_REG_PMIC_ID1 = 0x01, - MAX8997_REG_INTSRC = 0x02, - MAX8997_REG_INT1 = 0x03, - MAX8997_REG_INT2 = 0x04, - MAX8997_REG_INT3 = 0x05, - MAX8997_REG_INT4 = 0x06, - - MAX8997_REG_INT1MSK = 0x08, - MAX8997_REG_INT2MSK = 0x09, - MAX8997_REG_INT3MSK = 0x0a, - MAX8997_REG_INT4MSK = 0x0b, - - MAX8997_REG_STATUS1 = 0x0d, - MAX8997_REG_STATUS2 = 0x0e, - MAX8997_REG_STATUS3 = 0x0f, - MAX8997_REG_STATUS4 = 0x10, - - MAX8997_REG_MAINCON1 = 0x13, - MAX8997_REG_MAINCON2 = 0x14, - MAX8997_REG_BUCKRAMP = 0x15, - - MAX8997_REG_BUCK1CTRL = 0x18, - MAX8997_REG_BUCK1DVS1 = 0x19, - MAX8997_REG_BUCK1DVS2 = 0x1a, - MAX8997_REG_BUCK1DVS3 = 0x1b, - MAX8997_REG_BUCK1DVS4 = 0x1c, - MAX8997_REG_BUCK1DVS5 = 0x1d, - MAX8997_REG_BUCK1DVS6 = 0x1e, - MAX8997_REG_BUCK1DVS7 = 0x1f, - MAX8997_REG_BUCK1DVS8 = 0x20, - MAX8997_REG_BUCK2CTRL = 0x21, - MAX8997_REG_BUCK2DVS1 = 0x22, - MAX8997_REG_BUCK2DVS2 = 0x23, - MAX8997_REG_BUCK2DVS3 = 0x24, - MAX8997_REG_BUCK2DVS4 = 0x25, - MAX8997_REG_BUCK2DVS5 = 0x26, - MAX8997_REG_BUCK2DVS6 = 0x27, - MAX8997_REG_BUCK2DVS7 = 0x28, - MAX8997_REG_BUCK2DVS8 = 0x29, - MAX8997_REG_BUCK3CTRL = 0x2a, - MAX8997_REG_BUCK3DVS = 0x2b, - MAX8997_REG_BUCK4CTRL = 0x2c, - MAX8997_REG_BUCK4DVS = 0x2d, - MAX8997_REG_BUCK5CTRL = 0x2e, - MAX8997_REG_BUCK5DVS1 = 0x2f, - MAX8997_REG_BUCK5DVS2 = 0x30, - MAX8997_REG_BUCK5DVS3 = 0x31, - MAX8997_REG_BUCK5DVS4 = 0x32, - MAX8997_REG_BUCK5DVS5 = 0x33, - MAX8997_REG_BUCK5DVS6 = 0x34, - MAX8997_REG_BUCK5DVS7 = 0x35, - MAX8997_REG_BUCK5DVS8 = 0x36, - MAX8997_REG_BUCK6CTRL = 0x37, - MAX8997_REG_BUCK6BPSKIPCTRL = 0x38, - MAX8997_REG_BUCK7CTRL = 0x39, - MAX8997_REG_BUCK7DVS = 0x3a, - MAX8997_REG_LDO1CTRL = 0x3b, - MAX8997_REG_LDO2CTRL = 0x3c, - MAX8997_REG_LDO3CTRL = 0x3d, - MAX8997_REG_LDO4CTRL = 0x3e, - MAX8997_REG_LDO5CTRL = 0x3f, - MAX8997_REG_LDO6CTRL = 0x40, - MAX8997_REG_LDO7CTRL = 0x41, - MAX8997_REG_LDO8CTRL = 0x42, - MAX8997_REG_LDO9CTRL = 0x43, - MAX8997_REG_LDO10CTRL = 0x44, - MAX8997_REG_LDO11CTRL = 0x45, - MAX8997_REG_LDO12CTRL = 0x46, - MAX8997_REG_LDO13CTRL = 0x47, - MAX8997_REG_LDO14CTRL = 0x48, - MAX8997_REG_LDO15CTRL = 0x49, - MAX8997_REG_LDO16CTRL = 0x4a, - MAX8997_REG_LDO17CTRL = 0x4b, - MAX8997_REG_LDO18CTRL = 0x4c, - MAX8997_REG_LDO21CTRL = 0x4d, - - MAX8997_REG_MBCCTRL1 = 0x50, - MAX8997_REG_MBCCTRL2 = 0x51, - MAX8997_REG_MBCCTRL3 = 0x52, - MAX8997_REG_MBCCTRL4 = 0x53, - MAX8997_REG_MBCCTRL5 = 0x54, - MAX8997_REG_MBCCTRL6 = 0x55, - MAX8997_REG_OTPCGHCVS = 0x56, - - MAX8997_REG_SAFEOUTCTRL = 0x5a, - - MAX8997_REG_LBCNFG1 = 0x5e, - MAX8997_REG_LBCNFG2 = 0x5f, - MAX8997_REG_BBCCTRL = 0x60, - - MAX8997_REG_FLASH1_CUR = 0x63, /* 0x63 ~ 0x6e for FLASH */ - MAX8997_REG_FLASH2_CUR = 0x64, - MAX8997_REG_MOVIE_CUR = 0x65, - MAX8997_REG_GSMB_CUR = 0x66, - MAX8997_REG_BOOST_CNTL = 0x67, - MAX8997_REG_LEN_CNTL = 0x68, - MAX8997_REG_FLASH_CNTL = 0x69, - MAX8997_REG_WDT_CNTL = 0x6a, - MAX8997_REG_MAXFLASH1 = 0x6b, - MAX8997_REG_MAXFLASH2 = 0x6c, - MAX8997_REG_FLASHSTATUS = 0x6d, - MAX8997_REG_FLASHSTATUSMASK = 0x6e, - - MAX8997_REG_GPIOCNTL1 = 0x70, - MAX8997_REG_GPIOCNTL2 = 0x71, - MAX8997_REG_GPIOCNTL3 = 0x72, - MAX8997_REG_GPIOCNTL4 = 0x73, - MAX8997_REG_GPIOCNTL5 = 0x74, - MAX8997_REG_GPIOCNTL6 = 0x75, - MAX8997_REG_GPIOCNTL7 = 0x76, - MAX8997_REG_GPIOCNTL8 = 0x77, - MAX8997_REG_GPIOCNTL9 = 0x78, - MAX8997_REG_GPIOCNTL10 = 0x79, - MAX8997_REG_GPIOCNTL11 = 0x7a, - MAX8997_REG_GPIOCNTL12 = 0x7b, - - MAX8997_REG_LDO1CONFIG = 0x80, - MAX8997_REG_LDO2CONFIG = 0x81, - MAX8997_REG_LDO3CONFIG = 0x82, - MAX8997_REG_LDO4CONFIG = 0x83, - MAX8997_REG_LDO5CONFIG = 0x84, - MAX8997_REG_LDO6CONFIG = 0x85, - MAX8997_REG_LDO7CONFIG = 0x86, - MAX8997_REG_LDO8CONFIG = 0x87, - MAX8997_REG_LDO9CONFIG = 0x88, - MAX8997_REG_LDO10CONFIG = 0x89, - MAX8997_REG_LDO11CONFIG = 0x8a, - MAX8997_REG_LDO12CONFIG = 0x8b, - MAX8997_REG_LDO13CONFIG = 0x8c, - MAX8997_REG_LDO14CONFIG = 0x8d, - MAX8997_REG_LDO15CONFIG = 0x8e, - MAX8997_REG_LDO16CONFIG = 0x8f, - MAX8997_REG_LDO17CONFIG = 0x90, - MAX8997_REG_LDO18CONFIG = 0x91, - MAX8997_REG_LDO21CONFIG = 0x92, - - MAX8997_REG_DVSOKTIMER1 = 0x97, - MAX8997_REG_DVSOKTIMER2 = 0x98, - MAX8997_REG_DVSOKTIMER4 = 0x99, - MAX8997_REG_DVSOKTIMER5 = 0x9a, - - PMIC_NUM_OF_REGS = 0x9b, -}; - -#define ENSAFEOUT1 (1 << 6) -#define ENSAFEOUT2 (1 << 7) - -#define MAX8997_I2C_ADDR (0xCC >> 1) -#define MAX8997_RTC_ADDR (0x0C >> 1) -#define MAX8997_MUIC_ADDR (0x4A >> 1) -#define MAX8997_FG_ADDR (0x6C >> 1) - -enum { - LDO_OFF = 0, - LDO_ON = 1, - - DIS_LDO = (0x00 << 6), - EN_LDO = (0x3 << 6), -}; - -#endif /* __MAX8997_PMIC_H_ */ diff --git a/include/max8998_pmic.h b/include/max8998_pmic.h deleted file mode 100644 index ca21f882c29..00000000000 --- a/include/max8998_pmic.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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 __MAX8998_PMIC_H_ -#define __MAX8998_PMIC_H_ - -/* MAX 8998 registers */ -enum { - MAX8998_REG_IRQ1, - MAX8998_REG_IRQ2, - MAX8998_REG_IRQ3, - MAX8998_REG_IRQ4, - MAX8998_REG_IRQM1, - MAX8998_REG_IRQM2, - MAX8998_REG_IRQM3, - MAX8998_REG_IRQM4, - MAX8998_REG_STATUS1, - MAX8998_REG_STATUS2, - MAX8998_REG_STATUSM1, - MAX8998_REG_STATUSM2, - MAX8998_REG_CHGR1, - MAX8998_REG_CHGR2, - MAX8998_REG_LDO_ACTIVE_DISCHARGE1, - MAX8998_REG_LDO_ACTIVE_DISCHARGE2, - MAX8998_REG_BUCK_ACTIVE_DISCHARGE3, - MAX8998_REG_ONOFF1, - MAX8998_REG_ONOFF2, - MAX8998_REG_ONOFF3, - MAX8998_REG_ONOFF4, - MAX8998_REG_BUCK1_VOLTAGE1, - MAX8998_REG_BUCK1_VOLTAGE2, - MAX8998_REG_BUCK1_VOLTAGE3, - MAX8998_REG_BUCK1_VOLTAGE4, - MAX8998_REG_BUCK2_VOLTAGE1, - MAX8998_REG_BUCK2_VOLTAGE2, - MAX8998_REG_BUCK3, - MAX8998_REG_BUCK4, - MAX8998_REG_LDO2_LDO3, - MAX8998_REG_LDO4, - MAX8998_REG_LDO5, - MAX8998_REG_LDO6, - MAX8998_REG_LDO7, - MAX8998_REG_LDO8_LDO9, - MAX8998_REG_LDO10_LDO11, - MAX8998_REG_LDO12, - MAX8998_REG_LDO13, - MAX8998_REG_LDO14, - MAX8998_REG_LDO15, - MAX8998_REG_LDO16, - MAX8998_REG_LDO17, - MAX8998_REG_BKCHR, - MAX8998_REG_LBCNFG1, - MAX8998_REG_LBCNFG2, - PMIC_NUM_OF_REGS, -}; - -#define MAX8998_LDO3 (1 << 2) -#define MAX8998_LDO4 (1 << 1) -#define MAX8998_LDO8 (1 << 5) -#define MAX8998_SAFEOUT1 (1 << 4) - -#define MAX8998_I2C_ADDR (0xCC >> 1) - -enum { LDO_OFF, LDO_ON }; - -#endif /* __MAX8998_PMIC_H_ */ diff --git a/include/pmic.h b/include/pmic.h deleted file mode 100644 index 1a2db051109..00000000000 --- a/include/pmic.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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 __CORE_PMIC_H_ -#define __CORE_PMIC_H_ - -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; - unsigned char *buf; - unsigned char tx_num; -}; - -struct p_spi { - unsigned int cs; - unsigned int mode; - unsigned int bitlen; - unsigned int clk; - unsigned int flags; - u32 (*prepare_tx)(u32 reg, u32 *val, u32 write); -}; - -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; - struct p_spi spi; - } hw; -}; - -int pmic_init(void); -int pmic_dialog_init(void); -int check_reg(u32 reg); -struct pmic *get_pmic(void); -int pmic_probe(struct pmic *p); -int pmic_reg_read(struct pmic *p, u32 reg, u32 *val); -int pmic_reg_write(struct pmic *p, u32 reg, u32 val); -int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on); - -#define pmic_i2c_addr (p->hw.i2c.addr) -#define pmic_i2c_tx_num (p->hw.i2c.tx_num) - -#define pmic_spi_bitlen (p->hw.spi.bitlen) -#define pmic_spi_flags (p->hw.spi.flags) - -#endif /* __CORE_PMIC_H_ */ diff --git a/include/power/max8997_pmic.h b/include/power/max8997_pmic.h new file mode 100644 index 00000000000..1db7deb3beb --- /dev/null +++ b/include/power/max8997_pmic.h @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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_PMIC_H_ +#define __MAX8997_PMIC_H_ + +/* MAX 8997 registers */ +enum { + MAX8997_REG_PMIC_ID0 = 0x00, + MAX8997_REG_PMIC_ID1 = 0x01, + MAX8997_REG_INTSRC = 0x02, + MAX8997_REG_INT1 = 0x03, + MAX8997_REG_INT2 = 0x04, + MAX8997_REG_INT3 = 0x05, + MAX8997_REG_INT4 = 0x06, + + MAX8997_REG_INT1MSK = 0x08, + MAX8997_REG_INT2MSK = 0x09, + MAX8997_REG_INT3MSK = 0x0a, + MAX8997_REG_INT4MSK = 0x0b, + + MAX8997_REG_STATUS1 = 0x0d, + MAX8997_REG_STATUS2 = 0x0e, + MAX8997_REG_STATUS3 = 0x0f, + MAX8997_REG_STATUS4 = 0x10, + + MAX8997_REG_MAINCON1 = 0x13, + MAX8997_REG_MAINCON2 = 0x14, + MAX8997_REG_BUCKRAMP = 0x15, + + MAX8997_REG_BUCK1CTRL = 0x18, + MAX8997_REG_BUCK1DVS1 = 0x19, + MAX8997_REG_BUCK1DVS2 = 0x1a, + MAX8997_REG_BUCK1DVS3 = 0x1b, + MAX8997_REG_BUCK1DVS4 = 0x1c, + MAX8997_REG_BUCK1DVS5 = 0x1d, + MAX8997_REG_BUCK1DVS6 = 0x1e, + MAX8997_REG_BUCK1DVS7 = 0x1f, + MAX8997_REG_BUCK1DVS8 = 0x20, + MAX8997_REG_BUCK2CTRL = 0x21, + MAX8997_REG_BUCK2DVS1 = 0x22, + MAX8997_REG_BUCK2DVS2 = 0x23, + MAX8997_REG_BUCK2DVS3 = 0x24, + MAX8997_REG_BUCK2DVS4 = 0x25, + MAX8997_REG_BUCK2DVS5 = 0x26, + MAX8997_REG_BUCK2DVS6 = 0x27, + MAX8997_REG_BUCK2DVS7 = 0x28, + MAX8997_REG_BUCK2DVS8 = 0x29, + MAX8997_REG_BUCK3CTRL = 0x2a, + MAX8997_REG_BUCK3DVS = 0x2b, + MAX8997_REG_BUCK4CTRL = 0x2c, + MAX8997_REG_BUCK4DVS = 0x2d, + MAX8997_REG_BUCK5CTRL = 0x2e, + MAX8997_REG_BUCK5DVS1 = 0x2f, + MAX8997_REG_BUCK5DVS2 = 0x30, + MAX8997_REG_BUCK5DVS3 = 0x31, + MAX8997_REG_BUCK5DVS4 = 0x32, + MAX8997_REG_BUCK5DVS5 = 0x33, + MAX8997_REG_BUCK5DVS6 = 0x34, + MAX8997_REG_BUCK5DVS7 = 0x35, + MAX8997_REG_BUCK5DVS8 = 0x36, + MAX8997_REG_BUCK6CTRL = 0x37, + MAX8997_REG_BUCK6BPSKIPCTRL = 0x38, + MAX8997_REG_BUCK7CTRL = 0x39, + MAX8997_REG_BUCK7DVS = 0x3a, + MAX8997_REG_LDO1CTRL = 0x3b, + MAX8997_REG_LDO2CTRL = 0x3c, + MAX8997_REG_LDO3CTRL = 0x3d, + MAX8997_REG_LDO4CTRL = 0x3e, + MAX8997_REG_LDO5CTRL = 0x3f, + MAX8997_REG_LDO6CTRL = 0x40, + MAX8997_REG_LDO7CTRL = 0x41, + MAX8997_REG_LDO8CTRL = 0x42, + MAX8997_REG_LDO9CTRL = 0x43, + MAX8997_REG_LDO10CTRL = 0x44, + MAX8997_REG_LDO11CTRL = 0x45, + MAX8997_REG_LDO12CTRL = 0x46, + MAX8997_REG_LDO13CTRL = 0x47, + MAX8997_REG_LDO14CTRL = 0x48, + MAX8997_REG_LDO15CTRL = 0x49, + MAX8997_REG_LDO16CTRL = 0x4a, + MAX8997_REG_LDO17CTRL = 0x4b, + MAX8997_REG_LDO18CTRL = 0x4c, + MAX8997_REG_LDO21CTRL = 0x4d, + + MAX8997_REG_MBCCTRL1 = 0x50, + MAX8997_REG_MBCCTRL2 = 0x51, + MAX8997_REG_MBCCTRL3 = 0x52, + MAX8997_REG_MBCCTRL4 = 0x53, + MAX8997_REG_MBCCTRL5 = 0x54, + MAX8997_REG_MBCCTRL6 = 0x55, + MAX8997_REG_OTPCGHCVS = 0x56, + + MAX8997_REG_SAFEOUTCTRL = 0x5a, + + MAX8997_REG_LBCNFG1 = 0x5e, + MAX8997_REG_LBCNFG2 = 0x5f, + MAX8997_REG_BBCCTRL = 0x60, + + MAX8997_REG_FLASH1_CUR = 0x63, /* 0x63 ~ 0x6e for FLASH */ + MAX8997_REG_FLASH2_CUR = 0x64, + MAX8997_REG_MOVIE_CUR = 0x65, + MAX8997_REG_GSMB_CUR = 0x66, + MAX8997_REG_BOOST_CNTL = 0x67, + MAX8997_REG_LEN_CNTL = 0x68, + MAX8997_REG_FLASH_CNTL = 0x69, + MAX8997_REG_WDT_CNTL = 0x6a, + MAX8997_REG_MAXFLASH1 = 0x6b, + MAX8997_REG_MAXFLASH2 = 0x6c, + MAX8997_REG_FLASHSTATUS = 0x6d, + MAX8997_REG_FLASHSTATUSMASK = 0x6e, + + MAX8997_REG_GPIOCNTL1 = 0x70, + MAX8997_REG_GPIOCNTL2 = 0x71, + MAX8997_REG_GPIOCNTL3 = 0x72, + MAX8997_REG_GPIOCNTL4 = 0x73, + MAX8997_REG_GPIOCNTL5 = 0x74, + MAX8997_REG_GPIOCNTL6 = 0x75, + MAX8997_REG_GPIOCNTL7 = 0x76, + MAX8997_REG_GPIOCNTL8 = 0x77, + MAX8997_REG_GPIOCNTL9 = 0x78, + MAX8997_REG_GPIOCNTL10 = 0x79, + MAX8997_REG_GPIOCNTL11 = 0x7a, + MAX8997_REG_GPIOCNTL12 = 0x7b, + + MAX8997_REG_LDO1CONFIG = 0x80, + MAX8997_REG_LDO2CONFIG = 0x81, + MAX8997_REG_LDO3CONFIG = 0x82, + MAX8997_REG_LDO4CONFIG = 0x83, + MAX8997_REG_LDO5CONFIG = 0x84, + MAX8997_REG_LDO6CONFIG = 0x85, + MAX8997_REG_LDO7CONFIG = 0x86, + MAX8997_REG_LDO8CONFIG = 0x87, + MAX8997_REG_LDO9CONFIG = 0x88, + MAX8997_REG_LDO10CONFIG = 0x89, + MAX8997_REG_LDO11CONFIG = 0x8a, + MAX8997_REG_LDO12CONFIG = 0x8b, + MAX8997_REG_LDO13CONFIG = 0x8c, + MAX8997_REG_LDO14CONFIG = 0x8d, + MAX8997_REG_LDO15CONFIG = 0x8e, + MAX8997_REG_LDO16CONFIG = 0x8f, + MAX8997_REG_LDO17CONFIG = 0x90, + MAX8997_REG_LDO18CONFIG = 0x91, + MAX8997_REG_LDO21CONFIG = 0x92, + + MAX8997_REG_DVSOKTIMER1 = 0x97, + MAX8997_REG_DVSOKTIMER2 = 0x98, + MAX8997_REG_DVSOKTIMER4 = 0x99, + MAX8997_REG_DVSOKTIMER5 = 0x9a, + + 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) +#define MAX8997_FG_ADDR (0x6C >> 1) + +enum { + LDO_OFF = 0, + LDO_ON = 1, + + DIS_LDO = (0x00 << 6), + EN_LDO = (0x3 << 6), +}; + +#endif /* __MAX8997_PMIC_H_ */ diff --git a/include/power/max8998_pmic.h b/include/power/max8998_pmic.h new file mode 100644 index 00000000000..ca21f882c29 --- /dev/null +++ b/include/power/max8998_pmic.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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 __MAX8998_PMIC_H_ +#define __MAX8998_PMIC_H_ + +/* MAX 8998 registers */ +enum { + MAX8998_REG_IRQ1, + MAX8998_REG_IRQ2, + MAX8998_REG_IRQ3, + MAX8998_REG_IRQ4, + MAX8998_REG_IRQM1, + MAX8998_REG_IRQM2, + MAX8998_REG_IRQM3, + MAX8998_REG_IRQM4, + MAX8998_REG_STATUS1, + MAX8998_REG_STATUS2, + MAX8998_REG_STATUSM1, + MAX8998_REG_STATUSM2, + MAX8998_REG_CHGR1, + MAX8998_REG_CHGR2, + MAX8998_REG_LDO_ACTIVE_DISCHARGE1, + MAX8998_REG_LDO_ACTIVE_DISCHARGE2, + MAX8998_REG_BUCK_ACTIVE_DISCHARGE3, + MAX8998_REG_ONOFF1, + MAX8998_REG_ONOFF2, + MAX8998_REG_ONOFF3, + MAX8998_REG_ONOFF4, + MAX8998_REG_BUCK1_VOLTAGE1, + MAX8998_REG_BUCK1_VOLTAGE2, + MAX8998_REG_BUCK1_VOLTAGE3, + MAX8998_REG_BUCK1_VOLTAGE4, + MAX8998_REG_BUCK2_VOLTAGE1, + MAX8998_REG_BUCK2_VOLTAGE2, + MAX8998_REG_BUCK3, + MAX8998_REG_BUCK4, + MAX8998_REG_LDO2_LDO3, + MAX8998_REG_LDO4, + MAX8998_REG_LDO5, + MAX8998_REG_LDO6, + MAX8998_REG_LDO7, + MAX8998_REG_LDO8_LDO9, + MAX8998_REG_LDO10_LDO11, + MAX8998_REG_LDO12, + MAX8998_REG_LDO13, + MAX8998_REG_LDO14, + MAX8998_REG_LDO15, + MAX8998_REG_LDO16, + MAX8998_REG_LDO17, + MAX8998_REG_BKCHR, + MAX8998_REG_LBCNFG1, + MAX8998_REG_LBCNFG2, + PMIC_NUM_OF_REGS, +}; + +#define MAX8998_LDO3 (1 << 2) +#define MAX8998_LDO4 (1 << 1) +#define MAX8998_LDO8 (1 << 5) +#define MAX8998_SAFEOUT1 (1 << 4) + +#define MAX8998_I2C_ADDR (0xCC >> 1) + +enum { LDO_OFF, LDO_ON }; + +#endif /* __MAX8998_PMIC_H_ */ diff --git a/include/power/pmic.h b/include/power/pmic.h new file mode 100644 index 00000000000..e9affc8dd60 --- /dev/null +++ b/include/power/pmic.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2011-2012 Samsung Electronics + * Lukasz Majewski + * + * 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 __CORE_PMIC_H_ +#define __CORE_PMIC_H_ + +#include +#include +#include + +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; + unsigned char *buf; + unsigned char tx_num; +}; + +struct p_spi { + unsigned int cs; + unsigned int mode; + unsigned int bitlen; + unsigned int clk; + unsigned int flags; + u32 (*prepare_tx)(u32 reg, u32 *val, u32 write); +}; + +struct pmic { + const char *name; + unsigned char bus; + unsigned char interface; + unsigned char sensor_byte_order; + unsigned int number_of_regs; + union hw { + struct p_i2c i2c; + struct p_spi spi; + } hw; + + struct list_head list; +}; + +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); +int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on); + +#define pmic_i2c_addr (p->hw.i2c.addr) +#define pmic_i2c_tx_num (p->hw.i2c.tx_num) + +#define pmic_spi_bitlen (p->hw.spi.bitlen) +#define pmic_spi_flags (p->hw.spi.flags) + +#endif /* __CORE_PMIC_H_ */ -- cgit v1.3.1 From e0a0cbf2472feb840a8b820838272c1204d51584 Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:21:59 +0000 Subject: pmic: Move pmic related code to ./drivers/power directory The PMIC framework has been moved to its more natural place ./drivers/power from ./drivers/misc directory. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- Makefile | 3 +- drivers/misc/Makefile | 7 -- drivers/misc/pmic_core.c | 207 -------------------------------------- drivers/misc/pmic_dialog.c | 43 -------- drivers/misc/pmic_fsl.c | 69 ------------- drivers/misc/pmic_i2c.c | 125 ----------------------- drivers/misc/pmic_max8997.c | 50 --------- drivers/misc/pmic_max8998.c | 49 --------- drivers/misc/pmic_spi.c | 108 -------------------- drivers/power/Makefile | 12 ++- drivers/power/pmic/Makefile | 48 +++++++++ drivers/power/pmic/pmic_max8997.c | 50 +++++++++ drivers/power/pmic/pmic_max8998.c | 49 +++++++++ drivers/power/pmic_core.c | 207 ++++++++++++++++++++++++++++++++++++++ drivers/power/pmic_dialog.c | 43 ++++++++ drivers/power/pmic_fsl.c | 69 +++++++++++++ drivers/power/pmic_i2c.c | 125 +++++++++++++++++++++++ drivers/power/pmic_spi.c | 108 ++++++++++++++++++++ 18 files changed, 710 insertions(+), 662 deletions(-) delete mode 100644 drivers/misc/pmic_core.c delete mode 100644 drivers/misc/pmic_dialog.c delete mode 100644 drivers/misc/pmic_fsl.c delete mode 100644 drivers/misc/pmic_i2c.c delete mode 100644 drivers/misc/pmic_max8997.c delete mode 100644 drivers/misc/pmic_max8998.c delete mode 100644 drivers/misc/pmic_spi.c create mode 100644 drivers/power/pmic/Makefile create mode 100644 drivers/power/pmic/pmic_max8997.c create mode 100644 drivers/power/pmic/pmic_max8998.c create mode 100644 drivers/power/pmic_core.c create mode 100644 drivers/power/pmic_dialog.c create mode 100644 drivers/power/pmic_fsl.c create mode 100644 drivers/power/pmic_i2c.c create mode 100644 drivers/power/pmic_spi.c (limited to 'drivers') diff --git a/Makefile b/Makefile index 5fa2fba5e34..f78656adff1 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 271463cf142..cdec88b8fb9 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/misc/pmic_core.c b/drivers/misc/pmic_core.c deleted file mode 100644 index 4066b15adcd..00000000000 --- a/drivers/misc/pmic_core.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include -#include - -static LIST_HEAD(pmic_list); - -int check_reg(struct pmic *p, u32 reg) -{ - if (reg >= p->number_of_regs) { - printf(" = %d is invalid. Should be less than %d\n", - reg, p->number_of_regs); - return -1; - } - - return 0; -} - -int pmic_set_output(struct pmic *p, u32 reg, int out, int on) -{ - u32 val; - - if (pmic_reg_read(p, reg, &val)) - return -1; - - if (on) - val |= out; - else - val &= ~out; - - if (pmic_reg_write(p, reg, val)) - return -1; - - return 0; -} - -static void pmic_show_info(struct pmic *p) -{ - printf("PMIC: %s\n", p->name); -} - -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); - if (ret) - puts("PMIC: Registers dump failed\n"); - - if (!(i % 8)) - printf("\n0x%02x: ", i); - - printf("%08x ", val); - } - puts("\n"); - return 0; -} - -struct pmic *pmic_alloc(void) -{ - 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; - - /* at least two arguments please */ - if (argc < 2) - return CMD_RET_USAGE; - - cmd = argv[1]; - - if (strcmp(cmd, "list") == 0) { - pmic_list_names(); - return CMD_RET_SUCCESS; - } - - 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; - } - - if (strcmp(cmd, "read") == 0) { - if (argc < 4) - 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) - puts("PMIC: Register read failed\n"); - - printf("\n0x%02x: 0x%08x\n", reg, val); - - return CMD_RET_SUCCESS; - } - - if (strcmp(cmd, "write") == 0) { - 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 CMD_RET_SUCCESS; - } - - /* No subcommand found */ - return CMD_RET_SUCCESS; -} - -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 read - read register\n" - "pmic name write - write register" -); diff --git a/drivers/misc/pmic_dialog.c b/drivers/misc/pmic_dialog.c deleted file mode 100644 index d7ebd1583e8..00000000000 --- a/drivers/misc/pmic_dialog.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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. - */ - -#include -#include -#include -#include - -int pmic_dialog_init(unsigned char bus) -{ - 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; - - p->interface = PMIC_I2C; - p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR; - p->hw.i2c.tx_num = 1; - p->bus = bus; - - return 0; -} diff --git a/drivers/misc/pmic_fsl.c b/drivers/misc/pmic_fsl.c deleted file mode 100644 index 0275fd9891a..00000000000 --- a/drivers/misc/pmic_fsl.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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 -#include -#include -#include -#include - -#if defined(CONFIG_PMIC_SPI) -static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write) -{ - return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF); -} -#endif - -int pmic_init(unsigned char bus) -{ - 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; - -#if defined(CONFIG_PMIC_SPI) - p->interface = PMIC_SPI; - p->bus = CONFIG_FSL_PMIC_BUS; - p->hw.spi.cs = CONFIG_FSL_PMIC_CS; - p->hw.spi.clk = CONFIG_FSL_PMIC_CLK; - p->hw.spi.mode = CONFIG_FSL_PMIC_MODE; - 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) - 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" -#endif - - return 0; -} diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c deleted file mode 100644 index 3e5a784cf53..00000000000 --- a/drivers/misc/pmic_i2c.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include -#include - -int pmic_reg_write(struct pmic *p, u32 reg, u32 val) -{ - unsigned char buf[4] = { 0 }; - - if (check_reg(p, reg)) - return -1; - - switch (pmic_i2c_tx_num) { - case 3: - 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: - 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] = cpu_to_le32(val) & 0xff; - break; - default: - printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); - return -1; - } - - if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) - return -1; - - return 0; -} - -int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) -{ - unsigned char buf[4] = { 0 }; - u32 ret_val = 0; - - if (check_reg(p, reg)) - return -1; - - if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) - return -1; - - switch (pmic_i2c_tx_num) { - case 3: - 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: - 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 = le32_to_cpu(buf[0]); - break; - default: - printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); - return -1; - } - memcpy(val, &ret_val, sizeof(ret_val)); - - return 0; -} - -int pmic_probe(struct pmic *p) -{ - I2C_SET_BUS(p->bus); - 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; - } - - return 0; -} diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c deleted file mode 100644 index 7fe1b53ff07..00000000000 --- a/drivers/misc/pmic_max8997.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2012 Samsung Electronics - * Lukasz Majewski - * - * 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 -#include -#include -#include -#include - -int pmic_init(unsigned char bus) -{ - 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"); - - p->name = name; - p->interface = PMIC_I2C; - p->number_of_regs = PMIC_NUM_OF_REGS; - p->hw.i2c.addr = MAX8997_I2C_ADDR; - p->hw.i2c.tx_num = 1; - p->bus = bus; - - return 0; -} diff --git a/drivers/misc/pmic_max8998.c b/drivers/misc/pmic_max8998.c deleted file mode 100644 index 452e1c8d862..00000000000 --- a/drivers/misc/pmic_max8998.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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 -#include -#include -#include - -int pmic_init(unsigned char bus) -{ - 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"); - - p->name = name; - p->interface = PMIC_I2C; - p->number_of_regs = PMIC_NUM_OF_REGS; - p->hw.i2c.addr = MAX8998_I2C_ADDR; - p->hw.i2c.tx_num = 1; - p->bus = bus; - - return 0; -} diff --git a/drivers/misc/pmic_spi.c b/drivers/misc/pmic_spi.c deleted file mode 100644 index 27488ea5d92..00000000000 --- a/drivers/misc/pmic_spi.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include - -static struct spi_slave *slave; - -void pmic_spi_free(struct spi_slave *slave) -{ - if (slave) - spi_free_slave(slave); -} - -struct spi_slave *pmic_spi_probe(struct pmic *p) -{ - return spi_setup_slave(p->bus, - p->hw.spi.cs, - p->hw.spi.clk, - p->hw.spi.mode); -} - -static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write) -{ - u32 pmic_tx, pmic_rx; - u32 tmp; - - if (!slave) { - slave = pmic_spi_probe(p); - - if (!slave) - return -1; - } - - if (check_reg(p, reg)) - return -1; - - if (spi_claim_bus(slave)) - return -1; - - pmic_tx = p->hw.spi.prepare_tx(reg, val, write); - - tmp = cpu_to_be32(pmic_tx); - - if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, - pmic_spi_flags)) { - spi_release_bus(slave); - return -1; - } - - if (write) { - pmic_tx = p->hw.spi.prepare_tx(reg, val, 0); - tmp = cpu_to_be32(pmic_tx); - if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, - pmic_spi_flags)) { - spi_release_bus(slave); - return -1; - } - } - - spi_release_bus(slave); - *val = cpu_to_be32(pmic_rx); - - return 0; -} - -int pmic_reg_write(struct pmic *p, u32 reg, u32 val) -{ - if (pmic_reg(p, reg, &val, 1)) - return -1; - - return 0; -} - -int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) -{ - if (pmic_reg(p, reg, val, 0)) - return -1; - - return 0; -} diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 6bf388cb7d5..7fc5554b496 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 00000000000..8ccd6e97cad --- /dev/null +++ b/drivers/power/pmic/Makefile @@ -0,0 +1,48 @@ +# +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski +# +# 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/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c new file mode 100644 index 00000000000..7fe1b53ff07 --- /dev/null +++ b/drivers/power/pmic/pmic_max8997.c @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include + +int pmic_init(unsigned char bus) +{ + 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"); + + p->name = name; + p->interface = PMIC_I2C; + p->number_of_regs = PMIC_NUM_OF_REGS; + p->hw.i2c.addr = MAX8997_I2C_ADDR; + p->hw.i2c.tx_num = 1; + p->bus = bus; + + return 0; +} diff --git a/drivers/power/pmic/pmic_max8998.c b/drivers/power/pmic/pmic_max8998.c new file mode 100644 index 00000000000..452e1c8d862 --- /dev/null +++ b/drivers/power/pmic/pmic_max8998.c @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include + +int pmic_init(unsigned char bus) +{ + 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"); + + p->name = name; + p->interface = PMIC_I2C; + p->number_of_regs = PMIC_NUM_OF_REGS; + p->hw.i2c.addr = MAX8998_I2C_ADDR; + p->hw.i2c.tx_num = 1; + p->bus = bus; + + return 0; +} diff --git a/drivers/power/pmic_core.c b/drivers/power/pmic_core.c new file mode 100644 index 00000000000..4066b15adcd --- /dev/null +++ b/drivers/power/pmic_core.c @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include +#include + +static LIST_HEAD(pmic_list); + +int check_reg(struct pmic *p, u32 reg) +{ + if (reg >= p->number_of_regs) { + printf(" = %d is invalid. Should be less than %d\n", + reg, p->number_of_regs); + return -1; + } + + return 0; +} + +int pmic_set_output(struct pmic *p, u32 reg, int out, int on) +{ + u32 val; + + if (pmic_reg_read(p, reg, &val)) + return -1; + + if (on) + val |= out; + else + val &= ~out; + + if (pmic_reg_write(p, reg, val)) + return -1; + + return 0; +} + +static void pmic_show_info(struct pmic *p) +{ + printf("PMIC: %s\n", p->name); +} + +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); + if (ret) + puts("PMIC: Registers dump failed\n"); + + if (!(i % 8)) + printf("\n0x%02x: ", i); + + printf("%08x ", val); + } + puts("\n"); + return 0; +} + +struct pmic *pmic_alloc(void) +{ + 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; + + /* at least two arguments please */ + if (argc < 2) + return CMD_RET_USAGE; + + cmd = argv[1]; + + if (strcmp(cmd, "list") == 0) { + pmic_list_names(); + return CMD_RET_SUCCESS; + } + + 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; + } + + if (strcmp(cmd, "read") == 0) { + if (argc < 4) + 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) + puts("PMIC: Register read failed\n"); + + printf("\n0x%02x: 0x%08x\n", reg, val); + + return CMD_RET_SUCCESS; + } + + if (strcmp(cmd, "write") == 0) { + 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 CMD_RET_SUCCESS; + } + + /* No subcommand found */ + return CMD_RET_SUCCESS; +} + +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 read - read register\n" + "pmic name write - write register" +); diff --git a/drivers/power/pmic_dialog.c b/drivers/power/pmic_dialog.c new file mode 100644 index 00000000000..d7ebd1583e8 --- /dev/null +++ b/drivers/power/pmic_dialog.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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. + */ + +#include +#include +#include +#include + +int pmic_dialog_init(unsigned char bus) +{ + 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; + + p->interface = PMIC_I2C; + p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR; + p->hw.i2c.tx_num = 1; + p->bus = bus; + + return 0; +} diff --git a/drivers/power/pmic_fsl.c b/drivers/power/pmic_fsl.c new file mode 100644 index 00000000000..0275fd9891a --- /dev/null +++ b/drivers/power/pmic_fsl.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include + +#if defined(CONFIG_PMIC_SPI) +static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write) +{ + return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF); +} +#endif + +int pmic_init(unsigned char bus) +{ + 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; + +#if defined(CONFIG_PMIC_SPI) + p->interface = PMIC_SPI; + p->bus = CONFIG_FSL_PMIC_BUS; + p->hw.spi.cs = CONFIG_FSL_PMIC_CS; + p->hw.spi.clk = CONFIG_FSL_PMIC_CLK; + p->hw.spi.mode = CONFIG_FSL_PMIC_MODE; + 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) + 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" +#endif + + return 0; +} diff --git a/drivers/power/pmic_i2c.c b/drivers/power/pmic_i2c.c new file mode 100644 index 00000000000..3e5a784cf53 --- /dev/null +++ b/drivers/power/pmic_i2c.c @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include +#include + +int pmic_reg_write(struct pmic *p, u32 reg, u32 val) +{ + unsigned char buf[4] = { 0 }; + + if (check_reg(p, reg)) + return -1; + + switch (pmic_i2c_tx_num) { + case 3: + 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: + 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] = cpu_to_le32(val) & 0xff; + break; + default: + printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); + return -1; + } + + if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) + return -1; + + return 0; +} + +int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) +{ + unsigned char buf[4] = { 0 }; + u32 ret_val = 0; + + if (check_reg(p, reg)) + return -1; + + if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) + return -1; + + switch (pmic_i2c_tx_num) { + case 3: + 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: + 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 = le32_to_cpu(buf[0]); + break; + default: + printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); + return -1; + } + memcpy(val, &ret_val, sizeof(ret_val)); + + return 0; +} + +int pmic_probe(struct pmic *p) +{ + I2C_SET_BUS(p->bus); + 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; + } + + return 0; +} diff --git a/drivers/power/pmic_spi.c b/drivers/power/pmic_spi.c new file mode 100644 index 00000000000..27488ea5d92 --- /dev/null +++ b/drivers/power/pmic_spi.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include + +static struct spi_slave *slave; + +void pmic_spi_free(struct spi_slave *slave) +{ + if (slave) + spi_free_slave(slave); +} + +struct spi_slave *pmic_spi_probe(struct pmic *p) +{ + return spi_setup_slave(p->bus, + p->hw.spi.cs, + p->hw.spi.clk, + p->hw.spi.mode); +} + +static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write) +{ + u32 pmic_tx, pmic_rx; + u32 tmp; + + if (!slave) { + slave = pmic_spi_probe(p); + + if (!slave) + return -1; + } + + if (check_reg(p, reg)) + return -1; + + if (spi_claim_bus(slave)) + return -1; + + pmic_tx = p->hw.spi.prepare_tx(reg, val, write); + + tmp = cpu_to_be32(pmic_tx); + + if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, + pmic_spi_flags)) { + spi_release_bus(slave); + return -1; + } + + if (write) { + pmic_tx = p->hw.spi.prepare_tx(reg, val, 0); + tmp = cpu_to_be32(pmic_tx); + if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, + pmic_spi_flags)) { + spi_release_bus(slave); + return -1; + } + } + + spi_release_bus(slave); + *val = cpu_to_be32(pmic_rx); + + return 0; +} + +int pmic_reg_write(struct pmic *p, u32 reg, u32 val) +{ + if (pmic_reg(p, reg, &val, 1)) + return -1; + + return 0; +} + +int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) +{ + if (pmic_reg(p, reg, val, 0)) + return -1; + + return 0; +} -- cgit v1.3.1 From eba423910c78ca822653dfebe113664ef352ce94 Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:01 +0000 Subject: pmic:battery: Support for Trats Battery at PMIC framework 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 Signed-off-by: Kyungmin Park Cc: Stefano Babic --- Makefile | 3 +- drivers/power/battery/Makefile | 47 ++++++++++++++++++ drivers/power/battery/bat_trats.c | 100 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 drivers/power/battery/Makefile create mode 100644 drivers/power/battery/bat_trats.c (limited to 'drivers') diff --git a/Makefile b/Makefile index f78656adff1..0f18e6cf3dd 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 00000000000..b176701234b --- /dev/null +++ b/drivers/power/battery/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski +# +# 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 00000000000..ca0d2146599 --- /dev/null +++ b/drivers/power/battery/bat_trats.c @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include + +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; +} -- cgit v1.3.1 From 294a97da34529bb318996806651ac314b1734c1c Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:02 +0000 Subject: pmic:muic: Support for MUIC built into MAX8997 device 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 Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/pmic/Makefile | 1 + drivers/power/pmic/muic_max8997.c | 90 +++++++++++++++++++++++++++++++++++++++ include/power/max8997_muic.h | 61 ++++++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 drivers/power/pmic/muic_max8997.c create mode 100644 include/power/max8997_muic.h (limited to 'drivers') diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile index 8ccd6e97cad..9b71e55a254 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 00000000000..d5095c899ef --- /dev/null +++ b/drivers/power/pmic/muic_max8997.c @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include +#include + +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 00000000000..0149c124356 --- /dev/null +++ b/include/power/max8997_muic.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 + +/* 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_ */ -- cgit v1.3.1 From b95aacd332cde91299cf05e1a87dc6d7de545adb Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:03 +0000 Subject: pmic:fuel-gauge: Support for MAX17042 fuel-gauge 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 Signed-off-by: Kyungmin Park Cc: Stefano Babic --- 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(+) 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 (limited to 'drivers') diff --git a/Makefile b/Makefile index 0f18e6cf3dd..1a17be9dbe2 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 00000000000..da1541412b8 --- /dev/null +++ b/drivers/power/fuel_gauge/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (C) 2012 Samsung Electronics +# Lukasz Majewski +# +# 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 00000000000..9b7c184cb0f --- /dev/null +++ b/drivers/power/fuel_gauge/fg_max17042.c @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +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 at 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 00000000000..7ddf6f2ffa8 --- /dev/null +++ b/include/power/fg_battery_cell_params.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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 00000000000..1103a483f20 --- /dev/null +++ b/include/power/max17042_fg.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Lukasz Majewski + * + * 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_ */ -- cgit v1.3.1 From bf995a9a28c7a987be0b3df9d4f84da63c9bfb1c Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:04 +0000 Subject: pmic:max8997: Function for calculating LDO internal register value Function for calculating LDO internal register value from passed micro Volt. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/pmic/pmic_max8997.c | 16 ++++++++++++++++ include/power/max8997_pmic.h | 2 ++ 2 files changed, 18 insertions(+) (limited to 'drivers') diff --git a/drivers/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c index 7fe1b53ff07..2e46884dd68 100644 --- a/drivers/power/pmic/pmic_max8997.c +++ b/drivers/power/pmic/pmic_max8997.c @@ -27,6 +27,22 @@ #include #include +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 1db7deb3beb..03cac041f19 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_ */ -- cgit v1.3.1 From d955c6de84f59f5787fac399851af5b0e912b07a Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:09 +0000 Subject: pmic:max8997: Support for MAX8997 internal charger control Support for MAX8997 built-in charger. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/pmic/pmic_max8997.c | 59 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/power/pmic/pmic_max8997.c b/drivers/power/pmic/pmic_max8997.c index 2e46884dd68..4e5c6d647fb 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; } -- cgit v1.3.1 From 7d19629f8ee62c594629cd998ba7d89a4fc8ec18 Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:12 +0000 Subject: pmic: Extend PMIC framework to support battery related commands 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 Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/pmic_core.c | 59 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 17 deletions(-) (limited to 'drivers') diff --git a/drivers/power/pmic_core.c b/drivers/power/pmic_core.c index 4066b15adcd..90df2c58c4c 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 - read register\n" - "pmic name write - write register" + "pmic name write - write register\n" + "pmic name bat state - write register\n" + "pmic name bat charge - write register\n" ); -- cgit v1.3.1 From 316a51beba19f1e0004be27329462ce6616a945c Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:13 +0000 Subject: power:pmic: Rename ./drivers/power/pmic_* to ./drivers/power/power_* files Rename pmic/power related files at ./drivers/power directory Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/Makefile | 10 +- drivers/power/pmic_core.c | 232 ------------------------------------------- drivers/power/pmic_dialog.c | 43 -------- drivers/power/pmic_fsl.c | 69 ------------- drivers/power/pmic_i2c.c | 125 ----------------------- drivers/power/pmic_spi.c | 108 -------------------- drivers/power/power_core.c | 232 +++++++++++++++++++++++++++++++++++++++++++ drivers/power/power_dialog.c | 43 ++++++++ drivers/power/power_fsl.c | 69 +++++++++++++ drivers/power/power_i2c.c | 125 +++++++++++++++++++++++ drivers/power/power_spi.c | 108 ++++++++++++++++++++ 11 files changed, 582 insertions(+), 582 deletions(-) delete mode 100644 drivers/power/pmic_core.c delete mode 100644 drivers/power/pmic_dialog.c delete mode 100644 drivers/power/pmic_fsl.c delete mode 100644 drivers/power/pmic_i2c.c delete mode 100644 drivers/power/pmic_spi.c create mode 100644 drivers/power/power_core.c create mode 100644 drivers/power/power_dialog.c create mode 100644 drivers/power/power_fsl.c create mode 100644 drivers/power/power_i2c.c create mode 100644 drivers/power/power_spi.c (limited to 'drivers') diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 7fc5554b496..7733e01a448 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/pmic_core.c deleted file mode 100644 index 90df2c58c4c..00000000000 --- a/drivers/power/pmic_core.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include -#include - -static LIST_HEAD(pmic_list); - -int check_reg(struct pmic *p, u32 reg) -{ - if (reg >= p->number_of_regs) { - printf(" = %d is invalid. Should be less than %d\n", - reg, p->number_of_regs); - return -1; - } - - return 0; -} - -int pmic_set_output(struct pmic *p, u32 reg, int out, int on) -{ - u32 val; - - if (pmic_reg_read(p, reg, &val)) - return -1; - - if (on) - val |= out; - else - val &= ~out; - - if (pmic_reg_write(p, reg, val)) - return -1; - - return 0; -} - -static void pmic_show_info(struct pmic *p) -{ - printf("PMIC: %s\n", p->name); -} - -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); - if (ret) - puts("PMIC: Registers dump failed\n"); - - if (!(i % 8)) - printf("\n0x%02x: ", i); - - printf("%08x ", val); - } - puts("\n"); - return 0; -} - -struct pmic *pmic_alloc(void) -{ - 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; -} - -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 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; - - /* at least two arguments please */ - if (argc < 2) - return CMD_RET_USAGE; - - 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) { - if (pmic_dump(p)) - return CMD_RET_FAILURE; - return CMD_RET_SUCCESS; - } - - if (strcmp(cmd, "read") == 0) { - if (argc < 4) - return CMD_RET_USAGE; - - reg = simple_strtoul(argv[3], NULL, 16); - ret = pmic_reg_read(p, reg, &val); - - if (ret) - puts("PMIC: Register read failed\n"); - - printf("\n0x%02x: 0x%08x\n", reg, val); - - return CMD_RET_SUCCESS; - } - - if (strcmp(cmd, "write") == 0) { - if (argc < 5) - return CMD_RET_USAGE; - - reg = simple_strtoul(argv[3], NULL, 16); - val = simple_strtoul(argv[4], NULL, 16); - 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; -} - -U_BOOT_CMD( - pmic, CONFIG_SYS_MAXARGS, 1, do_pmic, - "PMIC", - "list - list available PMICs\n" - "pmic name dump - dump named PMIC registers\n" - "pmic name read - read register\n" - "pmic name write - write register\n" - "pmic name bat state - write register\n" - "pmic name bat charge - write register\n" -); diff --git a/drivers/power/pmic_dialog.c b/drivers/power/pmic_dialog.c deleted file mode 100644 index d7ebd1583e8..00000000000 --- a/drivers/power/pmic_dialog.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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. - */ - -#include -#include -#include -#include - -int pmic_dialog_init(unsigned char bus) -{ - 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; - - p->interface = PMIC_I2C; - p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR; - p->hw.i2c.tx_num = 1; - p->bus = bus; - - return 0; -} diff --git a/drivers/power/pmic_fsl.c b/drivers/power/pmic_fsl.c deleted file mode 100644 index 0275fd9891a..00000000000 --- a/drivers/power/pmic_fsl.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * 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 -#include -#include -#include -#include - -#if defined(CONFIG_PMIC_SPI) -static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write) -{ - return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF); -} -#endif - -int pmic_init(unsigned char bus) -{ - 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; - -#if defined(CONFIG_PMIC_SPI) - p->interface = PMIC_SPI; - p->bus = CONFIG_FSL_PMIC_BUS; - p->hw.spi.cs = CONFIG_FSL_PMIC_CS; - p->hw.spi.clk = CONFIG_FSL_PMIC_CLK; - p->hw.spi.mode = CONFIG_FSL_PMIC_MODE; - 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) - 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" -#endif - - return 0; -} diff --git a/drivers/power/pmic_i2c.c b/drivers/power/pmic_i2c.c deleted file mode 100644 index 3e5a784cf53..00000000000 --- a/drivers/power/pmic_i2c.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include -#include - -int pmic_reg_write(struct pmic *p, u32 reg, u32 val) -{ - unsigned char buf[4] = { 0 }; - - if (check_reg(p, reg)) - return -1; - - switch (pmic_i2c_tx_num) { - case 3: - 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: - 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] = cpu_to_le32(val) & 0xff; - break; - default: - printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); - return -1; - } - - if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) - return -1; - - return 0; -} - -int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) -{ - unsigned char buf[4] = { 0 }; - u32 ret_val = 0; - - if (check_reg(p, reg)) - return -1; - - if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) - return -1; - - switch (pmic_i2c_tx_num) { - case 3: - 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: - 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 = le32_to_cpu(buf[0]); - break; - default: - printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); - return -1; - } - memcpy(val, &ret_val, sizeof(ret_val)); - - return 0; -} - -int pmic_probe(struct pmic *p) -{ - I2C_SET_BUS(p->bus); - 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; - } - - return 0; -} diff --git a/drivers/power/pmic_spi.c b/drivers/power/pmic_spi.c deleted file mode 100644 index 27488ea5d92..00000000000 --- a/drivers/power/pmic_spi.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2011 Samsung Electronics - * Lukasz Majewski - * - * (C) Copyright 2010 - * Stefano Babic, DENX Software Engineering, sbabic@denx.de - * - * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. - * - * 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 -#include -#include -#include - -static struct spi_slave *slave; - -void pmic_spi_free(struct spi_slave *slave) -{ - if (slave) - spi_free_slave(slave); -} - -struct spi_slave *pmic_spi_probe(struct pmic *p) -{ - return spi_setup_slave(p->bus, - p->hw.spi.cs, - p->hw.spi.clk, - p->hw.spi.mode); -} - -static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write) -{ - u32 pmic_tx, pmic_rx; - u32 tmp; - - if (!slave) { - slave = pmic_spi_probe(p); - - if (!slave) - return -1; - } - - if (check_reg(p, reg)) - return -1; - - if (spi_claim_bus(slave)) - return -1; - - pmic_tx = p->hw.spi.prepare_tx(reg, val, write); - - tmp = cpu_to_be32(pmic_tx); - - if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, - pmic_spi_flags)) { - spi_release_bus(slave); - return -1; - } - - if (write) { - pmic_tx = p->hw.spi.prepare_tx(reg, val, 0); - tmp = cpu_to_be32(pmic_tx); - if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, - pmic_spi_flags)) { - spi_release_bus(slave); - return -1; - } - } - - spi_release_bus(slave); - *val = cpu_to_be32(pmic_rx); - - return 0; -} - -int pmic_reg_write(struct pmic *p, u32 reg, u32 val) -{ - if (pmic_reg(p, reg, &val, 1)) - return -1; - - return 0; -} - -int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) -{ - if (pmic_reg(p, reg, val, 0)) - return -1; - - return 0; -} diff --git a/drivers/power/power_core.c b/drivers/power/power_core.c new file mode 100644 index 00000000000..90df2c58c4c --- /dev/null +++ b/drivers/power/power_core.c @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include +#include + +static LIST_HEAD(pmic_list); + +int check_reg(struct pmic *p, u32 reg) +{ + if (reg >= p->number_of_regs) { + printf(" = %d is invalid. Should be less than %d\n", + reg, p->number_of_regs); + return -1; + } + + return 0; +} + +int pmic_set_output(struct pmic *p, u32 reg, int out, int on) +{ + u32 val; + + if (pmic_reg_read(p, reg, &val)) + return -1; + + if (on) + val |= out; + else + val &= ~out; + + if (pmic_reg_write(p, reg, val)) + return -1; + + return 0; +} + +static void pmic_show_info(struct pmic *p) +{ + printf("PMIC: %s\n", p->name); +} + +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); + if (ret) + puts("PMIC: Registers dump failed\n"); + + if (!(i % 8)) + printf("\n0x%02x: ", i); + + printf("%08x ", val); + } + puts("\n"); + return 0; +} + +struct pmic *pmic_alloc(void) +{ + 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; +} + +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 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; + + /* at least two arguments please */ + if (argc < 2) + return CMD_RET_USAGE; + + 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) { + if (pmic_dump(p)) + return CMD_RET_FAILURE; + return CMD_RET_SUCCESS; + } + + if (strcmp(cmd, "read") == 0) { + if (argc < 4) + return CMD_RET_USAGE; + + reg = simple_strtoul(argv[3], NULL, 16); + ret = pmic_reg_read(p, reg, &val); + + if (ret) + puts("PMIC: Register read failed\n"); + + printf("\n0x%02x: 0x%08x\n", reg, val); + + return CMD_RET_SUCCESS; + } + + if (strcmp(cmd, "write") == 0) { + if (argc < 5) + return CMD_RET_USAGE; + + reg = simple_strtoul(argv[3], NULL, 16); + val = simple_strtoul(argv[4], NULL, 16); + 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; +} + +U_BOOT_CMD( + pmic, CONFIG_SYS_MAXARGS, 1, do_pmic, + "PMIC", + "list - list available PMICs\n" + "pmic name dump - dump named PMIC registers\n" + "pmic name read - read register\n" + "pmic name write - write register\n" + "pmic name bat state - write register\n" + "pmic name bat charge - write register\n" +); diff --git a/drivers/power/power_dialog.c b/drivers/power/power_dialog.c new file mode 100644 index 00000000000..d7ebd1583e8 --- /dev/null +++ b/drivers/power/power_dialog.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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. + */ + +#include +#include +#include +#include + +int pmic_dialog_init(unsigned char bus) +{ + 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; + + p->interface = PMIC_I2C; + p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR; + p->hw.i2c.tx_num = 1; + p->bus = bus; + + return 0; +} diff --git a/drivers/power/power_fsl.c b/drivers/power/power_fsl.c new file mode 100644 index 00000000000..0275fd9891a --- /dev/null +++ b/drivers/power/power_fsl.c @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * 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 +#include +#include +#include +#include + +#if defined(CONFIG_PMIC_SPI) +static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write) +{ + return (write << 31) | (reg << 25) | (*val & 0x00FFFFFF); +} +#endif + +int pmic_init(unsigned char bus) +{ + 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; + +#if defined(CONFIG_PMIC_SPI) + p->interface = PMIC_SPI; + p->bus = CONFIG_FSL_PMIC_BUS; + p->hw.spi.cs = CONFIG_FSL_PMIC_CS; + p->hw.spi.clk = CONFIG_FSL_PMIC_CLK; + p->hw.spi.mode = CONFIG_FSL_PMIC_MODE; + 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) + 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" +#endif + + return 0; +} diff --git a/drivers/power/power_i2c.c b/drivers/power/power_i2c.c new file mode 100644 index 00000000000..3e5a784cf53 --- /dev/null +++ b/drivers/power/power_i2c.c @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include +#include + +int pmic_reg_write(struct pmic *p, u32 reg, u32 val) +{ + unsigned char buf[4] = { 0 }; + + if (check_reg(p, reg)) + return -1; + + switch (pmic_i2c_tx_num) { + case 3: + 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: + 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] = cpu_to_le32(val) & 0xff; + break; + default: + printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); + return -1; + } + + if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) + return -1; + + return 0; +} + +int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) +{ + unsigned char buf[4] = { 0 }; + u32 ret_val = 0; + + if (check_reg(p, reg)) + return -1; + + if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) + return -1; + + switch (pmic_i2c_tx_num) { + case 3: + 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: + 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 = le32_to_cpu(buf[0]); + break; + default: + printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); + return -1; + } + memcpy(val, &ret_val, sizeof(ret_val)); + + return 0; +} + +int pmic_probe(struct pmic *p) +{ + I2C_SET_BUS(p->bus); + 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; + } + + return 0; +} diff --git a/drivers/power/power_spi.c b/drivers/power/power_spi.c new file mode 100644 index 00000000000..27488ea5d92 --- /dev/null +++ b/drivers/power/power_spi.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2011 Samsung Electronics + * Lukasz Majewski + * + * (C) Copyright 2010 + * Stefano Babic, DENX Software Engineering, sbabic@denx.de + * + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. + * + * 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 +#include +#include +#include + +static struct spi_slave *slave; + +void pmic_spi_free(struct spi_slave *slave) +{ + if (slave) + spi_free_slave(slave); +} + +struct spi_slave *pmic_spi_probe(struct pmic *p) +{ + return spi_setup_slave(p->bus, + p->hw.spi.cs, + p->hw.spi.clk, + p->hw.spi.mode); +} + +static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write) +{ + u32 pmic_tx, pmic_rx; + u32 tmp; + + if (!slave) { + slave = pmic_spi_probe(p); + + if (!slave) + return -1; + } + + if (check_reg(p, reg)) + return -1; + + if (spi_claim_bus(slave)) + return -1; + + pmic_tx = p->hw.spi.prepare_tx(reg, val, write); + + tmp = cpu_to_be32(pmic_tx); + + if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, + pmic_spi_flags)) { + spi_release_bus(slave); + return -1; + } + + if (write) { + pmic_tx = p->hw.spi.prepare_tx(reg, val, 0); + tmp = cpu_to_be32(pmic_tx); + if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx, + pmic_spi_flags)) { + spi_release_bus(slave); + return -1; + } + } + + spi_release_bus(slave); + *val = cpu_to_be32(pmic_rx); + + return 0; +} + +int pmic_reg_write(struct pmic *p, u32 reg, u32 val) +{ + if (pmic_reg(p, reg, &val, 1)) + return -1; + + return 0; +} + +int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) +{ + if (pmic_reg(p, reg, val, 0)) + return -1; + + return 0; +} -- cgit v1.3.1 From be3b51aa4a450f3e3fcd9c6e5074ef435812a02d Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:14 +0000 Subject: power:pmic: Rename CONFIG_PMIC* defines to CONFIG_POWER Rename all CONFIG_PMIC* defines to CONFIG_POWER* Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- 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(-) (limited to 'drivers') diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c index 71ed618c6fd..50e92104e15 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 c4950ddc269..9849c6d1118 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 7733e01a448..2723724a35f 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 9b71e55a254..e19a9a81950 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 0275fd9891a..651f88f850a 100644 --- a/drivers/power/power_fsl.c +++ b/drivers/power/power_fsl.c @@ -27,7 +27,7 @@ #include #include -#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 6ae764a2d4a..8fc39424507 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 9d9f4a78229..9e4006b4419 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 223b5b0bb92..3b86c9ebf35 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 826c912494d..342d53fee0b 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 ffe771f2dcb..3c1c056fe31 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 225d359ecb7..f00cec28096 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 d1f684cbc5c..1916b85e283 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 a1b27cef535..d16de3306a3 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 e43a02110ec..d9bf2010b83 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 7e0b3029356..56e83478f8e 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 /* diff --git a/include/configs/s5pc210_universal.h b/include/configs/s5pc210_universal.h index 5fc61364355..894f38bd7db 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 2fdc597c000..355029e8d83 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 f46efa55f16..9f8f240f822 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 848df88e7df..a72010ff212 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 -- cgit v1.3.1 From 2988e8662bba5b94c366bc3cb8eb26f0024f74de Mon Sep 17 00:00:00 2001 From: Łukasz Majewski Date: Tue, 13 Nov 2012 03:22:15 +0000 Subject: power:pmic: Rename CONFIG_DIALOG_PMIC defines to CONFIG_DIALOG_POWER Rename CONFIG_DIALOG_PMIC to CONFIG_DIALOG_POWER Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park Cc: Stefano Babic --- drivers/power/Makefile | 2 +- include/configs/mx53loco.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 2723724a35f..8c7190156c3 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 d16de3306a3..a1101762e38 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 -- cgit v1.3.1