Re: [U-Boot] [PATCH V5 5/6] exynos: Add a common DT based PMIC driver initialization

On 16/01/14 17:55, Leela Krishna Amudala wrote:
Most of i2c PMIC drivers follow the same initialization sequence, let's generalize it in a common file.
The initialization function finds the PMIC in the device tree, and if found - registers it in the list of known PMICs and initializes it, iterating through the table of settings supplied by the caller.
Signed-off-by: Vadim Bendebury vbendeb@chromium.org Signed-off-by: Leela Krishna Amudala l.krishna@samsung.com Reviewed-by: Doug Anderson dianders@google.com Acked-by: Simon Glass sjg@chromium.org
board/samsung/common/board.c | 26 ++++++++++++ drivers/power/pmic/Makefile | 1 + drivers/power/pmic/pmic_common.c | 87 ++++++++++++++++++++++++++++++++++++++ drivers/power/power_core.c | 14 ++++++ include/power/pmic.h | 36 ++++++++++++++++ 5 files changed, 164 insertions(+) create mode 100644 drivers/power/pmic/pmic_common.c
diff --git a/drivers/power/pmic/pmic_common.c b/drivers/power/pmic/pmic_common.c new file mode 100644 index 0000000..ea1e90f --- /dev/null +++ b/drivers/power/pmic/pmic_common.c @@ -0,0 +1,87 @@ +/*
- Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- SPDX-License-Identifier: GPL-2.0+
- Author: Vadim Bendebury vbendeb@chromium.org
- */
+#include <common.h> +#include <fdtdec.h> +#include <errno.h> +#include <power/pmic.h>
+DECLARE_GLOBAL_DATA_PTR;
+int pmic_common_init(enum fdt_compat_id pmic_compat,
const struct pmic_init_ops *pmic_ops,
unsigned int number_of_regs)
+{
- const void *blob = gd->fdt_blob;
- struct pmic *p;
- int node, parent, ret;
- const char *pmic_name, *comma;
- if (!number_of_regs) {
printf("%s: %s - not a supported PMIC\n",
__func__, fdtdec_get_compatible(pmic_compat));
return -1;
- }
- node = fdtdec_next_compatible(blob, 0, pmic_compat);
- if (node < 0) {
debug("PMIC: Error %s. No node for %s in device tree\n",
fdt_strerror(node), fdtdec_get_compatible(pmic_compat));
return node;
- }
- pmic_name = fdtdec_get_compatible(pmic_compat);
- comma = strchr(pmic_name, ',');
- if (comma)
pmic_name = comma + 1;
- p = pmic_alloc();
- if (!p) {
printf("%s: POWER allocation error!\n", __func__);
return -ENOMEM;
- }
- parent = fdt_parent_offset(blob, node);
- if (parent < 0) {
debug("%s: Cannot find node parent\n", __func__);
return -1;
- }
- p->bus = i2c_get_bus_num_fdt(parent);
- if (p->bus < 0) {
debug("%s: Cannot find I2C bus\n", __func__);
return -1;
- }
- p->hw.i2c.addr = fdtdec_get_int(blob, node, "reg", 9);
- p->name = pmic_name;
- p->interface = PMIC_I2C;
- p->hw.i2c.tx_num = 1;
- p->number_of_regs = number_of_regs;
- p->compat_id = pmic_compat;
- ret = 0;
ret = 0; unnecessary.
- while (pmic_ops->reg_op != PMIC_REG_BAIL) {
if (pmic_ops->reg_op == PMIC_REG_WRITE)
ret = pmic_reg_write(p,
pmic_ops->reg_addr,
pmic_ops->reg_value);
else
ret = pmic_reg_update(p,
pmic_ops->reg_addr,
pmic_ops->reg_value);
if (ret) {
printf("%s: Failed accessing reg 0x%x of %s\n",
__func__, pmic_ops->reg_addr, p->name);
return ret;
}
pmic_ops++;
- }
- printf("PMIC %s initialized\n", p->name);
- return ret;
+} diff --git a/drivers/power/power_core.c b/drivers/power/power_core.c index a1c4fd0..f40be31 100644 --- a/drivers/power/power_core.c +++ b/drivers/power/power_core.c @@ -228,6 +228,20 @@ int pmic_reg_update(struct pmic *p, int reg, u32 val) return 0; }
+struct pmic *pmic_get_by_id(enum fdt_compat_id pmic_compat)
Seems to did not use anywhere.
+{
- struct pmic *p;
- list_for_each_entry(p, &pmic_list, list) {
if (p->compat_id == pmic_compat) {
debug("%s: pmic %s -> 0x%p\n", __func__, p->name, p);
return p;
}
- }
- return NULL;
+}
U_BOOT_CMD( pmic, CONFIG_SYS_MAXARGS, 1, do_pmic, "PMIC",
Thanks, Minkyu Kang.
participants (1)
-
Minkyu Kang