diff options
Diffstat (limited to 'drivers/misc/pmic_core.c')
| -rw-r--r-- | drivers/misc/pmic_core.c | 114 | 
1 files changed, 87 insertions, 27 deletions
| diff --git a/drivers/misc/pmic_core.c b/drivers/misc/pmic_core.c index 5d62a56d3..4066b15ad 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 *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;  } -struct pmic *get_pmic(void) +static void pmic_list_names(void)  { -	return &pmic; +	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"  ); |