xref: /rk3399_rockchip-uboot/drivers/power/pmic/max77686.c (revision 90aa625c9a9e1fb7a2f001fd8e50099bacaf92b8)
152a3de5eSPrzemyslaw Marczak /*
252a3de5eSPrzemyslaw Marczak  *  Copyright (C) 2014-2015 Samsung Electronics
352a3de5eSPrzemyslaw Marczak  *  Przemyslaw Marczak  <p.marczak@samsung.com>
452a3de5eSPrzemyslaw Marczak  *
552a3de5eSPrzemyslaw Marczak  * SPDX-License-Identifier:	GPL-2.0+
652a3de5eSPrzemyslaw Marczak  */
752a3de5eSPrzemyslaw Marczak 
852a3de5eSPrzemyslaw Marczak #include <common.h>
952a3de5eSPrzemyslaw Marczak #include <fdtdec.h>
1052a3de5eSPrzemyslaw Marczak #include <errno.h>
1152a3de5eSPrzemyslaw Marczak #include <dm.h>
1252a3de5eSPrzemyslaw Marczak #include <i2c.h>
1352a3de5eSPrzemyslaw Marczak #include <power/pmic.h>
1452a3de5eSPrzemyslaw Marczak #include <power/regulator.h>
1552a3de5eSPrzemyslaw Marczak #include <power/max77686_pmic.h>
1652a3de5eSPrzemyslaw Marczak 
1752a3de5eSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR;
1852a3de5eSPrzemyslaw Marczak 
19f415a3ecSPrzemyslaw Marczak static const struct pmic_child_info pmic_children_info[] = {
20b5ffa4fdSSimon Glass 	{ .prefix = "LDO", .driver = MAX77686_LDO_DRIVER },
21b5ffa4fdSSimon Glass 	{ .prefix = "BUCK", .driver = MAX77686_BUCK_DRIVER },
2252a3de5eSPrzemyslaw Marczak 	{ },
2352a3de5eSPrzemyslaw Marczak };
2452a3de5eSPrzemyslaw Marczak 
max77686_reg_count(struct udevice * dev)25f415a3ecSPrzemyslaw Marczak static int max77686_reg_count(struct udevice *dev)
26f415a3ecSPrzemyslaw Marczak {
27f415a3ecSPrzemyslaw Marczak 	return MAX77686_NUM_OF_REGS;
28f415a3ecSPrzemyslaw Marczak }
29f415a3ecSPrzemyslaw Marczak 
max77686_write(struct udevice * dev,uint reg,const uint8_t * buff,int len)3052a3de5eSPrzemyslaw Marczak static int max77686_write(struct udevice *dev, uint reg, const uint8_t *buff,
3152a3de5eSPrzemyslaw Marczak 			  int len)
3252a3de5eSPrzemyslaw Marczak {
3352a3de5eSPrzemyslaw Marczak 	if (dm_i2c_write(dev, reg, buff, len)) {
34*90aa625cSMasahiro Yamada 		pr_err("write error to device: %p register: %#x!", dev, reg);
3552a3de5eSPrzemyslaw Marczak 		return -EIO;
3652a3de5eSPrzemyslaw Marczak 	}
3752a3de5eSPrzemyslaw Marczak 
3852a3de5eSPrzemyslaw Marczak 	return 0;
3952a3de5eSPrzemyslaw Marczak }
4052a3de5eSPrzemyslaw Marczak 
max77686_read(struct udevice * dev,uint reg,uint8_t * buff,int len)4152a3de5eSPrzemyslaw Marczak static int max77686_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
4252a3de5eSPrzemyslaw Marczak {
4352a3de5eSPrzemyslaw Marczak 	if (dm_i2c_read(dev, reg, buff, len)) {
44*90aa625cSMasahiro Yamada 		pr_err("read error from device: %p register: %#x!", dev, reg);
4552a3de5eSPrzemyslaw Marczak 		return -EIO;
4652a3de5eSPrzemyslaw Marczak 	}
4752a3de5eSPrzemyslaw Marczak 
4852a3de5eSPrzemyslaw Marczak 	return 0;
4952a3de5eSPrzemyslaw Marczak }
5052a3de5eSPrzemyslaw Marczak 
max77686_bind(struct udevice * dev)5152a3de5eSPrzemyslaw Marczak static int max77686_bind(struct udevice *dev)
5252a3de5eSPrzemyslaw Marczak {
537a869e6cSSimon Glass 	ofnode regulators_node;
54f415a3ecSPrzemyslaw Marczak 	int children;
5552a3de5eSPrzemyslaw Marczak 
567a869e6cSSimon Glass 	regulators_node = dev_read_subnode(dev, "voltage-regulators");
577a869e6cSSimon Glass 	if (!ofnode_valid(regulators_node)) {
5852a3de5eSPrzemyslaw Marczak 		debug("%s: %s regulators subnode not found!", __func__,
5952a3de5eSPrzemyslaw Marczak 							     dev->name);
6052a3de5eSPrzemyslaw Marczak 		return -ENXIO;
6152a3de5eSPrzemyslaw Marczak 	}
6252a3de5eSPrzemyslaw Marczak 
6352a3de5eSPrzemyslaw Marczak 	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
6452a3de5eSPrzemyslaw Marczak 
65f415a3ecSPrzemyslaw Marczak 	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
66f415a3ecSPrzemyslaw Marczak 	if (!children)
6752a3de5eSPrzemyslaw Marczak 		debug("%s: %s - no child found\n", __func__, dev->name);
6852a3de5eSPrzemyslaw Marczak 
6952a3de5eSPrzemyslaw Marczak 	/* Always return success for this device */
7052a3de5eSPrzemyslaw Marczak 	return 0;
7152a3de5eSPrzemyslaw Marczak }
7252a3de5eSPrzemyslaw Marczak 
7352a3de5eSPrzemyslaw Marczak static struct dm_pmic_ops max77686_ops = {
74f415a3ecSPrzemyslaw Marczak 	.reg_count = max77686_reg_count,
7552a3de5eSPrzemyslaw Marczak 	.read = max77686_read,
7652a3de5eSPrzemyslaw Marczak 	.write = max77686_write,
7752a3de5eSPrzemyslaw Marczak };
7852a3de5eSPrzemyslaw Marczak 
7952a3de5eSPrzemyslaw Marczak static const struct udevice_id max77686_ids[] = {
8052a3de5eSPrzemyslaw Marczak 	{ .compatible = "maxim,max77686" },
8152a3de5eSPrzemyslaw Marczak 	{ }
8252a3de5eSPrzemyslaw Marczak };
8352a3de5eSPrzemyslaw Marczak 
8452a3de5eSPrzemyslaw Marczak U_BOOT_DRIVER(pmic_max77686) = {
85b5ffa4fdSSimon Glass 	.name = "max77686_pmic",
8652a3de5eSPrzemyslaw Marczak 	.id = UCLASS_PMIC,
8752a3de5eSPrzemyslaw Marczak 	.of_match = max77686_ids,
8852a3de5eSPrzemyslaw Marczak 	.bind = max77686_bind,
8952a3de5eSPrzemyslaw Marczak 	.ops = &max77686_ops,
9052a3de5eSPrzemyslaw Marczak };
91