xref: /openbmc/linux/drivers/i2c/busses/i2c-bcm2835.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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