blob: faae54e9fef025466787541631ce5b5171444621 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: BSD-3-Clause
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +02002/*
3 * Qualcomm SPMI bus driver
4 *
5 * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
6 *
7 * Loosely based on Little Kernel driver
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +02008 */
9
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020010#include <dm.h>
11#include <errno.h>
12#include <fdtdec.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060013#include <asm/global_data.h>
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020014#include <asm/io.h>
Simon Glass9bc15642020-02-03 07:36:16 -070015#include <dm/device_compat.h>
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020016#include <spmi/spmi.h>
17
18DECLARE_GLOBAL_DATA_PTR;
19
Jorge Ramirez-Ortiz4bcef682018-01-10 11:33:28 +010020/* PMIC Arbiter configuration registers */
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030021#define PMIC_ARB_VERSION 0x0000
22#define PMIC_ARB_VERSION_V2_MIN 0x20010000
23#define PMIC_ARB_VERSION_V3_MIN 0x30000000
24#define PMIC_ARB_VERSION_V5_MIN 0x50000000
Neil Armstronga243fb22024-04-05 10:21:56 +020025#define PMIC_ARB_VERSION_V7_MIN 0x70000000
Jorge Ramirez-Ortiz4bcef682018-01-10 11:33:28 +010026
Neil Armstrong93627ce2025-03-28 09:53:21 +010027#define PMIC_ARB_FEATURES 0x0004
28#define PMIC_ARB_FEATURES_PERIPH_MASK GENMASK(10, 0)
29
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030030#define APID_MAP_OFFSET_V1_V2_V3 (0x800)
31#define APID_MAP_OFFSET_V5 (0x900)
Neil Armstronga243fb22024-04-05 10:21:56 +020032#define APID_MAP_OFFSET_V7 (0x2000)
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030033#define ARB_CHANNEL_OFFSET(n) (0x4 * (n))
34#define SPMI_CH_OFFSET(chnl) ((chnl) * 0x8000)
35#define SPMI_V5_OBS_CH_OFFSET(chnl) ((chnl) * 0x80)
Neil Armstronga243fb22024-04-05 10:21:56 +020036#define SPMI_V7_OBS_CH_OFFSET(chnl) ((chnl) * 0x20)
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030037#define SPMI_V5_RW_CH_OFFSET(chnl) ((chnl) * 0x10000)
Neil Armstronga243fb22024-04-05 10:21:56 +020038#define SPMI_V7_RW_CH_OFFSET(chnl) ((chnl) * 0x1000)
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020039
Neil Armstrong3fe83672024-04-05 10:21:55 +020040#define SPMI_OWNERSHIP_PERIPH2OWNER(x) ((x) & 0x7)
41
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030042#define SPMI_REG_CMD0 0x0
43#define SPMI_REG_CONFIG 0x4
44#define SPMI_REG_STATUS 0x8
45#define SPMI_REG_WDATA 0x10
46#define SPMI_REG_RDATA 0x18
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020047
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030048#define SPMI_CMD_OPCODE_SHIFT 27
49#define SPMI_CMD_SLAVE_ID_SHIFT 20
50#define SPMI_CMD_ADDR_SHIFT 12
51#define SPMI_CMD_ADDR_OFFSET_SHIFT 4
52#define SPMI_CMD_BYTE_CNT_SHIFT 0
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020053
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030054#define SPMI_CMD_EXT_REG_WRITE_LONG 0x00
55#define SPMI_CMD_EXT_REG_READ_LONG 0x01
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020056
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030057#define SPMI_STATUS_DONE 0x1
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020058
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030059#define SPMI_MAX_CHANNELS 128
Neil Armstrong3fe83672024-04-05 10:21:55 +020060#define SPMI_MAX_CHANNELS_V5 512
Neil Armstronga243fb22024-04-05 10:21:56 +020061#define SPMI_MAX_CHANNELS_V7 1024
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030062#define SPMI_MAX_SLAVES 16
63#define SPMI_MAX_PERIPH 256
64
Neil Armstrong3fe83672024-04-05 10:21:55 +020065#define SPMI_CHANNEL_READ_ONLY BIT(31)
Neil Armstrong41f17552025-03-28 09:53:23 +010066#define SPMI_CHANNEL_VALID BIT(30)
Neil Armstrong3fe83672024-04-05 10:21:55 +020067#define SPMI_CHANNEL_MASK 0xffff
68
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030069enum arb_ver {
70 V1 = 1,
71 V2,
72 V3,
Neil Armstronga243fb22024-04-05 10:21:56 +020073 V5 = 5,
74 V7 = 7
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030075};
76
77/*
78 * PMIC arbiter version 5 uses different register offsets for read/write vs
79 * observer channels.
80 */
81enum pmic_arb_channel {
82 PMIC_ARB_CHANNEL_RW,
83 PMIC_ARB_CHANNEL_OBS,
84};
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020085
86struct msm_spmi_priv {
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030087 phys_addr_t arb_chnl; /* ARB channel mapping base */
Caleb Connolly99f591c2023-12-05 13:46:53 +000088 phys_addr_t spmi_chnls; /* SPMI channels */
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030089 phys_addr_t spmi_obs; /* SPMI observer */
Neil Armstrong3fe83672024-04-05 10:21:55 +020090 phys_addr_t spmi_cnfg; /* SPMI config */
91 u32 owner; /* Current owner */
92 unsigned int max_channels; /* Max channels */
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020093 /* SPMI channel map */
Neil Armstrong3fe83672024-04-05 10:21:55 +020094 uint32_t channel_map[SPMI_MAX_SLAVES][SPMI_MAX_PERIPH];
Dzmitry Sankouski682351a2021-10-17 13:44:28 +030095 /* SPMI bus arbiter version */
96 u32 arb_ver;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +020097};
98
Neil Armstrongdde6d552024-04-05 10:21:54 +020099static u32 pmic_arb_fmt_cmd_v1(u8 opc, u8 sid, u8 pid, u8 off)
100{
101 return (opc << 27) | (sid << 20) | (pid << 12) | (off << 4) | 1;
102}
103
104static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 off)
105{
106 return (opc << 27) | (off << 4) | 1;
107}
108
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200109static int msm_spmi_write(struct udevice *dev, int usid, int pid, int off,
110 uint8_t val)
111{
112 struct msm_spmi_priv *priv = dev_get_priv(dev);
113 unsigned channel;
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300114 unsigned int ch_offset;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200115 uint32_t reg = 0;
116
117 if (usid >= SPMI_MAX_SLAVES)
118 return -EIO;
119 if (pid >= SPMI_MAX_PERIPH)
120 return -EIO;
Neil Armstrong41f17552025-03-28 09:53:23 +0100121 if (!(priv->channel_map[usid][pid] & SPMI_CHANNEL_VALID))
122 return -EINVAL;
Neil Armstrong3fe83672024-04-05 10:21:55 +0200123 if (priv->channel_map[usid][pid] & SPMI_CHANNEL_READ_ONLY)
124 return -EPERM;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200125
Neil Armstrong3fe83672024-04-05 10:21:55 +0200126 channel = priv->channel_map[usid][pid] & SPMI_CHANNEL_MASK;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200127
Caleb Connolly2b7001d2024-06-24 14:46:27 +0200128 debug("%s: [%d:%d] %s: channel %d\n", dev->name, usid, pid, __func__, channel);
Neil Armstrongdde6d552024-04-05 10:21:54 +0200129
130 switch (priv->arb_ver) {
131 case V1:
132 ch_offset = SPMI_CH_OFFSET(channel);
133
134 reg = pmic_arb_fmt_cmd_v1(SPMI_CMD_EXT_REG_WRITE_LONG,
135 usid, pid, off);
136 break;
137
138 case V2:
Neil Armstrong62f34392024-04-05 10:21:53 +0200139 ch_offset = SPMI_CH_OFFSET(channel);
140
Neil Armstrongdde6d552024-04-05 10:21:54 +0200141 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_WRITE_LONG, off);
142 break;
143
144 case V5:
145 ch_offset = SPMI_V5_RW_CH_OFFSET(channel);
146
147 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_WRITE_LONG, off);
148 break;
Neil Armstronga243fb22024-04-05 10:21:56 +0200149
150 case V7:
151 ch_offset = SPMI_V7_RW_CH_OFFSET(channel);
152
153 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_WRITE_LONG, off);
154 break;
Neil Armstrongdde6d552024-04-05 10:21:54 +0200155 }
156
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200157 /* Disable IRQ mode for the current channel*/
Neil Armstrong62f34392024-04-05 10:21:53 +0200158 writel(0x0, priv->spmi_chnls + ch_offset + SPMI_REG_CONFIG);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200159
160 /* Write single byte */
Neil Armstrong62f34392024-04-05 10:21:53 +0200161 writel(val, priv->spmi_chnls + ch_offset + SPMI_REG_WDATA);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200162
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200163 /* Send write command */
Neil Armstrong62f34392024-04-05 10:21:53 +0200164 writel(reg, priv->spmi_chnls + ch_offset + SPMI_REG_CMD0);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200165
166 /* Wait till CMD DONE status */
167 reg = 0;
168 while (!reg) {
Neil Armstrong62f34392024-04-05 10:21:53 +0200169 reg = readl(priv->spmi_chnls + ch_offset +
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200170 SPMI_REG_STATUS);
171 }
172
173 if (reg ^ SPMI_STATUS_DONE) {
174 printf("SPMI write failure.\n");
175 return -EIO;
176 }
177
178 return 0;
179}
180
181static int msm_spmi_read(struct udevice *dev, int usid, int pid, int off)
182{
183 struct msm_spmi_priv *priv = dev_get_priv(dev);
184 unsigned channel;
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300185 unsigned int ch_offset;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200186 uint32_t reg = 0;
187
188 if (usid >= SPMI_MAX_SLAVES)
189 return -EIO;
190 if (pid >= SPMI_MAX_PERIPH)
191 return -EIO;
Neil Armstrong41f17552025-03-28 09:53:23 +0100192 if (!(priv->channel_map[usid][pid] & SPMI_CHANNEL_VALID))
193 return -EINVAL;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200194
Neil Armstrong3fe83672024-04-05 10:21:55 +0200195 channel = priv->channel_map[usid][pid] & SPMI_CHANNEL_MASK;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200196
Caleb Connolly2b7001d2024-06-24 14:46:27 +0200197 debug("%s: [%d:%d] %s: channel %d\n", dev->name, usid, pid, __func__, channel);
Neil Armstrongdde6d552024-04-05 10:21:54 +0200198
199 switch (priv->arb_ver) {
200 case V1:
201 ch_offset = SPMI_CH_OFFSET(channel);
202
203 /* Prepare read command */
204 reg = pmic_arb_fmt_cmd_v1(SPMI_CMD_EXT_REG_READ_LONG,
205 usid, pid, off);
206 break;
207
208 case V2:
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300209 ch_offset = SPMI_CH_OFFSET(channel);
210
Neil Armstrongdde6d552024-04-05 10:21:54 +0200211 /* Prepare read command */
212 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_READ_LONG, off);
213 break;
214
215 case V5:
216 ch_offset = SPMI_V5_OBS_CH_OFFSET(channel);
217
218 /* Prepare read command */
219 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_READ_LONG, off);
220 break;
Neil Armstronga243fb22024-04-05 10:21:56 +0200221
222 case V7:
223 ch_offset = SPMI_V7_OBS_CH_OFFSET(channel);
224
225 /* Prepare read command */
226 reg = pmic_arb_fmt_cmd_v2(SPMI_CMD_EXT_REG_READ_LONG, off);
227 break;
Neil Armstrongdde6d552024-04-05 10:21:54 +0200228 }
229
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200230 /* Disable IRQ mode for the current channel*/
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300231 writel(0x0, priv->spmi_obs + ch_offset + SPMI_REG_CONFIG);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200232
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200233 /* Request read */
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300234 writel(reg, priv->spmi_obs + ch_offset + SPMI_REG_CMD0);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200235
236 /* Wait till CMD DONE status */
237 reg = 0;
238 while (!reg) {
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300239 reg = readl(priv->spmi_obs + ch_offset + SPMI_REG_STATUS);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200240 }
241
242 if (reg ^ SPMI_STATUS_DONE) {
243 printf("SPMI read failure.\n");
244 return -EIO;
245 }
246
247 /* Read the data */
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300248 return readl(priv->spmi_obs + ch_offset +
249 SPMI_REG_RDATA) & 0xFF;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200250}
251
252static struct dm_spmi_ops msm_spmi_ops = {
253 .read = msm_spmi_read,
254 .write = msm_spmi_write,
255};
256
Neil Armstrong19a78a32025-03-28 09:53:24 +0100257/*
258 * In order to allow multiple EEs to write to a single PPID in arbiter
259 * version 5 and 7, there is more than one APID mapped to each PPID.
260 * The owner field for each of these mappings specifies the EE which is
261 * allowed to write to the APID.
262 */
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100263static void msm_spmi_channel_map_v5(struct msm_spmi_priv *priv, unsigned int i,
264 uint8_t slave_id, uint8_t pid)
265{
266 /* Mark channels read-only when from different owner */
267 uint32_t cnfg = readl(priv->spmi_cnfg + ARB_CHANNEL_OFFSET(i));
268 uint8_t owner = SPMI_OWNERSHIP_PERIPH2OWNER(cnfg);
Neil Armstrong19a78a32025-03-28 09:53:24 +0100269 bool prev_valid = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_VALID;
270 uint32_t prev_read_only = priv->channel_map[slave_id][pid] & SPMI_CHANNEL_READ_ONLY;
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100271
Neil Armstrong19a78a32025-03-28 09:53:24 +0100272 if (!prev_valid) {
273 /* First PPID mapping */
274 priv->channel_map[slave_id][pid] = i | SPMI_CHANNEL_VALID;
275 if (owner != priv->owner)
276 priv->channel_map[slave_id][pid] |= SPMI_CHANNEL_READ_ONLY;
277 } else if ((owner == priv->owner) && prev_read_only) {
278 /* Read only and we found one we own, switch */
279 priv->channel_map[slave_id][pid] = i | SPMI_CHANNEL_VALID;
280 }
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100281}
282
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200283static int msm_spmi_probe(struct udevice *dev)
284{
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200285 struct msm_spmi_priv *priv = dev_get_priv(dev);
Caleb Connolly99f591c2023-12-05 13:46:53 +0000286 phys_addr_t core_addr;
Jorge Ramirez-Ortiz4bcef682018-01-10 11:33:28 +0100287 u32 hw_ver;
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200288 int i;
289
Caleb Connolly99f591c2023-12-05 13:46:53 +0000290 core_addr = dev_read_addr_name(dev, "core");
291 priv->spmi_chnls = dev_read_addr_name(dev, "chnls");
292 priv->spmi_obs = dev_read_addr_name(dev, "obsrvr");
Neil Armstrong3fe83672024-04-05 10:21:55 +0200293 dev_read_u32(dev, "qcom,ee", &priv->owner);
Jorge Ramirez-Ortiz4bcef682018-01-10 11:33:28 +0100294
Caleb Connolly99f591c2023-12-05 13:46:53 +0000295 hw_ver = readl(core_addr + PMIC_ARB_VERSION);
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300296
297 if (hw_ver < PMIC_ARB_VERSION_V3_MIN) {
298 priv->arb_ver = V2;
Caleb Connolly99f591c2023-12-05 13:46:53 +0000299 priv->arb_chnl = core_addr + APID_MAP_OFFSET_V1_V2_V3;
Neil Armstrong3fe83672024-04-05 10:21:55 +0200300 priv->max_channels = SPMI_MAX_CHANNELS;
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300301 } else if (hw_ver < PMIC_ARB_VERSION_V5_MIN) {
302 priv->arb_ver = V3;
Caleb Connolly99f591c2023-12-05 13:46:53 +0000303 priv->arb_chnl = core_addr + APID_MAP_OFFSET_V1_V2_V3;
Neil Armstrong3fe83672024-04-05 10:21:55 +0200304 priv->max_channels = SPMI_MAX_CHANNELS;
Neil Armstronga243fb22024-04-05 10:21:56 +0200305 } else if (hw_ver < PMIC_ARB_VERSION_V7_MIN) {
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300306 priv->arb_ver = V5;
Caleb Connolly99f591c2023-12-05 13:46:53 +0000307 priv->arb_chnl = core_addr + APID_MAP_OFFSET_V5;
Neil Armstrong93627ce2025-03-28 09:53:21 +0100308 priv->max_channels = min_t(u32, readl(core_addr + PMIC_ARB_FEATURES) &
309 PMIC_ARB_FEATURES_PERIPH_MASK,
310 SPMI_MAX_CHANNELS_V5);
Neil Armstronga243fb22024-04-05 10:21:56 +0200311 priv->spmi_cnfg = dev_read_addr_name(dev, "cnfg");
312 } else {
313 /* TOFIX: handle second bus */
314 priv->arb_ver = V7;
315 priv->arb_chnl = core_addr + APID_MAP_OFFSET_V7;
Neil Armstrong93627ce2025-03-28 09:53:21 +0100316 priv->max_channels = min_t(u32, readl(core_addr + PMIC_ARB_FEATURES) &
317 PMIC_ARB_FEATURES_PERIPH_MASK,
318 SPMI_MAX_CHANNELS_V7);
Neil Armstrong3fe83672024-04-05 10:21:55 +0200319 priv->spmi_cnfg = dev_read_addr_name(dev, "cnfg");
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300320 }
321
Caleb Connolly99f591c2023-12-05 13:46:53 +0000322 dev_dbg(dev, "PMIC Arb Version-%d (%#x)\n", hw_ver >> 28, hw_ver);
Jorge Ramirez-Ortiz4bcef682018-01-10 11:33:28 +0100323
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200324 if (priv->arb_chnl == FDT_ADDR_T_NONE ||
Caleb Connolly99f591c2023-12-05 13:46:53 +0000325 priv->spmi_chnls == FDT_ADDR_T_NONE ||
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200326 priv->spmi_obs == FDT_ADDR_T_NONE)
327 return -EINVAL;
328
Caleb Connolly99f591c2023-12-05 13:46:53 +0000329 dev_dbg(dev, "priv->arb_chnl address (%#08llx)\n", priv->arb_chnl);
330 dev_dbg(dev, "priv->spmi_chnls address (%#08llx)\n", priv->spmi_chnls);
331 dev_dbg(dev, "priv->spmi_obs address (%#08llx)\n", priv->spmi_obs);
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200332 /* Scan peripherals connected to each SPMI channel */
Neil Armstrong3fe83672024-04-05 10:21:55 +0200333 for (i = 0; i < priv->max_channels; i++) {
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200334 uint32_t periph = readl(priv->arb_chnl + ARB_CHANNEL_OFFSET(i));
335 uint8_t slave_id = (periph & 0xf0000) >> 16;
336 uint8_t pid = (periph & 0xff00) >> 8;
337
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100338 switch (priv->arb_ver) {
339 case V2:
340 case V3:
Neil Armstrong41f17552025-03-28 09:53:23 +0100341 priv->channel_map[slave_id][pid] = i | SPMI_CHANNEL_VALID;
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100342 break;
Neil Armstrong3fe83672024-04-05 10:21:55 +0200343
Neil Armstrong7cc504e2025-03-28 09:53:22 +0100344 case V5:
345 case V7:
346 msm_spmi_channel_map_v5(priv, i, slave_id, pid);
347 break;
Neil Armstrong3fe83672024-04-05 10:21:55 +0200348 }
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200349 }
350 return 0;
351}
352
353static const struct udevice_id msm_spmi_ids[] = {
354 { .compatible = "qcom,spmi-pmic-arb" },
355 { }
356};
357
358U_BOOT_DRIVER(msm_spmi) = {
359 .name = "msm_spmi",
360 .id = UCLASS_SPMI,
361 .of_match = msm_spmi_ids,
362 .ops = &msm_spmi_ops,
363 .probe = msm_spmi_probe,
Dzmitry Sankouski682351a2021-10-17 13:44:28 +0300364 .priv_auto = sizeof(struct msm_spmi_priv),
Mateusz Kulikowski73bec9c2016-03-31 23:12:29 +0200365};