summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/misc/pmic_core.c116
-rw-r--r--drivers/misc/pmic_dialog.c14
-rw-r--r--drivers/misc/pmic_fsl.c14
-rw-r--r--drivers/misc/pmic_i2c.c6
-rw-r--r--drivers/misc/pmic_max8997.c16
-rw-r--r--drivers/misc/pmic_max8998.c16
-rw-r--r--drivers/misc/pmic_spi.c4
-rw-r--r--drivers/rtc/mc13xxx-rtc.c10
8 files changed, 142 insertions, 54 deletions
diff --git a/drivers/misc/pmic_core.c b/drivers/misc/pmic_core.c
index 5d62a56..4066b15 100644
--- a/drivers/misc/pmic_core.c
+++ b/drivers/misc/pmic_core.c
@@ -27,18 +27,21 @@
*/
#include <common.h>
+#include <malloc.h>
#include <linux/types.h>
-#include <pmic.h>
+#include <linux/list.h>
+#include <power/pmic.h>
-static struct pmic pmic;
+static LIST_HEAD(pmic_list);
-int check_reg(u32 reg)
+int check_reg(struct pmic *p, u32 reg)
{
- if (reg >= pmic.number_of_regs) {
+ if (reg >= p->number_of_regs) {
printf("<reg num> = %d is invalid. Should be less than %d\n",
- reg, pmic.number_of_regs);
+ reg, p->number_of_regs);
return -1;
}
+
return 0;
}
@@ -65,11 +68,16 @@ static void pmic_show_info(struct pmic *p)
printf("PMIC: %s\n", p->name);
}
-static void pmic_dump(struct pmic *p)
+static int pmic_dump(struct pmic *p)
{
int i, ret;
u32 val;
+ if (!p) {
+ puts("Wrong PMIC name!\n");
+ return -1;
+ }
+
pmic_show_info(p);
for (i = 0; i < p->number_of_regs; i++) {
ret = pmic_reg_read(p, i, &val);
@@ -82,35 +90,84 @@ static void pmic_dump(struct pmic *p)
printf("%08x ", val);
}
puts("\n");
+ return 0;
}
-struct pmic *get_pmic(void)
+struct pmic *pmic_alloc(void)
{
- return &pmic;
+ struct pmic *p;
+
+ p = calloc(sizeof(*p), 1);
+ if (!p) {
+ printf("%s: No available memory for allocation!\n", __func__);
+ return NULL;
+ }
+
+ list_add_tail(&p->list, &pmic_list);
+
+ debug("%s: new pmic struct: 0x%p\n", __func__, p);
+
+ return p;
+}
+
+struct pmic *pmic_get(const char *s)
+{
+ struct pmic *p;
+
+ list_for_each_entry(p, &pmic_list, list) {
+ if (strcmp(p->name, s) == 0) {
+ debug("%s: pmic %s -> 0x%p\n", __func__, p->name, p);
+ return p;
+ }
+ }
+
+ return NULL;
+}
+
+static void pmic_list_names(void)
+{
+ struct pmic *p;
+
+ puts("PMIC devices:\n");
+ list_for_each_entry(p, &pmic_list, list) {
+ printf("name: %s\n", p->name);
+ }
}
int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
u32 ret, reg, val;
+ struct pmic *p;
char *cmd;
- struct pmic *p = &pmic;
-
/* at least two arguments please */
if (argc < 2)
- return cmd_usage(cmdtp);
+ return CMD_RET_USAGE;
cmd = argv[1];
+
+ if (strcmp(cmd, "list") == 0) {
+ pmic_list_names();
+ return CMD_RET_SUCCESS;
+ }
+
if (strcmp(cmd, "dump") == 0) {
- pmic_dump(p);
- return 0;
+ p = pmic_get(argv[2]);
+ if (!p)
+ return CMD_RET_FAILURE;
+ if (pmic_dump(p))
+ return CMD_RET_FAILURE;
+ return CMD_RET_SUCCESS;
}
if (strcmp(cmd, "read") == 0) {
- if (argc < 3)
- return cmd_usage(cmdtp);
+ if (argc < 4)
+ return CMD_RET_USAGE;
- reg = simple_strtoul(argv[2], NULL, 16);
+ reg = simple_strtoul(argv[3], NULL, 16);
+ p = pmic_get(argv[2]);
+ if (!p)
+ return CMD_RET_FAILURE;
ret = pmic_reg_read(p, reg, &val);
@@ -119,29 +176,32 @@ int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
printf("\n0x%02x: 0x%08x\n", reg, val);
- return 0;
+ return CMD_RET_SUCCESS;
}
if (strcmp(cmd, "write") == 0) {
- if (argc < 4)
- return cmd_usage(cmdtp);
-
- reg = simple_strtoul(argv[2], NULL, 16);
- val = simple_strtoul(argv[3], NULL, 16);
-
+ if (argc < 5)
+ return CMD_RET_USAGE;
+
+ reg = simple_strtoul(argv[3], NULL, 16);
+ val = simple_strtoul(argv[4], NULL, 16);
+ p = pmic_get(argv[2]);
+ if (!p)
+ return CMD_RET_FAILURE;
pmic_reg_write(p, reg, val);
- return 0;
+ return CMD_RET_SUCCESS;
}
/* No subcommand found */
- return 1;
+ return CMD_RET_SUCCESS;
}
U_BOOT_CMD(
pmic, CONFIG_SYS_MAXARGS, 1, do_pmic,
"PMIC",
- "dump - dump PMIC registers\n"
- "pmic read <reg> - read register\n"
- "pmic write <reg> <value> - write register"
+ "list - list available PMICs\n"
+ "pmic dump name - dump named PMIC registers\n"
+ "pmic name read <reg> - read register\n"
+ "pmic name write <reg> <value> - write register"
);
diff --git a/drivers/misc/pmic_dialog.c b/drivers/misc/pmic_dialog.c
index e97af1d..d7ebd15 100644
--- a/drivers/misc/pmic_dialog.c
+++ b/drivers/misc/pmic_dialog.c
@@ -17,13 +17,19 @@
*/
#include <common.h>
-#include <pmic.h>
+#include <power/pmic.h>
#include <dialog_pmic.h>
+#include <errno.h>
-int pmic_dialog_init(void)
+int pmic_dialog_init(unsigned char bus)
{
- struct pmic *p = get_pmic();
static const char name[] = "DIALOG_PMIC";
+ struct pmic *p = pmic_alloc();
+
+ if (!p) {
+ printf("%s: POWER allocation error!\n", __func__);
+ return -ENOMEM;
+ }
p->name = name;
p->number_of_regs = DIALOG_NUM_OF_REGS;
@@ -31,7 +37,7 @@ int pmic_dialog_init(void)
p->interface = PMIC_I2C;
p->hw.i2c.addr = CONFIG_SYS_DIALOG_PMIC_I2C_ADDR;
p->hw.i2c.tx_num = 1;
- p->bus = I2C_PMIC;
+ p->bus = bus;
return 0;
}
diff --git a/drivers/misc/pmic_fsl.c b/drivers/misc/pmic_fsl.c
index 0ff75ed..0275fd9 100644
--- a/drivers/misc/pmic_fsl.c
+++ b/drivers/misc/pmic_fsl.c
@@ -23,8 +23,9 @@
#include <common.h>
#include <spi.h>
-#include <pmic.h>
+#include <power/pmic.h>
#include <fsl_pmic.h>
+#include <errno.h>
#if defined(CONFIG_PMIC_SPI)
static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)
@@ -33,10 +34,15 @@ static u32 pmic_spi_prepare_tx(u32 reg, u32 *val, u32 write)
}
#endif
-int pmic_init(void)
+int pmic_init(unsigned char bus)
{
- struct pmic *p = get_pmic();
static const char name[] = "FSL_PMIC";
+ struct pmic *p = pmic_alloc();
+
+ if (!p) {
+ printf("%s: POWER allocation error!\n", __func__);
+ return -ENOMEM;
+ }
p->name = name;
p->number_of_regs = PMIC_NUM_OF_REGS;
@@ -54,7 +60,7 @@ int pmic_init(void)
p->interface = PMIC_I2C;
p->hw.i2c.addr = CONFIG_SYS_FSL_PMIC_I2C_ADDR;
p->hw.i2c.tx_num = 3;
- p->bus = I2C_PMIC;
+ p->bus = bus;
#else
#error "You must select CONFIG_PMIC_SPI or CONFIG_PMIC_I2C"
#endif
diff --git a/drivers/misc/pmic_i2c.c b/drivers/misc/pmic_i2c.c
index 1064bfe..3e5a784 100644
--- a/drivers/misc/pmic_i2c.c
+++ b/drivers/misc/pmic_i2c.c
@@ -28,7 +28,7 @@
#include <common.h>
#include <linux/types.h>
-#include <pmic.h>
+#include <power/pmic.h>
#include <i2c.h>
#include <compiler.h>
@@ -36,7 +36,7 @@ int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
{
unsigned char buf[4] = { 0 };
- if (check_reg(reg))
+ if (check_reg(p, reg))
return -1;
switch (pmic_i2c_tx_num) {
@@ -79,7 +79,7 @@ int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
unsigned char buf[4] = { 0 };
u32 ret_val = 0;
- if (check_reg(reg))
+ if (check_reg(p, reg))
return -1;
if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num))
diff --git a/drivers/misc/pmic_max8997.c b/drivers/misc/pmic_max8997.c
index 4943f66..7fe1b53 100644
--- a/drivers/misc/pmic_max8997.c
+++ b/drivers/misc/pmic_max8997.c
@@ -22,14 +22,20 @@
*/
#include <common.h>
-#include <pmic.h>
-#include <max8997_pmic.h>
+#include <power/pmic.h>
+#include <power/max8997_pmic.h>
#include <i2c.h>
+#include <errno.h>
-int pmic_init(void)
+int pmic_init(unsigned char bus)
{
- struct pmic *p = get_pmic();
static const char name[] = "MAX8997_PMIC";
+ struct pmic *p = pmic_alloc();
+
+ if (!p) {
+ printf("%s: POWER allocation error!\n", __func__);
+ return -ENOMEM;
+ }
puts("Board PMIC init\n");
@@ -38,7 +44,7 @@ int pmic_init(void)
p->number_of_regs = PMIC_NUM_OF_REGS;
p->hw.i2c.addr = MAX8997_I2C_ADDR;
p->hw.i2c.tx_num = 1;
- p->bus = I2C_0;
+ p->bus = bus;
return 0;
}
diff --git a/drivers/misc/pmic_max8998.c b/drivers/misc/pmic_max8998.c
index cc69fd7..452e1c8 100644
--- a/drivers/misc/pmic_max8998.c
+++ b/drivers/misc/pmic_max8998.c
@@ -22,13 +22,19 @@
*/
#include <common.h>
-#include <pmic.h>
-#include <max8998_pmic.h>
+#include <power/pmic.h>
+#include <power/max8998_pmic.h>
+#include <errno.h>
-int pmic_init(void)
+int pmic_init(unsigned char bus)
{
- struct pmic *p = get_pmic();
static const char name[] = "MAX8998_PMIC";
+ struct pmic *p = pmic_alloc();
+
+ if (!p) {
+ printf("%s: POWER allocation error!\n", __func__);
+ return -ENOMEM;
+ }
puts("Board PMIC init\n");
@@ -37,7 +43,7 @@ int pmic_init(void)
p->number_of_regs = PMIC_NUM_OF_REGS;
p->hw.i2c.addr = MAX8998_I2C_ADDR;
p->hw.i2c.tx_num = 1;
- p->bus = I2C_PMIC;
+ p->bus = bus;
return 0;
}
diff --git a/drivers/misc/pmic_spi.c b/drivers/misc/pmic_spi.c
index 5a0dd22..27488ea 100644
--- a/drivers/misc/pmic_spi.c
+++ b/drivers/misc/pmic_spi.c
@@ -28,7 +28,7 @@
#include <common.h>
#include <linux/types.h>
-#include <pmic.h>
+#include <power/pmic.h>
#include <spi.h>
static struct spi_slave *slave;
@@ -59,7 +59,7 @@ static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write)
return -1;
}
- if (check_reg(reg))
+ if (check_reg(p, reg))
return -1;
if (spi_claim_bus(slave))
diff --git a/drivers/rtc/mc13xxx-rtc.c b/drivers/rtc/mc13xxx-rtc.c
index 70ea8a1..e79f462 100644
--- a/drivers/rtc/mc13xxx-rtc.c
+++ b/drivers/rtc/mc13xxx-rtc.c
@@ -23,16 +23,18 @@
#include <common.h>
#include <rtc.h>
#include <spi.h>
-#include <pmic.h>
+#include <power/pmic.h>
#include <fsl_pmic.h>
int rtc_get(struct rtc_time *rtc)
{
u32 day1, day2, time;
int tim, i = 0;
- struct pmic *p = get_pmic();
+ struct pmic *p = pmic_get("FSL_PMIC");
int ret;
+ if (!p)
+ return -1;
do {
ret = pmic_reg_read(p, REG_RTC_DAY, &day1);
if (ret < 0)
@@ -61,7 +63,9 @@ int rtc_get(struct rtc_time *rtc)
int rtc_set(struct rtc_time *rtc)
{
u32 time, day;
- struct pmic *p = get_pmic();
+ struct pmic *p = pmic_get("FSL_PMIC");
+ if (!p)
+ return -1;
time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
rtc->tm_hour, rtc->tm_min, rtc->tm_sec);