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 <vben...@chromium.org> > Signed-off-by: Leela Krishna Amudala <l.kris...@samsung.com> > Reviewed-by: Doug Anderson <diand...@google.com> > Acked-by: Simon Glass <s...@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 <vben...@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. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot