1*fea9b69aSScott Jiang /* 2*fea9b69aSScott Jiang * i2c.c - driver for ADI TWI/I2C 3*fea9b69aSScott Jiang * 4*fea9b69aSScott Jiang * Copyright (c) 2006-2014 Analog Devices Inc. 5*fea9b69aSScott Jiang * 6*fea9b69aSScott Jiang * Licensed under the GPL-2 or later. 7*fea9b69aSScott Jiang */ 8*fea9b69aSScott Jiang 9*fea9b69aSScott Jiang #include <common.h> 10*fea9b69aSScott Jiang #include <i2c.h> 11*fea9b69aSScott Jiang 12*fea9b69aSScott Jiang #include <asm/clock.h> 13*fea9b69aSScott Jiang #include <asm/twi.h> 14*fea9b69aSScott Jiang 15*fea9b69aSScott Jiang /* Every register is 32bit aligned, but only 16bits in size */ 16*fea9b69aSScott Jiang #define ureg(name) u16 name; u16 __pad_##name; 17*fea9b69aSScott Jiang struct twi_regs { 18*fea9b69aSScott Jiang ureg(clkdiv); 19*fea9b69aSScott Jiang ureg(control); 20*fea9b69aSScott Jiang ureg(slave_ctl); 21*fea9b69aSScott Jiang ureg(slave_stat); 22*fea9b69aSScott Jiang ureg(slave_addr); 23*fea9b69aSScott Jiang ureg(master_ctl); 24*fea9b69aSScott Jiang ureg(master_stat); 25*fea9b69aSScott Jiang ureg(master_addr); 26*fea9b69aSScott Jiang ureg(int_stat); 27*fea9b69aSScott Jiang ureg(int_mask); 28*fea9b69aSScott Jiang ureg(fifo_ctl); 29*fea9b69aSScott Jiang ureg(fifo_stat); 30*fea9b69aSScott Jiang char __pad[0x50]; 31*fea9b69aSScott Jiang ureg(xmt_data8); 32*fea9b69aSScott Jiang ureg(xmt_data16); 33*fea9b69aSScott Jiang ureg(rcv_data8); 34*fea9b69aSScott Jiang ureg(rcv_data16); 35*fea9b69aSScott Jiang }; 36*fea9b69aSScott Jiang #undef ureg 37*fea9b69aSScott Jiang 38*fea9b69aSScott Jiang /* U-Boot I2C framework allows only one active device at a time. */ 39*fea9b69aSScott Jiang #ifdef TWI_CLKDIV 40*fea9b69aSScott Jiang #define TWI0_CLKDIV TWI_CLKDIV 41*fea9b69aSScott Jiang #endif 42*fea9b69aSScott Jiang static volatile struct twi_regs *twi = (void *)TWI0_CLKDIV; 43*fea9b69aSScott Jiang 44*fea9b69aSScott Jiang #ifdef DEBUG 45*fea9b69aSScott Jiang # define dmemset(s, c, n) memset(s, c, n) 46*fea9b69aSScott Jiang #else 47*fea9b69aSScott Jiang # define dmemset(s, c, n) 48*fea9b69aSScott Jiang #endif 49*fea9b69aSScott Jiang #define debugi(fmt, args...) \ 50*fea9b69aSScott Jiang debug( \ 51*fea9b69aSScott Jiang "MSTAT:0x%03x FSTAT:0x%x ISTAT:0x%02x\t%-20s:%-3i: " fmt "\n", \ 52*fea9b69aSScott Jiang twi->master_stat, twi->fifo_stat, twi->int_stat, \ 53*fea9b69aSScott Jiang __func__, __LINE__, ## args) 54*fea9b69aSScott Jiang 55*fea9b69aSScott Jiang #ifdef CONFIG_TWICLK_KHZ 56*fea9b69aSScott Jiang # error do not define CONFIG_TWICLK_KHZ ... use CONFIG_SYS_I2C_SPEED 57*fea9b69aSScott Jiang #endif 58*fea9b69aSScott Jiang 59*fea9b69aSScott Jiang /* 60*fea9b69aSScott Jiang * The way speed is changed into duty often results in integer truncation 61*fea9b69aSScott Jiang * with 50% duty, so we'll force rounding up to the next duty by adding 1 62*fea9b69aSScott Jiang * to the max. In practice this will get us a speed of something like 63*fea9b69aSScott Jiang * 385 KHz. The other limit is easy to handle as it is only 8 bits. 64*fea9b69aSScott Jiang */ 65*fea9b69aSScott Jiang #define I2C_SPEED_MAX 400000 66*fea9b69aSScott Jiang #define I2C_SPEED_TO_DUTY(speed) (5000000 / (speed)) 67*fea9b69aSScott Jiang #define I2C_DUTY_MAX (I2C_SPEED_TO_DUTY(I2C_SPEED_MAX) + 1) 68*fea9b69aSScott Jiang #define I2C_DUTY_MIN 0xff /* 8 bit limited */ 69*fea9b69aSScott Jiang #define SYS_I2C_DUTY I2C_SPEED_TO_DUTY(CONFIG_SYS_I2C_SPEED) 70*fea9b69aSScott Jiang /* Note: duty is inverse of speed, so the comparisons below are correct */ 71*fea9b69aSScott Jiang #if SYS_I2C_DUTY < I2C_DUTY_MAX || SYS_I2C_DUTY > I2C_DUTY_MIN 72*fea9b69aSScott Jiang # error "The Blackfin I2C hardware can only operate 20KHz - 400KHz" 73*fea9b69aSScott Jiang #endif 74*fea9b69aSScott Jiang 75*fea9b69aSScott Jiang /* All transfers are described by this data structure */ 76*fea9b69aSScott Jiang struct i2c_msg { 77*fea9b69aSScott Jiang u8 flags; 78*fea9b69aSScott Jiang #define I2C_M_COMBO 0x4 79*fea9b69aSScott Jiang #define I2C_M_STOP 0x2 80*fea9b69aSScott Jiang #define I2C_M_READ 0x1 81*fea9b69aSScott Jiang int len; /* msg length */ 82*fea9b69aSScott Jiang u8 *buf; /* pointer to msg data */ 83*fea9b69aSScott Jiang int alen; /* addr length */ 84*fea9b69aSScott Jiang u8 *abuf; /* addr buffer */ 85*fea9b69aSScott Jiang }; 86*fea9b69aSScott Jiang 87*fea9b69aSScott Jiang /* Allow msec timeout per ~byte transfer */ 88*fea9b69aSScott Jiang #define I2C_TIMEOUT 10 89*fea9b69aSScott Jiang 90*fea9b69aSScott Jiang /** 91*fea9b69aSScott Jiang * wait_for_completion - manage the actual i2c transfer 92*fea9b69aSScott Jiang * @msg: the i2c msg 93*fea9b69aSScott Jiang */ 94*fea9b69aSScott Jiang static int wait_for_completion(struct i2c_msg *msg) 95*fea9b69aSScott Jiang { 96*fea9b69aSScott Jiang uint16_t int_stat; 97*fea9b69aSScott Jiang ulong timebase = get_timer(0); 98*fea9b69aSScott Jiang 99*fea9b69aSScott Jiang do { 100*fea9b69aSScott Jiang int_stat = twi->int_stat; 101*fea9b69aSScott Jiang 102*fea9b69aSScott Jiang if (int_stat & XMTSERV) { 103*fea9b69aSScott Jiang debugi("processing XMTSERV"); 104*fea9b69aSScott Jiang twi->int_stat = XMTSERV; 105*fea9b69aSScott Jiang SSYNC(); 106*fea9b69aSScott Jiang if (msg->alen) { 107*fea9b69aSScott Jiang twi->xmt_data8 = *(msg->abuf++); 108*fea9b69aSScott Jiang --msg->alen; 109*fea9b69aSScott Jiang } else if (!(msg->flags & I2C_M_COMBO) && msg->len) { 110*fea9b69aSScott Jiang twi->xmt_data8 = *(msg->buf++); 111*fea9b69aSScott Jiang --msg->len; 112*fea9b69aSScott Jiang } else { 113*fea9b69aSScott Jiang twi->master_ctl |= (msg->flags & I2C_M_COMBO) ? RSTART | MDIR : STOP; 114*fea9b69aSScott Jiang SSYNC(); 115*fea9b69aSScott Jiang } 116*fea9b69aSScott Jiang } 117*fea9b69aSScott Jiang if (int_stat & RCVSERV) { 118*fea9b69aSScott Jiang debugi("processing RCVSERV"); 119*fea9b69aSScott Jiang twi->int_stat = RCVSERV; 120*fea9b69aSScott Jiang SSYNC(); 121*fea9b69aSScott Jiang if (msg->len) { 122*fea9b69aSScott Jiang *(msg->buf++) = twi->rcv_data8; 123*fea9b69aSScott Jiang --msg->len; 124*fea9b69aSScott Jiang } else if (msg->flags & I2C_M_STOP) { 125*fea9b69aSScott Jiang twi->master_ctl |= STOP; 126*fea9b69aSScott Jiang SSYNC(); 127*fea9b69aSScott Jiang } 128*fea9b69aSScott Jiang } 129*fea9b69aSScott Jiang if (int_stat & MERR) { 130*fea9b69aSScott Jiang debugi("processing MERR"); 131*fea9b69aSScott Jiang twi->int_stat = MERR; 132*fea9b69aSScott Jiang SSYNC(); 133*fea9b69aSScott Jiang return msg->len; 134*fea9b69aSScott Jiang } 135*fea9b69aSScott Jiang if (int_stat & MCOMP) { 136*fea9b69aSScott Jiang debugi("processing MCOMP"); 137*fea9b69aSScott Jiang twi->int_stat = MCOMP; 138*fea9b69aSScott Jiang SSYNC(); 139*fea9b69aSScott Jiang if (msg->flags & I2C_M_COMBO && msg->len) { 140*fea9b69aSScott Jiang twi->master_ctl = (twi->master_ctl & ~RSTART) | 141*fea9b69aSScott Jiang (min(msg->len, 0xff) << 6) | MEN | MDIR; 142*fea9b69aSScott Jiang SSYNC(); 143*fea9b69aSScott Jiang } else 144*fea9b69aSScott Jiang break; 145*fea9b69aSScott Jiang } 146*fea9b69aSScott Jiang 147*fea9b69aSScott Jiang /* If we were able to do something, reset timeout */ 148*fea9b69aSScott Jiang if (int_stat) 149*fea9b69aSScott Jiang timebase = get_timer(0); 150*fea9b69aSScott Jiang 151*fea9b69aSScott Jiang } while (get_timer(timebase) < I2C_TIMEOUT); 152*fea9b69aSScott Jiang 153*fea9b69aSScott Jiang return msg->len; 154*fea9b69aSScott Jiang } 155*fea9b69aSScott Jiang 156*fea9b69aSScott Jiang /** 157*fea9b69aSScott Jiang * i2c_transfer - setup an i2c transfer 158*fea9b69aSScott Jiang * @return: 0 if things worked, non-0 if things failed 159*fea9b69aSScott Jiang * 160*fea9b69aSScott Jiang * Here we just get the i2c stuff all prepped and ready, and then tail off 161*fea9b69aSScott Jiang * into wait_for_completion() for all the bits to go. 162*fea9b69aSScott Jiang */ 163*fea9b69aSScott Jiang static int i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer, int len, u8 flags) 164*fea9b69aSScott Jiang { 165*fea9b69aSScott Jiang uchar addr_buffer[] = { 166*fea9b69aSScott Jiang (addr >> 0), 167*fea9b69aSScott Jiang (addr >> 8), 168*fea9b69aSScott Jiang (addr >> 16), 169*fea9b69aSScott Jiang }; 170*fea9b69aSScott Jiang struct i2c_msg msg = { 171*fea9b69aSScott Jiang .flags = flags | (len >= 0xff ? I2C_M_STOP : 0), 172*fea9b69aSScott Jiang .buf = buffer, 173*fea9b69aSScott Jiang .len = len, 174*fea9b69aSScott Jiang .abuf = addr_buffer, 175*fea9b69aSScott Jiang .alen = alen, 176*fea9b69aSScott Jiang }; 177*fea9b69aSScott Jiang int ret; 178*fea9b69aSScott Jiang 179*fea9b69aSScott Jiang dmemset(buffer, 0xff, len); 180*fea9b69aSScott Jiang debugi("chip=0x%x addr=0x%02x alen=%i buf[0]=0x%02x len=%i flags=0x%02x[%s] ", 181*fea9b69aSScott Jiang chip, addr, alen, buffer[0], len, flags, (flags & I2C_M_READ ? "rd" : "wr")); 182*fea9b69aSScott Jiang 183*fea9b69aSScott Jiang /* wait for things to settle */ 184*fea9b69aSScott Jiang while (twi->master_stat & BUSBUSY) 185*fea9b69aSScott Jiang if (ctrlc()) 186*fea9b69aSScott Jiang return 1; 187*fea9b69aSScott Jiang 188*fea9b69aSScott Jiang /* Set Transmit device address */ 189*fea9b69aSScott Jiang twi->master_addr = chip; 190*fea9b69aSScott Jiang 191*fea9b69aSScott Jiang /* Clear the FIFO before starting things */ 192*fea9b69aSScott Jiang twi->fifo_ctl = XMTFLUSH | RCVFLUSH; 193*fea9b69aSScott Jiang SSYNC(); 194*fea9b69aSScott Jiang twi->fifo_ctl = 0; 195*fea9b69aSScott Jiang SSYNC(); 196*fea9b69aSScott Jiang 197*fea9b69aSScott Jiang /* prime the pump */ 198*fea9b69aSScott Jiang if (msg.alen) { 199*fea9b69aSScott Jiang len = (msg.flags & I2C_M_COMBO) ? msg.alen : msg.alen + len; 200*fea9b69aSScott Jiang debugi("first byte=0x%02x", *msg.abuf); 201*fea9b69aSScott Jiang twi->xmt_data8 = *(msg.abuf++); 202*fea9b69aSScott Jiang --msg.alen; 203*fea9b69aSScott Jiang } else if (!(msg.flags & I2C_M_READ) && msg.len) { 204*fea9b69aSScott Jiang debugi("first byte=0x%02x", *msg.buf); 205*fea9b69aSScott Jiang twi->xmt_data8 = *(msg.buf++); 206*fea9b69aSScott Jiang --msg.len; 207*fea9b69aSScott Jiang } 208*fea9b69aSScott Jiang 209*fea9b69aSScott Jiang /* clear int stat */ 210*fea9b69aSScott Jiang twi->master_stat = -1; 211*fea9b69aSScott Jiang twi->int_stat = -1; 212*fea9b69aSScott Jiang twi->int_mask = 0; 213*fea9b69aSScott Jiang SSYNC(); 214*fea9b69aSScott Jiang 215*fea9b69aSScott Jiang /* Master enable */ 216*fea9b69aSScott Jiang twi->master_ctl = 217*fea9b69aSScott Jiang (twi->master_ctl & FAST) | 218*fea9b69aSScott Jiang (min(len, 0xff) << 6) | MEN | 219*fea9b69aSScott Jiang ((msg.flags & I2C_M_READ) ? MDIR : 0); 220*fea9b69aSScott Jiang SSYNC(); 221*fea9b69aSScott Jiang debugi("CTL=0x%04x", twi->master_ctl); 222*fea9b69aSScott Jiang 223*fea9b69aSScott Jiang /* process the rest */ 224*fea9b69aSScott Jiang ret = wait_for_completion(&msg); 225*fea9b69aSScott Jiang debugi("ret=%d", ret); 226*fea9b69aSScott Jiang 227*fea9b69aSScott Jiang if (ret) { 228*fea9b69aSScott Jiang twi->master_ctl &= ~MEN; 229*fea9b69aSScott Jiang twi->control &= ~TWI_ENA; 230*fea9b69aSScott Jiang SSYNC(); 231*fea9b69aSScott Jiang twi->control |= TWI_ENA; 232*fea9b69aSScott Jiang SSYNC(); 233*fea9b69aSScott Jiang } 234*fea9b69aSScott Jiang 235*fea9b69aSScott Jiang return ret; 236*fea9b69aSScott Jiang } 237*fea9b69aSScott Jiang 238*fea9b69aSScott Jiang /** 239*fea9b69aSScott Jiang * i2c_set_bus_speed - set i2c bus speed 240*fea9b69aSScott Jiang * @speed: bus speed (in HZ) 241*fea9b69aSScott Jiang */ 242*fea9b69aSScott Jiang int i2c_set_bus_speed(unsigned int speed) 243*fea9b69aSScott Jiang { 244*fea9b69aSScott Jiang u16 clkdiv = I2C_SPEED_TO_DUTY(speed); 245*fea9b69aSScott Jiang 246*fea9b69aSScott Jiang /* Set TWI interface clock */ 247*fea9b69aSScott Jiang if (clkdiv < I2C_DUTY_MAX || clkdiv > I2C_DUTY_MIN) 248*fea9b69aSScott Jiang return -1; 249*fea9b69aSScott Jiang twi->clkdiv = (clkdiv << 8) | (clkdiv & 0xff); 250*fea9b69aSScott Jiang 251*fea9b69aSScott Jiang /* Don't turn it on */ 252*fea9b69aSScott Jiang twi->master_ctl = (speed > 100000 ? FAST : 0); 253*fea9b69aSScott Jiang 254*fea9b69aSScott Jiang return 0; 255*fea9b69aSScott Jiang } 256*fea9b69aSScott Jiang 257*fea9b69aSScott Jiang /** 258*fea9b69aSScott Jiang * i2c_get_bus_speed - get i2c bus speed 259*fea9b69aSScott Jiang * @speed: bus speed (in HZ) 260*fea9b69aSScott Jiang */ 261*fea9b69aSScott Jiang unsigned int i2c_get_bus_speed(void) 262*fea9b69aSScott Jiang { 263*fea9b69aSScott Jiang /* 10 MHz / (2 * CLKDIV) -> 5 MHz / CLKDIV */ 264*fea9b69aSScott Jiang return 5000000 / (twi->clkdiv & 0xff); 265*fea9b69aSScott Jiang } 266*fea9b69aSScott Jiang 267*fea9b69aSScott Jiang /** 268*fea9b69aSScott Jiang * i2c_init - initialize the i2c bus 269*fea9b69aSScott Jiang * @speed: bus speed (in HZ) 270*fea9b69aSScott Jiang * @slaveaddr: address of device in slave mode (0 - not slave) 271*fea9b69aSScott Jiang * 272*fea9b69aSScott Jiang * Slave mode isn't actually implemented. It'll stay that way until 273*fea9b69aSScott Jiang * we get a real request for it. 274*fea9b69aSScott Jiang */ 275*fea9b69aSScott Jiang void i2c_init(int speed, int slaveaddr) 276*fea9b69aSScott Jiang { 277*fea9b69aSScott Jiang uint8_t prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10) & 0x7F; 278*fea9b69aSScott Jiang 279*fea9b69aSScott Jiang /* Set TWI internal clock as 10MHz */ 280*fea9b69aSScott Jiang twi->control = prescale; 281*fea9b69aSScott Jiang 282*fea9b69aSScott Jiang /* Set TWI interface clock as specified */ 283*fea9b69aSScott Jiang i2c_set_bus_speed(speed); 284*fea9b69aSScott Jiang 285*fea9b69aSScott Jiang /* Enable it */ 286*fea9b69aSScott Jiang twi->control = TWI_ENA | prescale; 287*fea9b69aSScott Jiang SSYNC(); 288*fea9b69aSScott Jiang 289*fea9b69aSScott Jiang debugi("CONTROL:0x%04x CLKDIV:0x%04x", twi->control, twi->clkdiv); 290*fea9b69aSScott Jiang 291*fea9b69aSScott Jiang #if CONFIG_SYS_I2C_SLAVE 292*fea9b69aSScott Jiang # error I2C slave support not tested/supported 293*fea9b69aSScott Jiang /* If they want us as a slave, do it */ 294*fea9b69aSScott Jiang if (slaveaddr) { 295*fea9b69aSScott Jiang twi->slave_addr = slaveaddr; 296*fea9b69aSScott Jiang twi->slave_ctl = SEN; 297*fea9b69aSScott Jiang } 298*fea9b69aSScott Jiang #endif 299*fea9b69aSScott Jiang } 300*fea9b69aSScott Jiang 301*fea9b69aSScott Jiang /** 302*fea9b69aSScott Jiang * i2c_probe - test if a chip exists at a given i2c address 303*fea9b69aSScott Jiang * @chip: i2c chip addr to search for 304*fea9b69aSScott Jiang * @return: 0 if found, non-0 if not found 305*fea9b69aSScott Jiang */ 306*fea9b69aSScott Jiang int i2c_probe(uchar chip) 307*fea9b69aSScott Jiang { 308*fea9b69aSScott Jiang u8 byte; 309*fea9b69aSScott Jiang return i2c_read(chip, 0, 0, &byte, 1); 310*fea9b69aSScott Jiang } 311*fea9b69aSScott Jiang 312*fea9b69aSScott Jiang /** 313*fea9b69aSScott Jiang * i2c_read - read data from an i2c device 314*fea9b69aSScott Jiang * @chip: i2c chip addr 315*fea9b69aSScott Jiang * @addr: memory (register) address in the chip 316*fea9b69aSScott Jiang * @alen: byte size of address 317*fea9b69aSScott Jiang * @buffer: buffer to store data read from chip 318*fea9b69aSScott Jiang * @len: how many bytes to read 319*fea9b69aSScott Jiang * @return: 0 on success, non-0 on failure 320*fea9b69aSScott Jiang */ 321*fea9b69aSScott Jiang int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) 322*fea9b69aSScott Jiang { 323*fea9b69aSScott Jiang return i2c_transfer(chip, addr, alen, buffer, len, (alen ? I2C_M_COMBO : I2C_M_READ)); 324*fea9b69aSScott Jiang } 325*fea9b69aSScott Jiang 326*fea9b69aSScott Jiang /** 327*fea9b69aSScott Jiang * i2c_write - write data to an i2c device 328*fea9b69aSScott Jiang * @chip: i2c chip addr 329*fea9b69aSScott Jiang * @addr: memory (register) address in the chip 330*fea9b69aSScott Jiang * @alen: byte size of address 331*fea9b69aSScott Jiang * @buffer: buffer holding data to write to chip 332*fea9b69aSScott Jiang * @len: how many bytes to write 333*fea9b69aSScott Jiang * @return: 0 on success, non-0 on failure 334*fea9b69aSScott Jiang */ 335*fea9b69aSScott Jiang int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) 336*fea9b69aSScott Jiang { 337*fea9b69aSScott Jiang return i2c_transfer(chip, addr, alen, buffer, len, 0); 338*fea9b69aSScott Jiang } 339*fea9b69aSScott Jiang 340*fea9b69aSScott Jiang /** 341*fea9b69aSScott Jiang * i2c_set_bus_num - change active I2C bus 342*fea9b69aSScott Jiang * @bus: bus index, zero based 343*fea9b69aSScott Jiang * @returns: 0 on success, non-0 on failure 344*fea9b69aSScott Jiang */ 345*fea9b69aSScott Jiang int i2c_set_bus_num(unsigned int bus) 346*fea9b69aSScott Jiang { 347*fea9b69aSScott Jiang switch (bus) { 348*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 0 349*fea9b69aSScott Jiang case 0: twi = (void *)TWI0_CLKDIV; return 0; 350*fea9b69aSScott Jiang #endif 351*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 1 352*fea9b69aSScott Jiang case 1: twi = (void *)TWI1_CLKDIV; return 0; 353*fea9b69aSScott Jiang #endif 354*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 2 355*fea9b69aSScott Jiang case 2: twi = (void *)TWI2_CLKDIV; return 0; 356*fea9b69aSScott Jiang #endif 357*fea9b69aSScott Jiang default: return -1; 358*fea9b69aSScott Jiang } 359*fea9b69aSScott Jiang } 360*fea9b69aSScott Jiang 361*fea9b69aSScott Jiang /** 362*fea9b69aSScott Jiang * i2c_get_bus_num - returns index of active I2C bus 363*fea9b69aSScott Jiang */ 364*fea9b69aSScott Jiang unsigned int i2c_get_bus_num(void) 365*fea9b69aSScott Jiang { 366*fea9b69aSScott Jiang switch ((unsigned long)twi) { 367*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 0 368*fea9b69aSScott Jiang case TWI0_CLKDIV: return 0; 369*fea9b69aSScott Jiang #endif 370*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 1 371*fea9b69aSScott Jiang case TWI1_CLKDIV: return 1; 372*fea9b69aSScott Jiang #endif 373*fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 2 374*fea9b69aSScott Jiang case TWI2_CLKDIV: return 2; 375*fea9b69aSScott Jiang #endif 376*fea9b69aSScott Jiang default: return -1; 377*fea9b69aSScott Jiang } 378*fea9b69aSScott Jiang } 379