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