Lines Matching +full:can +full:- +full:r8a7791
1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for the Renesas R-Car I2C unit
5 * Copyright (C) 2014-19 Wolfram Sang <wsa@sang-engineering.com>
6 * Copyright (C) 2011-2019 Renesas Electronics Corporation
8 * Copyright (C) 2012-14 Renesas Solutions Corp.
11 * This file is based on the drivers/i2c/busses/i2c-sh7760.c
12 * (c) 2005-2008 MSC Vertriebsges.m.b.H, Manuel Lauss <mlau@msc-ge.com>
18 #include <linux/dma-mapping.h>
24 #include <linux/i2c-smbus.h>
54 #define MDBS BIT(7) /* non-fifo mode switch */
147 #define rcar_i2c_priv_to_dev(p) ((p)->adap.dev.parent)
148 #define rcar_i2c_is_recv(p) ((p)->msg->flags & I2C_M_RD)
152 writel(val, priv->io + reg); in rcar_i2c_write()
157 return readl(priv->io + reg); in rcar_i2c_read()
162 writel(~val & 0x7f, priv->io + ICMSR); in rcar_i2c_clear_irq()
178 priv->recovery_icmcr |= FSCL; in rcar_i2c_set_scl()
180 priv->recovery_icmcr &= ~FSCL; in rcar_i2c_set_scl()
182 rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr); in rcar_i2c_set_scl()
190 priv->recovery_icmcr |= FSDA; in rcar_i2c_set_sda()
192 priv->recovery_icmcr &= ~FSDA; in rcar_i2c_set_sda()
194 rcar_i2c_write(priv, ICMCR, priv->recovery_icmcr); in rcar_i2c_set_sda()
219 rcar_i2c_write(priv, ICCCR, priv->icccr); in rcar_i2c_init()
221 if (priv->devtype == I2C_RCAR_GEN3) in rcar_i2c_init()
231 ret = readl_poll_timeout(priv->io + ICMCR, val, !(val & FSDA), 10, in rcar_i2c_bus_barrier()
232 priv->adap.timeout); in rcar_i2c_bus_barrier()
235 priv->recovery_icmcr = MDBS | OBPC | FSDA | FSCL; in rcar_i2c_bus_barrier()
236 ret = i2c_recover_bus(&priv->adap); in rcar_i2c_bus_barrier()
257 switch (priv->devtype) { in rcar_i2c_clock_calculate()
267 return -EIO; in rcar_i2c_clock_calculate()
283 * F[] : integer up-valuation in rcar_i2c_clock_calculate()
285 rate = clk_get_rate(priv->clk); in rcar_i2c_clock_calculate()
289 return -EIO; in rcar_i2c_clock_calculate()
313 * scgd = (div - 20 - round + 7) / 8; in rcar_i2c_clock_calculate()
323 return -EIO; in rcar_i2c_clock_calculate()
330 priv->icccr = scgd << cdf_width | cdf; in rcar_i2c_clock_calculate()
344 bool rep_start = !(priv->flags & ID_REP_AFTER_RD); in rcar_i2c_prepare_msg()
346 priv->pos = 0; in rcar_i2c_prepare_msg()
347 priv->flags &= ID_P_MASK; in rcar_i2c_prepare_msg()
349 if (priv->msgs_left == 1) in rcar_i2c_prepare_msg()
350 priv->flags |= ID_LAST_MSG; in rcar_i2c_prepare_msg()
352 rcar_i2c_write(priv, ICMAR, i2c_8bit_addr_from_msg(priv->msg)); in rcar_i2c_prepare_msg()
353 if (priv->flags & ID_P_NOT_ATOMIC) in rcar_i2c_prepare_msg()
363 priv->msg = msgs; in rcar_i2c_first_msg()
364 priv->msgs_left = num; in rcar_i2c_first_msg()
371 priv->msg++; in rcar_i2c_next_msg()
372 priv->msgs_left--; in rcar_i2c_next_msg()
379 struct dma_chan *chan = priv->dma_direction == DMA_FROM_DEVICE in rcar_i2c_cleanup_dma()
380 ? priv->dma_rx : priv->dma_tx; in rcar_i2c_cleanup_dma()
386 dma_unmap_single(chan->device->dev, sg_dma_address(&priv->sg), in rcar_i2c_cleanup_dma()
387 sg_dma_len(&priv->sg), priv->dma_direction); in rcar_i2c_cleanup_dma()
389 /* Gen3 can only do one RXDMA per transfer and we just completed it */ in rcar_i2c_cleanup_dma()
390 if (priv->devtype == I2C_RCAR_GEN3 && in rcar_i2c_cleanup_dma()
391 priv->dma_direction == DMA_FROM_DEVICE) in rcar_i2c_cleanup_dma()
392 priv->flags |= ID_P_NO_RXDMA; in rcar_i2c_cleanup_dma()
394 priv->dma_direction = DMA_NONE; in rcar_i2c_cleanup_dma()
404 priv->pos += sg_dma_len(&priv->sg); in rcar_i2c_dma_callback()
412 struct i2c_msg *msg = priv->msg; in rcar_i2c_dma()
413 bool read = msg->flags & I2C_M_RD; in rcar_i2c_dma()
415 struct dma_chan *chan = read ? priv->dma_rx : priv->dma_tx; in rcar_i2c_dma()
423 if (!(priv->flags & ID_P_NOT_ATOMIC) || IS_ERR(chan) || msg->len < RCAR_MIN_DMA_LEN || in rcar_i2c_dma()
424 !(msg->flags & I2C_M_DMA_SAFE) || (read && priv->flags & ID_P_NO_RXDMA)) in rcar_i2c_dma()
432 buf = priv->msg->buf; in rcar_i2c_dma()
433 len = priv->msg->len - 2; in rcar_i2c_dma()
438 buf = priv->msg->buf + 1; in rcar_i2c_dma()
439 len = priv->msg->len - 1; in rcar_i2c_dma()
442 dma_addr = dma_map_single(chan->device->dev, buf, len, dir); in rcar_i2c_dma()
443 if (dma_mapping_error(chan->device->dev, dma_addr)) { in rcar_i2c_dma()
448 sg_dma_len(&priv->sg) = len; in rcar_i2c_dma()
449 sg_dma_address(&priv->sg) = dma_addr; in rcar_i2c_dma()
451 priv->dma_direction = dir; in rcar_i2c_dma()
453 txdesc = dmaengine_prep_slave_sg(chan, &priv->sg, 1, in rcar_i2c_dma()
462 txdesc->callback = rcar_i2c_dma_callback; in rcar_i2c_dma()
463 txdesc->callback_param = priv; in rcar_i2c_dma()
484 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_send()
494 /* Check if DMA can be enabled and take over */ in rcar_i2c_irq_send()
495 if (priv->pos == 1 && rcar_i2c_dma(priv)) in rcar_i2c_irq_send()
498 if (priv->pos < msg->len) { in rcar_i2c_irq_send()
504 * [ICRXTX] -> [SHIFT] -> [I2C bus] in rcar_i2c_irq_send()
506 rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]); in rcar_i2c_irq_send()
507 priv->pos++; in rcar_i2c_irq_send()
514 * [ICRXTX] -> [SHIFT] -> [I2C bus] in rcar_i2c_irq_send()
517 if (priv->flags & ID_LAST_MSG) in rcar_i2c_irq_send()
533 struct i2c_msg *msg = priv->msg; in rcar_i2c_irq_recv()
534 bool recv_len_init = priv->pos == 0 && msg->flags & I2C_M_RECV_LEN; in rcar_i2c_irq_recv()
548 } else if (priv->pos < msg->len) { in rcar_i2c_irq_recv()
552 msg->buf[priv->pos] = data; in rcar_i2c_irq_recv()
555 priv->flags |= ID_DONE | ID_EPROTO; in rcar_i2c_irq_recv()
558 msg->len += msg->buf[0]; in rcar_i2c_irq_recv()
565 priv->pos++; in rcar_i2c_irq_recv()
572 if (priv->pos + 1 == msg->len && !recv_len_init) { in rcar_i2c_irq_recv()
573 if (priv->flags & ID_LAST_MSG) { in rcar_i2c_irq_recv()
577 priv->flags |= ID_REP_AFTER_RD; in rcar_i2c_irq_recv()
581 if (priv->pos == msg->len && !(priv->flags & ID_LAST_MSG)) in rcar_i2c_irq_recv()
602 i2c_slave_event(priv->slave, I2C_SLAVE_READ_REQUESTED, &value); in rcar_i2c_slave_irq()
606 i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); in rcar_i2c_slave_irq()
617 i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value); in rcar_i2c_slave_irq()
628 ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value); in rcar_i2c_slave_irq()
636 i2c_slave_event(priv->slave, I2C_SLAVE_READ_PROCESSED, &value); in rcar_i2c_slave_irq()
645 * This driver has a lock-free design because there are IP cores (at least
646 * R-Car Gen2) which have an inherent race condition in their hardware design.
652 * R-Car Gen3 seems to have this fixed but earlier versions than R-Car Gen2 are
666 priv->flags |= ID_DONE | ID_ARBLOST; in rcar_i2c_irq()
673 if (priv->flags & ID_P_NOT_ATOMIC) in rcar_i2c_irq()
675 priv->flags |= ID_NACK; in rcar_i2c_irq()
681 priv->msgs_left--; /* The last message also made it */ in rcar_i2c_irq()
682 priv->flags |= ID_DONE; in rcar_i2c_irq()
692 if (priv->flags & ID_DONE) { in rcar_i2c_irq()
695 if (priv->flags & ID_P_NOT_ATOMIC) in rcar_i2c_irq()
696 wake_up(&priv->wait); in rcar_i2c_irq()
708 if (likely(!(priv->flags & ID_REP_AFTER_RD))) in rcar_i2c_gen2_irq()
713 if (priv->flags & ID_P_NOT_ATOMIC) in rcar_i2c_gen2_irq()
726 if (priv->flags & ID_P_NOT_ATOMIC) in rcar_i2c_gen3_irq()
733 if (likely(!(priv->flags & ID_REP_AFTER_RD) && msr)) in rcar_i2c_gen3_irq()
785 read = msg->flags & I2C_M_RD; in rcar_i2c_request_dma()
787 chan = read ? priv->dma_rx : priv->dma_tx; in rcar_i2c_request_dma()
788 if (PTR_ERR(chan) != -EPROBE_DEFER) in rcar_i2c_request_dma()
792 chan = rcar_i2c_request_dma_chan(dev, dir, priv->res->start + ICRXTX); in rcar_i2c_request_dma()
795 priv->dma_rx = chan; in rcar_i2c_request_dma()
797 priv->dma_tx = chan; in rcar_i2c_request_dma()
802 if (!IS_ERR(priv->dma_tx)) { in rcar_i2c_release_dma()
803 dma_release_channel(priv->dma_tx); in rcar_i2c_release_dma()
804 priv->dma_tx = ERR_PTR(-EPROBE_DEFER); in rcar_i2c_release_dma()
807 if (!IS_ERR(priv->dma_rx)) { in rcar_i2c_release_dma()
808 dma_release_channel(priv->dma_rx); in rcar_i2c_release_dma()
809 priv->dma_rx = ERR_PTR(-EPROBE_DEFER); in rcar_i2c_release_dma()
818 ret = reset_control_reset(priv->rstc); in rcar_i2c_do_reset()
823 100, false, priv->rstc); in rcar_i2c_do_reset()
835 priv->flags |= ID_P_NOT_ATOMIC; in rcar_i2c_master_xfer()
845 if (priv->devtype == I2C_RCAR_GEN3) { in rcar_i2c_master_xfer()
846 priv->flags |= ID_P_NO_RXDMA; in rcar_i2c_master_xfer()
847 if (!IS_ERR(priv->rstc)) { in rcar_i2c_master_xfer()
850 priv->flags &= ~ID_P_NO_RXDMA; in rcar_i2c_master_xfer()
861 time_left = wait_event_timeout(priv->wait, priv->flags & ID_DONE, in rcar_i2c_master_xfer()
862 num * adap->timeout); in rcar_i2c_master_xfer()
865 if (priv->dma_direction != DMA_NONE) in rcar_i2c_master_xfer()
870 ret = -ETIMEDOUT; in rcar_i2c_master_xfer()
871 } else if (priv->flags & ID_NACK) { in rcar_i2c_master_xfer()
872 ret = -ENXIO; in rcar_i2c_master_xfer()
873 } else if (priv->flags & ID_ARBLOST) { in rcar_i2c_master_xfer()
874 ret = -EAGAIN; in rcar_i2c_master_xfer()
875 } else if (priv->flags & ID_EPROTO) { in rcar_i2c_master_xfer()
876 ret = -EPROTO; in rcar_i2c_master_xfer()
878 ret = num - priv->msgs_left; /* The number of transfer */ in rcar_i2c_master_xfer()
883 if (ret < 0 && ret != -ENXIO) in rcar_i2c_master_xfer()
884 dev_err(dev, "error %d : %x\n", ret, priv->flags); in rcar_i2c_master_xfer()
899 priv->flags &= ~ID_P_NOT_ATOMIC; in rcar_i2c_master_xfer_atomic()
911 j = jiffies + num * adap->timeout; in rcar_i2c_master_xfer_atomic()
918 if (priv->devtype < I2C_RCAR_GEN3) in rcar_i2c_master_xfer_atomic()
925 } while (!(priv->flags & ID_DONE) && time_left); in rcar_i2c_master_xfer_atomic()
929 ret = -ETIMEDOUT; in rcar_i2c_master_xfer_atomic()
930 } else if (priv->flags & ID_NACK) { in rcar_i2c_master_xfer_atomic()
931 ret = -ENXIO; in rcar_i2c_master_xfer_atomic()
932 } else if (priv->flags & ID_ARBLOST) { in rcar_i2c_master_xfer_atomic()
933 ret = -EAGAIN; in rcar_i2c_master_xfer_atomic()
934 } else if (priv->flags & ID_EPROTO) { in rcar_i2c_master_xfer_atomic()
935 ret = -EPROTO; in rcar_i2c_master_xfer_atomic()
937 ret = num - priv->msgs_left; /* The number of transfer */ in rcar_i2c_master_xfer_atomic()
942 if (ret < 0 && ret != -ENXIO) in rcar_i2c_master_xfer_atomic()
943 dev_err(dev, "error %d : %x\n", ret, priv->flags); in rcar_i2c_master_xfer_atomic()
950 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_reg_slave()
952 if (priv->slave) in rcar_reg_slave()
953 return -EBUSY; in rcar_reg_slave()
955 if (slave->flags & I2C_CLIENT_TEN) in rcar_reg_slave()
956 return -EAFNOSUPPORT; in rcar_reg_slave()
961 priv->slave = slave; in rcar_reg_slave()
962 rcar_i2c_write(priv, ICSAR, slave->addr); in rcar_reg_slave()
972 struct rcar_i2c_priv *priv = i2c_get_adapdata(slave->adapter); in rcar_unreg_slave()
974 WARN_ON(!priv->slave); in rcar_unreg_slave()
977 disable_irq(priv->irq); in rcar_unreg_slave()
980 enable_irq(priv->irq); in rcar_unreg_slave()
984 priv->slave = NULL; in rcar_unreg_slave()
996 * This HW can't do: in rcar_i2c_func()
1004 if (priv->flags & ID_P_HOST_NOTIFY) in rcar_i2c_func()
1023 { .compatible = "renesas,i2c-r8a7778", .data = (void *)I2C_RCAR_GEN1 },
1024 { .compatible = "renesas,i2c-r8a7779", .data = (void *)I2C_RCAR_GEN1 },
1025 { .compatible = "renesas,i2c-r8a7790", .data = (void *)I2C_RCAR_GEN2 },
1026 { .compatible = "renesas,i2c-r8a7791", .data = (void *)I2C_RCAR_GEN2 },
1027 { .compatible = "renesas,i2c-r8a7792", .data = (void *)I2C_RCAR_GEN2 },
1028 { .compatible = "renesas,i2c-r8a7793", .data = (void *)I2C_RCAR_GEN2 },
1029 { .compatible = "renesas,i2c-r8a7794", .data = (void *)I2C_RCAR_GEN2 },
1030 { .compatible = "renesas,i2c-r8a7795", .data = (void *)I2C_RCAR_GEN3 },
1031 { .compatible = "renesas,i2c-r8a7796", .data = (void *)I2C_RCAR_GEN3 },
1032 { .compatible = "renesas,rcar-gen1-i2c", .data = (void *)I2C_RCAR_GEN1 },
1033 { .compatible = "renesas,rcar-gen2-i2c", .data = (void *)I2C_RCAR_GEN2 },
1034 { .compatible = "renesas,rcar-gen3-i2c", .data = (void *)I2C_RCAR_GEN3 },
1035 { .compatible = "renesas,rcar-gen4-i2c", .data = (void *)I2C_RCAR_GEN3 },
1044 struct device *dev = &pdev->dev; in rcar_i2c_probe()
1054 return -ENOMEM; in rcar_i2c_probe()
1056 priv->clk = devm_clk_get(dev, NULL); in rcar_i2c_probe()
1057 if (IS_ERR(priv->clk)) { in rcar_i2c_probe()
1059 return PTR_ERR(priv->clk); in rcar_i2c_probe()
1062 priv->io = devm_platform_get_and_ioremap_resource(pdev, 0, &priv->res); in rcar_i2c_probe()
1063 if (IS_ERR(priv->io)) in rcar_i2c_probe()
1064 return PTR_ERR(priv->io); in rcar_i2c_probe()
1066 priv->devtype = (enum rcar_i2c_type)of_device_get_match_data(dev); in rcar_i2c_probe()
1067 init_waitqueue_head(&priv->wait); in rcar_i2c_probe()
1069 adap = &priv->adap; in rcar_i2c_probe()
1070 adap->nr = pdev->id; in rcar_i2c_probe()
1071 adap->algo = &rcar_i2c_algo; in rcar_i2c_probe()
1072 adap->class = I2C_CLASS_DEPRECATED; in rcar_i2c_probe()
1073 adap->retries = 3; in rcar_i2c_probe()
1074 adap->dev.parent = dev; in rcar_i2c_probe()
1075 adap->dev.of_node = dev->of_node; in rcar_i2c_probe()
1076 adap->bus_recovery_info = &rcar_i2c_bri; in rcar_i2c_probe()
1077 adap->quirks = &rcar_i2c_quirks; in rcar_i2c_probe()
1079 strscpy(adap->name, pdev->name, sizeof(adap->name)); in rcar_i2c_probe()
1082 sg_init_table(&priv->sg, 1); in rcar_i2c_probe()
1083 priv->dma_direction = DMA_NONE; in rcar_i2c_probe()
1084 priv->dma_rx = priv->dma_tx = ERR_PTR(-EPROBE_DEFER); in rcar_i2c_probe()
1097 if (priv->devtype < I2C_RCAR_GEN3) { in rcar_i2c_probe()
1102 if (priv->devtype == I2C_RCAR_GEN3) { in rcar_i2c_probe()
1103 priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); in rcar_i2c_probe()
1104 if (!IS_ERR(priv->rstc)) { in rcar_i2c_probe()
1105 ret = reset_control_status(priv->rstc); in rcar_i2c_probe()
1107 priv->rstc = ERR_PTR(-ENOTSUPP); in rcar_i2c_probe()
1111 /* Stay always active when multi-master to keep arbitration working */ in rcar_i2c_probe()
1112 if (of_property_read_bool(dev->of_node, "multi-master")) in rcar_i2c_probe()
1113 priv->flags |= ID_P_PM_BLOCKED; in rcar_i2c_probe()
1117 if (of_property_read_bool(dev->of_node, "smbus")) in rcar_i2c_probe()
1118 priv->flags |= ID_P_HOST_NOTIFY; in rcar_i2c_probe()
1123 priv->irq = ret; in rcar_i2c_probe()
1124 ret = devm_request_irq(dev, priv->irq, irqhandler, irqflags, dev_name(dev), priv); in rcar_i2c_probe()
1126 dev_err(dev, "cannot get irq %d\n", priv->irq); in rcar_i2c_probe()
1136 if (priv->flags & ID_P_HOST_NOTIFY) { in rcar_i2c_probe()
1137 priv->host_notify_client = i2c_new_slave_host_notify_device(adap); in rcar_i2c_probe()
1138 if (IS_ERR(priv->host_notify_client)) { in rcar_i2c_probe()
1139 ret = PTR_ERR(priv->host_notify_client); in rcar_i2c_probe()
1149 i2c_del_adapter(&priv->adap); in rcar_i2c_probe()
1151 if (priv->flags & ID_P_PM_BLOCKED) in rcar_i2c_probe()
1161 struct device *dev = &pdev->dev; in rcar_i2c_remove()
1163 if (priv->host_notify_client) in rcar_i2c_remove()
1164 i2c_free_slave_host_notify_device(priv->host_notify_client); in rcar_i2c_remove()
1165 i2c_del_adapter(&priv->adap); in rcar_i2c_remove()
1167 if (priv->flags & ID_P_PM_BLOCKED) in rcar_i2c_remove()
1179 i2c_mark_adapter_suspended(&priv->adap); in rcar_i2c_suspend()
1187 i2c_mark_adapter_resumed(&priv->adap); in rcar_i2c_resume()
1202 .name = "i2c-rcar",
1213 MODULE_DESCRIPTION("Renesas R-Car I2C bus driver");