xref: /linux/drivers/i2c/busses/i2c-riic.c (revision 279c83db24552e83caa09347358473e633e56617)
16055af5eSWolfram Sang // SPDX-License-Identifier: GPL-2.0
2310c18a4SWolfram Sang /*
3310c18a4SWolfram Sang  * Renesas RIIC driver
4310c18a4SWolfram Sang  *
5310c18a4SWolfram Sang  * Copyright (C) 2013 Wolfram Sang <wsa@sang-engineering.com>
6310c18a4SWolfram Sang  * Copyright (C) 2013 Renesas Solutions Corp.
7310c18a4SWolfram Sang  */
8310c18a4SWolfram Sang 
9310c18a4SWolfram Sang /*
10310c18a4SWolfram Sang  * This i2c core has a lot of interrupts, namely 8. We use their chaining as
11310c18a4SWolfram Sang  * some kind of state machine.
12310c18a4SWolfram Sang  *
13310c18a4SWolfram Sang  * 1) The main xfer routine kicks off a transmission by putting the start bit
14310c18a4SWolfram Sang  * (or repeated start) on the bus and enabling the transmit interrupt (TIE)
15e1571b1fSWolfram Sang  * since we need to send the target address + RW bit in every case.
16310c18a4SWolfram Sang  *
17e1571b1fSWolfram Sang  * 2) TIE sends target address + RW bit and selects how to continue.
18310c18a4SWolfram Sang  *
19310c18a4SWolfram Sang  * 3a) Write case: We keep utilizing TIE as long as we have data to send. If we
20310c18a4SWolfram Sang  * are done, we switch over to the transmission done interrupt (TEIE) and mark
21310c18a4SWolfram Sang  * the message as completed (includes sending STOP) there.
22310c18a4SWolfram Sang  *
23310c18a4SWolfram Sang  * 3b) Read case: We switch over to receive interrupt (RIE). One dummy read is
24310c18a4SWolfram Sang  * needed to start clocking, then we keep receiving until we are done. Note
25310c18a4SWolfram Sang  * that we use the RDRFS mode all the time, i.e. we ACK/NACK every byte by
26310c18a4SWolfram Sang  * writing to the ACKBT bit. I tried using the RDRFS mode only at the end of a
27310c18a4SWolfram Sang  * message to create the final NACK as sketched in the datasheet. This caused
28310c18a4SWolfram Sang  * some subtle races (when byte n was processed and byte n+1 was already
29310c18a4SWolfram Sang  * waiting), though, and I started with the safe approach.
30310c18a4SWolfram Sang  *
31310c18a4SWolfram Sang  * 4) If we got a NACK somewhere, we flag the error and stop the transmission
32310c18a4SWolfram Sang  * via NAKIE.
33310c18a4SWolfram Sang  *
34310c18a4SWolfram Sang  * Also check the comments in the interrupt routines for some gory details.
35310c18a4SWolfram Sang  */
36310c18a4SWolfram Sang 
37310c18a4SWolfram Sang #include <linux/clk.h>
38310c18a4SWolfram Sang #include <linux/completion.h>
39310c18a4SWolfram Sang #include <linux/err.h>
40310c18a4SWolfram Sang #include <linux/i2c.h>
41310c18a4SWolfram Sang #include <linux/interrupt.h>
42310c18a4SWolfram Sang #include <linux/io.h>
43310c18a4SWolfram Sang #include <linux/module.h>
44310c18a4SWolfram Sang #include <linux/of.h>
45310c18a4SWolfram Sang #include <linux/platform_device.h>
46d303ce59SGeert Uytterhoeven #include <linux/pm_runtime.h>
47010e765bSBiju Das #include <linux/reset.h>
48310c18a4SWolfram Sang 
49310c18a4SWolfram Sang #define ICCR1_ICE	0x80
50310c18a4SWolfram Sang #define ICCR1_IICRST	0x40
51310c18a4SWolfram Sang #define ICCR1_SOWP	0x10
52310c18a4SWolfram Sang 
53310c18a4SWolfram Sang #define ICCR2_BBSY	0x80
54310c18a4SWolfram Sang #define ICCR2_SP	0x08
55310c18a4SWolfram Sang #define ICCR2_RS	0x04
56310c18a4SWolfram Sang #define ICCR2_ST	0x02
57310c18a4SWolfram Sang 
58310c18a4SWolfram Sang #define ICMR1_CKS_MASK	0x70
59310c18a4SWolfram Sang #define ICMR1_BCWP	0x08
60310c18a4SWolfram Sang #define ICMR1_CKS(_x)	((((_x) << 4) & ICMR1_CKS_MASK) | ICMR1_BCWP)
61310c18a4SWolfram Sang 
62310c18a4SWolfram Sang #define ICMR3_RDRFS	0x20
63310c18a4SWolfram Sang #define ICMR3_ACKWP	0x10
64310c18a4SWolfram Sang #define ICMR3_ACKBT	0x08
65310c18a4SWolfram Sang 
663e3c9beaSClaudiu Beznea #define ICFER_FMPE	0x80
673e3c9beaSClaudiu Beznea 
68310c18a4SWolfram Sang #define ICIER_TIE	0x80
69310c18a4SWolfram Sang #define ICIER_TEIE	0x40
70310c18a4SWolfram Sang #define ICIER_RIE	0x20
71310c18a4SWolfram Sang #define ICIER_NAKIE	0x10
7271ccea09SChris Brandt #define ICIER_SPIE	0x08
73310c18a4SWolfram Sang 
74310c18a4SWolfram Sang #define ICSR2_NACKF	0x10
75310c18a4SWolfram Sang 
76310c18a4SWolfram Sang #define ICBR_RESERVED	0xe0 /* Should be 1 on writes */
77310c18a4SWolfram Sang 
78310c18a4SWolfram Sang #define RIIC_INIT_MSG	-1
79310c18a4SWolfram Sang 
80748ee3b2SLad Prabhakar enum riic_reg_list {
81748ee3b2SLad Prabhakar 	RIIC_ICCR1 = 0,
82748ee3b2SLad Prabhakar 	RIIC_ICCR2,
83748ee3b2SLad Prabhakar 	RIIC_ICMR1,
84748ee3b2SLad Prabhakar 	RIIC_ICMR3,
853e3c9beaSClaudiu Beznea 	RIIC_ICFER,
86748ee3b2SLad Prabhakar 	RIIC_ICSER,
87748ee3b2SLad Prabhakar 	RIIC_ICIER,
88748ee3b2SLad Prabhakar 	RIIC_ICSR2,
89748ee3b2SLad Prabhakar 	RIIC_ICBRL,
90748ee3b2SLad Prabhakar 	RIIC_ICBRH,
91748ee3b2SLad Prabhakar 	RIIC_ICDRT,
92748ee3b2SLad Prabhakar 	RIIC_ICDRR,
93748ee3b2SLad Prabhakar 	RIIC_REG_END,
94748ee3b2SLad Prabhakar };
95748ee3b2SLad Prabhakar 
96748ee3b2SLad Prabhakar struct riic_of_data {
9788c5cf45SClaudiu Beznea 	const u8 *regs;
983e3c9beaSClaudiu Beznea 	bool fast_mode_plus;
99748ee3b2SLad Prabhakar };
100748ee3b2SLad Prabhakar 
101310c18a4SWolfram Sang struct riic_dev {
102310c18a4SWolfram Sang 	void __iomem *base;
103310c18a4SWolfram Sang 	u8 *buf;
104310c18a4SWolfram Sang 	struct i2c_msg *msg;
105310c18a4SWolfram Sang 	int bytes_left;
106310c18a4SWolfram Sang 	int err;
107310c18a4SWolfram Sang 	int is_last;
108748ee3b2SLad Prabhakar 	const struct riic_of_data *info;
109310c18a4SWolfram Sang 	struct completion msg_done;
110310c18a4SWolfram Sang 	struct i2c_adapter adapter;
111310c18a4SWolfram Sang 	struct clk *clk;
11253326135SClaudiu Beznea 	struct reset_control *rstc;
11353326135SClaudiu Beznea 	struct i2c_timings i2c_t;
114310c18a4SWolfram Sang };
115310c18a4SWolfram Sang 
116310c18a4SWolfram Sang struct riic_irq_desc {
117310c18a4SWolfram Sang 	int res_num;
118310c18a4SWolfram Sang 	irq_handler_t isr;
119310c18a4SWolfram Sang 	char *name;
120310c18a4SWolfram Sang };
121310c18a4SWolfram Sang 
12226c78711SLad Prabhakar static inline void riic_writeb(struct riic_dev *riic, u8 val, u8 offset)
12326c78711SLad Prabhakar {
124748ee3b2SLad Prabhakar 	writeb(val, riic->base + riic->info->regs[offset]);
12526c78711SLad Prabhakar }
12626c78711SLad Prabhakar 
12726c78711SLad Prabhakar static inline u8 riic_readb(struct riic_dev *riic, u8 offset)
12826c78711SLad Prabhakar {
129748ee3b2SLad Prabhakar 	return readb(riic->base + riic->info->regs[offset]);
13026c78711SLad Prabhakar }
13126c78711SLad Prabhakar 
132310c18a4SWolfram Sang static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u8 reg)
133310c18a4SWolfram Sang {
13426c78711SLad Prabhakar 	riic_writeb(riic, (riic_readb(riic, reg) & ~clear) | set, reg);
135310c18a4SWolfram Sang }
136310c18a4SWolfram Sang 
137310c18a4SWolfram Sang static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
138310c18a4SWolfram Sang {
139310c18a4SWolfram Sang 	struct riic_dev *riic = i2c_get_adapdata(adap);
140b42ed9fdSClaudiu Beznea 	struct device *dev = adap->dev.parent;
141310c18a4SWolfram Sang 	unsigned long time_left;
1423149a9cfSClaudiu Beznea 	int i, ret;
143310c18a4SWolfram Sang 	u8 start_bit;
144310c18a4SWolfram Sang 
1453149a9cfSClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
1463149a9cfSClaudiu Beznea 	if (ret)
1473149a9cfSClaudiu Beznea 		return ret;
148310c18a4SWolfram Sang 
14926c78711SLad Prabhakar 	if (riic_readb(riic, RIIC_ICCR2) & ICCR2_BBSY) {
150310c18a4SWolfram Sang 		riic->err = -EBUSY;
151310c18a4SWolfram Sang 		goto out;
152310c18a4SWolfram Sang 	}
153310c18a4SWolfram Sang 
154310c18a4SWolfram Sang 	reinit_completion(&riic->msg_done);
155310c18a4SWolfram Sang 	riic->err = 0;
156310c18a4SWolfram Sang 
15726c78711SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICSR2);
158310c18a4SWolfram Sang 
159310c18a4SWolfram Sang 	for (i = 0, start_bit = ICCR2_ST; i < num; i++) {
160310c18a4SWolfram Sang 		riic->bytes_left = RIIC_INIT_MSG;
161310c18a4SWolfram Sang 		riic->buf = msgs[i].buf;
162310c18a4SWolfram Sang 		riic->msg = &msgs[i];
163310c18a4SWolfram Sang 		riic->is_last = (i == num - 1);
164310c18a4SWolfram Sang 
16526c78711SLad Prabhakar 		riic_writeb(riic, ICIER_NAKIE | ICIER_TIE, RIIC_ICIER);
166310c18a4SWolfram Sang 
16726c78711SLad Prabhakar 		riic_writeb(riic, start_bit, RIIC_ICCR2);
168310c18a4SWolfram Sang 
169310c18a4SWolfram Sang 		time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout);
170310c18a4SWolfram Sang 		if (time_left == 0)
171310c18a4SWolfram Sang 			riic->err = -ETIMEDOUT;
172310c18a4SWolfram Sang 
173310c18a4SWolfram Sang 		if (riic->err)
174310c18a4SWolfram Sang 			break;
175310c18a4SWolfram Sang 
176310c18a4SWolfram Sang 		start_bit = ICCR2_RS;
177310c18a4SWolfram Sang 	}
178310c18a4SWolfram Sang 
179310c18a4SWolfram Sang  out:
18010d5c884SClaudiu Beznea 	pm_runtime_mark_last_busy(dev);
18110d5c884SClaudiu Beznea 	pm_runtime_put_autosuspend(dev);
182310c18a4SWolfram Sang 
183310c18a4SWolfram Sang 	return riic->err ?: num;
184310c18a4SWolfram Sang }
185310c18a4SWolfram Sang 
186310c18a4SWolfram Sang static irqreturn_t riic_tdre_isr(int irq, void *data)
187310c18a4SWolfram Sang {
188310c18a4SWolfram Sang 	struct riic_dev *riic = data;
189310c18a4SWolfram Sang 	u8 val;
190310c18a4SWolfram Sang 
191310c18a4SWolfram Sang 	if (!riic->bytes_left)
192310c18a4SWolfram Sang 		return IRQ_NONE;
193310c18a4SWolfram Sang 
194310c18a4SWolfram Sang 	if (riic->bytes_left == RIIC_INIT_MSG) {
19530a64757SPeter Rosin 		if (riic->msg->flags & I2C_M_RD)
196310c18a4SWolfram Sang 			/* On read, switch over to receive interrupt */
197310c18a4SWolfram Sang 			riic_clear_set_bit(riic, ICIER_TIE, ICIER_RIE, RIIC_ICIER);
198310c18a4SWolfram Sang 		else
199310c18a4SWolfram Sang 			/* On write, initialize length */
200310c18a4SWolfram Sang 			riic->bytes_left = riic->msg->len;
201310c18a4SWolfram Sang 
20230a64757SPeter Rosin 		val = i2c_8bit_addr_from_msg(riic->msg);
203310c18a4SWolfram Sang 	} else {
204310c18a4SWolfram Sang 		val = *riic->buf;
205310c18a4SWolfram Sang 		riic->buf++;
206310c18a4SWolfram Sang 		riic->bytes_left--;
207310c18a4SWolfram Sang 	}
208310c18a4SWolfram Sang 
209310c18a4SWolfram Sang 	/*
210310c18a4SWolfram Sang 	 * Switch to transmission ended interrupt when done. Do check here
211310c18a4SWolfram Sang 	 * after bytes_left was initialized to support SMBUS_QUICK (new msg has
212310c18a4SWolfram Sang 	 * 0 length then)
213310c18a4SWolfram Sang 	 */
214310c18a4SWolfram Sang 	if (riic->bytes_left == 0)
215310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICIER_TIE, ICIER_TEIE, RIIC_ICIER);
216310c18a4SWolfram Sang 
217310c18a4SWolfram Sang 	/*
218310c18a4SWolfram Sang 	 * This acks the TIE interrupt. We get another TIE immediately if our
219310c18a4SWolfram Sang 	 * value could be moved to the shadow shift register right away. So
220310c18a4SWolfram Sang 	 * this must be after updates to ICIER (where we want to disable TIE)!
221310c18a4SWolfram Sang 	 */
22226c78711SLad Prabhakar 	riic_writeb(riic, val, RIIC_ICDRT);
223310c18a4SWolfram Sang 
224310c18a4SWolfram Sang 	return IRQ_HANDLED;
225310c18a4SWolfram Sang }
226310c18a4SWolfram Sang 
227310c18a4SWolfram Sang static irqreturn_t riic_tend_isr(int irq, void *data)
228310c18a4SWolfram Sang {
229310c18a4SWolfram Sang 	struct riic_dev *riic = data;
230310c18a4SWolfram Sang 
23126c78711SLad Prabhakar 	if (riic_readb(riic, RIIC_ICSR2) & ICSR2_NACKF) {
232310c18a4SWolfram Sang 		/* We got a NACKIE */
23326c78711SLad Prabhakar 		riic_readb(riic, RIIC_ICDRR);	/* dummy read */
234a71e2ac1SChris Brandt 		riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2);
235310c18a4SWolfram Sang 		riic->err = -ENXIO;
236310c18a4SWolfram Sang 	} else if (riic->bytes_left) {
237310c18a4SWolfram Sang 		return IRQ_NONE;
238310c18a4SWolfram Sang 	}
239310c18a4SWolfram Sang 
24071ccea09SChris Brandt 	if (riic->is_last || riic->err) {
2412501c1bbSChris Brandt 		riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER);
24226c78711SLad Prabhakar 		riic_writeb(riic, ICCR2_SP, RIIC_ICCR2);
2432501c1bbSChris Brandt 	} else {
2442501c1bbSChris Brandt 		/* Transfer is complete, but do not send STOP */
2452501c1bbSChris Brandt 		riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER);
2462501c1bbSChris Brandt 		complete(&riic->msg_done);
24771ccea09SChris Brandt 	}
248310c18a4SWolfram Sang 
249310c18a4SWolfram Sang 	return IRQ_HANDLED;
250310c18a4SWolfram Sang }
251310c18a4SWolfram Sang 
252310c18a4SWolfram Sang static irqreturn_t riic_rdrf_isr(int irq, void *data)
253310c18a4SWolfram Sang {
254310c18a4SWolfram Sang 	struct riic_dev *riic = data;
255310c18a4SWolfram Sang 
256310c18a4SWolfram Sang 	if (!riic->bytes_left)
257310c18a4SWolfram Sang 		return IRQ_NONE;
258310c18a4SWolfram Sang 
259310c18a4SWolfram Sang 	if (riic->bytes_left == RIIC_INIT_MSG) {
260310c18a4SWolfram Sang 		riic->bytes_left = riic->msg->len;
26126c78711SLad Prabhakar 		riic_readb(riic, RIIC_ICDRR);	/* dummy read */
262310c18a4SWolfram Sang 		return IRQ_HANDLED;
263310c18a4SWolfram Sang 	}
264310c18a4SWolfram Sang 
265310c18a4SWolfram Sang 	if (riic->bytes_left == 1) {
266310c18a4SWolfram Sang 		/* STOP must come before we set ACKBT! */
26771ccea09SChris Brandt 		if (riic->is_last) {
26871ccea09SChris Brandt 			riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER);
26926c78711SLad Prabhakar 			riic_writeb(riic, ICCR2_SP, RIIC_ICCR2);
27071ccea09SChris Brandt 		}
271310c18a4SWolfram Sang 
272310c18a4SWolfram Sang 		riic_clear_set_bit(riic, 0, ICMR3_ACKBT, RIIC_ICMR3);
273310c18a4SWolfram Sang 
274310c18a4SWolfram Sang 	} else {
275310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICMR3_ACKBT, 0, RIIC_ICMR3);
276310c18a4SWolfram Sang 	}
277310c18a4SWolfram Sang 
278310c18a4SWolfram Sang 	/* Reading acks the RIE interrupt */
27926c78711SLad Prabhakar 	*riic->buf = riic_readb(riic, RIIC_ICDRR);
280310c18a4SWolfram Sang 	riic->buf++;
281310c18a4SWolfram Sang 	riic->bytes_left--;
282310c18a4SWolfram Sang 
283310c18a4SWolfram Sang 	return IRQ_HANDLED;
284310c18a4SWolfram Sang }
285310c18a4SWolfram Sang 
28671ccea09SChris Brandt static irqreturn_t riic_stop_isr(int irq, void *data)
28771ccea09SChris Brandt {
28871ccea09SChris Brandt 	struct riic_dev *riic = data;
28971ccea09SChris Brandt 
29071ccea09SChris Brandt 	/* read back registers to confirm writes have fully propagated */
29126c78711SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICSR2);
29226c78711SLad Prabhakar 	riic_readb(riic, RIIC_ICSR2);
29326c78711SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICIER);
29426c78711SLad Prabhakar 	riic_readb(riic, RIIC_ICIER);
29571ccea09SChris Brandt 
29671ccea09SChris Brandt 	complete(&riic->msg_done);
29771ccea09SChris Brandt 
29871ccea09SChris Brandt 	return IRQ_HANDLED;
29971ccea09SChris Brandt }
30071ccea09SChris Brandt 
301310c18a4SWolfram Sang static u32 riic_func(struct i2c_adapter *adap)
302310c18a4SWolfram Sang {
303310c18a4SWolfram Sang 	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
304310c18a4SWolfram Sang }
305310c18a4SWolfram Sang 
306310c18a4SWolfram Sang static const struct i2c_algorithm riic_algo = {
307e1571b1fSWolfram Sang 	.xfer = riic_xfer,
308310c18a4SWolfram Sang 	.functionality = riic_func,
309310c18a4SWolfram Sang };
310310c18a4SWolfram Sang 
31153326135SClaudiu Beznea static int riic_init_hw(struct riic_dev *riic)
312310c18a4SWolfram Sang {
3133149a9cfSClaudiu Beznea 	int ret;
314310c18a4SWolfram Sang 	unsigned long rate;
315d982d665SChris Brandt 	int total_ticks, cks, brl, brh;
31653326135SClaudiu Beznea 	struct i2c_timings *t = &riic->i2c_t;
317b42ed9fdSClaudiu Beznea 	struct device *dev = riic->adapter.dev.parent;
3183e3c9beaSClaudiu Beznea 	bool fast_mode_plus = riic->info->fast_mode_plus;
31971dacb25SGeert Uytterhoeven 	u32 max_freq = fast_mode_plus ? I2C_MAX_FAST_MODE_PLUS_FREQ
32071dacb25SGeert Uytterhoeven 				      : I2C_MAX_FAST_MODE_FREQ;
321310c18a4SWolfram Sang 
32271dacb25SGeert Uytterhoeven 	if (t->bus_freq_hz > max_freq)
323*279c83dbSLad Prabhakar 		return dev_err_probe(dev, -EINVAL,
32471dacb25SGeert Uytterhoeven 				     "unsupported bus speed %uHz (%u max)\n",
32571dacb25SGeert Uytterhoeven 				     t->bus_freq_hz, max_freq);
326310c18a4SWolfram Sang 
327d982d665SChris Brandt 	rate = clk_get_rate(riic->clk);
328d982d665SChris Brandt 
329d982d665SChris Brandt 	/*
330d982d665SChris Brandt 	 * Assume the default register settings:
331d982d665SChris Brandt 	 *  FER.SCLE = 1 (SCL sync circuit enabled, adds 2 or 3 cycles)
332d982d665SChris Brandt 	 *  FER.NFE = 1 (noise circuit enabled)
333d982d665SChris Brandt 	 *  MR3.NF = 0 (1 cycle of noise filtered out)
334d982d665SChris Brandt 	 *
335d982d665SChris Brandt 	 * Freq (CKS=000) = (I2CCLK + tr + tf)/ (BRH + 3 + 1) + (BRL + 3 + 1)
336d982d665SChris Brandt 	 * Freq (CKS!=000) = (I2CCLK + tr + tf)/ (BRH + 2 + 1) + (BRL + 2 + 1)
337d982d665SChris Brandt 	 */
338d982d665SChris Brandt 
339d982d665SChris Brandt 	/*
340d982d665SChris Brandt 	 * Determine reference clock rate. We must be able to get the desired
341d982d665SChris Brandt 	 * frequency with only 62 clock ticks max (31 high, 31 low).
342d982d665SChris Brandt 	 * Aim for a duty of 60% LOW, 40% HIGH.
343d982d665SChris Brandt 	 */
3447890fce6SWolfram Sang 	total_ticks = DIV_ROUND_UP(rate, t->bus_freq_hz ?: 1);
345d982d665SChris Brandt 
346d982d665SChris Brandt 	for (cks = 0; cks < 7; cks++) {
347d982d665SChris Brandt 		/*
348d982d665SChris Brandt 		 * 60% low time must be less than BRL + 2 + 1
349d982d665SChris Brandt 		 * BRL max register value is 0x1F.
350d982d665SChris Brandt 		 */
351d982d665SChris Brandt 		brl = ((total_ticks * 6) / 10);
352d982d665SChris Brandt 		if (brl <= (0x1F + 3))
353d982d665SChris Brandt 			break;
354d982d665SChris Brandt 
355de6b4379SGeert Uytterhoeven 		total_ticks = DIV_ROUND_UP(total_ticks, 2);
356d982d665SChris Brandt 		rate /= 2;
357d982d665SChris Brandt 	}
358d982d665SChris Brandt 
359e2aa2502SLad Prabhakar 	if (brl > (0x1F + 3))
360e2aa2502SLad Prabhakar 		return dev_err_probe(dev, -EINVAL, "invalid speed (%uHz). Too slow.\n",
361e2aa2502SLad Prabhakar 				     t->bus_freq_hz);
362d982d665SChris Brandt 
363d982d665SChris Brandt 	brh = total_ticks - brl;
364d982d665SChris Brandt 
365d982d665SChris Brandt 	/* Remove automatic clock ticks for sync circuit and NF */
366d982d665SChris Brandt 	if (cks == 0) {
367d982d665SChris Brandt 		brl -= 4;
368d982d665SChris Brandt 		brh -= 4;
369d982d665SChris Brandt 	} else {
370d982d665SChris Brandt 		brl -= 3;
371d982d665SChris Brandt 		brh -= 3;
372d982d665SChris Brandt 	}
373d982d665SChris Brandt 
374d982d665SChris Brandt 	/*
375d982d665SChris Brandt 	 * Remove clock ticks for rise and fall times. Convert ns to clock
376d982d665SChris Brandt 	 * ticks.
377d982d665SChris Brandt 	 */
378d982d665SChris Brandt 	brl -= t->scl_fall_ns / (1000000000 / rate);
379d982d665SChris Brandt 	brh -= t->scl_rise_ns / (1000000000 / rate);
380d982d665SChris Brandt 
381d982d665SChris Brandt 	/* Adjust for min register values for when SCLE=1 and NFE=1 */
382d982d665SChris Brandt 	if (brl < 1)
383d982d665SChris Brandt 		brl = 1;
384d982d665SChris Brandt 	if (brh < 1)
385d982d665SChris Brandt 		brh = 1;
386d982d665SChris Brandt 
387d982d665SChris Brandt 	pr_debug("i2c-riic: freq=%lu, duty=%d, fall=%lu, rise=%lu, cks=%d, brl=%d, brh=%d\n",
388d982d665SChris Brandt 		 rate / total_ticks, ((brl + 3) * 100) / (brl + brh + 6),
389d982d665SChris Brandt 		 t->scl_fall_ns / (1000000000 / rate),
390d982d665SChris Brandt 		 t->scl_rise_ns / (1000000000 / rate), cks, brl, brh);
391d982d665SChris Brandt 
3923149a9cfSClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
3933149a9cfSClaudiu Beznea 	if (ret)
3943149a9cfSClaudiu Beznea 		return ret;
395a1ecb041SClaudiu Beznea 
396310c18a4SWolfram Sang 	/* Changing the order of accessing IICRST and ICE may break things! */
39726c78711SLad Prabhakar 	riic_writeb(riic, ICCR1_IICRST | ICCR1_SOWP, RIIC_ICCR1);
398310c18a4SWolfram Sang 	riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
399310c18a4SWolfram Sang 
40026c78711SLad Prabhakar 	riic_writeb(riic, ICMR1_CKS(cks), RIIC_ICMR1);
40126c78711SLad Prabhakar 	riic_writeb(riic, brh | ICBR_RESERVED, RIIC_ICBRH);
40226c78711SLad Prabhakar 	riic_writeb(riic, brl | ICBR_RESERVED, RIIC_ICBRL);
403310c18a4SWolfram Sang 
40426c78711SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICSER);
40526c78711SLad Prabhakar 	riic_writeb(riic, ICMR3_ACKWP | ICMR3_RDRFS, RIIC_ICMR3);
406310c18a4SWolfram Sang 
4073e3c9beaSClaudiu Beznea 	if (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ)
4083e3c9beaSClaudiu Beznea 		riic_clear_set_bit(riic, 0, ICFER_FMPE, RIIC_ICFER);
4093e3c9beaSClaudiu Beznea 
410310c18a4SWolfram Sang 	riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
411310c18a4SWolfram Sang 
41210d5c884SClaudiu Beznea 	pm_runtime_mark_last_busy(dev);
41310d5c884SClaudiu Beznea 	pm_runtime_put_autosuspend(dev);
414a1ecb041SClaudiu Beznea 	return 0;
415310c18a4SWolfram Sang }
416310c18a4SWolfram Sang 
417310c18a4SWolfram Sang static struct riic_irq_desc riic_irqs[] = {
418310c18a4SWolfram Sang 	{ .res_num = 0, .isr = riic_tend_isr, .name = "riic-tend" },
419310c18a4SWolfram Sang 	{ .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rdrf" },
420310c18a4SWolfram Sang 	{ .res_num = 2, .isr = riic_tdre_isr, .name = "riic-tdre" },
42171ccea09SChris Brandt 	{ .res_num = 3, .isr = riic_stop_isr, .name = "riic-stop" },
422310c18a4SWolfram Sang 	{ .res_num = 5, .isr = riic_tend_isr, .name = "riic-nack" },
423310c18a4SWolfram Sang };
424310c18a4SWolfram Sang 
425da2e86c0SLad Prabhakar static void riic_reset_control_assert(void *data)
426da2e86c0SLad Prabhakar {
427da2e86c0SLad Prabhakar 	reset_control_assert(data);
428da2e86c0SLad Prabhakar }
429da2e86c0SLad Prabhakar 
430310c18a4SWolfram Sang static int riic_i2c_probe(struct platform_device *pdev)
431310c18a4SWolfram Sang {
432b42ed9fdSClaudiu Beznea 	struct device *dev = &pdev->dev;
433310c18a4SWolfram Sang 	struct riic_dev *riic;
434310c18a4SWolfram Sang 	struct i2c_adapter *adap;
435310c18a4SWolfram Sang 	int i, ret;
436310c18a4SWolfram Sang 
437b42ed9fdSClaudiu Beznea 	riic = devm_kzalloc(dev, sizeof(*riic), GFP_KERNEL);
438310c18a4SWolfram Sang 	if (!riic)
439310c18a4SWolfram Sang 		return -ENOMEM;
440310c18a4SWolfram Sang 
441e05e4708SLad Prabhakar 	riic->base = devm_platform_ioremap_resource(pdev, 0);
442310c18a4SWolfram Sang 	if (IS_ERR(riic->base))
443310c18a4SWolfram Sang 		return PTR_ERR(riic->base);
444310c18a4SWolfram Sang 
445b42ed9fdSClaudiu Beznea 	riic->clk = devm_clk_get(dev, NULL);
446e2aa2502SLad Prabhakar 	if (IS_ERR(riic->clk))
447e2aa2502SLad Prabhakar 		return dev_err_probe(dev, PTR_ERR(riic->clk),
448e2aa2502SLad Prabhakar 				     "missing controller clock");
449310c18a4SWolfram Sang 
45053326135SClaudiu Beznea 	riic->rstc = devm_reset_control_get_optional_exclusive(dev, NULL);
45153326135SClaudiu Beznea 	if (IS_ERR(riic->rstc))
45253326135SClaudiu Beznea 		return dev_err_probe(dev, PTR_ERR(riic->rstc),
453da2e86c0SLad Prabhakar 				     "Error: missing reset ctrl\n");
454010e765bSBiju Das 
45553326135SClaudiu Beznea 	ret = reset_control_deassert(riic->rstc);
456da2e86c0SLad Prabhakar 	if (ret)
457da2e86c0SLad Prabhakar 		return ret;
458da2e86c0SLad Prabhakar 
45953326135SClaudiu Beznea 	ret = devm_add_action_or_reset(dev, riic_reset_control_assert, riic->rstc);
460da2e86c0SLad Prabhakar 	if (ret)
461da2e86c0SLad Prabhakar 		return ret;
462010e765bSBiju Das 
463310c18a4SWolfram Sang 	for (i = 0; i < ARRAY_SIZE(riic_irqs); i++) {
46476dc1629SLad Prabhakar 		int irq;
465310c18a4SWolfram Sang 
46676dc1629SLad Prabhakar 		irq = platform_get_irq(pdev, riic_irqs[i].res_num);
46776dc1629SLad Prabhakar 		if (irq < 0)
46876dc1629SLad Prabhakar 			return irq;
46976dc1629SLad Prabhakar 
47076dc1629SLad Prabhakar 		ret = devm_request_irq(dev, irq, riic_irqs[i].isr,
471310c18a4SWolfram Sang 				       0, riic_irqs[i].name, riic);
472e2aa2502SLad Prabhakar 		if (ret)
473e2aa2502SLad Prabhakar 			return dev_err_probe(dev, ret, "failed to request irq %s\n",
474e2aa2502SLad Prabhakar 					     riic_irqs[i].name);
475310c18a4SWolfram Sang 	}
476310c18a4SWolfram Sang 
477b42ed9fdSClaudiu Beznea 	riic->info = of_device_get_match_data(dev);
478748ee3b2SLad Prabhakar 
479310c18a4SWolfram Sang 	adap = &riic->adapter;
480310c18a4SWolfram Sang 	i2c_set_adapdata(adap, riic);
481ea1558ceSWolfram Sang 	strscpy(adap->name, "Renesas RIIC adapter", sizeof(adap->name));
482310c18a4SWolfram Sang 	adap->owner = THIS_MODULE;
483310c18a4SWolfram Sang 	adap->algo = &riic_algo;
484b42ed9fdSClaudiu Beznea 	adap->dev.parent = dev;
485b42ed9fdSClaudiu Beznea 	adap->dev.of_node = dev->of_node;
486310c18a4SWolfram Sang 
487310c18a4SWolfram Sang 	init_completion(&riic->msg_done);
488310c18a4SWolfram Sang 
48953326135SClaudiu Beznea 	i2c_parse_fw_timings(dev, &riic->i2c_t, true);
490d982d665SChris Brandt 
49110d5c884SClaudiu Beznea 	/* Default 0 to save power. Can be overridden via sysfs for lower latency. */
49210d5c884SClaudiu Beznea 	pm_runtime_set_autosuspend_delay(dev, 0);
49310d5c884SClaudiu Beznea 	pm_runtime_use_autosuspend(dev);
494b42ed9fdSClaudiu Beznea 	pm_runtime_enable(dev);
495d303ce59SGeert Uytterhoeven 
49653326135SClaudiu Beznea 	ret = riic_init_hw(riic);
497310c18a4SWolfram Sang 	if (ret)
498d303ce59SGeert Uytterhoeven 		goto out;
499310c18a4SWolfram Sang 
500310c18a4SWolfram Sang 	ret = i2c_add_adapter(adap);
501ea734404SWolfram Sang 	if (ret)
502d303ce59SGeert Uytterhoeven 		goto out;
503310c18a4SWolfram Sang 
504310c18a4SWolfram Sang 	platform_set_drvdata(pdev, riic);
505310c18a4SWolfram Sang 
50653326135SClaudiu Beznea 	dev_info(dev, "registered with %dHz bus speed\n", riic->i2c_t.bus_freq_hz);
507310c18a4SWolfram Sang 	return 0;
508d303ce59SGeert Uytterhoeven 
509d303ce59SGeert Uytterhoeven out:
510b42ed9fdSClaudiu Beznea 	pm_runtime_disable(dev);
51110d5c884SClaudiu Beznea 	pm_runtime_dont_use_autosuspend(dev);
512d303ce59SGeert Uytterhoeven 	return ret;
513310c18a4SWolfram Sang }
514310c18a4SWolfram Sang 
515e190a0c3SUwe Kleine-König static void riic_i2c_remove(struct platform_device *pdev)
516310c18a4SWolfram Sang {
517310c18a4SWolfram Sang 	struct riic_dev *riic = platform_get_drvdata(pdev);
518b42ed9fdSClaudiu Beznea 	struct device *dev = &pdev->dev;
5193149a9cfSClaudiu Beznea 	int ret;
520310c18a4SWolfram Sang 
5213149a9cfSClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
5223149a9cfSClaudiu Beznea 	if (!ret) {
52326c78711SLad Prabhakar 		riic_writeb(riic, 0, RIIC_ICIER);
524b42ed9fdSClaudiu Beznea 		pm_runtime_put(dev);
5253149a9cfSClaudiu Beznea 	}
526310c18a4SWolfram Sang 	i2c_del_adapter(&riic->adapter);
527b42ed9fdSClaudiu Beznea 	pm_runtime_disable(dev);
52810d5c884SClaudiu Beznea 	pm_runtime_dont_use_autosuspend(dev);
529310c18a4SWolfram Sang }
530310c18a4SWolfram Sang 
53188c5cf45SClaudiu Beznea static const u8 riic_rz_a_regs[RIIC_REG_END] = {
532748ee3b2SLad Prabhakar 	[RIIC_ICCR1] = 0x00,
533748ee3b2SLad Prabhakar 	[RIIC_ICCR2] = 0x04,
534748ee3b2SLad Prabhakar 	[RIIC_ICMR1] = 0x08,
535748ee3b2SLad Prabhakar 	[RIIC_ICMR3] = 0x10,
5363e3c9beaSClaudiu Beznea 	[RIIC_ICFER] = 0x14,
537748ee3b2SLad Prabhakar 	[RIIC_ICSER] = 0x18,
538748ee3b2SLad Prabhakar 	[RIIC_ICIER] = 0x1c,
539748ee3b2SLad Prabhakar 	[RIIC_ICSR2] = 0x24,
540748ee3b2SLad Prabhakar 	[RIIC_ICBRL] = 0x34,
541748ee3b2SLad Prabhakar 	[RIIC_ICBRH] = 0x38,
542748ee3b2SLad Prabhakar 	[RIIC_ICDRT] = 0x3c,
543748ee3b2SLad Prabhakar 	[RIIC_ICDRR] = 0x40,
544748ee3b2SLad Prabhakar };
545748ee3b2SLad Prabhakar 
54688c5cf45SClaudiu Beznea static const struct riic_of_data riic_rz_a_info = {
54788c5cf45SClaudiu Beznea 	.regs = riic_rz_a_regs,
5483e3c9beaSClaudiu Beznea 	.fast_mode_plus = true,
5493e3c9beaSClaudiu Beznea };
5503e3c9beaSClaudiu Beznea 
5513e3c9beaSClaudiu Beznea static const struct riic_of_data riic_rz_a1h_info = {
5523e3c9beaSClaudiu Beznea 	.regs = riic_rz_a_regs,
55388c5cf45SClaudiu Beznea };
55488c5cf45SClaudiu Beznea 
55588c5cf45SClaudiu Beznea static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
556a45f95d7SLad Prabhakar 	[RIIC_ICCR1] = 0x00,
557a45f95d7SLad Prabhakar 	[RIIC_ICCR2] = 0x01,
558a45f95d7SLad Prabhakar 	[RIIC_ICMR1] = 0x02,
559a45f95d7SLad Prabhakar 	[RIIC_ICMR3] = 0x04,
5603e3c9beaSClaudiu Beznea 	[RIIC_ICFER] = 0x05,
561a45f95d7SLad Prabhakar 	[RIIC_ICSER] = 0x06,
562a45f95d7SLad Prabhakar 	[RIIC_ICIER] = 0x07,
563a45f95d7SLad Prabhakar 	[RIIC_ICSR2] = 0x09,
564a45f95d7SLad Prabhakar 	[RIIC_ICBRL] = 0x10,
565a45f95d7SLad Prabhakar 	[RIIC_ICBRH] = 0x11,
566a45f95d7SLad Prabhakar 	[RIIC_ICDRT] = 0x12,
567a45f95d7SLad Prabhakar 	[RIIC_ICDRR] = 0x13,
56888c5cf45SClaudiu Beznea };
56988c5cf45SClaudiu Beznea 
57088c5cf45SClaudiu Beznea static const struct riic_of_data riic_rz_v2h_info = {
57188c5cf45SClaudiu Beznea 	.regs = riic_rz_v2h_regs,
5723e3c9beaSClaudiu Beznea 	.fast_mode_plus = true,
573a45f95d7SLad Prabhakar };
574a45f95d7SLad Prabhakar 
57553326135SClaudiu Beznea static int riic_i2c_suspend(struct device *dev)
57653326135SClaudiu Beznea {
57753326135SClaudiu Beznea 	struct riic_dev *riic = dev_get_drvdata(dev);
57853326135SClaudiu Beznea 	int ret;
57953326135SClaudiu Beznea 
58053326135SClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
58153326135SClaudiu Beznea 	if (ret)
58253326135SClaudiu Beznea 		return ret;
58353326135SClaudiu Beznea 
58453326135SClaudiu Beznea 	i2c_mark_adapter_suspended(&riic->adapter);
58553326135SClaudiu Beznea 
58653326135SClaudiu Beznea 	/* Disable output on SDA, SCL pins. */
58753326135SClaudiu Beznea 	riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1);
58853326135SClaudiu Beznea 
58953326135SClaudiu Beznea 	pm_runtime_mark_last_busy(dev);
59053326135SClaudiu Beznea 	pm_runtime_put_sync(dev);
59153326135SClaudiu Beznea 
59253326135SClaudiu Beznea 	return reset_control_assert(riic->rstc);
59353326135SClaudiu Beznea }
59453326135SClaudiu Beznea 
59553326135SClaudiu Beznea static int riic_i2c_resume(struct device *dev)
59653326135SClaudiu Beznea {
59753326135SClaudiu Beznea 	struct riic_dev *riic = dev_get_drvdata(dev);
59853326135SClaudiu Beznea 	int ret;
59953326135SClaudiu Beznea 
60053326135SClaudiu Beznea 	ret = reset_control_deassert(riic->rstc);
60153326135SClaudiu Beznea 	if (ret)
60253326135SClaudiu Beznea 		return ret;
60353326135SClaudiu Beznea 
60453326135SClaudiu Beznea 	ret = riic_init_hw(riic);
60553326135SClaudiu Beznea 	if (ret) {
60653326135SClaudiu Beznea 		/*
60753326135SClaudiu Beznea 		 * In case this happens there is no way to recover from this
60853326135SClaudiu Beznea 		 * state. The driver will remain loaded. We want to avoid
60953326135SClaudiu Beznea 		 * keeping the reset line de-asserted for no reason.
61053326135SClaudiu Beznea 		 */
61153326135SClaudiu Beznea 		reset_control_assert(riic->rstc);
61253326135SClaudiu Beznea 		return ret;
61353326135SClaudiu Beznea 	}
61453326135SClaudiu Beznea 
61553326135SClaudiu Beznea 	i2c_mark_adapter_resumed(&riic->adapter);
61653326135SClaudiu Beznea 
61753326135SClaudiu Beznea 	return 0;
61853326135SClaudiu Beznea }
61953326135SClaudiu Beznea 
62053326135SClaudiu Beznea static const struct dev_pm_ops riic_i2c_pm_ops = {
62153326135SClaudiu Beznea 	SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend, riic_i2c_resume)
62253326135SClaudiu Beznea };
62353326135SClaudiu Beznea 
624eae45e5dSJingoo Han static const struct of_device_id riic_i2c_dt_ids[] = {
625748ee3b2SLad Prabhakar 	{ .compatible = "renesas,riic-rz", .data = &riic_rz_a_info },
6263e3c9beaSClaudiu Beznea 	{ .compatible = "renesas,riic-r7s72100", .data =  &riic_rz_a1h_info, },
627a45f95d7SLad Prabhakar 	{ .compatible = "renesas,riic-r9a09g057", .data = &riic_rz_v2h_info },
628310c18a4SWolfram Sang 	{ /* Sentinel */ },
629310c18a4SWolfram Sang };
630310c18a4SWolfram Sang 
631310c18a4SWolfram Sang static struct platform_driver riic_i2c_driver = {
632310c18a4SWolfram Sang 	.probe		= riic_i2c_probe,
63332a0a94aSUwe Kleine-König 	.remove		= riic_i2c_remove,
634310c18a4SWolfram Sang 	.driver		= {
635310c18a4SWolfram Sang 		.name	= "i2c-riic",
636310c18a4SWolfram Sang 		.of_match_table = riic_i2c_dt_ids,
63753326135SClaudiu Beznea 		.pm	= pm_ptr(&riic_i2c_pm_ops),
638310c18a4SWolfram Sang 	},
639310c18a4SWolfram Sang };
640310c18a4SWolfram Sang 
641310c18a4SWolfram Sang module_platform_driver(riic_i2c_driver);
642310c18a4SWolfram Sang 
643310c18a4SWolfram Sang MODULE_DESCRIPTION("Renesas RIIC adapter");
644310c18a4SWolfram Sang MODULE_AUTHOR("Wolfram Sang <wsa@sang-engineering.com>");
645310c18a4SWolfram Sang MODULE_LICENSE("GPL v2");
646310c18a4SWolfram Sang MODULE_DEVICE_TABLE(of, riic_i2c_dt_ids);
647