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