1346f7e6bSStefan Wahren // SPDX-License-Identifier: GPL-2.0
2f3b54b9aSStephen Warren /*
3f3b54b9aSStephen Warren * BCM2835 master mode driver
4f3b54b9aSStephen Warren */
5f3b54b9aSStephen Warren
6f3b54b9aSStephen Warren #include <linux/clk.h>
7bebff81fSAnnaliese McDermond #include <linux/clkdev.h>
8bebff81fSAnnaliese McDermond #include <linux/clk-provider.h>
9f3b54b9aSStephen Warren #include <linux/completion.h>
10f3b54b9aSStephen Warren #include <linux/err.h>
11f3b54b9aSStephen Warren #include <linux/i2c.h>
12f3b54b9aSStephen Warren #include <linux/interrupt.h>
13f3b54b9aSStephen Warren #include <linux/io.h>
14f3b54b9aSStephen Warren #include <linux/module.h>
15*59738ab2SRob Herring #include <linux/of.h>
16f3b54b9aSStephen Warren #include <linux/platform_device.h>
17f3b54b9aSStephen Warren #include <linux/slab.h>
18f3b54b9aSStephen Warren
19f3b54b9aSStephen Warren #define BCM2835_I2C_C 0x0
20f3b54b9aSStephen Warren #define BCM2835_I2C_S 0x4
21f3b54b9aSStephen Warren #define BCM2835_I2C_DLEN 0x8
22f3b54b9aSStephen Warren #define BCM2835_I2C_A 0xc
23f3b54b9aSStephen Warren #define BCM2835_I2C_FIFO 0x10
24f3b54b9aSStephen Warren #define BCM2835_I2C_DIV 0x14
25f3b54b9aSStephen Warren #define BCM2835_I2C_DEL 0x18
269495b9b3SEric Anholt /*
279495b9b3SEric Anholt * 16-bit field for the number of SCL cycles to wait after rising SCL
289495b9b3SEric Anholt * before deciding the slave is not responding. 0 disables the
299495b9b3SEric Anholt * timeout detection.
309495b9b3SEric Anholt */
31f3b54b9aSStephen Warren #define BCM2835_I2C_CLKT 0x1c
32f3b54b9aSStephen Warren
33f3b54b9aSStephen Warren #define BCM2835_I2C_C_READ BIT(0)
34f3b54b9aSStephen Warren #define BCM2835_I2C_C_CLEAR BIT(4) /* bits 4 and 5 both clear */
35f3b54b9aSStephen Warren #define BCM2835_I2C_C_ST BIT(7)
36f3b54b9aSStephen Warren #define BCM2835_I2C_C_INTD BIT(8)
37f3b54b9aSStephen Warren #define BCM2835_I2C_C_INTT BIT(9)
38f3b54b9aSStephen Warren #define BCM2835_I2C_C_INTR BIT(10)
39f3b54b9aSStephen Warren #define BCM2835_I2C_C_I2CEN BIT(15)
40f3b54b9aSStephen Warren
41f3b54b9aSStephen Warren #define BCM2835_I2C_S_TA BIT(0)
42f3b54b9aSStephen Warren #define BCM2835_I2C_S_DONE BIT(1)
43f3b54b9aSStephen Warren #define BCM2835_I2C_S_TXW BIT(2)
44f3b54b9aSStephen Warren #define BCM2835_I2C_S_RXR BIT(3)
45f3b54b9aSStephen Warren #define BCM2835_I2C_S_TXD BIT(4)
46f3b54b9aSStephen Warren #define BCM2835_I2C_S_RXD BIT(5)
47f3b54b9aSStephen Warren #define BCM2835_I2C_S_TXE BIT(6)
48f3b54b9aSStephen Warren #define BCM2835_I2C_S_RXF BIT(7)
49f3b54b9aSStephen Warren #define BCM2835_I2C_S_ERR BIT(8)
50f3b54b9aSStephen Warren #define BCM2835_I2C_S_CLKT BIT(9)
51f3b54b9aSStephen Warren #define BCM2835_I2C_S_LEN BIT(10) /* Fake bit for SW error reporting */
52f3b54b9aSStephen Warren
53fe32a815SEric Anholt #define BCM2835_I2C_FEDL_SHIFT 16
54fe32a815SEric Anholt #define BCM2835_I2C_REDL_SHIFT 0
55fe32a815SEric Anholt
56a294aba1SSilvan Wicki #define BCM2835_I2C_CDIV_MIN 0x0002
57a294aba1SSilvan Wicki #define BCM2835_I2C_CDIV_MAX 0xFFFE
58a294aba1SSilvan Wicki
59f3b54b9aSStephen Warren struct bcm2835_i2c_dev {
60f3b54b9aSStephen Warren struct device *dev;
61f3b54b9aSStephen Warren void __iomem *regs;
62f3b54b9aSStephen Warren int irq;
63f3b54b9aSStephen Warren struct i2c_adapter adapter;
64f3b54b9aSStephen Warren struct completion completion;
65e2474541SNoralf Trønnes struct i2c_msg *curr_msg;
663b722da6SStefan Wahren struct clk *bus_clk;
67ee05fea2SNoralf Trønnes int num_msgs;
68f3b54b9aSStephen Warren u32 msg_err;
69f3b54b9aSStephen Warren u8 *msg_buf;
70f3b54b9aSStephen Warren size_t msg_buf_remaining;
71f3b54b9aSStephen Warren };
72f3b54b9aSStephen Warren
bcm2835_i2c_writel(struct bcm2835_i2c_dev * i2c_dev,u32 reg,u32 val)73f3b54b9aSStephen Warren static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev,
74f3b54b9aSStephen Warren u32 reg, u32 val)
75f3b54b9aSStephen Warren {
76f3b54b9aSStephen Warren writel(val, i2c_dev->regs + reg);
77f3b54b9aSStephen Warren }
78f3b54b9aSStephen Warren
bcm2835_i2c_readl(struct bcm2835_i2c_dev * i2c_dev,u32 reg)79f3b54b9aSStephen Warren static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg)
80f3b54b9aSStephen Warren {
81f3b54b9aSStephen Warren return readl(i2c_dev->regs + reg);
82f3b54b9aSStephen Warren }
83f3b54b9aSStephen Warren
84bebff81fSAnnaliese McDermond #define to_clk_bcm2835_i2c(_hw) container_of(_hw, struct clk_bcm2835_i2c, hw)
85bebff81fSAnnaliese McDermond struct clk_bcm2835_i2c {
86bebff81fSAnnaliese McDermond struct clk_hw hw;
87bebff81fSAnnaliese McDermond struct bcm2835_i2c_dev *i2c_dev;
88bebff81fSAnnaliese McDermond };
899446f62eSNoralf Trønnes
clk_bcm2835_i2c_calc_divider(unsigned long rate,unsigned long parent_rate)90bebff81fSAnnaliese McDermond static int clk_bcm2835_i2c_calc_divider(unsigned long rate,
91bebff81fSAnnaliese McDermond unsigned long parent_rate)
92bebff81fSAnnaliese McDermond {
93bebff81fSAnnaliese McDermond u32 divider = DIV_ROUND_UP(parent_rate, rate);
94bebff81fSAnnaliese McDermond
959446f62eSNoralf Trønnes /*
969446f62eSNoralf Trønnes * Per the datasheet, the register is always interpreted as an even
979446f62eSNoralf Trønnes * number, by rounding down. In other words, the LSB is ignored. So,
989446f62eSNoralf Trønnes * if the LSB is set, increment the divider to avoid any issue.
999446f62eSNoralf Trønnes */
1009446f62eSNoralf Trønnes if (divider & 1)
1019446f62eSNoralf Trønnes divider++;
1029446f62eSNoralf Trønnes if ((divider < BCM2835_I2C_CDIV_MIN) ||
103bebff81fSAnnaliese McDermond (divider > BCM2835_I2C_CDIV_MAX))
1049446f62eSNoralf Trønnes return -EINVAL;
105bebff81fSAnnaliese McDermond
106bebff81fSAnnaliese McDermond return divider;
1079446f62eSNoralf Trønnes }
1089446f62eSNoralf Trønnes
clk_bcm2835_i2c_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)109bebff81fSAnnaliese McDermond static int clk_bcm2835_i2c_set_rate(struct clk_hw *hw, unsigned long rate,
110bebff81fSAnnaliese McDermond unsigned long parent_rate)
111bebff81fSAnnaliese McDermond {
112bebff81fSAnnaliese McDermond struct clk_bcm2835_i2c *div = to_clk_bcm2835_i2c(hw);
113bebff81fSAnnaliese McDermond u32 redl, fedl;
114bebff81fSAnnaliese McDermond u32 divider = clk_bcm2835_i2c_calc_divider(rate, parent_rate);
115bebff81fSAnnaliese McDermond
116bebff81fSAnnaliese McDermond if (divider == -EINVAL)
117bebff81fSAnnaliese McDermond return -EINVAL;
118bebff81fSAnnaliese McDermond
119bebff81fSAnnaliese McDermond bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider);
1209446f62eSNoralf Trønnes
121fe32a815SEric Anholt /*
122fe32a815SEric Anholt * Number of core clocks to wait after falling edge before
123fe32a815SEric Anholt * outputting the next data bit. Note that both FEDL and REDL
124fe32a815SEric Anholt * can't be greater than CDIV/2.
125fe32a815SEric Anholt */
126fe32a815SEric Anholt fedl = max(divider / 16, 1u);
127fe32a815SEric Anholt
128fe32a815SEric Anholt /*
129fe32a815SEric Anholt * Number of core clocks to wait after rising edge before
130fe32a815SEric Anholt * sampling the next incoming data bit.
131fe32a815SEric Anholt */
132fe32a815SEric Anholt redl = max(divider / 4, 1u);
133fe32a815SEric Anholt
134bebff81fSAnnaliese McDermond bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL,
135fe32a815SEric Anholt (fedl << BCM2835_I2C_FEDL_SHIFT) |
136fe32a815SEric Anholt (redl << BCM2835_I2C_REDL_SHIFT));
1379446f62eSNoralf Trønnes return 0;
1389446f62eSNoralf Trønnes }
1399446f62eSNoralf Trønnes
clk_bcm2835_i2c_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * parent_rate)140bebff81fSAnnaliese McDermond static long clk_bcm2835_i2c_round_rate(struct clk_hw *hw, unsigned long rate,
141bebff81fSAnnaliese McDermond unsigned long *parent_rate)
142bebff81fSAnnaliese McDermond {
143bebff81fSAnnaliese McDermond u32 divider = clk_bcm2835_i2c_calc_divider(rate, *parent_rate);
144bebff81fSAnnaliese McDermond
145bebff81fSAnnaliese McDermond return DIV_ROUND_UP(*parent_rate, divider);
146bebff81fSAnnaliese McDermond }
147bebff81fSAnnaliese McDermond
clk_bcm2835_i2c_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)148bebff81fSAnnaliese McDermond static unsigned long clk_bcm2835_i2c_recalc_rate(struct clk_hw *hw,
149bebff81fSAnnaliese McDermond unsigned long parent_rate)
150bebff81fSAnnaliese McDermond {
151bebff81fSAnnaliese McDermond struct clk_bcm2835_i2c *div = to_clk_bcm2835_i2c(hw);
152bebff81fSAnnaliese McDermond u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV);
153bebff81fSAnnaliese McDermond
154bebff81fSAnnaliese McDermond return DIV_ROUND_UP(parent_rate, divider);
155bebff81fSAnnaliese McDermond }
156bebff81fSAnnaliese McDermond
157bebff81fSAnnaliese McDermond static const struct clk_ops clk_bcm2835_i2c_ops = {
158bebff81fSAnnaliese McDermond .set_rate = clk_bcm2835_i2c_set_rate,
159bebff81fSAnnaliese McDermond .round_rate = clk_bcm2835_i2c_round_rate,
160bebff81fSAnnaliese McDermond .recalc_rate = clk_bcm2835_i2c_recalc_rate,
161bebff81fSAnnaliese McDermond };
162bebff81fSAnnaliese McDermond
bcm2835_i2c_register_div(struct device * dev,struct clk * mclk,struct bcm2835_i2c_dev * i2c_dev)163bebff81fSAnnaliese McDermond static struct clk *bcm2835_i2c_register_div(struct device *dev,
1649de93b04SAnnaliese McDermond struct clk *mclk,
165bebff81fSAnnaliese McDermond struct bcm2835_i2c_dev *i2c_dev)
166bebff81fSAnnaliese McDermond {
167bebff81fSAnnaliese McDermond struct clk_init_data init;
168bebff81fSAnnaliese McDermond struct clk_bcm2835_i2c *priv;
169bebff81fSAnnaliese McDermond char name[32];
1709de93b04SAnnaliese McDermond const char *mclk_name;
171bebff81fSAnnaliese McDermond
172bebff81fSAnnaliese McDermond snprintf(name, sizeof(name), "%s_div", dev_name(dev));
173bebff81fSAnnaliese McDermond
1749de93b04SAnnaliese McDermond mclk_name = __clk_get_name(mclk);
1759de93b04SAnnaliese McDermond
176bebff81fSAnnaliese McDermond init.ops = &clk_bcm2835_i2c_ops;
177bebff81fSAnnaliese McDermond init.name = name;
178bebff81fSAnnaliese McDermond init.parent_names = (const char* []) { mclk_name };
179bebff81fSAnnaliese McDermond init.num_parents = 1;
180bebff81fSAnnaliese McDermond init.flags = 0;
181bebff81fSAnnaliese McDermond
182bebff81fSAnnaliese McDermond priv = devm_kzalloc(dev, sizeof(struct clk_bcm2835_i2c), GFP_KERNEL);
183bebff81fSAnnaliese McDermond if (priv == NULL)
184bebff81fSAnnaliese McDermond return ERR_PTR(-ENOMEM);
185bebff81fSAnnaliese McDermond
186bebff81fSAnnaliese McDermond priv->hw.init = &init;
187bebff81fSAnnaliese McDermond priv->i2c_dev = i2c_dev;
188bebff81fSAnnaliese McDermond
189bebff81fSAnnaliese McDermond clk_hw_register_clkdev(&priv->hw, "div", dev_name(dev));
190bebff81fSAnnaliese McDermond return devm_clk_register(dev, &priv->hw);
191bebff81fSAnnaliese McDermond }
192bebff81fSAnnaliese McDermond
bcm2835_fill_txfifo(struct bcm2835_i2c_dev * i2c_dev)193f3b54b9aSStephen Warren static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev)
194f3b54b9aSStephen Warren {
195f3b54b9aSStephen Warren u32 val;
196f3b54b9aSStephen Warren
197f3b54b9aSStephen Warren while (i2c_dev->msg_buf_remaining) {
198f3b54b9aSStephen Warren val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
199f3b54b9aSStephen Warren if (!(val & BCM2835_I2C_S_TXD))
200f3b54b9aSStephen Warren break;
201f3b54b9aSStephen Warren bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO,
202f3b54b9aSStephen Warren *i2c_dev->msg_buf);
203f3b54b9aSStephen Warren i2c_dev->msg_buf++;
204f3b54b9aSStephen Warren i2c_dev->msg_buf_remaining--;
205f3b54b9aSStephen Warren }
206f3b54b9aSStephen Warren }
207f3b54b9aSStephen Warren
bcm2835_drain_rxfifo(struct bcm2835_i2c_dev * i2c_dev)208f3b54b9aSStephen Warren static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev)
209f3b54b9aSStephen Warren {
210f3b54b9aSStephen Warren u32 val;
211f3b54b9aSStephen Warren
212f3b54b9aSStephen Warren while (i2c_dev->msg_buf_remaining) {
213f3b54b9aSStephen Warren val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
214f3b54b9aSStephen Warren if (!(val & BCM2835_I2C_S_RXD))
215f3b54b9aSStephen Warren break;
216f3b54b9aSStephen Warren *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev,
217f3b54b9aSStephen Warren BCM2835_I2C_FIFO);
218f3b54b9aSStephen Warren i2c_dev->msg_buf++;
219f3b54b9aSStephen Warren i2c_dev->msg_buf_remaining--;
220f3b54b9aSStephen Warren }
221f3b54b9aSStephen Warren }
222f3b54b9aSStephen Warren
223d4030d75SNoralf Trønnes /*
224ee05fea2SNoralf Trønnes * Repeated Start Condition (Sr)
225ee05fea2SNoralf Trønnes * The BCM2835 ARM Peripherals datasheet mentions a way to trigger a Sr when it
226ee05fea2SNoralf Trønnes * talks about reading from a slave with 10 bit address. This is achieved by
227ee05fea2SNoralf Trønnes * issuing a write, poll the I2CS.TA flag and wait for it to be set, and then
228ee05fea2SNoralf Trønnes * issue a read.
229ee05fea2SNoralf Trønnes * A comment in https://github.com/raspberrypi/linux/issues/254 shows how the
230ee05fea2SNoralf Trønnes * firmware actually does it using polling and says that it's a workaround for
231ee05fea2SNoralf Trønnes * a problem in the state machine.
232ee05fea2SNoralf Trønnes * It turns out that it is possible to use the TXW interrupt to know when the
233ee05fea2SNoralf Trønnes * transfer is active, provided the FIFO has not been prefilled.
234ee05fea2SNoralf Trønnes */
235ee05fea2SNoralf Trønnes
bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev * i2c_dev)236ee05fea2SNoralf Trønnes static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev)
237ee05fea2SNoralf Trønnes {
238ee05fea2SNoralf Trønnes u32 c = BCM2835_I2C_C_ST | BCM2835_I2C_C_I2CEN;
239ee05fea2SNoralf Trønnes struct i2c_msg *msg = i2c_dev->curr_msg;
240ee05fea2SNoralf Trønnes bool last_msg = (i2c_dev->num_msgs == 1);
241ee05fea2SNoralf Trønnes
242ee05fea2SNoralf Trønnes if (!i2c_dev->num_msgs)
243ee05fea2SNoralf Trønnes return;
244ee05fea2SNoralf Trønnes
245ee05fea2SNoralf Trønnes i2c_dev->num_msgs--;
246ee05fea2SNoralf Trønnes i2c_dev->msg_buf = msg->buf;
247ee05fea2SNoralf Trønnes i2c_dev->msg_buf_remaining = msg->len;
248ee05fea2SNoralf Trønnes
249ee05fea2SNoralf Trønnes if (msg->flags & I2C_M_RD)
250ee05fea2SNoralf Trønnes c |= BCM2835_I2C_C_READ | BCM2835_I2C_C_INTR;
251ee05fea2SNoralf Trønnes else
252ee05fea2SNoralf Trønnes c |= BCM2835_I2C_C_INTT;
253ee05fea2SNoralf Trønnes
254ee05fea2SNoralf Trønnes if (last_msg)
255ee05fea2SNoralf Trønnes c |= BCM2835_I2C_C_INTD;
256ee05fea2SNoralf Trønnes
257ee05fea2SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr);
258ee05fea2SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len);
259ee05fea2SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
260ee05fea2SNoralf Trønnes }
261ee05fea2SNoralf Trønnes
bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev * i2c_dev)262f275a465SPaul Kocialkowski static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev)
263f275a465SPaul Kocialkowski {
264f275a465SPaul Kocialkowski i2c_dev->curr_msg = NULL;
265f275a465SPaul Kocialkowski i2c_dev->num_msgs = 0;
266f275a465SPaul Kocialkowski
267f275a465SPaul Kocialkowski i2c_dev->msg_buf = NULL;
268f275a465SPaul Kocialkowski i2c_dev->msg_buf_remaining = 0;
269f275a465SPaul Kocialkowski }
270f275a465SPaul Kocialkowski
271ee05fea2SNoralf Trønnes /*
272d4030d75SNoralf Trønnes * Note about I2C_C_CLEAR on error:
273d4030d75SNoralf Trønnes * The I2C_C_CLEAR on errors will take some time to resolve -- if you were in
274d4030d75SNoralf Trønnes * non-idle state and I2C_C_READ, it sets an abort_rx flag and runs through
275d4030d75SNoralf Trønnes * the state machine to send a NACK and a STOP. Since we're setting CLEAR
276d4030d75SNoralf Trønnes * without I2CEN, that NACK will be hanging around queued up for next time
277d4030d75SNoralf Trønnes * we start the engine.
278d4030d75SNoralf Trønnes */
279d4030d75SNoralf Trønnes
bcm2835_i2c_isr(int this_irq,void * data)280f3b54b9aSStephen Warren static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data)
281f3b54b9aSStephen Warren {
282f3b54b9aSStephen Warren struct bcm2835_i2c_dev *i2c_dev = data;
283f3b54b9aSStephen Warren u32 val, err;
284f3b54b9aSStephen Warren
285f3b54b9aSStephen Warren val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
286f3b54b9aSStephen Warren
287f3b54b9aSStephen Warren err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR);
288f3b54b9aSStephen Warren if (err) {
289f3b54b9aSStephen Warren i2c_dev->msg_err = err;
290d4030d75SNoralf Trønnes goto complete;
291f3b54b9aSStephen Warren }
292f3b54b9aSStephen Warren
293e2474541SNoralf Trønnes if (val & BCM2835_I2C_S_DONE) {
294ababb089SStefan Wahren if (!i2c_dev->curr_msg) {
295ababb089SStefan Wahren dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n");
296ababb089SStefan Wahren } else if (i2c_dev->curr_msg->flags & I2C_M_RD) {
297f3b54b9aSStephen Warren bcm2835_drain_rxfifo(i2c_dev);
298e2474541SNoralf Trønnes val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
299f3b54b9aSStephen Warren }
300f3b54b9aSStephen Warren
301e2474541SNoralf Trønnes if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining)
302f3b54b9aSStephen Warren i2c_dev->msg_err = BCM2835_I2C_S_LEN;
303f3b54b9aSStephen Warren else
304f3b54b9aSStephen Warren i2c_dev->msg_err = 0;
305d4030d75SNoralf Trønnes goto complete;
306f3b54b9aSStephen Warren }
307f3b54b9aSStephen Warren
308e2474541SNoralf Trønnes if (val & BCM2835_I2C_S_TXW) {
309d4030d75SNoralf Trønnes if (!i2c_dev->msg_buf_remaining) {
310d4030d75SNoralf Trønnes i2c_dev->msg_err = val | BCM2835_I2C_S_LEN;
311d4030d75SNoralf Trønnes goto complete;
312d4030d75SNoralf Trønnes }
313d4030d75SNoralf Trønnes
314f3b54b9aSStephen Warren bcm2835_fill_txfifo(i2c_dev);
315ee05fea2SNoralf Trønnes
316ee05fea2SNoralf Trønnes if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) {
317ee05fea2SNoralf Trønnes i2c_dev->curr_msg++;
318ee05fea2SNoralf Trønnes bcm2835_i2c_start_transfer(i2c_dev);
319ee05fea2SNoralf Trønnes }
320ee05fea2SNoralf Trønnes
321f3b54b9aSStephen Warren return IRQ_HANDLED;
322f3b54b9aSStephen Warren }
323f3b54b9aSStephen Warren
324e2474541SNoralf Trønnes if (val & BCM2835_I2C_S_RXR) {
325d4030d75SNoralf Trønnes if (!i2c_dev->msg_buf_remaining) {
326d4030d75SNoralf Trønnes i2c_dev->msg_err = val | BCM2835_I2C_S_LEN;
327d4030d75SNoralf Trønnes goto complete;
328d4030d75SNoralf Trønnes }
329d4030d75SNoralf Trønnes
330e2474541SNoralf Trønnes bcm2835_drain_rxfifo(i2c_dev);
331e2474541SNoralf Trønnes return IRQ_HANDLED;
332e2474541SNoralf Trønnes }
333e2474541SNoralf Trønnes
334f3b54b9aSStephen Warren return IRQ_NONE;
335d4030d75SNoralf Trønnes
336d4030d75SNoralf Trønnes complete:
337d4030d75SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR);
338d4030d75SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT |
339d4030d75SNoralf Trønnes BCM2835_I2C_S_ERR | BCM2835_I2C_S_DONE);
340d4030d75SNoralf Trønnes complete(&i2c_dev->completion);
341d4030d75SNoralf Trønnes
342d4030d75SNoralf Trønnes return IRQ_HANDLED;
343f3b54b9aSStephen Warren }
344f3b54b9aSStephen Warren
bcm2835_i2c_xfer(struct i2c_adapter * adap,struct i2c_msg msgs[],int num)345ee05fea2SNoralf Trønnes static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
346ee05fea2SNoralf Trønnes int num)
347f3b54b9aSStephen Warren {
348ee05fea2SNoralf Trønnes struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap);
349c4dc1216SNicholas Mc Guire unsigned long time_left;
350bebff81fSAnnaliese McDermond int i;
351f3b54b9aSStephen Warren
352ee05fea2SNoralf Trønnes for (i = 0; i < (num - 1); i++)
353ee05fea2SNoralf Trønnes if (msgs[i].flags & I2C_M_RD) {
354ee05fea2SNoralf Trønnes dev_warn_once(i2c_dev->dev,
355ee05fea2SNoralf Trønnes "only one read message supported, has to be last\n");
356ee05fea2SNoralf Trønnes return -EOPNOTSUPP;
357ee05fea2SNoralf Trønnes }
358ee05fea2SNoralf Trønnes
359ee05fea2SNoralf Trønnes i2c_dev->curr_msg = msgs;
360ee05fea2SNoralf Trønnes i2c_dev->num_msgs = num;
36116735d02SWolfram Sang reinit_completion(&i2c_dev->completion);
362f3b54b9aSStephen Warren
363ee05fea2SNoralf Trønnes bcm2835_i2c_start_transfer(i2c_dev);
364f3b54b9aSStephen Warren
365f3b54b9aSStephen Warren time_left = wait_for_completion_timeout(&i2c_dev->completion,
366e13e19e1SNoralf Trønnes adap->timeout);
367f275a465SPaul Kocialkowski
368f275a465SPaul Kocialkowski bcm2835_i2c_finish_transfer(i2c_dev);
369f275a465SPaul Kocialkowski
370f3b54b9aSStephen Warren if (!time_left) {
371d4030d75SNoralf Trønnes bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C,
372d4030d75SNoralf Trønnes BCM2835_I2C_C_CLEAR);
373f3b54b9aSStephen Warren dev_err(i2c_dev->dev, "i2c transfer timed out\n");
374f3b54b9aSStephen Warren return -ETIMEDOUT;
375f3b54b9aSStephen Warren }
376f3b54b9aSStephen Warren
377ee05fea2SNoralf Trønnes if (!i2c_dev->msg_err)
378ee05fea2SNoralf Trønnes return num;
379f3b54b9aSStephen Warren
38023c9540bSNoralf Trønnes dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err);
381f3b54b9aSStephen Warren
382f3b54b9aSStephen Warren if (i2c_dev->msg_err & BCM2835_I2C_S_ERR)
383f3b54b9aSStephen Warren return -EREMOTEIO;
384ee05fea2SNoralf Trønnes
385f3b54b9aSStephen Warren return -EIO;
386f3b54b9aSStephen Warren }
387f3b54b9aSStephen Warren
bcm2835_i2c_func(struct i2c_adapter * adap)388f3b54b9aSStephen Warren static u32 bcm2835_i2c_func(struct i2c_adapter *adap)
389f3b54b9aSStephen Warren {
390f3b54b9aSStephen Warren return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
391f3b54b9aSStephen Warren }
392f3b54b9aSStephen Warren
393f3b54b9aSStephen Warren static const struct i2c_algorithm bcm2835_i2c_algo = {
394f3b54b9aSStephen Warren .master_xfer = bcm2835_i2c_xfer,
395f3b54b9aSStephen Warren .functionality = bcm2835_i2c_func,
396f3b54b9aSStephen Warren };
397f3b54b9aSStephen Warren
3984dbfb5f4SNicola Corna /*
39967de10fbSStefan Wahren * The BCM2835 was reported to have problems with clock stretching:
400db4694e6SAlexander A. Klimov * https://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html
4014dbfb5f4SNicola Corna * https://www.raspberrypi.org/forums/viewtopic.php?p=146272
4024dbfb5f4SNicola Corna */
4034dbfb5f4SNicola Corna static const struct i2c_adapter_quirks bcm2835_i2c_quirks = {
4044dbfb5f4SNicola Corna .flags = I2C_AQ_NO_CLK_STRETCH,
4054dbfb5f4SNicola Corna };
4064dbfb5f4SNicola Corna
bcm2835_i2c_probe(struct platform_device * pdev)407f3b54b9aSStephen Warren static int bcm2835_i2c_probe(struct platform_device *pdev)
408f3b54b9aSStephen Warren {
409f3b54b9aSStephen Warren struct bcm2835_i2c_dev *i2c_dev;
410f3b54b9aSStephen Warren int ret;
411f3b54b9aSStephen Warren struct i2c_adapter *adap;
4129de93b04SAnnaliese McDermond struct clk *mclk;
413bebff81fSAnnaliese McDermond u32 bus_clk_rate;
414f3b54b9aSStephen Warren
415f3b54b9aSStephen Warren i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
41646797a2aSJingoo Han if (!i2c_dev)
417f3b54b9aSStephen Warren return -ENOMEM;
418f3b54b9aSStephen Warren platform_set_drvdata(pdev, i2c_dev);
419f3b54b9aSStephen Warren i2c_dev->dev = &pdev->dev;
420f3b54b9aSStephen Warren init_completion(&i2c_dev->completion);
421f3b54b9aSStephen Warren
4229fc49c4cSye xingchen i2c_dev->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
423ae50b1dfSJingoo Han if (IS_ERR(i2c_dev->regs))
424ae50b1dfSJingoo Han return PTR_ERR(i2c_dev->regs);
425f3b54b9aSStephen Warren
4269de93b04SAnnaliese McDermond mclk = devm_clk_get(&pdev->dev, NULL);
427b713aa86SKrzysztof Kozlowski if (IS_ERR(mclk))
428b713aa86SKrzysztof Kozlowski return dev_err_probe(&pdev->dev, PTR_ERR(mclk),
429b713aa86SKrzysztof Kozlowski "Could not get clock\n");
430bebff81fSAnnaliese McDermond
4313b722da6SStefan Wahren i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev);
432bebff81fSAnnaliese McDermond
4337aec2f39SLiao Chang if (IS_ERR(i2c_dev->bus_clk))
4347aec2f39SLiao Chang return dev_err_probe(&pdev->dev, PTR_ERR(i2c_dev->bus_clk),
4357aec2f39SLiao Chang "Could not register clock\n");
436bebff81fSAnnaliese McDermond
437bebff81fSAnnaliese McDermond ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency",
438bebff81fSAnnaliese McDermond &bus_clk_rate);
439bebff81fSAnnaliese McDermond if (ret < 0) {
440bebff81fSAnnaliese McDermond dev_warn(&pdev->dev,
441bebff81fSAnnaliese McDermond "Could not read clock-frequency property\n");
44290224e64SAndy Shevchenko bus_clk_rate = I2C_MAX_STANDARD_MODE_FREQ;
443bebff81fSAnnaliese McDermond }
444bebff81fSAnnaliese McDermond
4453b722da6SStefan Wahren ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate);
4467aec2f39SLiao Chang if (ret < 0)
4477aec2f39SLiao Chang return dev_err_probe(&pdev->dev, ret,
4487aec2f39SLiao Chang "Could not set clock frequency\n");
449bebff81fSAnnaliese McDermond
4503b722da6SStefan Wahren ret = clk_prepare_enable(i2c_dev->bus_clk);
451bebff81fSAnnaliese McDermond if (ret) {
452bebff81fSAnnaliese McDermond dev_err(&pdev->dev, "Couldn't prepare clock");
453b205f585SChristophe JAILLET goto err_put_exclusive_rate;
454bebff81fSAnnaliese McDermond }
455bebff81fSAnnaliese McDermond
456c3b2f911SLad Prabhakar i2c_dev->irq = platform_get_irq(pdev, 0);
457b205f585SChristophe JAILLET if (i2c_dev->irq < 0) {
458b205f585SChristophe JAILLET ret = i2c_dev->irq;
459b205f585SChristophe JAILLET goto err_disable_unprepare_clk;
460b205f585SChristophe JAILLET }
4614a5cfa39SAnnaliese McDermond
4624a5cfa39SAnnaliese McDermond ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED,
4634a5cfa39SAnnaliese McDermond dev_name(&pdev->dev), i2c_dev);
4644a5cfa39SAnnaliese McDermond if (ret) {
4654a5cfa39SAnnaliese McDermond dev_err(&pdev->dev, "Could not request IRQ\n");
466b205f585SChristophe JAILLET goto err_disable_unprepare_clk;
4674a5cfa39SAnnaliese McDermond }
4684a5cfa39SAnnaliese McDermond
469f3b54b9aSStephen Warren adap = &i2c_dev->adapter;
470f3b54b9aSStephen Warren i2c_set_adapdata(adap, i2c_dev);
471f3b54b9aSStephen Warren adap->owner = THIS_MODULE;
47237e4f91aSWolfram Sang adap->class = I2C_CLASS_DEPRECATED;
473250212b5SStefan Wahren snprintf(adap->name, sizeof(adap->name), "bcm2835 (%s)",
474250212b5SStefan Wahren of_node_full_name(pdev->dev.of_node));
475f3b54b9aSStephen Warren adap->algo = &bcm2835_i2c_algo;
476f3b54b9aSStephen Warren adap->dev.parent = &pdev->dev;
47707a27a00SFlorian Meier adap->dev.of_node = pdev->dev.of_node;
47867de10fbSStefan Wahren adap->quirks = of_device_get_match_data(&pdev->dev);
479f3b54b9aSStephen Warren
4809495b9b3SEric Anholt /*
4819495b9b3SEric Anholt * Disable the hardware clock stretching timeout. SMBUS
4829495b9b3SEric Anholt * specifies a limit for how long the device can stretch the
4839495b9b3SEric Anholt * clock, but core I2C doesn't.
4849495b9b3SEric Anholt */
4859495b9b3SEric Anholt bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_CLKT, 0);
486f3b54b9aSStephen Warren bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0);
487f3b54b9aSStephen Warren
488f3b54b9aSStephen Warren ret = i2c_add_adapter(adap);
489f3b54b9aSStephen Warren if (ret)
490b205f585SChristophe JAILLET goto err_free_irq;
491b205f585SChristophe JAILLET
492b205f585SChristophe JAILLET return 0;
493b205f585SChristophe JAILLET
494b205f585SChristophe JAILLET err_free_irq:
495f3b54b9aSStephen Warren free_irq(i2c_dev->irq, i2c_dev);
496b205f585SChristophe JAILLET err_disable_unprepare_clk:
497b205f585SChristophe JAILLET clk_disable_unprepare(i2c_dev->bus_clk);
498b205f585SChristophe JAILLET err_put_exclusive_rate:
499b205f585SChristophe JAILLET clk_rate_exclusive_put(i2c_dev->bus_clk);
500f3b54b9aSStephen Warren
501f3b54b9aSStephen Warren return ret;
502f3b54b9aSStephen Warren }
503f3b54b9aSStephen Warren
bcm2835_i2c_remove(struct platform_device * pdev)504e190a0c3SUwe Kleine-König static void bcm2835_i2c_remove(struct platform_device *pdev)
505f3b54b9aSStephen Warren {
506f3b54b9aSStephen Warren struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
507bebff81fSAnnaliese McDermond
5083b722da6SStefan Wahren clk_rate_exclusive_put(i2c_dev->bus_clk);
5093b722da6SStefan Wahren clk_disable_unprepare(i2c_dev->bus_clk);
510f3b54b9aSStephen Warren
511f3b54b9aSStephen Warren free_irq(i2c_dev->irq, i2c_dev);
512f3b54b9aSStephen Warren i2c_del_adapter(&i2c_dev->adapter);
513f3b54b9aSStephen Warren }
514f3b54b9aSStephen Warren
515f3b54b9aSStephen Warren static const struct of_device_id bcm2835_i2c_of_match[] = {
51667de10fbSStefan Wahren { .compatible = "brcm,bcm2711-i2c" },
51767de10fbSStefan Wahren { .compatible = "brcm,bcm2835-i2c", .data = &bcm2835_i2c_quirks },
518f3b54b9aSStephen Warren {},
519f3b54b9aSStephen Warren };
520f3b54b9aSStephen Warren MODULE_DEVICE_TABLE(of, bcm2835_i2c_of_match);
521f3b54b9aSStephen Warren
522f3b54b9aSStephen Warren static struct platform_driver bcm2835_i2c_driver = {
523f3b54b9aSStephen Warren .probe = bcm2835_i2c_probe,
524e190a0c3SUwe Kleine-König .remove_new = bcm2835_i2c_remove,
525f3b54b9aSStephen Warren .driver = {
526f3b54b9aSStephen Warren .name = "i2c-bcm2835",
527f3b54b9aSStephen Warren .of_match_table = bcm2835_i2c_of_match,
528f3b54b9aSStephen Warren },
529f3b54b9aSStephen Warren };
530f3b54b9aSStephen Warren module_platform_driver(bcm2835_i2c_driver);
531f3b54b9aSStephen Warren
532f3b54b9aSStephen Warren MODULE_AUTHOR("Stephen Warren <swarren@wwwdotorg.org>");
533f3b54b9aSStephen Warren MODULE_DESCRIPTION("BCM2835 I2C bus adapter");
534f3b54b9aSStephen Warren MODULE_LICENSE("GPL v2");
535f3b54b9aSStephen Warren MODULE_ALIAS("platform:i2c-bcm2835");
536