blob: c83c8cf7bb3859c093d32d33fb126b9956441ba4 [file] [log] [blame]
Simon Glassa8bd2ac2016-01-21 19:43:29 -07001/*
2 * Copyright (C) 2015 Google, Inc
3 * Written by Simon Glass <sjg@chromium.org>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <dm.h>
10#include <errno.h>
Jacob Chen614704b2017-05-02 14:54:52 +080011#include <power/rk8xx_pmic.h>
Simon Glassa8bd2ac2016-01-21 19:43:29 -070012#include <power/pmic.h>
13
Simon Glassa8bd2ac2016-01-21 19:43:29 -070014static const struct pmic_child_info pmic_children_info[] = {
Jacob Chen614704b2017-05-02 14:54:52 +080015 { .prefix = "DCDC_REG", .driver = "rk8xx_buck"},
16 { .prefix = "LDO_REG", .driver = "rk8xx_ldo"},
17 { .prefix = "SWITCH_REG", .driver = "rk8xx_switch"},
Simon Glassa8bd2ac2016-01-21 19:43:29 -070018 { },
19};
20
Jacob Chen614704b2017-05-02 14:54:52 +080021static int rk8xx_reg_count(struct udevice *dev)
Simon Glassa8bd2ac2016-01-21 19:43:29 -070022{
23 return RK808_NUM_OF_REGS;
24}
25
Jacob Chen614704b2017-05-02 14:54:52 +080026static int rk8xx_write(struct udevice *dev, uint reg, const uint8_t *buff,
Simon Glassa8bd2ac2016-01-21 19:43:29 -070027 int len)
28{
Simon Glass46ad8cb2016-01-21 19:43:58 -070029 int ret;
30
31 ret = dm_i2c_write(dev, reg, buff, len);
32 if (ret) {
Simon Glassa8bd2ac2016-01-21 19:43:29 -070033 debug("write error to device: %p register: %#x!", dev, reg);
Simon Glass46ad8cb2016-01-21 19:43:58 -070034 return ret;
Simon Glassa8bd2ac2016-01-21 19:43:29 -070035 }
36
37 return 0;
38}
39
Jacob Chen614704b2017-05-02 14:54:52 +080040static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
Simon Glassa8bd2ac2016-01-21 19:43:29 -070041{
Simon Glass46ad8cb2016-01-21 19:43:58 -070042 int ret;
43
44 ret = dm_i2c_read(dev, reg, buff, len);
45 if (ret) {
Simon Glassa8bd2ac2016-01-21 19:43:29 -070046 debug("read error from device: %p register: %#x!", dev, reg);
Simon Glass46ad8cb2016-01-21 19:43:58 -070047 return ret;
Simon Glassa8bd2ac2016-01-21 19:43:29 -070048 }
49
50 return 0;
51}
52
53#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
Jacob Chen614704b2017-05-02 14:54:52 +080054static int rk8xx_bind(struct udevice *dev)
Simon Glassa8bd2ac2016-01-21 19:43:29 -070055{
Simon Glass2c2d2c22017-05-18 20:09:32 -060056 ofnode regulators_node;
Simon Glassa8bd2ac2016-01-21 19:43:29 -070057 int children;
58
Simon Glass2c2d2c22017-05-18 20:09:32 -060059 regulators_node = dev_read_subnode(dev, "regulators");
60 if (!ofnode_valid(regulators_node)) {
Simon Glassa8bd2ac2016-01-21 19:43:29 -070061 debug("%s: %s regulators subnode not found!", __func__,
62 dev->name);
63 return -ENXIO;
64 }
65
66 debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
67
68 children = pmic_bind_children(dev, regulators_node, pmic_children_info);
69 if (!children)
70 debug("%s: %s - no child found\n", __func__, dev->name);
71
72 /* Always return success for this device */
73 return 0;
74}
75#endif
76
Jacob Chen614704b2017-05-02 14:54:52 +080077static int rk8xx_probe(struct udevice *dev)
Jacob Chen0234adb2017-05-02 14:54:49 +080078{
Jacob Chen614704b2017-05-02 14:54:52 +080079 struct rk8xx_priv *priv = dev_get_priv(dev);
Jacob Chen0234adb2017-05-02 14:54:49 +080080 uint8_t msb, lsb;
81
82 /* read Chip variant */
Jacob Chen614704b2017-05-02 14:54:52 +080083 rk8xx_read(dev, ID_MSB, &msb, 1);
84 rk8xx_read(dev, ID_LSB, &lsb, 1);
Jacob Chen0234adb2017-05-02 14:54:49 +080085
86 priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
87
88 return 0;
89}
90
Jacob Chen614704b2017-05-02 14:54:52 +080091static struct dm_pmic_ops rk8xx_ops = {
92 .reg_count = rk8xx_reg_count,
93 .read = rk8xx_read,
94 .write = rk8xx_write,
Simon Glassa8bd2ac2016-01-21 19:43:29 -070095};
96
Jacob Chen614704b2017-05-02 14:54:52 +080097static const struct udevice_id rk8xx_ids[] = {
Simon Glassa8bd2ac2016-01-21 19:43:29 -070098 { .compatible = "rockchip,rk808" },
Jacob Chen0234adb2017-05-02 14:54:49 +080099 { .compatible = "rockchip,rk818" },
Simon Glassa8bd2ac2016-01-21 19:43:29 -0700100 { }
101};
102
Jacob Chen614704b2017-05-02 14:54:52 +0800103U_BOOT_DRIVER(pmic_rk8xx) = {
104 .name = "rk8xx pmic",
Simon Glassa8bd2ac2016-01-21 19:43:29 -0700105 .id = UCLASS_PMIC,
Jacob Chen614704b2017-05-02 14:54:52 +0800106 .of_match = rk8xx_ids,
Simon Glassa8bd2ac2016-01-21 19:43:29 -0700107#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
Jacob Chen614704b2017-05-02 14:54:52 +0800108 .bind = rk8xx_bind,
Simon Glassa8bd2ac2016-01-21 19:43:29 -0700109#endif
Kever Yang00ab7fb2017-05-05 14:50:56 +0800110 .priv_auto_alloc_size = sizeof(struct rk8xx_priv),
Jacob Chen614704b2017-05-02 14:54:52 +0800111 .probe = rk8xx_probe,
112 .ops = &rk8xx_ops,
Simon Glassa8bd2ac2016-01-21 19:43:29 -0700113};