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 25f415a3ecSPrzemyslaw Marczak static int max77686_reg_count(struct udevice *dev) 26f415a3ecSPrzemyslaw Marczak { 27f415a3ecSPrzemyslaw Marczak return MAX77686_NUM_OF_REGS; 28f415a3ecSPrzemyslaw Marczak } 29f415a3ecSPrzemyslaw Marczak 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)) { 3452a3de5eSPrzemyslaw Marczak error("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 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)) { 4452a3de5eSPrzemyslaw Marczak error("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 5152a3de5eSPrzemyslaw Marczak static int max77686_bind(struct udevice *dev) 5252a3de5eSPrzemyslaw Marczak { 53*7a869e6cSSimon Glass ofnode regulators_node; 54f415a3ecSPrzemyslaw Marczak int children; 5552a3de5eSPrzemyslaw Marczak 56*7a869e6cSSimon Glass regulators_node = dev_read_subnode(dev, "voltage-regulators"); 57*7a869e6cSSimon 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