1c54473cbSPrzemyslaw Marczak /* 2c54473cbSPrzemyslaw Marczak * (C) Copyright 2015, Samsung Electronics 3c54473cbSPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com> 4c54473cbSPrzemyslaw Marczak * 5c54473cbSPrzemyslaw Marczak * This file is based on: drivers/i2c/soft-i2c.c, 6c54473cbSPrzemyslaw Marczak * with added driver-model support and code cleanup. 7c54473cbSPrzemyslaw Marczak */ 8c54473cbSPrzemyslaw Marczak #include <common.h> 9c54473cbSPrzemyslaw Marczak #include <errno.h> 10c54473cbSPrzemyslaw Marczak #include <dm.h> 11c54473cbSPrzemyslaw Marczak #include <i2c.h> 12c54473cbSPrzemyslaw Marczak #include <asm/gpio.h> 13c54473cbSPrzemyslaw Marczak 14c54473cbSPrzemyslaw Marczak #define DEFAULT_UDELAY 5 15c54473cbSPrzemyslaw Marczak #define RETRIES 0 16c54473cbSPrzemyslaw Marczak #define I2C_ACK 0 17c54473cbSPrzemyslaw Marczak #define I2C_NOACK 1 18c54473cbSPrzemyslaw Marczak 19c54473cbSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR; 20c54473cbSPrzemyslaw Marczak 21c54473cbSPrzemyslaw Marczak enum { 22c54473cbSPrzemyslaw Marczak PIN_SDA = 0, 23c54473cbSPrzemyslaw Marczak PIN_SCL, 24c54473cbSPrzemyslaw Marczak PIN_COUNT, 25c54473cbSPrzemyslaw Marczak }; 26c54473cbSPrzemyslaw Marczak 27c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus { 28c54473cbSPrzemyslaw Marczak /** 29c54473cbSPrzemyslaw Marczak * udelay - delay [us] between GPIO toggle operations, 30c54473cbSPrzemyslaw Marczak * which is 1/4 of I2C speed clock period. 31c54473cbSPrzemyslaw Marczak */ 32c54473cbSPrzemyslaw Marczak int udelay; 33c54473cbSPrzemyslaw Marczak /* sda, scl */ 34c54473cbSPrzemyslaw Marczak struct gpio_desc gpios[PIN_COUNT]; 35c54473cbSPrzemyslaw Marczak }; 36c54473cbSPrzemyslaw Marczak 37c54473cbSPrzemyslaw Marczak static int i2c_gpio_sda_get(struct gpio_desc *sda) 38c54473cbSPrzemyslaw Marczak { 39c54473cbSPrzemyslaw Marczak return dm_gpio_get_value(sda); 40c54473cbSPrzemyslaw Marczak } 41c54473cbSPrzemyslaw Marczak 42c54473cbSPrzemyslaw Marczak static void i2c_gpio_sda_set(struct gpio_desc *sda, int bit) 43c54473cbSPrzemyslaw Marczak { 4476382aa2SAxel Lin if (bit) 45c54473cbSPrzemyslaw Marczak dm_gpio_set_dir_flags(sda, GPIOD_IS_IN); 4676382aa2SAxel Lin else 47c54473cbSPrzemyslaw Marczak dm_gpio_set_dir_flags(sda, GPIOD_IS_OUT); 48c54473cbSPrzemyslaw Marczak } 49c54473cbSPrzemyslaw Marczak 50c54473cbSPrzemyslaw Marczak static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit) 51c54473cbSPrzemyslaw Marczak { 5276382aa2SAxel Lin ulong flags = GPIOD_IS_OUT; 5376382aa2SAxel Lin 5476382aa2SAxel Lin if (bit) 5576382aa2SAxel Lin flags |= GPIOD_IS_OUT_ACTIVE; 5676382aa2SAxel Lin dm_gpio_set_dir_flags(scl, flags); 57c54473cbSPrzemyslaw Marczak } 58c54473cbSPrzemyslaw Marczak 59c54473cbSPrzemyslaw Marczak static void i2c_gpio_write_bit(struct gpio_desc *scl, struct gpio_desc *sda, 60c54473cbSPrzemyslaw Marczak int delay, uchar bit) 61c54473cbSPrzemyslaw Marczak { 62c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 0); 63c54473cbSPrzemyslaw Marczak udelay(delay); 64c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, bit); 65c54473cbSPrzemyslaw Marczak udelay(delay); 66c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 1); 67c54473cbSPrzemyslaw Marczak udelay(2 * delay); 68c54473cbSPrzemyslaw Marczak } 69c54473cbSPrzemyslaw Marczak 70c54473cbSPrzemyslaw Marczak static int i2c_gpio_read_bit(struct gpio_desc *scl, struct gpio_desc *sda, 71c54473cbSPrzemyslaw Marczak int delay) 72c54473cbSPrzemyslaw Marczak { 73c54473cbSPrzemyslaw Marczak int value; 74c54473cbSPrzemyslaw Marczak 75c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 1); 76c54473cbSPrzemyslaw Marczak udelay(delay); 77c54473cbSPrzemyslaw Marczak value = i2c_gpio_sda_get(sda); 78c54473cbSPrzemyslaw Marczak udelay(delay); 79c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 0); 80c54473cbSPrzemyslaw Marczak udelay(2 * delay); 81c54473cbSPrzemyslaw Marczak 82c54473cbSPrzemyslaw Marczak return value; 83c54473cbSPrzemyslaw Marczak } 84c54473cbSPrzemyslaw Marczak 85c54473cbSPrzemyslaw Marczak /* START: High -> Low on SDA while SCL is High */ 86c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_start(struct gpio_desc *scl, struct gpio_desc *sda, 87c54473cbSPrzemyslaw Marczak int delay) 88c54473cbSPrzemyslaw Marczak { 89c54473cbSPrzemyslaw Marczak udelay(delay); 90c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, 1); 91c54473cbSPrzemyslaw Marczak udelay(delay); 92c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 1); 93c54473cbSPrzemyslaw Marczak udelay(delay); 94c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, 0); 95c54473cbSPrzemyslaw Marczak udelay(delay); 96c54473cbSPrzemyslaw Marczak } 97c54473cbSPrzemyslaw Marczak 98c54473cbSPrzemyslaw Marczak /* STOP: Low -> High on SDA while SCL is High */ 99c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_stop(struct gpio_desc *scl, struct gpio_desc *sda, 100c54473cbSPrzemyslaw Marczak int delay) 101c54473cbSPrzemyslaw Marczak { 102c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 0); 103c54473cbSPrzemyslaw Marczak udelay(delay); 104c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, 0); 105c54473cbSPrzemyslaw Marczak udelay(delay); 106c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 1); 107c54473cbSPrzemyslaw Marczak udelay(delay); 108c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, 1); 109c54473cbSPrzemyslaw Marczak udelay(delay); 110c54473cbSPrzemyslaw Marczak } 111c54473cbSPrzemyslaw Marczak 112c54473cbSPrzemyslaw Marczak /* ack should be I2C_ACK or I2C_NOACK */ 113c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_ack(struct gpio_desc *scl, struct gpio_desc *sda, 114c54473cbSPrzemyslaw Marczak int delay, int ack) 115c54473cbSPrzemyslaw Marczak { 116c54473cbSPrzemyslaw Marczak i2c_gpio_write_bit(scl, sda, delay, ack); 117c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 0); 118c54473cbSPrzemyslaw Marczak udelay(delay); 119c54473cbSPrzemyslaw Marczak } 120c54473cbSPrzemyslaw Marczak 121c54473cbSPrzemyslaw Marczak /** 122c54473cbSPrzemyslaw Marczak * Send a reset sequence consisting of 9 clocks with the data signal high 123c54473cbSPrzemyslaw Marczak * to clock any confused device back into an idle state. Also send a 124c54473cbSPrzemyslaw Marczak * <stop> at the end of the sequence for belts & suspenders. 125c54473cbSPrzemyslaw Marczak */ 126c54473cbSPrzemyslaw Marczak static void i2c_gpio_send_reset(struct gpio_desc *scl, struct gpio_desc *sda, 127c54473cbSPrzemyslaw Marczak int delay) 128c54473cbSPrzemyslaw Marczak { 129c54473cbSPrzemyslaw Marczak int j; 130c54473cbSPrzemyslaw Marczak 131c54473cbSPrzemyslaw Marczak for (j = 0; j < 9; j++) 132c54473cbSPrzemyslaw Marczak i2c_gpio_write_bit(scl, sda, delay, 1); 133c54473cbSPrzemyslaw Marczak 134c54473cbSPrzemyslaw Marczak i2c_gpio_send_stop(scl, sda, delay); 135c54473cbSPrzemyslaw Marczak } 136c54473cbSPrzemyslaw Marczak 137c54473cbSPrzemyslaw Marczak /* Set sda high with low clock, before reading slave data */ 138c54473cbSPrzemyslaw Marczak static void i2c_gpio_sda_high(struct gpio_desc *scl, struct gpio_desc *sda, 139c54473cbSPrzemyslaw Marczak int delay) 140c54473cbSPrzemyslaw Marczak { 141c54473cbSPrzemyslaw Marczak i2c_gpio_scl_set(scl, 0); 142c54473cbSPrzemyslaw Marczak udelay(delay); 143c54473cbSPrzemyslaw Marczak i2c_gpio_sda_set(sda, 1); 144c54473cbSPrzemyslaw Marczak udelay(delay); 145c54473cbSPrzemyslaw Marczak } 146c54473cbSPrzemyslaw Marczak 147c54473cbSPrzemyslaw Marczak /* Send 8 bits and look for an acknowledgement */ 148c54473cbSPrzemyslaw Marczak static int i2c_gpio_write_byte(struct gpio_desc *scl, struct gpio_desc *sda, 149c54473cbSPrzemyslaw Marczak int delay, uchar data) 150c54473cbSPrzemyslaw Marczak { 151c54473cbSPrzemyslaw Marczak int j; 152c54473cbSPrzemyslaw Marczak int nack; 153c54473cbSPrzemyslaw Marczak 154c54473cbSPrzemyslaw Marczak for (j = 0; j < 8; j++) { 155c54473cbSPrzemyslaw Marczak i2c_gpio_write_bit(scl, sda, delay, data & 0x80); 156c54473cbSPrzemyslaw Marczak data <<= 1; 157c54473cbSPrzemyslaw Marczak } 158c54473cbSPrzemyslaw Marczak 159c54473cbSPrzemyslaw Marczak udelay(delay); 160c54473cbSPrzemyslaw Marczak 161c54473cbSPrzemyslaw Marczak /* Look for an <ACK>(negative logic) and return it */ 162c54473cbSPrzemyslaw Marczak i2c_gpio_sda_high(scl, sda, delay); 163c54473cbSPrzemyslaw Marczak nack = i2c_gpio_read_bit(scl, sda, delay); 164c54473cbSPrzemyslaw Marczak 165c54473cbSPrzemyslaw Marczak return nack; /* not a nack is an ack */ 166c54473cbSPrzemyslaw Marczak } 167c54473cbSPrzemyslaw Marczak 168c54473cbSPrzemyslaw Marczak /** 169c54473cbSPrzemyslaw Marczak * if ack == I2C_ACK, ACK the byte so can continue reading, else 170c54473cbSPrzemyslaw Marczak * send I2C_NOACK to end the read. 171c54473cbSPrzemyslaw Marczak */ 172c54473cbSPrzemyslaw Marczak static uchar i2c_gpio_read_byte(struct gpio_desc *scl, struct gpio_desc *sda, 173c54473cbSPrzemyslaw Marczak int delay, int ack) 174c54473cbSPrzemyslaw Marczak { 175c54473cbSPrzemyslaw Marczak int data; 176c54473cbSPrzemyslaw Marczak int j; 177c54473cbSPrzemyslaw Marczak 178c54473cbSPrzemyslaw Marczak i2c_gpio_sda_high(scl, sda, delay); 179c54473cbSPrzemyslaw Marczak data = 0; 180c54473cbSPrzemyslaw Marczak for (j = 0; j < 8; j++) { 181c54473cbSPrzemyslaw Marczak data <<= 1; 182c54473cbSPrzemyslaw Marczak data |= i2c_gpio_read_bit(scl, sda, delay); 183c54473cbSPrzemyslaw Marczak } 184c54473cbSPrzemyslaw Marczak i2c_gpio_send_ack(scl, sda, delay, ack); 185c54473cbSPrzemyslaw Marczak 186c54473cbSPrzemyslaw Marczak return data; 187c54473cbSPrzemyslaw Marczak } 188c54473cbSPrzemyslaw Marczak 189c54473cbSPrzemyslaw Marczak /* send start and the slave chip address */ 190c54473cbSPrzemyslaw Marczak int i2c_send_slave_addr(struct gpio_desc *scl, struct gpio_desc *sda, int delay, 191c54473cbSPrzemyslaw Marczak uchar chip) 192c54473cbSPrzemyslaw Marczak { 193c54473cbSPrzemyslaw Marczak i2c_gpio_send_start(scl, sda, delay); 194c54473cbSPrzemyslaw Marczak 195c54473cbSPrzemyslaw Marczak if (i2c_gpio_write_byte(scl, sda, delay, chip)) { 196c54473cbSPrzemyslaw Marczak i2c_gpio_send_stop(scl, sda, delay); 197c54473cbSPrzemyslaw Marczak return -EIO; 198c54473cbSPrzemyslaw Marczak } 199c54473cbSPrzemyslaw Marczak 200c54473cbSPrzemyslaw Marczak return 0; 201c54473cbSPrzemyslaw Marczak } 202c54473cbSPrzemyslaw Marczak 203c54473cbSPrzemyslaw Marczak static int i2c_gpio_write_data(struct i2c_gpio_bus *bus, uchar chip, 204c54473cbSPrzemyslaw Marczak uchar *buffer, int len, 205c54473cbSPrzemyslaw Marczak bool end_with_repeated_start) 206c54473cbSPrzemyslaw Marczak { 207c54473cbSPrzemyslaw Marczak struct gpio_desc *scl = &bus->gpios[PIN_SCL]; 208c54473cbSPrzemyslaw Marczak struct gpio_desc *sda = &bus->gpios[PIN_SDA]; 209c54473cbSPrzemyslaw Marczak unsigned int delay = bus->udelay; 210c54473cbSPrzemyslaw Marczak int failures = 0; 211c54473cbSPrzemyslaw Marczak 212c54473cbSPrzemyslaw Marczak debug("%s: chip %x buffer %p len %d\n", __func__, chip, buffer, len); 213c54473cbSPrzemyslaw Marczak 214c54473cbSPrzemyslaw Marczak if (i2c_send_slave_addr(scl, sda, delay, chip << 1)) { 215c54473cbSPrzemyslaw Marczak debug("i2c_write, no chip responded %02X\n", chip); 216c54473cbSPrzemyslaw Marczak return -EIO; 217c54473cbSPrzemyslaw Marczak } 218c54473cbSPrzemyslaw Marczak 219c54473cbSPrzemyslaw Marczak while (len-- > 0) { 220c54473cbSPrzemyslaw Marczak if (i2c_gpio_write_byte(scl, sda, delay, *buffer++)) 221c54473cbSPrzemyslaw Marczak failures++; 222c54473cbSPrzemyslaw Marczak } 223c54473cbSPrzemyslaw Marczak 224c54473cbSPrzemyslaw Marczak if (!end_with_repeated_start) { 225c54473cbSPrzemyslaw Marczak i2c_gpio_send_stop(scl, sda, delay); 226c54473cbSPrzemyslaw Marczak return failures; 227c54473cbSPrzemyslaw Marczak } 228c54473cbSPrzemyslaw Marczak 229c54473cbSPrzemyslaw Marczak if (i2c_send_slave_addr(scl, sda, delay, (chip << 1) | 0x1)) { 230c54473cbSPrzemyslaw Marczak debug("i2c_write, no chip responded %02X\n", chip); 231c54473cbSPrzemyslaw Marczak return -EIO; 232c54473cbSPrzemyslaw Marczak } 233c54473cbSPrzemyslaw Marczak 234c54473cbSPrzemyslaw Marczak return failures; 235c54473cbSPrzemyslaw Marczak } 236c54473cbSPrzemyslaw Marczak 237c54473cbSPrzemyslaw Marczak static int i2c_gpio_read_data(struct i2c_gpio_bus *bus, uchar chip, 238c54473cbSPrzemyslaw Marczak uchar *buffer, int len) 239c54473cbSPrzemyslaw Marczak { 240c54473cbSPrzemyslaw Marczak struct gpio_desc *scl = &bus->gpios[PIN_SCL]; 241c54473cbSPrzemyslaw Marczak struct gpio_desc *sda = &bus->gpios[PIN_SDA]; 242c54473cbSPrzemyslaw Marczak unsigned int delay = bus->udelay; 243c54473cbSPrzemyslaw Marczak 244c54473cbSPrzemyslaw Marczak debug("%s: chip %x buffer: %p len %d\n", __func__, chip, buffer, len); 245c54473cbSPrzemyslaw Marczak 246c54473cbSPrzemyslaw Marczak while (len-- > 0) 247c54473cbSPrzemyslaw Marczak *buffer++ = i2c_gpio_read_byte(scl, sda, delay, len == 0); 248c54473cbSPrzemyslaw Marczak 249c54473cbSPrzemyslaw Marczak i2c_gpio_send_stop(scl, sda, delay); 250c54473cbSPrzemyslaw Marczak 251c54473cbSPrzemyslaw Marczak return 0; 252c54473cbSPrzemyslaw Marczak } 253c54473cbSPrzemyslaw Marczak 254c54473cbSPrzemyslaw Marczak static int i2c_gpio_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs) 255c54473cbSPrzemyslaw Marczak { 256c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus *bus = dev_get_priv(dev); 257c54473cbSPrzemyslaw Marczak int ret; 258c54473cbSPrzemyslaw Marczak 259c54473cbSPrzemyslaw Marczak for (; nmsgs > 0; nmsgs--, msg++) { 260c54473cbSPrzemyslaw Marczak bool next_is_read = nmsgs > 1 && (msg[1].flags & I2C_M_RD); 261c54473cbSPrzemyslaw Marczak 262c54473cbSPrzemyslaw Marczak if (msg->flags & I2C_M_RD) { 263c54473cbSPrzemyslaw Marczak ret = i2c_gpio_read_data(bus, msg->addr, msg->buf, 264c54473cbSPrzemyslaw Marczak msg->len); 265c54473cbSPrzemyslaw Marczak } else { 266c54473cbSPrzemyslaw Marczak ret = i2c_gpio_write_data(bus, msg->addr, msg->buf, 267c54473cbSPrzemyslaw Marczak msg->len, next_is_read); 268c54473cbSPrzemyslaw Marczak } 269c54473cbSPrzemyslaw Marczak 270c54473cbSPrzemyslaw Marczak if (ret) 271c54473cbSPrzemyslaw Marczak return -EREMOTEIO; 272c54473cbSPrzemyslaw Marczak } 273c54473cbSPrzemyslaw Marczak 274c54473cbSPrzemyslaw Marczak return 0; 275c54473cbSPrzemyslaw Marczak } 276c54473cbSPrzemyslaw Marczak 277c54473cbSPrzemyslaw Marczak static int i2c_gpio_probe(struct udevice *dev, uint chip, uint chip_flags) 278c54473cbSPrzemyslaw Marczak { 279c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus *bus = dev_get_priv(dev); 280c54473cbSPrzemyslaw Marczak struct gpio_desc *scl = &bus->gpios[PIN_SCL]; 281c54473cbSPrzemyslaw Marczak struct gpio_desc *sda = &bus->gpios[PIN_SDA]; 282c54473cbSPrzemyslaw Marczak unsigned int delay = bus->udelay; 283c54473cbSPrzemyslaw Marczak int ret; 284c54473cbSPrzemyslaw Marczak 285c54473cbSPrzemyslaw Marczak i2c_gpio_send_start(scl, sda, delay); 286c54473cbSPrzemyslaw Marczak ret = i2c_gpio_write_byte(scl, sda, delay, (chip << 1) | 0); 287c54473cbSPrzemyslaw Marczak i2c_gpio_send_stop(scl, sda, delay); 288c54473cbSPrzemyslaw Marczak 289c54473cbSPrzemyslaw Marczak debug("%s: bus: %d (%s) chip: %x flags: %x ret: %d\n", 290c54473cbSPrzemyslaw Marczak __func__, dev->seq, dev->name, chip, chip_flags, ret); 291c54473cbSPrzemyslaw Marczak 292c54473cbSPrzemyslaw Marczak return ret; 293c54473cbSPrzemyslaw Marczak } 294c54473cbSPrzemyslaw Marczak 295c54473cbSPrzemyslaw Marczak static int i2c_gpio_set_bus_speed(struct udevice *dev, unsigned int speed_hz) 296c54473cbSPrzemyslaw Marczak { 297c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus *bus = dev_get_priv(dev); 298c54473cbSPrzemyslaw Marczak struct gpio_desc *scl = &bus->gpios[PIN_SCL]; 299c54473cbSPrzemyslaw Marczak struct gpio_desc *sda = &bus->gpios[PIN_SDA]; 300c54473cbSPrzemyslaw Marczak 301c54473cbSPrzemyslaw Marczak bus->udelay = 1000000 / (speed_hz << 2); 302c54473cbSPrzemyslaw Marczak 303c54473cbSPrzemyslaw Marczak i2c_gpio_send_reset(scl, sda, bus->udelay); 304c54473cbSPrzemyslaw Marczak 305c54473cbSPrzemyslaw Marczak return 0; 306c54473cbSPrzemyslaw Marczak } 307c54473cbSPrzemyslaw Marczak 308c54473cbSPrzemyslaw Marczak static int i2c_gpio_ofdata_to_platdata(struct udevice *dev) 309c54473cbSPrzemyslaw Marczak { 310c54473cbSPrzemyslaw Marczak struct i2c_gpio_bus *bus = dev_get_priv(dev); 311c54473cbSPrzemyslaw Marczak const void *blob = gd->fdt_blob; 312*e160f7d4SSimon Glass int node = dev_of_offset(dev); 313c54473cbSPrzemyslaw Marczak int ret; 314c54473cbSPrzemyslaw Marczak 315c54473cbSPrzemyslaw Marczak ret = gpio_request_list_by_name(dev, "gpios", bus->gpios, 316c54473cbSPrzemyslaw Marczak ARRAY_SIZE(bus->gpios), 0); 317c54473cbSPrzemyslaw Marczak if (ret < 0) 318c54473cbSPrzemyslaw Marczak goto error; 319c54473cbSPrzemyslaw Marczak 320c54473cbSPrzemyslaw Marczak bus->udelay = fdtdec_get_int(blob, node, "i2c-gpio,delay-us", 321c54473cbSPrzemyslaw Marczak DEFAULT_UDELAY); 322c54473cbSPrzemyslaw Marczak 323c54473cbSPrzemyslaw Marczak return 0; 324c54473cbSPrzemyslaw Marczak error: 325c54473cbSPrzemyslaw Marczak error("Can't get %s gpios! Error: %d", dev->name, ret); 326c54473cbSPrzemyslaw Marczak return ret; 327c54473cbSPrzemyslaw Marczak } 328c54473cbSPrzemyslaw Marczak 329c54473cbSPrzemyslaw Marczak static const struct dm_i2c_ops i2c_gpio_ops = { 330c54473cbSPrzemyslaw Marczak .xfer = i2c_gpio_xfer, 331c54473cbSPrzemyslaw Marczak .probe_chip = i2c_gpio_probe, 332c54473cbSPrzemyslaw Marczak .set_bus_speed = i2c_gpio_set_bus_speed, 333c54473cbSPrzemyslaw Marczak }; 334c54473cbSPrzemyslaw Marczak 335c54473cbSPrzemyslaw Marczak static const struct udevice_id i2c_gpio_ids[] = { 336c54473cbSPrzemyslaw Marczak { .compatible = "i2c-gpio" }, 337c54473cbSPrzemyslaw Marczak { } 338c54473cbSPrzemyslaw Marczak }; 339c54473cbSPrzemyslaw Marczak 340c54473cbSPrzemyslaw Marczak U_BOOT_DRIVER(i2c_gpio) = { 341c54473cbSPrzemyslaw Marczak .name = "i2c-gpio", 342c54473cbSPrzemyslaw Marczak .id = UCLASS_I2C, 343c54473cbSPrzemyslaw Marczak .of_match = i2c_gpio_ids, 344c54473cbSPrzemyslaw Marczak .ofdata_to_platdata = i2c_gpio_ofdata_to_platdata, 345c54473cbSPrzemyslaw Marczak .priv_auto_alloc_size = sizeof(struct i2c_gpio_bus), 346c54473cbSPrzemyslaw Marczak .ops = &i2c_gpio_ops, 347c54473cbSPrzemyslaw Marczak }; 348