1d2c88f7dSSimon Glass /* 2d2c88f7dSSimon Glass * Copyright (C) 2015 Google, Inc 3d2c88f7dSSimon Glass * Written by Simon Glass <sjg@chromium.org> 4d2c88f7dSSimon Glass * 5d2c88f7dSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6d2c88f7dSSimon Glass */ 7d2c88f7dSSimon Glass 8d2c88f7dSSimon Glass #include <common.h> 9d2c88f7dSSimon Glass #include <dm.h> 10d2c88f7dSSimon Glass #include <errno.h> 11d2c88f7dSSimon Glass #include <fdtdec.h> 12d2c88f7dSSimon Glass #include <libfdt.h> 13d2c88f7dSSimon Glass #include <power/act8846_pmic.h> 14d2c88f7dSSimon Glass #include <power/pmic.h> 15d2c88f7dSSimon Glass 16d2c88f7dSSimon Glass DECLARE_GLOBAL_DATA_PTR; 17d2c88f7dSSimon Glass 18d2c88f7dSSimon Glass static const struct pmic_child_info pmic_children_info[] = { 19d2c88f7dSSimon Glass { .prefix = "REG", .driver = "act8846_reg"}, 20d2c88f7dSSimon Glass { }, 21d2c88f7dSSimon Glass }; 22d2c88f7dSSimon Glass 23d2c88f7dSSimon Glass static int act8846_reg_count(struct udevice *dev) 24d2c88f7dSSimon Glass { 25d2c88f7dSSimon Glass return ACT8846_NUM_OF_REGS; 26d2c88f7dSSimon Glass } 27d2c88f7dSSimon Glass 28d2c88f7dSSimon Glass static int act8846_write(struct udevice *dev, uint reg, const uint8_t *buff, 29d2c88f7dSSimon Glass int len) 30d2c88f7dSSimon Glass { 31d2c88f7dSSimon Glass if (dm_i2c_write(dev, reg, buff, len)) { 32aa26776aSJohn Keeping debug("write error to device: %p register: %#x!\n", dev, reg); 33d2c88f7dSSimon Glass return -EIO; 34d2c88f7dSSimon Glass } 35d2c88f7dSSimon Glass 36d2c88f7dSSimon Glass return 0; 37d2c88f7dSSimon Glass } 38d2c88f7dSSimon Glass 39d2c88f7dSSimon Glass static int act8846_read(struct udevice *dev, uint reg, uint8_t *buff, int len) 40d2c88f7dSSimon Glass { 41d2c88f7dSSimon Glass if (dm_i2c_read(dev, reg, buff, len)) { 42aa26776aSJohn Keeping debug("read error from device: %p register: %#x!\n", dev, reg); 43d2c88f7dSSimon Glass return -EIO; 44d2c88f7dSSimon Glass } 45d2c88f7dSSimon Glass 46d2c88f7dSSimon Glass return 0; 47d2c88f7dSSimon Glass } 48d2c88f7dSSimon Glass 49d2c88f7dSSimon Glass static int act8846_bind(struct udevice *dev) 50d2c88f7dSSimon Glass { 51*7a869e6cSSimon Glass ofnode regulators_node; 52d2c88f7dSSimon Glass int children; 53d2c88f7dSSimon Glass 54*7a869e6cSSimon Glass regulators_node = dev_read_subnode(dev, "regulators"); 55*7a869e6cSSimon Glass if (!ofnode_valid(regulators_node)) { 56d2c88f7dSSimon Glass debug("%s: %s regulators subnode not found!", __func__, 57d2c88f7dSSimon Glass dev->name); 58d2c88f7dSSimon Glass return -ENXIO; 59d2c88f7dSSimon Glass } 60d2c88f7dSSimon Glass 61d2c88f7dSSimon Glass debug("%s: '%s' - found regulators subnode\n", __func__, dev->name); 62d2c88f7dSSimon Glass 63d2c88f7dSSimon Glass children = pmic_bind_children(dev, regulators_node, pmic_children_info); 64d2c88f7dSSimon Glass if (!children) 65d2c88f7dSSimon Glass debug("%s: %s - no child found\n", __func__, dev->name); 66d2c88f7dSSimon Glass 67d2c88f7dSSimon Glass /* Always return success for this device */ 68d2c88f7dSSimon Glass return 0; 69d2c88f7dSSimon Glass } 70d2c88f7dSSimon Glass 71d2c88f7dSSimon Glass static struct dm_pmic_ops act8846_ops = { 72d2c88f7dSSimon Glass .reg_count = act8846_reg_count, 73d2c88f7dSSimon Glass .read = act8846_read, 74d2c88f7dSSimon Glass .write = act8846_write, 75d2c88f7dSSimon Glass }; 76d2c88f7dSSimon Glass 77d2c88f7dSSimon Glass static const struct udevice_id act8846_ids[] = { 78d2c88f7dSSimon Glass { .compatible = "active-semi,act8846" }, 79d2c88f7dSSimon Glass { } 80d2c88f7dSSimon Glass }; 81d2c88f7dSSimon Glass 82d2c88f7dSSimon Glass U_BOOT_DRIVER(pmic_act8846) = { 83d2c88f7dSSimon Glass .name = "act8846 pmic", 84d2c88f7dSSimon Glass .id = UCLASS_PMIC, 85d2c88f7dSSimon Glass .of_match = act8846_ids, 86d2c88f7dSSimon Glass .bind = act8846_bind, 87d2c88f7dSSimon Glass .ops = &act8846_ops, 88d2c88f7dSSimon Glass }; 89