xref: /openbmc/u-boot/drivers/power/pmic/stpmu1.c (revision ae485b54)
1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2 /*
3  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <errno.h>
9 #include <i2c.h>
10 #include <power/pmic.h>
11 #include <power/stpmu1.h>
12 
13 #define STMPU1_NUM_OF_REGS 0x100
14 
15 #ifndef CONFIG_SPL_BUILD
16 static const struct pmic_child_info stpmu1_children_info[] = {
17 	{ .prefix = "ldo", .driver = "stpmu1_ldo" },
18 	{ .prefix = "buck", .driver = "stpmu1_buck" },
19 	{ .prefix = "vref_ddr", .driver = "stpmu1_vref_ddr" },
20 	{ .prefix = "pwr_sw", .driver = "stpmu1_pwr_sw" },
21 	{ .prefix = "boost", .driver = "stpmu1_boost" },
22 	{ },
23 };
24 #endif /* CONFIG_SPL_BUILD */
25 
26 static int stpmu1_reg_count(struct udevice *dev)
27 {
28 	return STMPU1_NUM_OF_REGS;
29 }
30 
31 static int stpmu1_write(struct udevice *dev, uint reg, const uint8_t *buff,
32 			int len)
33 {
34 	int ret;
35 
36 	ret = dm_i2c_write(dev, reg, buff, len);
37 	if (ret)
38 		dev_err(dev, "%s: failed to write register %#x :%d",
39 			__func__, reg, ret);
40 
41 	return ret;
42 }
43 
44 static int stpmu1_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
45 {
46 	int ret;
47 
48 	ret = dm_i2c_read(dev, reg, buff, len);
49 	if (ret)
50 		dev_err(dev, "%s: failed to read register %#x : %d",
51 			__func__, reg, ret);
52 
53 	return ret;
54 }
55 
56 static int stpmu1_bind(struct udevice *dev)
57 {
58 #ifndef CONFIG_SPL_BUILD
59 	ofnode regulators_node;
60 	int children;
61 
62 	regulators_node = dev_read_subnode(dev, "regulators");
63 	if (!ofnode_valid(regulators_node)) {
64 		dev_dbg(dev, "regulators subnode not found!");
65 		return -ENXIO;
66 	}
67 	dev_dbg(dev, "found regulators subnode\n");
68 
69 	children = pmic_bind_children(dev, regulators_node,
70 				      stpmu1_children_info);
71 	if (!children)
72 		dev_dbg(dev, "no child found\n");
73 #endif /* CONFIG_SPL_BUILD */
74 
75 	return 0;
76 }
77 
78 static struct dm_pmic_ops stpmu1_ops = {
79 	.reg_count = stpmu1_reg_count,
80 	.read = stpmu1_read,
81 	.write = stpmu1_write,
82 };
83 
84 static const struct udevice_id stpmu1_ids[] = {
85 	{ .compatible = "st,stpmu1" },
86 	{ }
87 };
88 
89 U_BOOT_DRIVER(pmic_stpmu1) = {
90 	.name = "stpmu1_pmic",
91 	.id = UCLASS_PMIC,
92 	.of_match = stpmu1_ids,
93 	.bind = stpmu1_bind,
94 	.ops = &stpmu1_ops,
95 };
96