xref: /linux/drivers/i2c/busses/i2c-riic.c (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
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 
370094d6b7SLad Prabhakar #include <linux/bits.h>
38310c18a4SWolfram Sang #include <linux/clk.h>
39310c18a4SWolfram Sang #include <linux/completion.h>
40310c18a4SWolfram Sang #include <linux/err.h>
41310c18a4SWolfram Sang #include <linux/i2c.h>
42310c18a4SWolfram Sang #include <linux/interrupt.h>
43310c18a4SWolfram Sang #include <linux/io.h>
44b31addf2SLad Prabhakar #include <linux/iopoll.h>
45310c18a4SWolfram Sang #include <linux/module.h>
46310c18a4SWolfram Sang #include <linux/of.h>
47310c18a4SWolfram Sang #include <linux/platform_device.h>
48d303ce59SGeert Uytterhoeven #include <linux/pm_runtime.h>
49010e765bSBiju Das #include <linux/reset.h>
50385bb1c2SLad Prabhakar #include <linux/time.h>
51310c18a4SWolfram Sang 
520094d6b7SLad Prabhakar #define ICCR1_ICE	BIT(7)
530094d6b7SLad Prabhakar #define ICCR1_IICRST	BIT(6)
540094d6b7SLad Prabhakar #define ICCR1_SOWP	BIT(4)
55*ba9e1b52SLad Prabhakar #define ICCR1_SCLO	BIT(3)
56*ba9e1b52SLad Prabhakar #define ICCR1_SDAO	BIT(2)
57b31addf2SLad Prabhakar #define ICCR1_SCLI	BIT(1)
58b31addf2SLad Prabhakar #define ICCR1_SDAI	BIT(0)
59310c18a4SWolfram Sang 
600094d6b7SLad Prabhakar #define ICCR2_BBSY	BIT(7)
610094d6b7SLad Prabhakar #define ICCR2_SP	BIT(3)
620094d6b7SLad Prabhakar #define ICCR2_RS	BIT(2)
630094d6b7SLad Prabhakar #define ICCR2_ST	BIT(1)
64310c18a4SWolfram Sang 
6572252162SLad Prabhakar #define ICMR1_CKS_MASK	GENMASK(6, 4)
660094d6b7SLad Prabhakar #define ICMR1_BCWP	BIT(3)
67310c18a4SWolfram Sang #define ICMR1_CKS(_x)	((((_x) << 4) & ICMR1_CKS_MASK) | ICMR1_BCWP)
68310c18a4SWolfram Sang 
690094d6b7SLad Prabhakar #define ICMR3_RDRFS	BIT(5)
700094d6b7SLad Prabhakar #define ICMR3_ACKWP	BIT(4)
710094d6b7SLad Prabhakar #define ICMR3_ACKBT	BIT(3)
72310c18a4SWolfram Sang 
730094d6b7SLad Prabhakar #define ICFER_FMPE	BIT(7)
743e3c9beaSClaudiu Beznea 
750094d6b7SLad Prabhakar #define ICIER_TIE	BIT(7)
760094d6b7SLad Prabhakar #define ICIER_TEIE	BIT(6)
770094d6b7SLad Prabhakar #define ICIER_RIE	BIT(5)
780094d6b7SLad Prabhakar #define ICIER_NAKIE	BIT(4)
790094d6b7SLad Prabhakar #define ICIER_SPIE	BIT(3)
80310c18a4SWolfram Sang 
810094d6b7SLad Prabhakar #define ICSR2_NACKF	BIT(4)
82310c18a4SWolfram Sang #define ICSR2_STOP	BIT(3)
8372252162SLad Prabhakar 
84310c18a4SWolfram Sang #define ICBR_RESERVED	GENMASK(7, 5) /* Should be 1 on writes */
85310c18a4SWolfram Sang 
86310c18a4SWolfram Sang #define RIIC_INIT_MSG	-1
87748ee3b2SLad Prabhakar 
88748ee3b2SLad Prabhakar enum riic_reg_list {
89748ee3b2SLad Prabhakar 	RIIC_ICCR1 = 0,
90748ee3b2SLad Prabhakar 	RIIC_ICCR2,
91748ee3b2SLad Prabhakar 	RIIC_ICMR1,
923e3c9beaSClaudiu Beznea 	RIIC_ICMR3,
93748ee3b2SLad Prabhakar 	RIIC_ICFER,
94748ee3b2SLad Prabhakar 	RIIC_ICSER,
95748ee3b2SLad Prabhakar 	RIIC_ICIER,
96748ee3b2SLad Prabhakar 	RIIC_ICSR2,
97748ee3b2SLad Prabhakar 	RIIC_ICBRL,
98748ee3b2SLad Prabhakar 	RIIC_ICBRH,
99748ee3b2SLad Prabhakar 	RIIC_ICDRT,
100748ee3b2SLad Prabhakar 	RIIC_ICDRR,
101748ee3b2SLad Prabhakar 	RIIC_REG_END,
102748ee3b2SLad Prabhakar };
103748ee3b2SLad Prabhakar 
10488c5cf45SClaudiu Beznea struct riic_of_data {
1053e3c9beaSClaudiu Beznea 	const u8 *regs;
106748ee3b2SLad Prabhakar 	const struct riic_irq_desc *irqs;
107748ee3b2SLad Prabhakar 	u8 num_irqs;
108310c18a4SWolfram Sang 	bool fast_mode_plus;
109310c18a4SWolfram Sang };
110310c18a4SWolfram Sang 
111310c18a4SWolfram Sang struct riic_dev {
112310c18a4SWolfram Sang 	void __iomem *base;
113310c18a4SWolfram Sang 	u8 *buf;
114310c18a4SWolfram Sang 	struct i2c_msg *msg;
115748ee3b2SLad Prabhakar 	int bytes_left;
116310c18a4SWolfram Sang 	int err;
117310c18a4SWolfram Sang 	int is_last;
118310c18a4SWolfram Sang 	const struct riic_of_data *info;
11953326135SClaudiu Beznea 	struct completion msg_done;
12053326135SClaudiu Beznea 	struct i2c_adapter adapter;
121310c18a4SWolfram Sang 	struct clk *clk;
122310c18a4SWolfram Sang 	struct reset_control *rstc;
123310c18a4SWolfram Sang 	struct i2c_timings i2c_t;
124310c18a4SWolfram Sang };
125310c18a4SWolfram Sang 
126310c18a4SWolfram Sang struct riic_irq_desc {
127310c18a4SWolfram Sang 	int res_num;
128310c18a4SWolfram Sang 	irq_handler_t isr;
12926c78711SLad Prabhakar 	char *name;
13026c78711SLad Prabhakar };
131748ee3b2SLad Prabhakar 
riic_writeb(struct riic_dev * riic,u8 val,u8 offset)13226c78711SLad Prabhakar static inline void riic_writeb(struct riic_dev *riic, u8 val, u8 offset)
13326c78711SLad Prabhakar {
13426c78711SLad Prabhakar 	writeb(val, riic->base + riic->info->regs[offset]);
13526c78711SLad Prabhakar }
136748ee3b2SLad Prabhakar 
riic_readb(struct riic_dev * riic,u8 offset)13726c78711SLad Prabhakar static inline u8 riic_readb(struct riic_dev *riic, u8 offset)
13826c78711SLad Prabhakar {
139310c18a4SWolfram Sang 	return readb(riic->base + riic->info->regs[offset]);
140310c18a4SWolfram Sang }
14126c78711SLad Prabhakar 
riic_clear_set_bit(struct riic_dev * riic,u8 clear,u8 set,u8 reg)142310c18a4SWolfram Sang static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u8 reg)
143310c18a4SWolfram Sang {
144b31addf2SLad Prabhakar 	riic_writeb(riic, (riic_readb(riic, reg) & ~clear) | set, reg);
145b31addf2SLad Prabhakar }
146b31addf2SLad Prabhakar 
riic_bus_barrier(struct riic_dev * riic)147b31addf2SLad Prabhakar static int riic_bus_barrier(struct riic_dev *riic)
148b31addf2SLad Prabhakar {
149b31addf2SLad Prabhakar 	int ret;
150b31addf2SLad Prabhakar 	u8 val;
151b31addf2SLad Prabhakar 
152b31addf2SLad Prabhakar 	/*
153b31addf2SLad Prabhakar 	 * The SDA line can still be low even when BBSY = 0. Therefore, after checking
154b31addf2SLad Prabhakar 	 * the BBSY flag, also verify that the SDA and SCL lines are not being held low.
155b31addf2SLad Prabhakar 	 */
156*ba9e1b52SLad Prabhakar 	ret = readb_poll_timeout(riic->base + riic->info->regs[RIIC_ICCR2], val,
157b31addf2SLad Prabhakar 				 !(val & ICCR2_BBSY), 10, riic->adapter.timeout);
158b31addf2SLad Prabhakar 	if (ret)
159b31addf2SLad Prabhakar 		return i2c_recover_bus(&riic->adapter);
160*ba9e1b52SLad Prabhakar 
161b31addf2SLad Prabhakar 	if ((riic_readb(riic, RIIC_ICCR1) & (ICCR1_SDAI | ICCR1_SCLI)) !=
162b31addf2SLad Prabhakar 	     (ICCR1_SDAI | ICCR1_SCLI))
163b31addf2SLad Prabhakar 		return i2c_recover_bus(&riic->adapter);
164b31addf2SLad Prabhakar 
165310c18a4SWolfram Sang 	return 0;
166310c18a4SWolfram Sang }
167310c18a4SWolfram Sang 
riic_xfer(struct i2c_adapter * adap,struct i2c_msg msgs[],int num)168b42ed9fdSClaudiu Beznea static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
169310c18a4SWolfram Sang {
1703149a9cfSClaudiu Beznea 	struct riic_dev *riic = i2c_get_adapdata(adap);
171310c18a4SWolfram Sang 	struct device *dev = adap->dev.parent;
172310c18a4SWolfram Sang 	unsigned long time_left;
1733149a9cfSClaudiu Beznea 	int i, ret;
1743149a9cfSClaudiu Beznea 	u8 start_bit;
1753149a9cfSClaudiu Beznea 
176310c18a4SWolfram Sang 	ret = pm_runtime_resume_and_get(dev);
177b31addf2SLad Prabhakar 	if (ret)
178b31addf2SLad Prabhakar 		return ret;
179310c18a4SWolfram Sang 
180310c18a4SWolfram Sang 	riic->err = riic_bus_barrier(riic);
181310c18a4SWolfram Sang 	if (riic->err)
182310c18a4SWolfram Sang 		goto out;
18326c78711SLad Prabhakar 
184310c18a4SWolfram Sang 	reinit_completion(&riic->msg_done);
185310c18a4SWolfram Sang 
186310c18a4SWolfram Sang 	riic_writeb(riic, 0, RIIC_ICSR2);
187310c18a4SWolfram Sang 
188310c18a4SWolfram Sang 	for (i = 0, start_bit = ICCR2_ST; i < num; i++) {
189310c18a4SWolfram Sang 		riic->bytes_left = RIIC_INIT_MSG;
190310c18a4SWolfram Sang 		riic->buf = msgs[i].buf;
19126c78711SLad Prabhakar 		riic->msg = &msgs[i];
192310c18a4SWolfram Sang 		riic->is_last = (i == num - 1);
19326c78711SLad Prabhakar 
194310c18a4SWolfram Sang 		riic_writeb(riic, ICIER_NAKIE | ICIER_TIE, RIIC_ICIER);
195310c18a4SWolfram Sang 
196310c18a4SWolfram Sang 		riic_writeb(riic, start_bit, RIIC_ICCR2);
197310c18a4SWolfram Sang 
198310c18a4SWolfram Sang 		time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout);
199310c18a4SWolfram Sang 		if (time_left == 0)
200310c18a4SWolfram Sang 			riic->err = -ETIMEDOUT;
201310c18a4SWolfram Sang 
202310c18a4SWolfram Sang 		if (riic->err)
203310c18a4SWolfram Sang 			break;
204310c18a4SWolfram Sang 
205310c18a4SWolfram Sang 		start_bit = ICCR2_RS;
20610d5c884SClaudiu Beznea 	}
20710d5c884SClaudiu Beznea 
208310c18a4SWolfram Sang  out:
209310c18a4SWolfram Sang 	pm_runtime_mark_last_busy(dev);
210310c18a4SWolfram Sang 	pm_runtime_put_autosuspend(dev);
211310c18a4SWolfram Sang 
212310c18a4SWolfram Sang 	return riic->err ?: num;
213310c18a4SWolfram Sang }
214310c18a4SWolfram Sang 
riic_tdre_isr(int irq,void * data)215310c18a4SWolfram Sang static irqreturn_t riic_tdre_isr(int irq, void *data)
216310c18a4SWolfram Sang {
217310c18a4SWolfram Sang 	struct riic_dev *riic = data;
218310c18a4SWolfram Sang 	u8 val;
219310c18a4SWolfram Sang 
220310c18a4SWolfram Sang 	if (!riic->bytes_left)
22130a64757SPeter Rosin 		return IRQ_NONE;
222310c18a4SWolfram Sang 
223310c18a4SWolfram Sang 	if (riic->bytes_left == RIIC_INIT_MSG) {
224310c18a4SWolfram Sang 		if (riic->msg->flags & I2C_M_RD)
225310c18a4SWolfram Sang 			/* On read, switch over to receive interrupt */
226310c18a4SWolfram Sang 			riic_clear_set_bit(riic, ICIER_TIE, ICIER_RIE, RIIC_ICIER);
227310c18a4SWolfram Sang 		else
22830a64757SPeter Rosin 			/* On write, initialize length */
229310c18a4SWolfram Sang 			riic->bytes_left = riic->msg->len;
230310c18a4SWolfram Sang 
231310c18a4SWolfram Sang 		val = i2c_8bit_addr_from_msg(riic->msg);
232310c18a4SWolfram Sang 	} else {
233310c18a4SWolfram Sang 		val = *riic->buf;
234310c18a4SWolfram Sang 		riic->buf++;
235310c18a4SWolfram Sang 		riic->bytes_left--;
236310c18a4SWolfram Sang 	}
237310c18a4SWolfram Sang 
238310c18a4SWolfram Sang 	/*
239310c18a4SWolfram Sang 	 * Switch to transmission ended interrupt when done. Do check here
240310c18a4SWolfram Sang 	 * after bytes_left was initialized to support SMBUS_QUICK (new msg has
241310c18a4SWolfram Sang 	 * 0 length then)
242310c18a4SWolfram Sang 	 */
243310c18a4SWolfram Sang 	if (riic->bytes_left == 0)
244310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICIER_TIE, ICIER_TEIE, RIIC_ICIER);
245310c18a4SWolfram Sang 
246310c18a4SWolfram Sang 	/*
247310c18a4SWolfram Sang 	 * This acks the TIE interrupt. We get another TIE immediately if our
24826c78711SLad Prabhakar 	 * value could be moved to the shadow shift register right away. So
249310c18a4SWolfram Sang 	 * this must be after updates to ICIER (where we want to disable TIE)!
250310c18a4SWolfram Sang 	 */
251310c18a4SWolfram Sang 	riic_writeb(riic, val, RIIC_ICDRT);
252310c18a4SWolfram Sang 
253310c18a4SWolfram Sang 	return IRQ_HANDLED;
254310c18a4SWolfram Sang }
255310c18a4SWolfram Sang 
riic_tend_isr(int irq,void * data)256310c18a4SWolfram Sang static irqreturn_t riic_tend_isr(int irq, void *data)
25726c78711SLad Prabhakar {
258310c18a4SWolfram Sang 	struct riic_dev *riic = data;
25926c78711SLad Prabhakar 
260a71e2ac1SChris Brandt 	if (riic_readb(riic, RIIC_ICSR2) & ICSR2_NACKF) {
261310c18a4SWolfram Sang 		/* We got a NACKIE */
262310c18a4SWolfram Sang 		riic_readb(riic, RIIC_ICDRR);	/* dummy read */
263310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2);
264310c18a4SWolfram Sang 		riic->err = -ENXIO;
265310c18a4SWolfram Sang 	} else if (riic->bytes_left) {
26671ccea09SChris Brandt 		return IRQ_NONE;
2672501c1bbSChris Brandt 	}
26826c78711SLad Prabhakar 
2692501c1bbSChris Brandt 	if (riic->is_last || riic->err) {
2702501c1bbSChris Brandt 		riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER);
2712501c1bbSChris Brandt 		riic_writeb(riic, ICCR2_SP, RIIC_ICCR2);
2722501c1bbSChris Brandt 	} else {
27371ccea09SChris Brandt 		/* Transfer is complete, but do not send STOP */
274310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER);
275310c18a4SWolfram Sang 		complete(&riic->msg_done);
276310c18a4SWolfram Sang 	}
277310c18a4SWolfram Sang 
278310c18a4SWolfram Sang 	return IRQ_HANDLED;
279310c18a4SWolfram Sang }
280310c18a4SWolfram Sang 
riic_rdrf_isr(int irq,void * data)281310c18a4SWolfram Sang static irqreturn_t riic_rdrf_isr(int irq, void *data)
282310c18a4SWolfram Sang {
283310c18a4SWolfram Sang 	struct riic_dev *riic = data;
284310c18a4SWolfram Sang 
285310c18a4SWolfram Sang 	if (!riic->bytes_left)
286310c18a4SWolfram Sang 		return IRQ_NONE;
28726c78711SLad Prabhakar 
288310c18a4SWolfram Sang 	if (riic->bytes_left == RIIC_INIT_MSG) {
289310c18a4SWolfram Sang 		riic->bytes_left = riic->msg->len;
290310c18a4SWolfram Sang 		riic_readb(riic, RIIC_ICDRR);	/* dummy read */
291310c18a4SWolfram Sang 		return IRQ_HANDLED;
292310c18a4SWolfram Sang 	}
29371ccea09SChris Brandt 
29471ccea09SChris Brandt 	if (riic->bytes_left == 1) {
29526c78711SLad Prabhakar 		/* STOP must come before we set ACKBT! */
29671ccea09SChris Brandt 		if (riic->is_last) {
297310c18a4SWolfram Sang 			riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER);
298310c18a4SWolfram Sang 			riic_writeb(riic, ICCR2_SP, RIIC_ICCR2);
299310c18a4SWolfram Sang 		}
300310c18a4SWolfram Sang 
301310c18a4SWolfram Sang 		riic_clear_set_bit(riic, 0, ICMR3_ACKBT, RIIC_ICMR3);
302310c18a4SWolfram Sang 
303310c18a4SWolfram Sang 	} else {
304310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICMR3_ACKBT, 0, RIIC_ICMR3);
30526c78711SLad Prabhakar 	}
306310c18a4SWolfram Sang 
307310c18a4SWolfram Sang 	/* Reading acks the RIE interrupt */
308310c18a4SWolfram Sang 	*riic->buf = riic_readb(riic, RIIC_ICDRR);
309310c18a4SWolfram Sang 	riic->buf++;
310310c18a4SWolfram Sang 	riic->bytes_left--;
311310c18a4SWolfram Sang 
31271ccea09SChris Brandt 	return IRQ_HANDLED;
31371ccea09SChris Brandt }
31471ccea09SChris Brandt 
riic_stop_isr(int irq,void * data)31571ccea09SChris Brandt static irqreturn_t riic_stop_isr(int irq, void *data)
31671ccea09SChris Brandt {
31726c78711SLad Prabhakar 	struct riic_dev *riic = data;
31826c78711SLad Prabhakar 
31926c78711SLad Prabhakar 	/* read back registers to confirm writes have fully propagated */
32026c78711SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICSR2);
32171ccea09SChris Brandt 	riic_readb(riic, RIIC_ICSR2);
32271ccea09SChris Brandt 	riic_writeb(riic, 0, RIIC_ICIER);
32371ccea09SChris Brandt 	riic_readb(riic, RIIC_ICIER);
32471ccea09SChris Brandt 
32571ccea09SChris Brandt 	complete(&riic->msg_done);
32671ccea09SChris Brandt 
327310c18a4SWolfram Sang 	return IRQ_HANDLED;
328310c18a4SWolfram Sang }
329310c18a4SWolfram Sang 
riic_eei_isr(int irq,void * data)330310c18a4SWolfram Sang static irqreturn_t riic_eei_isr(int irq, void *data)
331310c18a4SWolfram Sang {
332310c18a4SWolfram Sang 	u8 icsr2 = riic_readb(data, RIIC_ICSR2);
333e1571b1fSWolfram Sang 
334310c18a4SWolfram Sang 	if (icsr2 & ICSR2_NACKF)
335310c18a4SWolfram Sang 		return riic_tend_isr(irq, data);
336310c18a4SWolfram Sang 
33753326135SClaudiu Beznea 	if (icsr2 & ICSR2_STOP)
338310c18a4SWolfram Sang 		return riic_stop_isr(irq, data);
3393149a9cfSClaudiu Beznea 
340310c18a4SWolfram Sang 	return IRQ_NONE;
341385bb1c2SLad Prabhakar }
342d982d665SChris Brandt 
riic_func(struct i2c_adapter * adap)34353326135SClaudiu Beznea static u32 riic_func(struct i2c_adapter *adap)
344b42ed9fdSClaudiu Beznea {
3453e3c9beaSClaudiu Beznea 	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
34671dacb25SGeert Uytterhoeven }
34771dacb25SGeert Uytterhoeven 
348310c18a4SWolfram Sang static const struct i2c_algorithm riic_algo = {
34971dacb25SGeert Uytterhoeven 	.xfer = riic_xfer,
350279c83dbSLad Prabhakar 	.functionality = riic_func,
35171dacb25SGeert Uytterhoeven };
35271dacb25SGeert Uytterhoeven 
riic_init_hw(struct riic_dev * riic)353310c18a4SWolfram Sang static int riic_init_hw(struct riic_dev *riic)
354d982d665SChris Brandt {
355d982d665SChris Brandt 	int ret;
356d982d665SChris Brandt 	unsigned long rate;
357d982d665SChris Brandt 	unsigned long ns_per_tick;
358d982d665SChris Brandt 	int total_ticks, cks, brl, brh;
359d982d665SChris Brandt 	struct i2c_timings *t = &riic->i2c_t;
360d982d665SChris Brandt 	struct device *dev = riic->adapter.dev.parent;
361d982d665SChris Brandt 	bool fast_mode_plus = riic->info->fast_mode_plus;
362d982d665SChris Brandt 	u32 max_freq = fast_mode_plus ? I2C_MAX_FAST_MODE_PLUS_FREQ
363d982d665SChris Brandt 				      : I2C_MAX_FAST_MODE_FREQ;
364d982d665SChris Brandt 
365d982d665SChris Brandt 	if (t->bus_freq_hz > max_freq)
366d982d665SChris Brandt 		return dev_err_probe(dev, -EINVAL,
367d982d665SChris Brandt 				     "unsupported bus speed %uHz (%u max)\n",
368d982d665SChris Brandt 				     t->bus_freq_hz, max_freq);
369d982d665SChris Brandt 
370d982d665SChris Brandt 	rate = clk_get_rate(riic->clk);
3717890fce6SWolfram Sang 
372d982d665SChris Brandt 	/*
373d982d665SChris Brandt 	 * Assume the default register settings:
374d982d665SChris Brandt 	 *  FER.SCLE = 1 (SCL sync circuit enabled, adds 2 or 3 cycles)
375d982d665SChris Brandt 	 *  FER.NFE = 1 (noise circuit enabled)
376d982d665SChris Brandt 	 *  MR3.NF = 0 (1 cycle of noise filtered out)
377d982d665SChris Brandt 	 *
378d982d665SChris Brandt 	 * Freq (CKS=000) = (I2CCLK + tr + tf)/ (BRH + 3 + 1) + (BRL + 3 + 1)
379d982d665SChris Brandt 	 * Freq (CKS!=000) = (I2CCLK + tr + tf)/ (BRH + 2 + 1) + (BRL + 2 + 1)
380d982d665SChris Brandt 	 */
381d982d665SChris Brandt 
382de6b4379SGeert Uytterhoeven 	/*
383d982d665SChris Brandt 	 * Determine reference clock rate. We must be able to get the desired
384d982d665SChris Brandt 	 * frequency with only 62 clock ticks max (31 high, 31 low).
385d982d665SChris Brandt 	 * Aim for a duty of 60% LOW, 40% HIGH.
386e2aa2502SLad Prabhakar 	 */
387e2aa2502SLad Prabhakar 	total_ticks = DIV_ROUND_UP(rate, t->bus_freq_hz ?: 1);
388e2aa2502SLad Prabhakar 
389d982d665SChris Brandt 	for (cks = 0; cks < 7; cks++) {
390d982d665SChris Brandt 		/*
391d982d665SChris Brandt 		 * 60% low time must be less than BRL + 2 + 1
392d982d665SChris Brandt 		 * BRL max register value is 0x1F.
393d982d665SChris Brandt 		 */
394d982d665SChris Brandt 		brl = ((total_ticks * 6) / 10);
395d982d665SChris Brandt 		if (brl <= (0x1F + 3))
396d982d665SChris Brandt 			break;
397d982d665SChris Brandt 
398d982d665SChris Brandt 		total_ticks = DIV_ROUND_UP(total_ticks, 2);
399d982d665SChris Brandt 		rate /= 2;
400d982d665SChris Brandt 	}
401d982d665SChris Brandt 
402d982d665SChris Brandt 	if (brl > (0x1F + 3))
403d982d665SChris Brandt 		return dev_err_probe(dev, -EINVAL, "invalid speed (%uHz). Too slow.\n",
404d982d665SChris Brandt 				     t->bus_freq_hz);
405385bb1c2SLad Prabhakar 
406385bb1c2SLad Prabhakar 	brh = total_ticks - brl;
407385bb1c2SLad Prabhakar 
408d982d665SChris Brandt 	/* Remove automatic clock ticks for sync circuit and NF */
409d982d665SChris Brandt 	if (cks == 0) {
410d982d665SChris Brandt 		brl -= 4;
411d982d665SChris Brandt 		brh -= 4;
412d982d665SChris Brandt 	} else {
413d982d665SChris Brandt 		brl -= 3;
414d982d665SChris Brandt 		brh -= 3;
415d982d665SChris Brandt 	}
416d982d665SChris Brandt 
417385bb1c2SLad Prabhakar 	/*
418d982d665SChris Brandt 	 * Remove clock ticks for rise and fall times. Convert ns to clock
4193149a9cfSClaudiu Beznea 	 * ticks.
4203149a9cfSClaudiu Beznea 	 */
4213149a9cfSClaudiu Beznea 	ns_per_tick = NSEC_PER_SEC / rate;
422a1ecb041SClaudiu Beznea 	brl -= t->scl_fall_ns / ns_per_tick;
423310c18a4SWolfram Sang 	brh -= t->scl_rise_ns / ns_per_tick;
42426c78711SLad Prabhakar 
425310c18a4SWolfram Sang 	/* Adjust for min register values for when SCLE=1 and NFE=1 */
426310c18a4SWolfram Sang 	if (brl < 1)
42726c78711SLad Prabhakar 		brl = 1;
42826c78711SLad Prabhakar 	if (brh < 1)
42926c78711SLad Prabhakar 		brh = 1;
430310c18a4SWolfram Sang 
43126c78711SLad Prabhakar 	pr_debug("i2c-riic: freq=%lu, duty=%d, fall=%lu, rise=%lu, cks=%d, brl=%d, brh=%d\n",
43226c78711SLad Prabhakar 		 rate / total_ticks, ((brl + 3) * 100) / (brl + brh + 6),
433310c18a4SWolfram Sang 		 t->scl_fall_ns / ns_per_tick, t->scl_rise_ns / ns_per_tick, cks, brl, brh);
4343e3c9beaSClaudiu Beznea 
4353e3c9beaSClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
4363e3c9beaSClaudiu Beznea 	if (ret)
437310c18a4SWolfram Sang 		return ret;
438310c18a4SWolfram Sang 
43910d5c884SClaudiu Beznea 	/* Changing the order of accessing IICRST and ICE may break things! */
44010d5c884SClaudiu Beznea 	riic_writeb(riic, ICCR1_IICRST | ICCR1_SOWP, RIIC_ICCR1);
441a1ecb041SClaudiu Beznea 	riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
442310c18a4SWolfram Sang 
443310c18a4SWolfram Sang 	riic_writeb(riic, ICMR1_CKS(cks), RIIC_ICMR1);
444*ba9e1b52SLad Prabhakar 	riic_writeb(riic, brh | ICBR_RESERVED, RIIC_ICBRH);
445*ba9e1b52SLad Prabhakar 	riic_writeb(riic, brl | ICBR_RESERVED, RIIC_ICBRL);
446*ba9e1b52SLad Prabhakar 
447*ba9e1b52SLad Prabhakar 	riic_writeb(riic, 0, RIIC_ICSER);
448*ba9e1b52SLad Prabhakar 	riic_writeb(riic, ICMR3_ACKWP | ICMR3_RDRFS, RIIC_ICMR3);
449*ba9e1b52SLad Prabhakar 
450*ba9e1b52SLad Prabhakar 	if (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ)
451*ba9e1b52SLad Prabhakar 		riic_clear_set_bit(riic, 0, ICFER_FMPE, RIIC_ICFER);
452*ba9e1b52SLad Prabhakar 
453*ba9e1b52SLad Prabhakar 	riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
454*ba9e1b52SLad Prabhakar 
455*ba9e1b52SLad Prabhakar 	pm_runtime_mark_last_busy(dev);
456*ba9e1b52SLad Prabhakar 	pm_runtime_put_autosuspend(dev);
457*ba9e1b52SLad Prabhakar 	return 0;
458*ba9e1b52SLad Prabhakar }
459*ba9e1b52SLad Prabhakar 
riic_get_scl(struct i2c_adapter * adap)460*ba9e1b52SLad Prabhakar static int riic_get_scl(struct i2c_adapter *adap)
461*ba9e1b52SLad Prabhakar {
462*ba9e1b52SLad Prabhakar 	struct riic_dev *riic = i2c_get_adapdata(adap);
463*ba9e1b52SLad Prabhakar 
464*ba9e1b52SLad Prabhakar 	return !!(riic_readb(riic, RIIC_ICCR1) & ICCR1_SCLI);
465*ba9e1b52SLad Prabhakar }
466*ba9e1b52SLad Prabhakar 
riic_get_sda(struct i2c_adapter * adap)467*ba9e1b52SLad Prabhakar static int riic_get_sda(struct i2c_adapter *adap)
468*ba9e1b52SLad Prabhakar {
469*ba9e1b52SLad Prabhakar 	struct riic_dev *riic = i2c_get_adapdata(adap);
470*ba9e1b52SLad Prabhakar 
471*ba9e1b52SLad Prabhakar 	return !!(riic_readb(riic, RIIC_ICCR1) & ICCR1_SDAI);
472*ba9e1b52SLad Prabhakar }
473*ba9e1b52SLad Prabhakar 
riic_set_scl(struct i2c_adapter * adap,int val)474*ba9e1b52SLad Prabhakar static void riic_set_scl(struct i2c_adapter *adap, int val)
475*ba9e1b52SLad Prabhakar {
476*ba9e1b52SLad Prabhakar 	struct riic_dev *riic = i2c_get_adapdata(adap);
477*ba9e1b52SLad Prabhakar 
478*ba9e1b52SLad Prabhakar 	if (val)
479*ba9e1b52SLad Prabhakar 		riic_clear_set_bit(riic, ICCR1_SOWP, ICCR1_SCLO, RIIC_ICCR1);
480*ba9e1b52SLad Prabhakar 	else
481*ba9e1b52SLad Prabhakar 		riic_clear_set_bit(riic, ICCR1_SOWP | ICCR1_SCLO, 0, RIIC_ICCR1);
482*ba9e1b52SLad Prabhakar 
483*ba9e1b52SLad Prabhakar 	riic_clear_set_bit(riic, 0, ICCR1_SOWP, RIIC_ICCR1);
484*ba9e1b52SLad Prabhakar }
485*ba9e1b52SLad Prabhakar 
riic_set_sda(struct i2c_adapter * adap,int val)486*ba9e1b52SLad Prabhakar static void riic_set_sda(struct i2c_adapter *adap, int val)
487*ba9e1b52SLad Prabhakar {
488*ba9e1b52SLad Prabhakar 	struct riic_dev *riic = i2c_get_adapdata(adap);
489*ba9e1b52SLad Prabhakar 
4909ae0e7f7SLad Prabhakar 	if (val)
491310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICCR1_SOWP, ICCR1_SDAO, RIIC_ICCR1);
492310c18a4SWolfram Sang 	else
493310c18a4SWolfram Sang 		riic_clear_set_bit(riic, ICCR1_SOWP | ICCR1_SDAO, 0, RIIC_ICCR1);
49471ccea09SChris Brandt 
495310c18a4SWolfram Sang 	riic_clear_set_bit(riic, 0, ICCR1_SOWP, RIIC_ICCR1);
496310c18a4SWolfram Sang }
497310c18a4SWolfram Sang 
498310c18a4SWolfram Sang static struct i2c_bus_recovery_info riic_bri = {
499310c18a4SWolfram Sang 	.recover_bus = i2c_generic_scl_recovery,
500b42ed9fdSClaudiu Beznea 	.get_scl = riic_get_scl,
501310c18a4SWolfram Sang 	.set_scl = riic_set_scl,
502310c18a4SWolfram Sang 	.get_sda = riic_get_sda,
503310c18a4SWolfram Sang 	.set_sda = riic_set_sda,
504310c18a4SWolfram Sang };
505b42ed9fdSClaudiu Beznea 
506310c18a4SWolfram Sang static const struct riic_irq_desc riic_irqs[] = {
507310c18a4SWolfram Sang 	{ .res_num = 0, .isr = riic_tend_isr, .name = "riic-tend" },
508310c18a4SWolfram Sang 	{ .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rdrf" },
509e05e4708SLad Prabhakar 	{ .res_num = 2, .isr = riic_tdre_isr, .name = "riic-tdre" },
510310c18a4SWolfram Sang 	{ .res_num = 3, .isr = riic_stop_isr, .name = "riic-stop" },
511310c18a4SWolfram Sang 	{ .res_num = 5, .isr = riic_tend_isr, .name = "riic-nack" },
512310c18a4SWolfram Sang };
513b42ed9fdSClaudiu Beznea 
514e2aa2502SLad Prabhakar static const struct riic_irq_desc riic_rzt2h_irqs[] = {
515e2aa2502SLad Prabhakar 	{ .res_num = 0, .isr = riic_eei_isr,  .name = "riic-eei" },
516e2aa2502SLad Prabhakar 	{ .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rxi" },
517310c18a4SWolfram Sang 	{ .res_num = 2, .isr = riic_tdre_isr, .name = "riic-txi" },
5183d9e63c3SLad Prabhakar 	{ .res_num = 3, .isr = riic_tend_isr, .name = "riic-tei" },
51953326135SClaudiu Beznea };
52053326135SClaudiu Beznea 
riic_i2c_probe(struct platform_device * pdev)5213d9e63c3SLad Prabhakar static int riic_i2c_probe(struct platform_device *pdev)
522010e765bSBiju Das {
523310c18a4SWolfram Sang 	struct device *dev = &pdev->dev;
52476dc1629SLad Prabhakar 	struct riic_dev *riic;
525310c18a4SWolfram Sang 	struct i2c_adapter *adap;
52676dc1629SLad Prabhakar 	int i, ret;
52776dc1629SLad Prabhakar 
52876dc1629SLad Prabhakar 	riic = devm_kzalloc(dev, sizeof(*riic), GFP_KERNEL);
52976dc1629SLad Prabhakar 	if (!riic)
53076dc1629SLad Prabhakar 		return -ENOMEM;
531310c18a4SWolfram Sang 
532e2aa2502SLad Prabhakar 	riic->base = devm_platform_ioremap_resource(pdev, 0);
533e2aa2502SLad Prabhakar 	if (IS_ERR(riic->base))
534e2aa2502SLad Prabhakar 		return PTR_ERR(riic->base);
535310c18a4SWolfram Sang 
536310c18a4SWolfram Sang 	riic->clk = devm_clk_get(dev, NULL);
537b42ed9fdSClaudiu Beznea 	if (IS_ERR(riic->clk))
538748ee3b2SLad Prabhakar 		return dev_err_probe(dev, PTR_ERR(riic->clk),
539310c18a4SWolfram Sang 				     "missing controller clock");
540310c18a4SWolfram Sang 
541ea1558ceSWolfram Sang 	riic->rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL);
542310c18a4SWolfram Sang 	if (IS_ERR(riic->rstc))
543310c18a4SWolfram Sang 		return dev_err_probe(dev, PTR_ERR(riic->rstc),
544b42ed9fdSClaudiu Beznea 				     "failed to acquire deasserted reset\n");
545b42ed9fdSClaudiu Beznea 
546*ba9e1b52SLad Prabhakar 	riic->info = of_device_get_match_data(dev);
547310c18a4SWolfram Sang 
548310c18a4SWolfram Sang 	for (i = 0; i < riic->info->num_irqs; i++) {
549310c18a4SWolfram Sang 		const struct riic_irq_desc *irq_desc;
55053326135SClaudiu Beznea 		int irq;
551d982d665SChris Brandt 
55210d5c884SClaudiu Beznea 		irq_desc = &riic->info->irqs[i];
55310d5c884SClaudiu Beznea 		irq = platform_get_irq(pdev, irq_desc->res_num);
55410d5c884SClaudiu Beznea 		if (irq < 0)
555b42ed9fdSClaudiu Beznea 			return irq;
556d303ce59SGeert Uytterhoeven 
55753326135SClaudiu Beznea 		ret = devm_request_irq(dev, irq, irq_desc->isr, 0, irq_desc->name, riic);
558310c18a4SWolfram Sang 		if (ret)
559d303ce59SGeert Uytterhoeven 			return dev_err_probe(dev, ret, "failed to request irq %s\n",
560310c18a4SWolfram Sang 					     irq_desc->name);
561310c18a4SWolfram Sang 	}
562ea734404SWolfram Sang 
563d303ce59SGeert Uytterhoeven 
564310c18a4SWolfram Sang 	adap = &riic->adapter;
565310c18a4SWolfram Sang 	i2c_set_adapdata(adap, riic);
566310c18a4SWolfram Sang 	strscpy(adap->name, "Renesas RIIC adapter", sizeof(adap->name));
56753326135SClaudiu Beznea 	adap->owner = THIS_MODULE;
568310c18a4SWolfram Sang 	adap->algo = &riic_algo;
569d303ce59SGeert Uytterhoeven 	adap->dev.parent = dev;
570d303ce59SGeert Uytterhoeven 	adap->dev.of_node = dev->of_node;
571b42ed9fdSClaudiu Beznea 	adap->bus_recovery_info = &riic_bri;
57210d5c884SClaudiu Beznea 
573d303ce59SGeert Uytterhoeven 	init_completion(&riic->msg_done);
574310c18a4SWolfram Sang 
575310c18a4SWolfram Sang 	i2c_parse_fw_timings(dev, &riic->i2c_t, true);
576e190a0c3SUwe Kleine-König 
577310c18a4SWolfram Sang 	/* Default 0 to save power. Can be overridden via sysfs for lower latency. */
578310c18a4SWolfram Sang 	pm_runtime_set_autosuspend_delay(dev, 0);
579b42ed9fdSClaudiu Beznea 	pm_runtime_use_autosuspend(dev);
5803149a9cfSClaudiu Beznea 	pm_runtime_enable(dev);
581310c18a4SWolfram Sang 
5823149a9cfSClaudiu Beznea 	ret = riic_init_hw(riic);
5833149a9cfSClaudiu Beznea 	if (ret)
58426c78711SLad Prabhakar 		goto out;
585b42ed9fdSClaudiu Beznea 
5863149a9cfSClaudiu Beznea 	ret = i2c_add_adapter(adap);
587310c18a4SWolfram Sang 	if (ret)
588b42ed9fdSClaudiu Beznea 		goto out;
58910d5c884SClaudiu Beznea 
590310c18a4SWolfram Sang 	platform_set_drvdata(pdev, riic);
591310c18a4SWolfram Sang 
59288c5cf45SClaudiu Beznea 	dev_info(dev, "registered with %dHz bus speed\n", riic->i2c_t.bus_freq_hz);
593748ee3b2SLad Prabhakar 	return 0;
594748ee3b2SLad Prabhakar 
595748ee3b2SLad Prabhakar out:
596748ee3b2SLad Prabhakar 	pm_runtime_disable(dev);
5973e3c9beaSClaudiu Beznea 	pm_runtime_dont_use_autosuspend(dev);
598748ee3b2SLad Prabhakar 	return ret;
599748ee3b2SLad Prabhakar }
600748ee3b2SLad Prabhakar 
riic_i2c_remove(struct platform_device * pdev)601748ee3b2SLad Prabhakar static void riic_i2c_remove(struct platform_device *pdev)
602748ee3b2SLad Prabhakar {
603748ee3b2SLad Prabhakar 	struct riic_dev *riic = platform_get_drvdata(pdev);
604748ee3b2SLad Prabhakar 	struct device *dev = &pdev->dev;
605748ee3b2SLad Prabhakar 	int ret;
606748ee3b2SLad Prabhakar 
60788c5cf45SClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
60888c5cf45SClaudiu Beznea 	if (!ret) {
6093e3c9beaSClaudiu Beznea 		riic_writeb(riic, 0, RIIC_ICIER);
6103e3c9beaSClaudiu Beznea 		pm_runtime_put(dev);
6113e3c9beaSClaudiu Beznea 	}
6123e3c9beaSClaudiu Beznea 	i2c_del_adapter(&riic->adapter);
6133e3c9beaSClaudiu Beznea 	pm_runtime_disable(dev);
61488c5cf45SClaudiu Beznea 	pm_runtime_dont_use_autosuspend(dev);
61588c5cf45SClaudiu Beznea }
61688c5cf45SClaudiu Beznea 
617a45f95d7SLad Prabhakar static const u8 riic_rz_a_regs[RIIC_REG_END] = {
618a45f95d7SLad Prabhakar 	[RIIC_ICCR1] = 0x00,
619a45f95d7SLad Prabhakar 	[RIIC_ICCR2] = 0x04,
620a45f95d7SLad Prabhakar 	[RIIC_ICMR1] = 0x08,
6213e3c9beaSClaudiu Beznea 	[RIIC_ICMR3] = 0x10,
622a45f95d7SLad Prabhakar 	[RIIC_ICFER] = 0x14,
623a45f95d7SLad Prabhakar 	[RIIC_ICSER] = 0x18,
624a45f95d7SLad Prabhakar 	[RIIC_ICIER] = 0x1c,
625a45f95d7SLad Prabhakar 	[RIIC_ICSR2] = 0x24,
626a45f95d7SLad Prabhakar 	[RIIC_ICBRL] = 0x34,
627a45f95d7SLad Prabhakar 	[RIIC_ICBRH] = 0x38,
628a45f95d7SLad Prabhakar 	[RIIC_ICDRT] = 0x3c,
62988c5cf45SClaudiu Beznea 	[RIIC_ICDRR] = 0x40,
63088c5cf45SClaudiu Beznea };
63188c5cf45SClaudiu Beznea 
63288c5cf45SClaudiu Beznea static const struct riic_of_data riic_rz_a_info = {
6333e3c9beaSClaudiu Beznea 	.regs = riic_rz_a_regs,
634a45f95d7SLad Prabhakar 	.irqs = riic_irqs,
635a45f95d7SLad Prabhakar 	.num_irqs = ARRAY_SIZE(riic_irqs),
63653326135SClaudiu Beznea 	.fast_mode_plus = true,
63753326135SClaudiu Beznea };
63853326135SClaudiu Beznea 
63953326135SClaudiu Beznea static const struct riic_of_data riic_rz_a1h_info = {
64053326135SClaudiu Beznea 	.regs = riic_rz_a_regs,
64153326135SClaudiu Beznea 	.irqs = riic_irqs,
64253326135SClaudiu Beznea 	.num_irqs = ARRAY_SIZE(riic_irqs),
64353326135SClaudiu Beznea };
64453326135SClaudiu Beznea 
64553326135SClaudiu Beznea static const u8 riic_rz_v2h_regs[RIIC_REG_END] = {
64653326135SClaudiu Beznea 	[RIIC_ICCR1] = 0x00,
64753326135SClaudiu Beznea 	[RIIC_ICCR2] = 0x01,
64853326135SClaudiu Beznea 	[RIIC_ICMR1] = 0x02,
64953326135SClaudiu Beznea 	[RIIC_ICMR3] = 0x04,
65053326135SClaudiu Beznea 	[RIIC_ICFER] = 0x05,
65153326135SClaudiu Beznea 	[RIIC_ICSER] = 0x06,
65253326135SClaudiu Beznea 	[RIIC_ICIER] = 0x07,
65353326135SClaudiu Beznea 	[RIIC_ICSR2] = 0x09,
65453326135SClaudiu Beznea 	[RIIC_ICBRL] = 0x10,
65553326135SClaudiu Beznea 	[RIIC_ICBRH] = 0x11,
65653326135SClaudiu Beznea 	[RIIC_ICDRT] = 0x12,
65753326135SClaudiu Beznea 	[RIIC_ICDRR] = 0x13,
65853326135SClaudiu Beznea };
65953326135SClaudiu Beznea 
66053326135SClaudiu Beznea static const struct riic_of_data riic_rz_v2h_info = {
66153326135SClaudiu Beznea 	.regs = riic_rz_v2h_regs,
66253326135SClaudiu Beznea 	.irqs = riic_irqs,
66353326135SClaudiu Beznea 	.num_irqs = ARRAY_SIZE(riic_irqs),
66453326135SClaudiu Beznea 	.fast_mode_plus = true,
66553326135SClaudiu Beznea };
66653326135SClaudiu Beznea 
66753326135SClaudiu Beznea static const struct riic_of_data riic_rz_t2h_info = {
66853326135SClaudiu Beznea 	.regs = riic_rz_v2h_regs,
66953326135SClaudiu Beznea 	.irqs = riic_rzt2h_irqs,
67053326135SClaudiu Beznea 	.num_irqs = ARRAY_SIZE(riic_rzt2h_irqs),
67153326135SClaudiu Beznea };
67253326135SClaudiu Beznea 
riic_i2c_suspend(struct device * dev)67353326135SClaudiu Beznea static int riic_i2c_suspend(struct device *dev)
67453326135SClaudiu Beznea {
67553326135SClaudiu Beznea 	struct riic_dev *riic = dev_get_drvdata(dev);
67653326135SClaudiu Beznea 	int ret;
67753326135SClaudiu Beznea 
67853326135SClaudiu Beznea 	ret = pm_runtime_resume_and_get(dev);
67953326135SClaudiu Beznea 	if (ret)
68053326135SClaudiu Beznea 		return ret;
68153326135SClaudiu Beznea 
68253326135SClaudiu Beznea 	i2c_mark_adapter_suspended(&riic->adapter);
68353326135SClaudiu Beznea 
68453326135SClaudiu Beznea 	/* Disable output on SDA, SCL pins. */
685eae45e5dSJingoo Han 	riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1);
686748ee3b2SLad Prabhakar 
6873e3c9beaSClaudiu Beznea 	pm_runtime_mark_last_busy(dev);
688a45f95d7SLad Prabhakar 	pm_runtime_put_sync(dev);
689310c18a4SWolfram Sang 
690310c18a4SWolfram Sang 	return reset_control_assert(riic->rstc);
691310c18a4SWolfram Sang }
692310c18a4SWolfram Sang 
riic_i2c_resume(struct device * dev)693310c18a4SWolfram Sang static int riic_i2c_resume(struct device *dev)
69432a0a94aSUwe Kleine-König {
695310c18a4SWolfram Sang 	struct riic_dev *riic = dev_get_drvdata(dev);
696310c18a4SWolfram Sang 	int ret;
697310c18a4SWolfram Sang 
69853326135SClaudiu Beznea 	ret = reset_control_deassert(riic->rstc);
699310c18a4SWolfram Sang 	if (ret)
700310c18a4SWolfram Sang 		return ret;
701310c18a4SWolfram Sang 
702310c18a4SWolfram Sang 	ret = riic_init_hw(riic);
703310c18a4SWolfram Sang 	if (ret) {
704310c18a4SWolfram Sang 		/*
705310c18a4SWolfram Sang 		 * In case this happens there is no way to recover from this
706310c18a4SWolfram Sang 		 * state. The driver will remain loaded. We want to avoid
707310c18a4SWolfram Sang 		 * keeping the reset line de-asserted for no reason.
708 		 */
709 		reset_control_assert(riic->rstc);
710 		return ret;
711 	}
712 
713 	i2c_mark_adapter_resumed(&riic->adapter);
714 
715 	return 0;
716 }
717 
718 static const struct dev_pm_ops riic_i2c_pm_ops = {
719 	SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend, riic_i2c_resume)
720 };
721 
722 static const struct of_device_id riic_i2c_dt_ids[] = {
723 	{ .compatible = "renesas,riic-r7s72100", .data =  &riic_rz_a1h_info, },
724 	{ .compatible = "renesas,riic-r9a09g057", .data = &riic_rz_v2h_info },
725 	{ .compatible = "renesas,riic-r9a09g077", .data = &riic_rz_t2h_info },
726 	{ .compatible = "renesas,riic-rz", .data = &riic_rz_a_info },
727 	{ /* Sentinel */ }
728 };
729 
730 static struct platform_driver riic_i2c_driver = {
731 	.probe		= riic_i2c_probe,
732 	.remove		= riic_i2c_remove,
733 	.driver		= {
734 		.name	= "i2c-riic",
735 		.of_match_table = riic_i2c_dt_ids,
736 		.pm	= pm_ptr(&riic_i2c_pm_ops),
737 	},
738 };
739 
740 module_platform_driver(riic_i2c_driver);
741 
742 MODULE_DESCRIPTION("Renesas RIIC adapter");
743 MODULE_AUTHOR("Wolfram Sang <wsa@sang-engineering.com>");
744 MODULE_LICENSE("GPL v2");
745 MODULE_DEVICE_TABLE(of, riic_i2c_dt_ids);
746