1fdec2d21SMoritz Fischer /* 2fdec2d21SMoritz Fischer * Copyright (C) 2015 Moritz Fischer <moritz.fischer@ettus.com> 3fdec2d21SMoritz Fischer * IP from Cadence (ID T-CS-PE-0007-100, Version R1p10f2) 4fdec2d21SMoritz Fischer * 5fdec2d21SMoritz Fischer * This file is based on: drivers/i2c/zynq_i2c.c, 6fdec2d21SMoritz Fischer * with added driver-model support and code cleanup. 7fdec2d21SMoritz Fischer * 8fdec2d21SMoritz Fischer * SPDX-License-Identifier: GPL-2.0+ 9fdec2d21SMoritz Fischer */ 10fdec2d21SMoritz Fischer 11fdec2d21SMoritz Fischer #include <common.h> 12fdec2d21SMoritz Fischer #include <linux/types.h> 13fdec2d21SMoritz Fischer #include <linux/io.h> 14fdec2d21SMoritz Fischer #include <asm/errno.h> 15fdec2d21SMoritz Fischer #include <dm/device.h> 16fdec2d21SMoritz Fischer #include <dm/root.h> 17fdec2d21SMoritz Fischer #include <i2c.h> 18fdec2d21SMoritz Fischer #include <fdtdec.h> 19fdec2d21SMoritz Fischer #include <mapmem.h> 20fdec2d21SMoritz Fischer 21fdec2d21SMoritz Fischer DECLARE_GLOBAL_DATA_PTR; 22fdec2d21SMoritz Fischer 23fdec2d21SMoritz Fischer /* i2c register set */ 24fdec2d21SMoritz Fischer struct cdns_i2c_regs { 25fdec2d21SMoritz Fischer u32 control; 26fdec2d21SMoritz Fischer u32 status; 27fdec2d21SMoritz Fischer u32 address; 28fdec2d21SMoritz Fischer u32 data; 29fdec2d21SMoritz Fischer u32 interrupt_status; 30fdec2d21SMoritz Fischer u32 transfer_size; 31fdec2d21SMoritz Fischer u32 slave_mon_pause; 32fdec2d21SMoritz Fischer u32 time_out; 33fdec2d21SMoritz Fischer u32 interrupt_mask; 34fdec2d21SMoritz Fischer u32 interrupt_enable; 35fdec2d21SMoritz Fischer u32 interrupt_disable; 36fdec2d21SMoritz Fischer }; 37fdec2d21SMoritz Fischer 38fdec2d21SMoritz Fischer /* Control register fields */ 39fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_RW 0x00000001 40fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_MS 0x00000002 41fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_NEA 0x00000004 42fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_ACKEN 0x00000008 43fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_HOLD 0x00000010 44fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_SLVMON 0x00000020 45fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_CLR_FIFO 0x00000040 46fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_DIV_B_SHIFT 8 47fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_DIV_B_MASK 0x00003F00 48fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_DIV_A_SHIFT 14 49fdec2d21SMoritz Fischer #define CDNS_I2C_CONTROL_DIV_A_MASK 0x0000C000 50fdec2d21SMoritz Fischer 51fdec2d21SMoritz Fischer /* Status register values */ 52fdec2d21SMoritz Fischer #define CDNS_I2C_STATUS_RXDV 0x00000020 53fdec2d21SMoritz Fischer #define CDNS_I2C_STATUS_TXDV 0x00000040 54fdec2d21SMoritz Fischer #define CDNS_I2C_STATUS_RXOVF 0x00000080 55fdec2d21SMoritz Fischer #define CDNS_I2C_STATUS_BA 0x00000100 56fdec2d21SMoritz Fischer 57fdec2d21SMoritz Fischer /* Interrupt register fields */ 58fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_COMP 0x00000001 59fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_DATA 0x00000002 60fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_NACK 0x00000004 61fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_TO 0x00000008 62fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_SLVRDY 0x00000010 63fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_RXOVF 0x00000020 64fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_TXOVF 0x00000040 65fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_RXUNF 0x00000080 66fdec2d21SMoritz Fischer #define CDNS_I2C_INTERRUPT_ARBLOST 0x00000200 67fdec2d21SMoritz Fischer 68fdec2d21SMoritz Fischer #define CDNS_I2C_FIFO_DEPTH 16 69fdec2d21SMoritz Fischer #define CDNS_I2C_TRANSFER_SIZE_MAX 255 /* Controller transfer limit */ 70fdec2d21SMoritz Fischer 71fdec2d21SMoritz Fischer #ifdef DEBUG 72fdec2d21SMoritz Fischer static void cdns_i2c_debug_status(struct cdns_i2c_regs *cdns_i2c) 73fdec2d21SMoritz Fischer { 74fdec2d21SMoritz Fischer int int_status; 75fdec2d21SMoritz Fischer int status; 76fdec2d21SMoritz Fischer int_status = readl(&cdns_i2c->interrupt_status); 77fdec2d21SMoritz Fischer 78fdec2d21SMoritz Fischer status = readl(&cdns_i2c->status); 79fdec2d21SMoritz Fischer if (int_status || status) { 80fdec2d21SMoritz Fischer debug("Status: "); 81fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_COMP) 82fdec2d21SMoritz Fischer debug("COMP "); 83fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_DATA) 84fdec2d21SMoritz Fischer debug("DATA "); 85fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_NACK) 86fdec2d21SMoritz Fischer debug("NACK "); 87fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_TO) 88fdec2d21SMoritz Fischer debug("TO "); 89fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_SLVRDY) 90fdec2d21SMoritz Fischer debug("SLVRDY "); 91fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_RXOVF) 92fdec2d21SMoritz Fischer debug("RXOVF "); 93fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_TXOVF) 94fdec2d21SMoritz Fischer debug("TXOVF "); 95fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_RXUNF) 96fdec2d21SMoritz Fischer debug("RXUNF "); 97fdec2d21SMoritz Fischer if (int_status & CDNS_I2C_INTERRUPT_ARBLOST) 98fdec2d21SMoritz Fischer debug("ARBLOST "); 99fdec2d21SMoritz Fischer if (status & CDNS_I2C_STATUS_RXDV) 100fdec2d21SMoritz Fischer debug("RXDV "); 101fdec2d21SMoritz Fischer if (status & CDNS_I2C_STATUS_TXDV) 102fdec2d21SMoritz Fischer debug("TXDV "); 103fdec2d21SMoritz Fischer if (status & CDNS_I2C_STATUS_RXOVF) 104fdec2d21SMoritz Fischer debug("RXOVF "); 105fdec2d21SMoritz Fischer if (status & CDNS_I2C_STATUS_BA) 106fdec2d21SMoritz Fischer debug("BA "); 107fdec2d21SMoritz Fischer debug("TS%d ", readl(&cdns_i2c->transfer_size)); 108fdec2d21SMoritz Fischer debug("\n"); 109fdec2d21SMoritz Fischer } 110fdec2d21SMoritz Fischer } 111fdec2d21SMoritz Fischer #endif 112fdec2d21SMoritz Fischer 113fdec2d21SMoritz Fischer struct i2c_cdns_bus { 114fdec2d21SMoritz Fischer int id; 115fdec2d21SMoritz Fischer struct cdns_i2c_regs __iomem *regs; /* register base */ 116fdec2d21SMoritz Fischer }; 117fdec2d21SMoritz Fischer 118fdec2d21SMoritz Fischer 119fdec2d21SMoritz Fischer /** cdns_i2c_probe() - Probe method 120fdec2d21SMoritz Fischer * @dev: udevice pointer 121fdec2d21SMoritz Fischer * 122fdec2d21SMoritz Fischer * DM callback called when device is probed 123fdec2d21SMoritz Fischer */ 124fdec2d21SMoritz Fischer static int cdns_i2c_probe(struct udevice *dev) 125fdec2d21SMoritz Fischer { 126fdec2d21SMoritz Fischer struct i2c_cdns_bus *bus = dev_get_priv(dev); 127fdec2d21SMoritz Fischer 128fdec2d21SMoritz Fischer /* TODO: Calculate dividers based on CPU_CLK_1X */ 129fdec2d21SMoritz Fischer /* 111MHz / ( (3 * 17) * 22 ) = ~100KHz */ 130fdec2d21SMoritz Fischer writel((16 << CDNS_I2C_CONTROL_DIV_B_SHIFT) | 131fdec2d21SMoritz Fischer (2 << CDNS_I2C_CONTROL_DIV_A_SHIFT), &bus->regs->control); 132fdec2d21SMoritz Fischer 133fdec2d21SMoritz Fischer /* Enable master mode, ack, and 7-bit addressing */ 134fdec2d21SMoritz Fischer setbits_le32(&bus->regs->control, CDNS_I2C_CONTROL_MS | 135fdec2d21SMoritz Fischer CDNS_I2C_CONTROL_ACKEN | CDNS_I2C_CONTROL_NEA); 136fdec2d21SMoritz Fischer 137fdec2d21SMoritz Fischer debug("%s bus %d at %p\n", __func__, dev->seq, bus->regs); 138fdec2d21SMoritz Fischer 139fdec2d21SMoritz Fischer return 0; 140fdec2d21SMoritz Fischer } 141fdec2d21SMoritz Fischer 142fdec2d21SMoritz Fischer static int cdns_i2c_remove(struct udevice *dev) 143fdec2d21SMoritz Fischer { 144fdec2d21SMoritz Fischer struct i2c_cdns_bus *bus = dev_get_priv(dev); 145fdec2d21SMoritz Fischer 146fdec2d21SMoritz Fischer debug("%s bus %d at %p\n", __func__, dev->seq, bus->regs); 147fdec2d21SMoritz Fischer 148fdec2d21SMoritz Fischer unmap_sysmem(bus->regs); 149fdec2d21SMoritz Fischer 150fdec2d21SMoritz Fischer return 0; 151fdec2d21SMoritz Fischer } 152fdec2d21SMoritz Fischer 153fdec2d21SMoritz Fischer /* Wait for an interrupt */ 154fdec2d21SMoritz Fischer static u32 cdns_i2c_wait(struct cdns_i2c_regs *cdns_i2c, u32 mask) 155fdec2d21SMoritz Fischer { 156fdec2d21SMoritz Fischer int timeout, int_status; 157fdec2d21SMoritz Fischer 158fdec2d21SMoritz Fischer for (timeout = 0; timeout < 100; timeout++) { 159fdec2d21SMoritz Fischer udelay(100); 160fdec2d21SMoritz Fischer int_status = readl(&cdns_i2c->interrupt_status); 161fdec2d21SMoritz Fischer if (int_status & mask) 162fdec2d21SMoritz Fischer break; 163fdec2d21SMoritz Fischer } 164fdec2d21SMoritz Fischer 165fdec2d21SMoritz Fischer /* Clear interrupt status flags */ 166fdec2d21SMoritz Fischer writel(int_status & mask, &cdns_i2c->interrupt_status); 167fdec2d21SMoritz Fischer 168fdec2d21SMoritz Fischer return int_status & mask; 169fdec2d21SMoritz Fischer } 170fdec2d21SMoritz Fischer 171fdec2d21SMoritz Fischer static int cdns_i2c_set_bus_speed(struct udevice *dev, unsigned int speed) 172fdec2d21SMoritz Fischer { 173fdec2d21SMoritz Fischer if (speed != 100000) { 174fdec2d21SMoritz Fischer printf("%s, failed to set clock speed to %u\n", __func__, 175fdec2d21SMoritz Fischer speed); 176fdec2d21SMoritz Fischer return -EINVAL; 177fdec2d21SMoritz Fischer } 178fdec2d21SMoritz Fischer 179fdec2d21SMoritz Fischer return 0; 180fdec2d21SMoritz Fischer } 181fdec2d21SMoritz Fischer 182fdec2d21SMoritz Fischer /* Probe to see if a chip is present. */ 183fdec2d21SMoritz Fischer static int cdns_i2c_probe_chip(struct udevice *bus, uint chip_addr, 184fdec2d21SMoritz Fischer uint chip_flags) 185fdec2d21SMoritz Fischer { 186fdec2d21SMoritz Fischer struct i2c_cdns_bus *i2c_bus = dev_get_priv(bus); 187fdec2d21SMoritz Fischer struct cdns_i2c_regs *regs = i2c_bus->regs; 188fdec2d21SMoritz Fischer 189fdec2d21SMoritz Fischer /* Attempt to read a byte */ 190fdec2d21SMoritz Fischer setbits_le32(®s->control, CDNS_I2C_CONTROL_CLR_FIFO | 191fdec2d21SMoritz Fischer CDNS_I2C_CONTROL_RW); 192fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_HOLD); 193fdec2d21SMoritz Fischer writel(0xFF, ®s->interrupt_status); 194fdec2d21SMoritz Fischer writel(chip_addr, ®s->address); 195fdec2d21SMoritz Fischer writel(1, ®s->transfer_size); 196fdec2d21SMoritz Fischer 197fdec2d21SMoritz Fischer return (cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP | 198fdec2d21SMoritz Fischer CDNS_I2C_INTERRUPT_NACK) & 199fdec2d21SMoritz Fischer CDNS_I2C_INTERRUPT_COMP) ? 0 : -ETIMEDOUT; 200fdec2d21SMoritz Fischer } 201fdec2d21SMoritz Fischer 202fdec2d21SMoritz Fischer static int cdns_i2c_write_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data, 203fdec2d21SMoritz Fischer u32 len, bool next_is_read) 204fdec2d21SMoritz Fischer { 205fdec2d21SMoritz Fischer u8 *cur_data = data; 206fdec2d21SMoritz Fischer 207fdec2d21SMoritz Fischer struct cdns_i2c_regs *regs = i2c_bus->regs; 208fdec2d21SMoritz Fischer 209fdec2d21SMoritz Fischer setbits_le32(®s->control, CDNS_I2C_CONTROL_CLR_FIFO | 210fdec2d21SMoritz Fischer CDNS_I2C_CONTROL_HOLD); 211fdec2d21SMoritz Fischer 212fdec2d21SMoritz Fischer /* if next is a read, we need to clear HOLD, doesn't work */ 213fdec2d21SMoritz Fischer if (next_is_read) 214fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_HOLD); 215fdec2d21SMoritz Fischer 216fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_RW); 217fdec2d21SMoritz Fischer 218fdec2d21SMoritz Fischer writel(0xFF, ®s->interrupt_status); 219fdec2d21SMoritz Fischer writel(addr, ®s->address); 220fdec2d21SMoritz Fischer 221fdec2d21SMoritz Fischer while (len--) { 222fdec2d21SMoritz Fischer writel(*(cur_data++), ®s->data); 223fdec2d21SMoritz Fischer if (readl(®s->transfer_size) == CDNS_I2C_FIFO_DEPTH) { 224fdec2d21SMoritz Fischer if (!cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP)) { 225fdec2d21SMoritz Fischer /* Release the bus */ 226fdec2d21SMoritz Fischer clrbits_le32(®s->control, 227fdec2d21SMoritz Fischer CDNS_I2C_CONTROL_HOLD); 228fdec2d21SMoritz Fischer return -ETIMEDOUT; 229fdec2d21SMoritz Fischer } 230fdec2d21SMoritz Fischer } 231fdec2d21SMoritz Fischer } 232fdec2d21SMoritz Fischer 233fdec2d21SMoritz Fischer /* All done... release the bus */ 234fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_HOLD); 235fdec2d21SMoritz Fischer /* Wait for the address and data to be sent */ 236fdec2d21SMoritz Fischer if (!cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP)) 237fdec2d21SMoritz Fischer return -ETIMEDOUT; 238fdec2d21SMoritz Fischer return 0; 239fdec2d21SMoritz Fischer } 240fdec2d21SMoritz Fischer 241fdec2d21SMoritz Fischer static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data, 242fdec2d21SMoritz Fischer u32 len) 243fdec2d21SMoritz Fischer { 244fdec2d21SMoritz Fischer u32 status; 245fdec2d21SMoritz Fischer u32 i = 0; 246fdec2d21SMoritz Fischer u8 *cur_data = data; 247fdec2d21SMoritz Fischer 248fdec2d21SMoritz Fischer /* TODO: Fix this */ 249fdec2d21SMoritz Fischer struct cdns_i2c_regs *regs = i2c_bus->regs; 250fdec2d21SMoritz Fischer 251fdec2d21SMoritz Fischer /* Check the hardware can handle the requested bytes */ 252fdec2d21SMoritz Fischer if ((len < 0) || (len > CDNS_I2C_TRANSFER_SIZE_MAX)) 253fdec2d21SMoritz Fischer return -EINVAL; 254fdec2d21SMoritz Fischer 255fdec2d21SMoritz Fischer setbits_le32(®s->control, CDNS_I2C_CONTROL_CLR_FIFO | 256fdec2d21SMoritz Fischer CDNS_I2C_CONTROL_RW); 257fdec2d21SMoritz Fischer 258fdec2d21SMoritz Fischer /* Start reading data */ 259fdec2d21SMoritz Fischer writel(addr, ®s->address); 260fdec2d21SMoritz Fischer writel(len, ®s->transfer_size); 261fdec2d21SMoritz Fischer 262fdec2d21SMoritz Fischer /* Wait for data */ 263fdec2d21SMoritz Fischer do { 264fdec2d21SMoritz Fischer status = cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP | 265fdec2d21SMoritz Fischer CDNS_I2C_INTERRUPT_DATA); 266fdec2d21SMoritz Fischer if (!status) { 267fdec2d21SMoritz Fischer /* Release the bus */ 268fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_HOLD); 269fdec2d21SMoritz Fischer return -ETIMEDOUT; 270fdec2d21SMoritz Fischer } 271fdec2d21SMoritz Fischer debug("Read %d bytes\n", 272fdec2d21SMoritz Fischer len - readl(®s->transfer_size)); 273fdec2d21SMoritz Fischer for (; i < len - readl(®s->transfer_size); i++) 274fdec2d21SMoritz Fischer *(cur_data++) = readl(®s->data); 275fdec2d21SMoritz Fischer } while (readl(®s->transfer_size) != 0); 276fdec2d21SMoritz Fischer /* All done... release the bus */ 277fdec2d21SMoritz Fischer clrbits_le32(®s->control, CDNS_I2C_CONTROL_HOLD); 278fdec2d21SMoritz Fischer 279fdec2d21SMoritz Fischer #ifdef DEBUG 280fdec2d21SMoritz Fischer cdns_i2c_debug_status(regs); 281fdec2d21SMoritz Fischer #endif 282fdec2d21SMoritz Fischer return 0; 283fdec2d21SMoritz Fischer } 284fdec2d21SMoritz Fischer 285fdec2d21SMoritz Fischer static int cdns_i2c_xfer(struct udevice *dev, struct i2c_msg *msg, 286fdec2d21SMoritz Fischer int nmsgs) 287fdec2d21SMoritz Fischer { 288fdec2d21SMoritz Fischer struct i2c_cdns_bus *i2c_bus = dev_get_priv(dev); 289fdec2d21SMoritz Fischer int ret; 290fdec2d21SMoritz Fischer 291fdec2d21SMoritz Fischer debug("i2c_xfer: %d messages\n", nmsgs); 292fdec2d21SMoritz Fischer for (; nmsgs > 0; nmsgs--, msg++) { 293fdec2d21SMoritz Fischer bool next_is_read = nmsgs > 1 && (msg[1].flags & I2C_M_RD); 294fdec2d21SMoritz Fischer 295fdec2d21SMoritz Fischer debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len); 296fdec2d21SMoritz Fischer if (msg->flags & I2C_M_RD) { 297fdec2d21SMoritz Fischer ret = cdns_i2c_read_data(i2c_bus, msg->addr, msg->buf, 298fdec2d21SMoritz Fischer msg->len); 299fdec2d21SMoritz Fischer } else { 300fdec2d21SMoritz Fischer ret = cdns_i2c_write_data(i2c_bus, msg->addr, msg->buf, 301fdec2d21SMoritz Fischer msg->len, next_is_read); 302fdec2d21SMoritz Fischer } 303fdec2d21SMoritz Fischer if (ret) { 304fdec2d21SMoritz Fischer debug("i2c_write: error sending\n"); 305fdec2d21SMoritz Fischer return -EREMOTEIO; 306fdec2d21SMoritz Fischer } 307fdec2d21SMoritz Fischer } 308fdec2d21SMoritz Fischer 309fdec2d21SMoritz Fischer return 0; 310fdec2d21SMoritz Fischer } 311fdec2d21SMoritz Fischer 312*a13767bcSMichal Simek static int cdns_i2c_ofdata_to_platdata(struct udevice *dev) 313*a13767bcSMichal Simek { 314*a13767bcSMichal Simek struct i2c_cdns_bus *i2c_bus = dev_get_priv(dev); 315*a13767bcSMichal Simek 316*a13767bcSMichal Simek i2c_bus->regs = (struct cdns_i2c_regs *)dev_get_addr(dev); 317*a13767bcSMichal Simek if (!i2c_bus->regs) 318*a13767bcSMichal Simek return -ENOMEM; 319*a13767bcSMichal Simek 320*a13767bcSMichal Simek return 0; 321*a13767bcSMichal Simek } 322*a13767bcSMichal Simek 323fdec2d21SMoritz Fischer static const struct dm_i2c_ops cdns_i2c_ops = { 324fdec2d21SMoritz Fischer .xfer = cdns_i2c_xfer, 325fdec2d21SMoritz Fischer .probe_chip = cdns_i2c_probe_chip, 326fdec2d21SMoritz Fischer .set_bus_speed = cdns_i2c_set_bus_speed, 327fdec2d21SMoritz Fischer }; 328fdec2d21SMoritz Fischer 329fdec2d21SMoritz Fischer static const struct udevice_id cdns_i2c_of_match[] = { 330fdec2d21SMoritz Fischer { .compatible = "cdns,i2c-r1p10" }, 331fdec2d21SMoritz Fischer { /* end of table */ } 332fdec2d21SMoritz Fischer }; 333fdec2d21SMoritz Fischer 334fdec2d21SMoritz Fischer U_BOOT_DRIVER(cdns_i2c) = { 335fdec2d21SMoritz Fischer .name = "i2c-cdns", 336fdec2d21SMoritz Fischer .id = UCLASS_I2C, 337fdec2d21SMoritz Fischer .of_match = cdns_i2c_of_match, 338fdec2d21SMoritz Fischer .probe = cdns_i2c_probe, 339fdec2d21SMoritz Fischer .remove = cdns_i2c_remove, 340*a13767bcSMichal Simek .ofdata_to_platdata = cdns_i2c_ofdata_to_platdata, 341fdec2d21SMoritz Fischer .priv_auto_alloc_size = sizeof(struct i2c_cdns_bus), 342fdec2d21SMoritz Fischer .ops = &cdns_i2c_ops, 343fdec2d21SMoritz Fischer }; 344