xref: /rk3399_rockchip-uboot/drivers/power/pmic/rk8xx_spi.c (revision 2bf72cbb7ad8dc4a82a3feb155099dde044cfdb1)
1 /*
2  **Copyright (C) 2021 Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <dm.h>
9 #include <errno.h>
10 #include <irq-generic.h>
11 #include <power/rk8xx_pmic.h>
12 #include <power/pmic.h>
13 #include <spi.h>
14 
15 DECLARE_GLOBAL_DATA_PTR;
16 
17 #define RK806_CHIP_NAME			0x5A
18 #define RK806_CHIP_VER			0x5B
19 
20 #define RK806_CMD_READ			0
21 #define RK806_CMD_WRITE			BIT(7)
22 #define RK806_CMD_CRC_EN		BIT(6)
23 #define RK806_CMD_CRC_DIS		0
24 #define RK806_CMD_LEN_MSK		0x0f
25 #define RK806_REG_H			0x00
26 
27 static const struct pmic_child_info pmic_children_info[] = {
28 	{ .prefix = "DCDC", .driver = "rk8xx_spi_buck"},
29 	{ .prefix = "NLDO", .driver = "rk8xx_spi_ldo"},
30 	{ .prefix = "PLDO", .driver = "rk8xx_spi_pldo"},
31 	{ },
32 };
33 
34 static int _spi_read(struct udevice *dev, u32 reg, u8 *buffer, int len)
35 {
36 	struct rk8xx_priv *priv = dev_get_priv(dev);
37 	u8 txbuf[3];
38 	int ret;
39 
40 	if (spi_claim_bus(priv->slave))
41 		return -EBUSY;
42 
43 	txbuf[0] = RK806_CMD_READ;
44 	txbuf[1] = reg;
45 	txbuf[2] = RK806_REG_H;
46 
47 	ret = spi_write_then_read(priv->slave, txbuf, 3, NULL, buffer, 1);
48 	spi_release_bus(priv->slave);
49 
50 	return ret;
51 }
52 
53 static int _spi_write(struct udevice *dev, uint reg, const u8 *buffer, int len)
54 {
55 	struct rk8xx_priv *priv = dev_get_priv(dev);
56 	u8 txbuf[4];
57 	int ret;
58 
59 	if (len < 1) {
60 		dev_err(dev, "rk806 write error: len < 1\n");
61 		return -EINVAL;
62 	}
63 
64 	if (spi_claim_bus(priv->slave))
65 		return -EBUSY;
66 
67 	txbuf[0] = RK806_CMD_WRITE;
68 	txbuf[1] = reg;
69 	txbuf[2] = RK806_REG_H;
70 	txbuf[3] = *buffer;
71 
72 	ret = spi_write_then_read(priv->slave, txbuf, 4, NULL, NULL, 0);
73 	spi_release_bus(priv->slave);
74 
75 	return ret;
76 }
77 
78 static int rk806_spi_read(struct udevice *dev,
79 			  uint reg,
80 			  u8 *buffer,
81 			  int len)
82 {
83 	int ret;
84 
85 	ret = _spi_read(dev, reg, buffer, len);
86 	if (ret)
87 		dev_err(dev, "rk806 read reg(0x%x) error: %d\n", reg, ret);
88 
89 	return ret;
90 }
91 
92 static int rk806_spi_write(struct udevice *dev,
93 			   uint reg,
94 			   const u8 *buffer,
95 			   int len)
96 {
97 	int ret;
98 
99 	ret = _spi_write(dev, reg, buffer, len);
100 	if (ret)
101 		dev_err(dev, "rk806 write reg(0x%x) error: %d\n", reg, ret);
102 
103 	return ret;
104 }
105 
106 static int rk8xx_spi_reg_count(struct udevice *dev)
107 {
108 	return 0xff;
109 }
110 
111 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
112 static int rk8xx_spi_bind(struct udevice *dev)
113 {
114 	ofnode regulators_node;
115 	int children;
116 
117 	regulators_node = dev_read_subnode(dev, "regulators");
118 	if (!ofnode_valid(regulators_node)) {
119 		debug("%s: %s regulators subnode not found!\n", __func__,
120 		      dev->name);
121 		return -ENXIO;
122 	}
123 
124 	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
125 	if (!children)
126 		debug("%s: %s - no child found\n", __func__, dev->name);
127 
128 	return 0;
129 }
130 #endif
131 
132 static int rk8xx_spi_probe(struct udevice *dev)
133 {
134 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
135 	struct rk8xx_priv *priv = dev_get_priv(dev);
136 	struct udevice *spi = dev_get_parent(dev);
137 	struct spi_slave *slave = NULL;
138 	u8 msb, lsb;
139 	int ret;
140 
141 	if (spi->seq < 0) {
142 		dev_err(dev, "Failed to configure the spi num\n");
143 		return -EINVAL;
144 	}
145 
146 	slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz,
147 				plat->mode);
148 	if (!slave)
149 		return -ENODEV;
150 	priv->slave = slave;
151 
152 	/* read Chip variant */
153 	ret = rk806_spi_read(dev, RK806_CHIP_NAME, &msb, 1);
154 	if (msb < 0) {
155 		dev_err(dev, "rk806 name read error: %d\n", ret);
156 		return ret;
157 	}
158 
159 	ret = rk806_spi_read(dev, RK806_CHIP_VER, &lsb, 1);
160 	if (lsb < 0) {
161 		dev_err(dev, "rk806 version read error: %d\n", ret);
162 		return ret;
163 	}
164 
165 	priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
166 	printf("spi%d: RK%x%x: %d\n", spi->seq, msb, (lsb >> 4), lsb & 0x0f);
167 
168 	return 0;
169 }
170 
171 static struct dm_pmic_ops rk8xx_spi_ops = {
172 	.reg_count = rk8xx_spi_reg_count,
173 	.read = rk806_spi_read,
174 	.write = rk806_spi_write,
175 };
176 
177 static const struct udevice_id rk8xx_spi_ids[] = {
178 	{ .compatible = "rockchip,rk806" },
179 	{ }
180 };
181 
182 U_BOOT_DRIVER(pmic_rk8xx_spi) = {
183 	.name = "rk806-pmic",
184 	.id = UCLASS_PMIC,
185 	.of_match = rk8xx_spi_ids,
186 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
187 	.bind = rk8xx_spi_bind,
188 #endif
189 	.priv_auto_alloc_size = sizeof(struct rk8xx_priv),
190 	.probe = rk8xx_spi_probe,
191 	.ops = &rk8xx_spi_ops,
192 };
193