Lines Matching +full:riic +full:- +full:r7s72100
1 // SPDX-License-Identifier: GPL-2.0
3 * Renesas RIIC driver
5 * Copyright (C) 2013 Wolfram Sang <wsa@sang-engineering.com>
83 #define RIIC_INIT_MSG -1
127 static inline void riic_writeb(struct riic_dev *riic, u8 val, u8 offset) in riic_writeb() argument
129 writeb(val, riic->base + riic->info->regs[offset]); in riic_writeb()
132 static inline u8 riic_readb(struct riic_dev *riic, u8 offset) in riic_readb() argument
134 return readb(riic->base + riic->info->regs[offset]); in riic_readb()
137 static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u8 reg) in riic_clear_set_bit() argument
139 riic_writeb(riic, (riic_readb(riic, reg) & ~clear) | set, reg); in riic_clear_set_bit()
142 static int riic_bus_barrier(struct riic_dev *riic) in riic_bus_barrier() argument
151 ret = readb_poll_timeout(riic->base + riic->info->regs[RIIC_ICCR2], val, in riic_bus_barrier()
152 !(val & ICCR2_BBSY), 10, riic->adapter.timeout); in riic_bus_barrier()
156 if ((riic_readb(riic, RIIC_ICCR1) & (ICCR1_SDAI | ICCR1_SCLI)) != in riic_bus_barrier()
158 return -EBUSY; in riic_bus_barrier()
165 struct riic_dev *riic = i2c_get_adapdata(adap); in riic_xfer() local
166 struct device *dev = adap->dev.parent; in riic_xfer()
175 riic->err = riic_bus_barrier(riic); in riic_xfer()
176 if (riic->err) in riic_xfer()
179 reinit_completion(&riic->msg_done); in riic_xfer()
181 riic_writeb(riic, 0, RIIC_ICSR2); in riic_xfer()
184 riic->bytes_left = RIIC_INIT_MSG; in riic_xfer()
185 riic->buf = msgs[i].buf; in riic_xfer()
186 riic->msg = &msgs[i]; in riic_xfer()
187 riic->is_last = (i == num - 1); in riic_xfer()
189 riic_writeb(riic, ICIER_NAKIE | ICIER_TIE, RIIC_ICIER); in riic_xfer()
191 riic_writeb(riic, start_bit, RIIC_ICCR2); in riic_xfer()
193 time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout); in riic_xfer()
195 riic->err = -ETIMEDOUT; in riic_xfer()
197 if (riic->err) in riic_xfer()
207 return riic->err ?: num; in riic_xfer()
212 struct riic_dev *riic = data; in riic_tdre_isr() local
215 if (!riic->bytes_left) in riic_tdre_isr()
218 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_tdre_isr()
219 if (riic->msg->flags & I2C_M_RD) in riic_tdre_isr()
221 riic_clear_set_bit(riic, ICIER_TIE, ICIER_RIE, RIIC_ICIER); in riic_tdre_isr()
224 riic->bytes_left = riic->msg->len; in riic_tdre_isr()
226 val = i2c_8bit_addr_from_msg(riic->msg); in riic_tdre_isr()
228 val = *riic->buf; in riic_tdre_isr()
229 riic->buf++; in riic_tdre_isr()
230 riic->bytes_left--; in riic_tdre_isr()
238 if (riic->bytes_left == 0) in riic_tdre_isr()
239 riic_clear_set_bit(riic, ICIER_TIE, ICIER_TEIE, RIIC_ICIER); in riic_tdre_isr()
246 riic_writeb(riic, val, RIIC_ICDRT); in riic_tdre_isr()
253 struct riic_dev *riic = data; in riic_tend_isr() local
255 if (riic_readb(riic, RIIC_ICSR2) & ICSR2_NACKF) { in riic_tend_isr()
257 riic_readb(riic, RIIC_ICDRR); /* dummy read */ in riic_tend_isr()
258 riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2); in riic_tend_isr()
259 riic->err = -ENXIO; in riic_tend_isr()
260 } else if (riic->bytes_left) { in riic_tend_isr()
264 if (riic->is_last || riic->err) { in riic_tend_isr()
265 riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER); in riic_tend_isr()
266 riic_writeb(riic, ICCR2_SP, RIIC_ICCR2); in riic_tend_isr()
269 riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER); in riic_tend_isr()
270 complete(&riic->msg_done); in riic_tend_isr()
278 struct riic_dev *riic = data; in riic_rdrf_isr() local
280 if (!riic->bytes_left) in riic_rdrf_isr()
283 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_rdrf_isr()
284 riic->bytes_left = riic->msg->len; in riic_rdrf_isr()
285 riic_readb(riic, RIIC_ICDRR); /* dummy read */ in riic_rdrf_isr()
289 if (riic->bytes_left == 1) { in riic_rdrf_isr()
291 if (riic->is_last) { in riic_rdrf_isr()
292 riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER); in riic_rdrf_isr()
293 riic_writeb(riic, ICCR2_SP, RIIC_ICCR2); in riic_rdrf_isr()
296 riic_clear_set_bit(riic, 0, ICMR3_ACKBT, RIIC_ICMR3); in riic_rdrf_isr()
299 riic_clear_set_bit(riic, ICMR3_ACKBT, 0, RIIC_ICMR3); in riic_rdrf_isr()
303 *riic->buf = riic_readb(riic, RIIC_ICDRR); in riic_rdrf_isr()
304 riic->buf++; in riic_rdrf_isr()
305 riic->bytes_left--; in riic_rdrf_isr()
312 struct riic_dev *riic = data; in riic_stop_isr() local
315 riic_writeb(riic, 0, RIIC_ICSR2); in riic_stop_isr()
316 riic_readb(riic, RIIC_ICSR2); in riic_stop_isr()
317 riic_writeb(riic, 0, RIIC_ICIER); in riic_stop_isr()
318 riic_readb(riic, RIIC_ICIER); in riic_stop_isr()
320 complete(&riic->msg_done); in riic_stop_isr()
335 static int riic_init_hw(struct riic_dev *riic) in riic_init_hw() argument
341 struct i2c_timings *t = &riic->i2c_t; in riic_init_hw()
342 struct device *dev = riic->adapter.dev.parent; in riic_init_hw()
343 bool fast_mode_plus = riic->info->fast_mode_plus; in riic_init_hw()
347 if (t->bus_freq_hz > max_freq) in riic_init_hw()
348 return dev_err_probe(dev, -EINVAL, in riic_init_hw()
350 t->bus_freq_hz, max_freq); in riic_init_hw()
352 rate = clk_get_rate(riic->clk); in riic_init_hw()
369 total_ticks = DIV_ROUND_UP(rate, t->bus_freq_hz ?: 1); in riic_init_hw()
385 return dev_err_probe(dev, -EINVAL, "invalid speed (%uHz). Too slow.\n", in riic_init_hw()
386 t->bus_freq_hz); in riic_init_hw()
388 brh = total_ticks - brl; in riic_init_hw()
392 brl -= 4; in riic_init_hw()
393 brh -= 4; in riic_init_hw()
395 brl -= 3; in riic_init_hw()
396 brh -= 3; in riic_init_hw()
404 brl -= t->scl_fall_ns / ns_per_tick; in riic_init_hw()
405 brh -= t->scl_rise_ns / ns_per_tick; in riic_init_hw()
413 pr_debug("i2c-riic: freq=%lu, duty=%d, fall=%lu, rise=%lu, cks=%d, brl=%d, brh=%d\n", in riic_init_hw()
415 t->scl_fall_ns / ns_per_tick, t->scl_rise_ns / ns_per_tick, cks, brl, brh); in riic_init_hw()
422 riic_writeb(riic, ICCR1_IICRST | ICCR1_SOWP, RIIC_ICCR1); in riic_init_hw()
423 riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1); in riic_init_hw()
425 riic_writeb(riic, ICMR1_CKS(cks), RIIC_ICMR1); in riic_init_hw()
426 riic_writeb(riic, brh | ICBR_RESERVED, RIIC_ICBRH); in riic_init_hw()
427 riic_writeb(riic, brl | ICBR_RESERVED, RIIC_ICBRL); in riic_init_hw()
429 riic_writeb(riic, 0, RIIC_ICSER); in riic_init_hw()
430 riic_writeb(riic, ICMR3_ACKWP | ICMR3_RDRFS, RIIC_ICMR3); in riic_init_hw()
432 if (fast_mode_plus && t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) in riic_init_hw()
433 riic_clear_set_bit(riic, 0, ICFER_FMPE, RIIC_ICFER); in riic_init_hw()
435 riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1); in riic_init_hw()
443 { .res_num = 0, .isr = riic_tend_isr, .name = "riic-tend" },
444 { .res_num = 1, .isr = riic_rdrf_isr, .name = "riic-rdrf" },
445 { .res_num = 2, .isr = riic_tdre_isr, .name = "riic-tdre" },
446 { .res_num = 3, .isr = riic_stop_isr, .name = "riic-stop" },
447 { .res_num = 5, .isr = riic_tend_isr, .name = "riic-nack" },
452 struct device *dev = &pdev->dev; in riic_i2c_probe()
453 struct riic_dev *riic; in riic_i2c_probe() local
457 riic = devm_kzalloc(dev, sizeof(*riic), GFP_KERNEL); in riic_i2c_probe()
458 if (!riic) in riic_i2c_probe()
459 return -ENOMEM; in riic_i2c_probe()
461 riic->base = devm_platform_ioremap_resource(pdev, 0); in riic_i2c_probe()
462 if (IS_ERR(riic->base)) in riic_i2c_probe()
463 return PTR_ERR(riic->base); in riic_i2c_probe()
465 riic->clk = devm_clk_get(dev, NULL); in riic_i2c_probe()
466 if (IS_ERR(riic->clk)) in riic_i2c_probe()
467 return dev_err_probe(dev, PTR_ERR(riic->clk), in riic_i2c_probe()
470 riic->rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL); in riic_i2c_probe()
471 if (IS_ERR(riic->rstc)) in riic_i2c_probe()
472 return dev_err_probe(dev, PTR_ERR(riic->rstc), in riic_i2c_probe()
483 0, riic_irqs[i].name, riic); in riic_i2c_probe()
489 riic->info = of_device_get_match_data(dev); in riic_i2c_probe()
491 adap = &riic->adapter; in riic_i2c_probe()
492 i2c_set_adapdata(adap, riic); in riic_i2c_probe()
493 strscpy(adap->name, "Renesas RIIC adapter", sizeof(adap->name)); in riic_i2c_probe()
494 adap->owner = THIS_MODULE; in riic_i2c_probe()
495 adap->algo = &riic_algo; in riic_i2c_probe()
496 adap->dev.parent = dev; in riic_i2c_probe()
497 adap->dev.of_node = dev->of_node; in riic_i2c_probe()
499 init_completion(&riic->msg_done); in riic_i2c_probe()
501 i2c_parse_fw_timings(dev, &riic->i2c_t, true); in riic_i2c_probe()
508 ret = riic_init_hw(riic); in riic_i2c_probe()
516 platform_set_drvdata(pdev, riic); in riic_i2c_probe()
518 dev_info(dev, "registered with %dHz bus speed\n", riic->i2c_t.bus_freq_hz); in riic_i2c_probe()
529 struct riic_dev *riic = platform_get_drvdata(pdev); in riic_i2c_remove() local
530 struct device *dev = &pdev->dev; in riic_i2c_remove()
535 riic_writeb(riic, 0, RIIC_ICIER); in riic_i2c_remove()
538 i2c_del_adapter(&riic->adapter); in riic_i2c_remove()
589 struct riic_dev *riic = dev_get_drvdata(dev); in riic_i2c_suspend() local
596 i2c_mark_adapter_suspended(&riic->adapter); in riic_i2c_suspend()
599 riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1); in riic_i2c_suspend()
604 return reset_control_assert(riic->rstc); in riic_i2c_suspend()
609 struct riic_dev *riic = dev_get_drvdata(dev); in riic_i2c_resume() local
612 ret = reset_control_deassert(riic->rstc); in riic_i2c_resume()
616 ret = riic_init_hw(riic); in riic_i2c_resume()
621 * keeping the reset line de-asserted for no reason. in riic_i2c_resume()
623 reset_control_assert(riic->rstc); in riic_i2c_resume()
627 i2c_mark_adapter_resumed(&riic->adapter); in riic_i2c_resume()
637 { .compatible = "renesas,riic-rz", .data = &riic_rz_a_info },
638 { .compatible = "renesas,riic-r7s72100", .data = &riic_rz_a1h_info, },
639 { .compatible = "renesas,riic-r9a09g057", .data = &riic_rz_v2h_info },
647 .name = "i2c-riic",
655 MODULE_DESCRIPTION("Renesas RIIC adapter");
656 MODULE_AUTHOR("Wolfram Sang <wsa@sang-engineering.com>");