15d387d0dSPrzemyslaw Marczak /*
25d387d0dSPrzemyslaw Marczak * Copyright (C) 2015 Samsung Electronics
35d387d0dSPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com>
45d387d0dSPrzemyslaw Marczak *
55d387d0dSPrzemyslaw Marczak * SPDX-License-Identifier: GPL-2.0+
65d387d0dSPrzemyslaw Marczak */
75d387d0dSPrzemyslaw Marczak
85d387d0dSPrzemyslaw Marczak #include <common.h>
95d387d0dSPrzemyslaw Marczak #include <fdtdec.h>
105d387d0dSPrzemyslaw Marczak #include <errno.h>
115d387d0dSPrzemyslaw Marczak #include <dm.h>
125d387d0dSPrzemyslaw Marczak #include <i2c.h>
135d387d0dSPrzemyslaw Marczak #include <power/pmic.h>
145d387d0dSPrzemyslaw Marczak #include <power/regulator.h>
155d387d0dSPrzemyslaw Marczak #include <power/sandbox_pmic.h>
165d387d0dSPrzemyslaw Marczak
175d387d0dSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR;
185d387d0dSPrzemyslaw Marczak
195d387d0dSPrzemyslaw Marczak static const struct pmic_child_info pmic_children_info[] = {
205d387d0dSPrzemyslaw Marczak { .prefix = SANDBOX_OF_LDO_PREFIX, .driver = SANDBOX_LDO_DRIVER },
215d387d0dSPrzemyslaw Marczak { .prefix = SANDBOX_OF_BUCK_PREFIX, .driver = SANDBOX_BUCK_DRIVER },
225d387d0dSPrzemyslaw Marczak { },
235d387d0dSPrzemyslaw Marczak };
245d387d0dSPrzemyslaw Marczak
sandbox_pmic_reg_count(struct udevice * dev)255d387d0dSPrzemyslaw Marczak static int sandbox_pmic_reg_count(struct udevice *dev)
265d387d0dSPrzemyslaw Marczak {
275d387d0dSPrzemyslaw Marczak return SANDBOX_PMIC_REG_COUNT;
285d387d0dSPrzemyslaw Marczak }
295d387d0dSPrzemyslaw Marczak
sandbox_pmic_write(struct udevice * dev,uint reg,const uint8_t * buff,int len)305d387d0dSPrzemyslaw Marczak static int sandbox_pmic_write(struct udevice *dev, uint reg,
315d387d0dSPrzemyslaw Marczak const uint8_t *buff, int len)
325d387d0dSPrzemyslaw Marczak {
335d387d0dSPrzemyslaw Marczak if (dm_i2c_write(dev, reg, buff, len)) {
34*90aa625cSMasahiro Yamada pr_err("write error to device: %p register: %#x!", dev, reg);
355d387d0dSPrzemyslaw Marczak return -EIO;
365d387d0dSPrzemyslaw Marczak }
375d387d0dSPrzemyslaw Marczak
385d387d0dSPrzemyslaw Marczak return 0;
395d387d0dSPrzemyslaw Marczak }
405d387d0dSPrzemyslaw Marczak
sandbox_pmic_read(struct udevice * dev,uint reg,uint8_t * buff,int len)415d387d0dSPrzemyslaw Marczak static int sandbox_pmic_read(struct udevice *dev, uint reg,
425d387d0dSPrzemyslaw Marczak uint8_t *buff, int len)
435d387d0dSPrzemyslaw Marczak {
445d387d0dSPrzemyslaw Marczak if (dm_i2c_read(dev, reg, buff, len)) {
45*90aa625cSMasahiro Yamada pr_err("read error from device: %p register: %#x!", dev, reg);
465d387d0dSPrzemyslaw Marczak return -EIO;
475d387d0dSPrzemyslaw Marczak }
485d387d0dSPrzemyslaw Marczak
495d387d0dSPrzemyslaw Marczak return 0;
505d387d0dSPrzemyslaw Marczak }
515d387d0dSPrzemyslaw Marczak
sandbox_pmic_bind(struct udevice * dev)525d387d0dSPrzemyslaw Marczak static int sandbox_pmic_bind(struct udevice *dev)
535d387d0dSPrzemyslaw Marczak {
547a869e6cSSimon Glass if (!pmic_bind_children(dev, dev_ofnode(dev), pmic_children_info))
55*90aa625cSMasahiro Yamada pr_err("%s:%d PMIC: %s - no child found!", __func__, __LINE__,
565d387d0dSPrzemyslaw Marczak dev->name);
575d387d0dSPrzemyslaw Marczak
585d387d0dSPrzemyslaw Marczak /* Always return success for this device - allows for PMIC I/O */
595d387d0dSPrzemyslaw Marczak return 0;
605d387d0dSPrzemyslaw Marczak }
615d387d0dSPrzemyslaw Marczak
625d387d0dSPrzemyslaw Marczak static struct dm_pmic_ops sandbox_pmic_ops = {
635d387d0dSPrzemyslaw Marczak .reg_count = sandbox_pmic_reg_count,
645d387d0dSPrzemyslaw Marczak .read = sandbox_pmic_read,
655d387d0dSPrzemyslaw Marczak .write = sandbox_pmic_write,
665d387d0dSPrzemyslaw Marczak };
675d387d0dSPrzemyslaw Marczak
685d387d0dSPrzemyslaw Marczak static const struct udevice_id sandbox_pmic_ids[] = {
695d387d0dSPrzemyslaw Marczak { .compatible = "sandbox,pmic" },
705d387d0dSPrzemyslaw Marczak { }
715d387d0dSPrzemyslaw Marczak };
725d387d0dSPrzemyslaw Marczak
735d387d0dSPrzemyslaw Marczak U_BOOT_DRIVER(sandbox_pmic) = {
745d387d0dSPrzemyslaw Marczak .name = "sandbox_pmic",
755d387d0dSPrzemyslaw Marczak .id = UCLASS_PMIC,
765d387d0dSPrzemyslaw Marczak .of_match = sandbox_pmic_ids,
775d387d0dSPrzemyslaw Marczak .bind = sandbox_pmic_bind,
785d387d0dSPrzemyslaw Marczak .ops = &sandbox_pmic_ops,
795d387d0dSPrzemyslaw Marczak };
80