Lines Matching +full:uniphier +full:- +full:fi2c
3 * Copyright (C) 2015-2016 Socionext Inc.
6 * SPDX-License-Identifier: GPL-2.0+
25 u32 dttx; /* send FIFO (write-only) */
26 #define dtrx dttx /* receive FIFO (read-only) */
79 writel(I2C_RST_RST, ®s->rst); in reset_bus()
80 ret = readl_poll_timeout(®s->rst, val, !(val & I2C_RST_RST), 1); in reset_bus()
92 ret = readl_poll_timeout(®s->sr, val, !(val & I2C_SR_DB), 100); in check_device_busy()
109 return -EINVAL; in uniphier_fi2c_probe()
111 priv->regs = devm_ioremap(dev, addr, SZ_128); in uniphier_fi2c_probe()
112 if (!priv->regs) in uniphier_fi2c_probe()
113 return -ENOMEM; in uniphier_fi2c_probe()
115 priv->fioclk = FIOCLK; in uniphier_fi2c_probe()
118 ret = reset_bus(priv->regs); in uniphier_fi2c_probe()
122 writel(I2C_BRST_FOEN | I2C_BRST_RSCLO, &priv->regs->brst); in uniphier_fi2c_probe()
133 ret = readl_poll_timeout(&dev->regs->intr, irq, irq & flags, in wait_for_irq()
134 dev->timeout); in wait_for_irq()
159 writel(I2C_CR_MST | I2C_CR_STO, &dev->regs->cr); in issue_stop()
161 ret = check_device_busy(dev->regs); in issue_stop()
173 struct uniphier_fi2c_regs __iomem *regs = dev->regs; in uniphier_fi2c_transmit()
177 writel(I2C_DTTX_CMD | addr << 1, ®s->dttx); in uniphier_fi2c_transmit()
179 writel(irq_flags, ®s->ie); in uniphier_fi2c_transmit()
180 writel(irq_flags, ®s->ic); in uniphier_fi2c_transmit()
183 writel(I2C_CR_MST | I2C_CR_STA, ®s->cr); in uniphier_fi2c_transmit()
189 while (len--) { in uniphier_fi2c_transmit()
191 writel(*buf++, ®s->dttx); in uniphier_fi2c_transmit()
193 writel(irq_flags, ®s->ic); in uniphier_fi2c_transmit()
201 writel(irq_flags, ®s->ic); in uniphier_fi2c_transmit()
214 struct uniphier_fi2c_regs __iomem *regs = dev->regs; in uniphier_fi2c_receive()
225 writel(I2C_DTTX_CMD | I2C_DTTX_RD | addr << 1, ®s->dttx); in uniphier_fi2c_receive()
227 writel(0, ®s->rbc); in uniphier_fi2c_receive()
228 writel(irq_flags, ®s->ie); in uniphier_fi2c_receive()
229 writel(irq_flags, ®s->ic); in uniphier_fi2c_receive()
233 ®s->cr); in uniphier_fi2c_receive()
235 while (len--) { in uniphier_fi2c_receive()
240 *buf++ = readl(®s->dtrx); in uniphier_fi2c_receive()
241 debug("received %x\n", *(buf - 1)); in uniphier_fi2c_receive()
244 writel(I2C_CR_MST | I2C_CR_NACK, ®s->cr); in uniphier_fi2c_receive()
246 writel(irq_flags, ®s->ic); in uniphier_fi2c_receive()
250 writel(irq_flags, ®s->ic); in uniphier_fi2c_receive()
265 ret = check_device_busy(dev->regs); in uniphier_fi2c_xfer()
269 for (; nmsgs > 0; nmsgs--, msg++) { in uniphier_fi2c_xfer()
273 if (msg->flags & I2C_M_RD) in uniphier_fi2c_xfer()
274 ret = uniphier_fi2c_receive(dev, msg->addr, msg->len, in uniphier_fi2c_xfer()
275 msg->buf, &stop); in uniphier_fi2c_xfer()
277 ret = uniphier_fi2c_transmit(dev, msg->addr, msg->len, in uniphier_fi2c_xfer()
278 msg->buf, &stop); in uniphier_fi2c_xfer()
292 struct uniphier_fi2c_regs __iomem *regs = dev->regs; in uniphier_fi2c_set_bus_speed()
296 return -EINVAL; in uniphier_fi2c_set_bus_speed()
298 ret = check_device_busy(dev->regs); in uniphier_fi2c_set_bus_speed()
303 writel(I2C_BRST_RSCLO, ®s->brst); in uniphier_fi2c_set_bus_speed()
305 clk_count = dev->fioclk / speed; in uniphier_fi2c_set_bus_speed()
307 writel(clk_count, ®s->cyc); in uniphier_fi2c_set_bus_speed()
308 writel(clk_count / 2, ®s->lctl); in uniphier_fi2c_set_bus_speed()
309 writel(clk_count / 2, ®s->ssut); in uniphier_fi2c_set_bus_speed()
310 writel(clk_count / 16, ®s->dsut); in uniphier_fi2c_set_bus_speed()
312 writel(I2C_BRST_FOEN | I2C_BRST_RSCLO, ®s->brst); in uniphier_fi2c_set_bus_speed()
319 dev->timeout = 100000000L / speed; in uniphier_fi2c_set_bus_speed()
330 { .compatible = "socionext,uniphier-fi2c" },
335 .name = "uniphier-fi2c",