Lines Matching +full:stop +full:- +full:ack

1 // SPDX-License-Identifier: GPL-2.0+
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()
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()
90 udelay(priv->delay); in versatile_i2c_write_bit()
104 /* write byte without start/stop sequence */
114 /* read ACK */ in versatile_i2c_write_byte()
118 return nak; /* not a nack is an ack */ in versatile_i2c_write_byte()
122 u8 *byte, u8 ack) in versatile_i2c_read_byte() argument
132 versatile_i2c_write_bit(priv, ack); in versatile_i2c_read_byte()
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()
187 u8 ack; in versatile_i2c_message_xfer() local
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",