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