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 255d387d0dSPrzemyslaw Marczak static int sandbox_pmic_reg_count(struct udevice *dev) 265d387d0dSPrzemyslaw Marczak { 275d387d0dSPrzemyslaw Marczak return SANDBOX_PMIC_REG_COUNT; 285d387d0dSPrzemyslaw Marczak } 295d387d0dSPrzemyslaw Marczak 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)) { 345d387d0dSPrzemyslaw Marczak error("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 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)) { 455d387d0dSPrzemyslaw Marczak error("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 525d387d0dSPrzemyslaw Marczak static int sandbox_pmic_bind(struct udevice *dev) 535d387d0dSPrzemyslaw Marczak { 54*7a869e6cSSimon Glass if (!pmic_bind_children(dev, dev_ofnode(dev), pmic_children_info)) 555d387d0dSPrzemyslaw Marczak error("%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