Lines Matching +full:i2c +full:- +full:sda +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0+
11 #include <i2c.h>
21 #define SDA BIT(1) macro
25 u32 delay; member
30 writel(SDA, priv->base + (state ? I2C_SET_REG : I2C_CLEAR_REG)); in versatile_sda_set()
31 udelay(priv->delay); in versatile_sda_set()
36 int v = !!(readl(priv->base + I2C_CONTROL_REG) & SDA); in versatile_sda_get()
38 udelay(priv->delay); in versatile_sda_get()
44 writel(SCL, priv->base + (state ? I2C_SET_REG : I2C_CLEAR_REG)); in versatile_scl_set()
45 udelay(priv->delay); in versatile_scl_set()
50 int v = !!(readl(priv->base + I2C_CONTROL_REG) & SCL); in versatile_scl_get()
52 udelay(priv->delay); in versatile_scl_get()
56 /* start: SDA goes from high to low while SCL is high */
59 udelay(priv->delay); in versatile_i2c_start()
65 /* stop: SDA goes from low to high while SCL is high */
74 /* read a bit from the SDA line (data or ACK/NACK) */
80 udelay(priv->delay); in versatile_i2c_read_bit()
84 /* write a bit on the SDA line */
90 udelay(priv->delay); in versatile_i2c_write_bit()
93 /* send a reset sequence of 9 clocks with SDA high */
143 if (msg->flags & I2C_M_TEN) { in versatile_i2c_send_slave_addr()
144 /* 10-bit address, send extended address code first */ in versatile_i2c_send_slave_addr()
145 addr = 0xf0 | ((msg->addr >> 7) & 0x06); in versatile_i2c_send_slave_addr()
149 return -EIO; in versatile_i2c_send_slave_addr()
153 ret = versatile_i2c_write_byte(priv, msg->addr & 0xff); in versatile_i2c_send_slave_addr()
156 return -EIO; in versatile_i2c_send_slave_addr()
159 if (msg->flags & I2C_M_RD) { in versatile_i2c_send_slave_addr()
165 return -EIO; in versatile_i2c_send_slave_addr()
169 /* normal 7-bit address */ in versatile_i2c_send_slave_addr()
170 addr = msg->addr << 1; in versatile_i2c_send_slave_addr()
171 if (msg->flags & I2C_M_RD) in versatile_i2c_send_slave_addr()
176 return -EIO; in versatile_i2c_send_slave_addr()
191 return -EIO; in versatile_i2c_message_xfer()
193 for (i = 0; i < msg->len; i++) { in versatile_i2c_message_xfer()
194 if (msg->flags & I2C_M_RD) { in versatile_i2c_message_xfer()
195 ack = (msg->len - i - 1) == 0 ? 1 : 0; in versatile_i2c_message_xfer()
196 ret = versatile_i2c_read_byte(priv, &msg->buf[i], ack); in versatile_i2c_message_xfer()
198 ret = versatile_i2c_write_byte(priv, msg->buf[i]); in versatile_i2c_message_xfer()
216 for ( ; nmsgs > 0; nmsgs--, msg++) { in versatile_i2c_xfer()
219 return -EREMOTEIO; in versatile_i2c_xfer()
228 /* probe the presence of a slave by writing a 0-size message */ in versatile_i2c_chip_probe()
240 priv->delay = 1000000 / (speed << 2); in versatile_i2c_set_bus_speed()
251 priv->base = (phys_addr_t)dev_read_addr(dev); in versatile_i2c_probe()
252 priv->delay = 25; /* 25us * 4 = 100kHz */ in versatile_i2c_probe()
254 * U-Boot still doesn't assign automatically in versatile_i2c_probe()
257 dev->req_seq = 1; in versatile_i2c_probe()
269 { .compatible = "arm,versatile-i2c" },
274 .name = "i2c-bus-versatile",