blob: 4cddcfa6b7fff5c7b85824eb160318133f41e58c [file] [log] [blame]
Nathan Barrett-Morrison3ce44bc2025-02-26 12:30:28 -05001// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * (C) Copyright 2022 - Analog Devices, Inc.
4 *
5 * Written and/or maintained by Timesys Corporation
6 *
7 * Converted to driver model by Nathan Barrett-Morrison
8 *
9 * Contact: Nathan Barrett-Morrison <nathan.morrison@timesys.com>
10 * Contact: Greg Malysa <greg.malysa@timesys.com>
11 */
12
13#include <clk.h>
14#include <dm.h>
15#include <i2c.h>
16#include <mapmem.h>
17#include <linux/io.h>
18
19#define CLKLOW(x) ((x) & 0xFF) // Periods Clock Is Held Low
20#define CLKHI(y) (((y) & 0xFF) << 0x8) // Periods Clock Is High
21
22#define PRESCALE 0x007F // SCLKs Per Internal Time Reference (10MHz)
23#define TWI_ENA 0x0080 // TWI Enable
24#define SCCB 0x0200 // SCCB Compatibility Enable
25
26#define SEN 0x0001 // Slave Enable
27#define SADD_LEN 0x0002 // Slave Address Length
28#define STDVAL 0x0004 // Slave Transmit Data Valid
29#define TSC_NAK 0x0008 // NAK Generated At Conclusion Of Transfer
30#define GEN 0x0010 // General Call Adrress Matching Enabled
31
32#define SDIR 0x0001 // Slave Transfer Direction
33#define GCALL 0x0002 // General Call Indicator
34
35#define MEN 0x0001 // Master Mode Enable
36#define MADD_LEN 0x0002 // Master Address Length
37#define MDIR 0x0004 // Master Transmit Direction (RX/TX*)
38#define FAST 0x0008 // Use Fast Mode Timing Specs
39#define STOP 0x0010 // Issue Stop Condition
40#define RSTART 0x0020 // Repeat Start or Stop* At End Of Transfer
41#define DCNT 0x3FC0 // Data Bytes To Transfer
42#define SDAOVR 0x4000 // Serial Data Override
43#define SCLOVR 0x8000 // Serial Clock Override
44
45#define MPROG 0x0001 // Master Transfer In Progress
46#define LOSTARB 0x0002 // Lost Arbitration Indicator (Xfer Aborted)
47#define ANAK 0x0004 // Address Not Acknowledged
48#define DNAK 0x0008 // Data Not Acknowledged
49#define BUFRDERR 0x0010 // Buffer Read Error
50#define BUFWRERR 0x0020 // Buffer Write Error
51#define SDASEN 0x0040 // Serial Data Sense
52#define SCLSEN 0x0080 // Serial Clock Sense
53#define BUSBUSY 0x0100 // Bus Busy Indicator
54
55#define SINIT 0x0001 // Slave Transfer Initiated
56#define SCOMP 0x0002 // Slave Transfer Complete
57#define SERR 0x0004 // Slave Transfer Error
58#define SOVF 0x0008 // Slave Overflow
59#define MCOMP 0x0010 // Master Transfer Complete
60#define MERR 0x0020 // Master Transfer Error
61#define XMTSERV 0x0040 // Transmit FIFO Service
62#define RCVSERV 0x0080 // Receive FIFO Service
63
64#define XMTFLUSH 0x0001 // Transmit Buffer Flush
65#define RCVFLUSH 0x0002 // Receive Buffer Flush
66#define XMTINTLEN 0x0004 // Transmit Buffer Interrupt Length
67#define RCVINTLEN 0x0008 // Receive Buffer Interrupt Length
68
69#define XMTSTAT 0x0003 // Transmit FIFO Status
70#define XMT_EMPTY 0x0000 // Transmit FIFO Empty
71#define XMT_HALF 0x0001 // Transmit FIFO Has 1 Byte To Write
72#define XMT_FULL 0x0003 // Transmit FIFO Full (2 Bytes To Write)
73
74#define RCVSTAT 0x000C // Receive FIFO Status
75#define RCV_EMPTY 0x0000 // Receive FIFO Empty
76#define RCV_HALF 0x0004 // Receive FIFO Has 1 Byte To Read
77#define RCV_FULL 0x000C // Receive FIFO Full (2 Bytes To Read)
78
79/* Every register is 32bit aligned, but only 16bits in size */
80#define ureg(name) u16 name; u16 __pad_##name
81
82struct twi_regs {
83 ureg(clkdiv);
84 ureg(control);
85 ureg(slave_ctl);
86 ureg(slave_stat);
87 ureg(slave_addr);
88 ureg(master_ctl);
89 ureg(master_stat);
90 ureg(master_addr);
91 ureg(int_stat);
92 ureg(int_mask);
93 ureg(fifo_ctl);
94 ureg(fifo_stat);
95 u8 __pad[0x50];
96
97 ureg(xmt_data8);
98 ureg(xmt_data16);
99 ureg(rcv_data8);
100 ureg(rcv_data16);
101};
102
103#undef ureg
104
105/*
106 * The way speed is changed into duty often results in integer truncation
107 * with 50% duty, so we'll force rounding up to the next duty by adding 1
108 * to the max. In practice this will get us a speed of something like
109 * 385 KHz. The other limit is easy to handle as it is only 8 bits.
110 */
111#define I2C_SPEED_MAX 400000
112#define I2C_SPEED_TO_DUTY(speed) (5000000 / (speed))
113#define I2C_DUTY_MAX (I2C_SPEED_TO_DUTY(I2C_SPEED_MAX) + 1)
114#define I2C_DUTY_MIN 0xff /* 8 bit limited */
115
116#define I2C_M_COMBO 0x4
117#define I2C_M_STOP 0x2
118#define I2C_M_READ 0x1
119
120/*
121 * All transfers are described by this data structure
122 */
123struct adi_i2c_msg {
124 u8 flags;
125 u32 len; /* msg length */
126 u8 *buf; /* pointer to msg data */
127 u32 olen; /* addr length */
128 u8 *obuf; /* addr buffer */
129};
130
131struct adi_i2c_dev {
132 struct twi_regs __iomem *base;
133 u32 i2c_clk;
134 uint speed;
135};
136
137/* Allow msec timeout per ~byte transfer */
138#define I2C_TIMEOUT 10
139
140/**
141 * wait_for_completion - manage the actual i2c transfer
142 * @msg: the i2c msg
143 */
144static int wait_for_completion(struct twi_regs *twi, struct adi_i2c_msg *msg)
145{
146 u16 int_stat;
147 ulong timebase = get_timer(0);
148
149 do {
150 int_stat = ioread16(&twi->int_stat);
151
152 if (int_stat & XMTSERV) {
153 iowrite16(XMTSERV, &twi->int_stat);
154 if (msg->olen) {
155 iowrite16(*(msg->obuf++), &twi->xmt_data8);
156 --msg->olen;
157 } else if (!(msg->flags & I2C_M_COMBO) && msg->len) {
158 iowrite16(*(msg->buf++), &twi->xmt_data8);
159 --msg->len;
160 } else {
161 if (msg->flags & I2C_M_COMBO)
162 setbits_16(&twi->master_ctl, RSTART | MDIR);
163 else
164 setbits_16(&twi->master_ctl, STOP);
165 }
166 }
167 if (int_stat & RCVSERV) {
168 iowrite16(RCVSERV, &twi->int_stat);
169 if (msg->len) {
170 *(msg->buf++) = ioread16(&twi->rcv_data8);
171 --msg->len;
172 } else if (msg->flags & I2C_M_STOP) {
173 setbits_16(&twi->master_ctl, STOP);
174 }
175 }
176 if (int_stat & MERR) {
177 pr_err("%s: master transmit terror: %d\n", __func__,
178 ioread16(&twi->master_stat));
179 iowrite16(MERR, &twi->int_stat);
180 return -EIO;
181 }
182 if (int_stat & MCOMP) {
183 iowrite16(MCOMP, &twi->int_stat);
184 if (msg->flags & I2C_M_COMBO && msg->len) {
185 u16 mlen = min(msg->len, 0xffu) << 6;
186 clrsetbits_16(&twi->master_ctl, RSTART, mlen | MEN | MDIR);
187 } else {
188 break;
189 }
190 }
191
192 /* If we were able to do something, reset timeout */
193 if (int_stat)
194 timebase = get_timer(0);
195
196 } while (get_timer(timebase) < I2C_TIMEOUT);
197
198 return 0;
199}
200
201static int i2c_transfer(struct twi_regs *twi, u8 chip, u8 *offset,
202 int olen, u8 *buffer, int len, u8 flags)
203{
204 int ret;
205 u16 ctl;
206
207 struct adi_i2c_msg msg = {
208 .flags = flags | (len >= 0xff ? I2C_M_STOP : 0),
209 .buf = buffer,
210 .len = len,
211 .obuf = offset,
212 .olen = olen,
213 };
214
215 /* wait for things to settle */
216 while (ioread16(&twi->master_stat) & BUSBUSY)
217 if (!IS_ENABLED(CONFIG_SPL_BUILD) && ctrlc())
218 return -EINTR;
219
220 /* Set Transmit device address */
221 iowrite16(chip, &twi->master_addr);
222
223 /* Clear the FIFO before starting things */
224 iowrite16(XMTFLUSH | RCVFLUSH, &twi->fifo_ctl);
225 iowrite16(0, &twi->fifo_ctl);
226
227 /* Prime the pump */
228 if (msg.olen) {
229 len = (msg.flags & I2C_M_COMBO) ? msg.olen : msg.olen + len;
230 iowrite16(*(msg.obuf++), &twi->xmt_data8);
231 --msg.olen;
232 } else if (!(msg.flags & I2C_M_READ) && msg.len) {
233 iowrite16(*(msg.buf++), &twi->xmt_data8);
234 --msg.len;
235 }
236
237 /* clear int stat */
238 iowrite16(-1, &twi->master_stat);
239 iowrite16(-1, &twi->int_stat);
240 iowrite16(0, &twi->int_mask);
241
242 /* Master enable */
243 ctl = ioread16(&twi->master_ctl);
244 ctl = (ctl & FAST) | (min(len, 0xff) << 6) | MEN |
245 ((msg.flags & I2C_M_READ) ? MDIR : 0);
246 iowrite16(ctl, &twi->master_ctl);
247
248 /* Process the rest */
249 ret = wait_for_completion(twi, &msg);
250
251 clrbits_16(&twi->master_ctl, MEN);
252 clrbits_16(&twi->control, TWI_ENA);
253 setbits_16(&twi->control, TWI_ENA);
254 return ret;
255}
256
257static int adi_i2c_read(struct twi_regs *twi, u8 chip,
258 u8 *offset, int olen, u8 *buffer, int len)
259{
260 return i2c_transfer(twi, chip, offset, olen, buffer,
261 len, olen ? I2C_M_COMBO : I2C_M_READ);
262}
263
264static int adi_i2c_write(struct twi_regs *twi, u8 chip,
265 u8 *offset, int olen, u8 *buffer, int len)
266{
267 return i2c_transfer(twi, chip, offset, olen, buffer, len, 0);
268}
269
270static int adi_i2c_set_bus_speed(struct udevice *bus, uint speed)
271{
272 struct adi_i2c_dev *dev = dev_get_priv(bus);
273 struct twi_regs *twi = dev->base;
274 u16 clkdiv = I2C_SPEED_TO_DUTY(speed);
275
276 /* Set TWI interface clock */
277 if (clkdiv < I2C_DUTY_MAX || clkdiv > I2C_DUTY_MIN)
278 return -1;
279 clkdiv = (clkdiv << 8) | (clkdiv & 0xff);
280 iowrite16(clkdiv, &twi->clkdiv);
281
282 /* Don't turn it on */
283 iowrite16(speed > 100000 ? FAST : 0, &twi->master_ctl);
284
285 return 0;
286}
287
288static int adi_i2c_of_to_plat(struct udevice *bus)
289{
290 struct adi_i2c_dev *dev = dev_get_priv(bus);
291 struct clk clock;
292 u32 ret;
293
294 dev->base = map_sysmem(dev_read_addr(bus), sizeof(struct twi_regs));
295
296 if (!dev->base)
297 return -ENOMEM;
298
299 dev->speed = dev_read_u32_default(bus, "clock-frequency",
300 I2C_SPEED_FAST_RATE);
301
302 ret = clk_get_by_name(bus, "i2c", &clock);
303 if (ret < 0)
304 printf("%s: Can't get I2C clk: %d\n", __func__, ret);
305 else
306 dev->i2c_clk = clk_get_rate(&clock);
307
308 return 0;
309}
310
311static int adi_i2c_probe_chip(struct udevice *bus, u32 chip_addr,
312 u32 chip_flags)
313{
314 struct adi_i2c_dev *dev = dev_get_priv(bus);
315 u8 byte;
316
317 return adi_i2c_read(dev->base, chip_addr, NULL, 0, &byte, 1);
318}
319
320static int adi_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
321{
322 struct adi_i2c_dev *dev = dev_get_priv(bus);
323 struct i2c_msg *dmsg, *omsg, dummy;
324
325 memset(&dummy, 0, sizeof(struct i2c_msg));
326
327 /*
328 * We expect either two messages (one with an offset and one with the
329 * actual data) or one message (just data)
330 */
331 if (nmsgs > 2 || nmsgs == 0) {
332 debug("%s: Only one or two messages are supported.", __func__);
333 return -EINVAL;
334 }
335
336 omsg = nmsgs == 1 ? &dummy : msg;
337 dmsg = nmsgs == 1 ? msg : msg + 1;
338
339 if (dmsg->flags & I2C_M_RD)
340 return adi_i2c_read(dev->base, dmsg->addr, omsg->buf, omsg->len,
341 dmsg->buf, dmsg->len);
342 else
343 return adi_i2c_write(dev->base, dmsg->addr, omsg->buf, omsg->len,
344 dmsg->buf, dmsg->len);
345}
346
347int adi_i2c_probe(struct udevice *bus)
348{
349 struct adi_i2c_dev *dev = dev_get_priv(bus);
350 struct twi_regs *twi = dev->base;
351
352 u16 prescale = ((dev->i2c_clk / 1000 / 1000 + 5) / 10) & 0x7F;
353
354 /* Set TWI internal clock as 10MHz */
355 iowrite16(prescale, &twi->control);
356
357 /* Set TWI interface clock as specified */
358 adi_i2c_set_bus_speed(bus, dev->speed);
359
360 /* Enable it */
361 iowrite16(TWI_ENA | prescale, &twi->control);
362
363 return 0;
364}
365
366static const struct dm_i2c_ops adi_i2c_ops = {
367 .xfer = adi_i2c_xfer,
368 .probe_chip = adi_i2c_probe_chip,
369 .set_bus_speed = adi_i2c_set_bus_speed,
370};
371
372static const struct udevice_id adi_i2c_ids[] = {
373 { .compatible = "adi-i2c", },
374 { /* sentinel */ }
375};
376
377U_BOOT_DRIVER(i2c_adi) = {
378 .name = "i2c_adi",
379 .id = UCLASS_I2C,
380 .of_match = adi_i2c_ids,
381 .probe = adi_i2c_probe,
382 .of_to_plat = adi_i2c_of_to_plat,
383 .priv_auto = sizeof(struct adi_i2c_dev),
384 .ops = &adi_i2c_ops,
385 .flags = DM_FLAG_PRE_RELOC,
386};