1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
3 * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
11 #include <dm/device.h>
13 #include <power/pmic.h>
14 #include <power/stpmic1.h>
16 #define STPMIC1_NUM_OF_REGS 0x100
18 #define STPMIC1_NVM_SIZE 8
19 #define STPMIC1_NVM_POLL_TIMEOUT 100000
20 #define STPMIC1_NVM_START_ADDRESS 0xf8
29 #if CONFIG_IS_ENABLED(DM_REGULATOR)
30 static const struct pmic_child_info stpmic1_children_info[] = {
31 { .prefix = "ldo", .driver = "stpmic1_ldo" },
32 { .prefix = "buck", .driver = "stpmic1_buck" },
33 { .prefix = "vref_ddr", .driver = "stpmic1_vref_ddr" },
34 { .prefix = "pwr_sw", .driver = "stpmic1_pwr_sw" },
35 { .prefix = "boost", .driver = "stpmic1_boost" },
38 #endif /* DM_REGULATOR */
40 static int stpmic1_reg_count(struct udevice *dev)
42 return STPMIC1_NUM_OF_REGS;
45 static int stpmic1_write(struct udevice *dev, uint reg, const uint8_t *buff,
50 ret = dm_i2c_write(dev, reg, buff, len);
52 dev_err(dev, "%s: failed to write register %#x :%d",
58 static int stpmic1_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
62 ret = dm_i2c_read(dev, reg, buff, len);
64 dev_err(dev, "%s: failed to read register %#x : %d",
70 static int stpmic1_bind(struct udevice *dev)
72 #if CONFIG_IS_ENABLED(DM_REGULATOR)
73 ofnode regulators_node;
76 regulators_node = dev_read_subnode(dev, "regulators");
77 if (!ofnode_valid(regulators_node)) {
78 dev_dbg(dev, "regulators subnode not found!");
81 dev_dbg(dev, "found regulators subnode\n");
83 children = pmic_bind_children(dev, regulators_node,
84 stpmic1_children_info);
86 dev_dbg(dev, "no child found\n");
87 #endif /* DM_REGULATOR */
89 if (CONFIG_IS_ENABLED(SYSRESET))
90 return device_bind_driver(dev, "stpmic1-sysreset",
91 "stpmic1-sysreset", NULL);
96 static struct dm_pmic_ops stpmic1_ops = {
97 .reg_count = stpmic1_reg_count,
99 .write = stpmic1_write,
102 static const struct udevice_id stpmic1_ids[] = {
103 { .compatible = "st,stpmic1" },
107 U_BOOT_DRIVER(pmic_stpmic1) = {
108 .name = "stpmic1_pmic",
110 .of_match = stpmic1_ids,
111 .bind = stpmic1_bind,
115 #ifndef CONFIG_SPL_BUILD
116 static int stpmic1_nvm_rw(u8 addr, u8 *buf, int buf_len, enum pmic_nvm_op op)
119 unsigned long timeout;
120 u8 cmd = STPMIC1_NVM_CMD_READ;
123 ret = uclass_get_device_by_driver(UCLASS_PMIC,
124 DM_GET_DRIVER(pmic_stpmic1), &dev);
126 /* No PMIC on power discrete board */
129 if (addr < STPMIC1_NVM_START_ADDRESS)
132 if (op == SHADOW_READ)
133 return pmic_read(dev, addr, buf, buf_len);
135 if (op == SHADOW_WRITE)
136 return pmic_write(dev, addr, buf, buf_len);
138 if (op == NVM_WRITE) {
139 cmd = STPMIC1_NVM_CMD_PROGRAM;
141 ret = pmic_write(dev, addr, buf, buf_len);
146 ret = pmic_reg_read(dev, STPMIC1_NVM_CR);
150 ret = pmic_reg_write(dev, STPMIC1_NVM_CR, ret | cmd);
154 timeout = timer_get_us() + STPMIC1_NVM_POLL_TIMEOUT;
156 ret = pmic_reg_read(dev, STPMIC1_NVM_SR);
160 if (!(ret & STPMIC1_NVM_BUSY))
163 if (time_after(timer_get_us(), timeout))
167 if (ret & STPMIC1_NVM_BUSY)
170 if (op == NVM_READ) {
171 ret = pmic_read(dev, addr, buf, buf_len);
179 int stpmic1_shadow_read_byte(u8 addr, u8 *buf)
181 return stpmic1_nvm_rw(addr, buf, 1, SHADOW_READ);
184 int stpmic1_shadow_write_byte(u8 addr, u8 *buf)
186 return stpmic1_nvm_rw(addr, buf, 1, SHADOW_WRITE);
189 int stpmic1_nvm_read_byte(u8 addr, u8 *buf)
191 return stpmic1_nvm_rw(addr, buf, 1, NVM_READ);
194 int stpmic1_nvm_write_byte(u8 addr, u8 *buf)
196 return stpmic1_nvm_rw(addr, buf, 1, NVM_WRITE);
199 int stpmic1_nvm_read_all(u8 *buf, int buf_len)
201 if (buf_len != STPMIC1_NVM_SIZE)
204 return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
205 buf, buf_len, NVM_READ);
208 int stpmic1_nvm_write_all(u8 *buf, int buf_len)
210 if (buf_len != STPMIC1_NVM_SIZE)
213 return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
214 buf, buf_len, NVM_WRITE);
216 #endif /* CONFIG_SPL_BUILD */
218 #ifdef CONFIG_SYSRESET
219 static int stpmic1_sysreset_request(struct udevice *dev, enum sysreset_t type)
221 struct udevice *pmic_dev;
224 if (type != SYSRESET_POWER)
225 return -EPROTONOSUPPORT;
227 ret = uclass_get_device_by_driver(UCLASS_PMIC,
228 DM_GET_DRIVER(pmic_stpmic1),
234 ret = pmic_reg_read(pmic_dev, STPMIC1_MAIN_CR);
238 ret = pmic_reg_write(pmic_dev, STPMIC1_MAIN_CR,
239 ret | STPMIC1_SWOFF | STPMIC1_RREQ_EN);
246 static struct sysreset_ops stpmic1_sysreset_ops = {
247 .request = stpmic1_sysreset_request,
250 U_BOOT_DRIVER(stpmic1_sysreset) = {
251 .name = "stpmic1-sysreset",
252 .id = UCLASS_SYSRESET,
253 .ops = &stpmic1_sysreset_ops,