xref: /rk3399_rockchip-uboot/drivers/power/pmic/sandbox.c (revision 90aa625c9a9e1fb7a2f001fd8e50099bacaf92b8)
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