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