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