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> 14a6be70f7SScott Jiang #include <asm/io.h> 15fea9b69aSScott Jiang 16*c469703bSScott Jiang static struct twi_regs *i2c_get_base(struct i2c_adapter *adap); 17*c469703bSScott Jiang 18fea9b69aSScott Jiang /* Every register is 32bit aligned, but only 16bits in size */ 19fea9b69aSScott Jiang #define ureg(name) u16 name; u16 __pad_##name; 20fea9b69aSScott Jiang struct twi_regs { 21fea9b69aSScott Jiang ureg(clkdiv); 22fea9b69aSScott Jiang ureg(control); 23fea9b69aSScott Jiang ureg(slave_ctl); 24fea9b69aSScott Jiang ureg(slave_stat); 25fea9b69aSScott Jiang ureg(slave_addr); 26fea9b69aSScott Jiang ureg(master_ctl); 27fea9b69aSScott Jiang ureg(master_stat); 28fea9b69aSScott Jiang ureg(master_addr); 29fea9b69aSScott Jiang ureg(int_stat); 30fea9b69aSScott Jiang ureg(int_mask); 31fea9b69aSScott Jiang ureg(fifo_ctl); 32fea9b69aSScott Jiang ureg(fifo_stat); 33fea9b69aSScott Jiang char __pad[0x50]; 34fea9b69aSScott Jiang ureg(xmt_data8); 35fea9b69aSScott Jiang ureg(xmt_data16); 36fea9b69aSScott Jiang ureg(rcv_data8); 37fea9b69aSScott Jiang ureg(rcv_data16); 38fea9b69aSScott Jiang }; 39fea9b69aSScott Jiang #undef ureg 40fea9b69aSScott Jiang 41fea9b69aSScott Jiang #ifdef TWI_CLKDIV 42fea9b69aSScott Jiang #define TWI0_CLKDIV TWI_CLKDIV 43*c469703bSScott Jiang # ifdef CONFIG_SYS_MAX_I2C_BUS 44*c469703bSScott Jiang # undef CONFIG_SYS_MAX_I2C_BUS 45fea9b69aSScott Jiang # endif 46*c469703bSScott Jiang #define CONFIG_SYS_MAX_I2C_BUS 1 47fea9b69aSScott Jiang #endif 48fea9b69aSScott Jiang 49fea9b69aSScott Jiang /* 50fea9b69aSScott Jiang * The way speed is changed into duty often results in integer truncation 51fea9b69aSScott Jiang * with 50% duty, so we'll force rounding up to the next duty by adding 1 52fea9b69aSScott Jiang * to the max. In practice this will get us a speed of something like 53fea9b69aSScott Jiang * 385 KHz. The other limit is easy to handle as it is only 8 bits. 54fea9b69aSScott Jiang */ 55fea9b69aSScott Jiang #define I2C_SPEED_MAX 400000 56fea9b69aSScott Jiang #define I2C_SPEED_TO_DUTY(speed) (5000000 / (speed)) 57fea9b69aSScott Jiang #define I2C_DUTY_MAX (I2C_SPEED_TO_DUTY(I2C_SPEED_MAX) + 1) 58fea9b69aSScott Jiang #define I2C_DUTY_MIN 0xff /* 8 bit limited */ 59fea9b69aSScott Jiang #define SYS_I2C_DUTY I2C_SPEED_TO_DUTY(CONFIG_SYS_I2C_SPEED) 60fea9b69aSScott Jiang /* Note: duty is inverse of speed, so the comparisons below are correct */ 61fea9b69aSScott Jiang #if SYS_I2C_DUTY < I2C_DUTY_MAX || SYS_I2C_DUTY > I2C_DUTY_MIN 62*c469703bSScott Jiang # error "The I2C hardware can only operate 20KHz - 400KHz" 63fea9b69aSScott Jiang #endif 64fea9b69aSScott Jiang 65fea9b69aSScott Jiang /* All transfers are described by this data structure */ 66fea9b69aSScott Jiang struct i2c_msg { 67fea9b69aSScott Jiang u8 flags; 68fea9b69aSScott Jiang #define I2C_M_COMBO 0x4 69fea9b69aSScott Jiang #define I2C_M_STOP 0x2 70fea9b69aSScott Jiang #define I2C_M_READ 0x1 71fea9b69aSScott Jiang int len; /* msg length */ 72fea9b69aSScott Jiang u8 *buf; /* pointer to msg data */ 73fea9b69aSScott Jiang int alen; /* addr length */ 74fea9b69aSScott Jiang u8 *abuf; /* addr buffer */ 75fea9b69aSScott Jiang }; 76fea9b69aSScott Jiang 77fea9b69aSScott Jiang /* Allow msec timeout per ~byte transfer */ 78fea9b69aSScott Jiang #define I2C_TIMEOUT 10 79fea9b69aSScott Jiang 80fea9b69aSScott Jiang /** 81fea9b69aSScott Jiang * wait_for_completion - manage the actual i2c transfer 82fea9b69aSScott Jiang * @msg: the i2c msg 83fea9b69aSScott Jiang */ 84*c469703bSScott Jiang static int wait_for_completion(struct twi_regs *twi, struct i2c_msg *msg) 85fea9b69aSScott Jiang { 86a6be70f7SScott Jiang u16 int_stat, ctl; 87fea9b69aSScott Jiang ulong timebase = get_timer(0); 88fea9b69aSScott Jiang 89fea9b69aSScott Jiang do { 90a6be70f7SScott Jiang int_stat = readw(&twi->int_stat); 91fea9b69aSScott Jiang 92fea9b69aSScott Jiang if (int_stat & XMTSERV) { 93a6be70f7SScott Jiang writew(XMTSERV, &twi->int_stat); 94fea9b69aSScott Jiang if (msg->alen) { 95a6be70f7SScott Jiang writew(*(msg->abuf++), &twi->xmt_data8); 96fea9b69aSScott Jiang --msg->alen; 97fea9b69aSScott Jiang } else if (!(msg->flags & I2C_M_COMBO) && msg->len) { 98a6be70f7SScott Jiang writew(*(msg->buf++), &twi->xmt_data8); 99fea9b69aSScott Jiang --msg->len; 100fea9b69aSScott Jiang } else { 101a6be70f7SScott Jiang ctl = readw(&twi->master_ctl); 102a6be70f7SScott Jiang if (msg->flags & I2C_M_COMBO) 103a6be70f7SScott Jiang writew(ctl | RSTART | MDIR, 104a6be70f7SScott Jiang &twi->master_ctl); 105a6be70f7SScott Jiang else 106a6be70f7SScott Jiang writew(ctl | STOP, &twi->master_ctl); 107fea9b69aSScott Jiang } 108fea9b69aSScott Jiang } 109fea9b69aSScott Jiang if (int_stat & RCVSERV) { 110a6be70f7SScott Jiang writew(RCVSERV, &twi->int_stat); 111fea9b69aSScott Jiang if (msg->len) { 112a6be70f7SScott Jiang *(msg->buf++) = readw(&twi->rcv_data8); 113fea9b69aSScott Jiang --msg->len; 114fea9b69aSScott Jiang } else if (msg->flags & I2C_M_STOP) { 115a6be70f7SScott Jiang ctl = readw(&twi->master_ctl); 116a6be70f7SScott Jiang writew(ctl | STOP, &twi->master_ctl); 117fea9b69aSScott Jiang } 118fea9b69aSScott Jiang } 119fea9b69aSScott Jiang if (int_stat & MERR) { 120a6be70f7SScott Jiang writew(MERR, &twi->int_stat); 121fea9b69aSScott Jiang return msg->len; 122fea9b69aSScott Jiang } 123fea9b69aSScott Jiang if (int_stat & MCOMP) { 124a6be70f7SScott Jiang writew(MCOMP, &twi->int_stat); 125fea9b69aSScott Jiang if (msg->flags & I2C_M_COMBO && msg->len) { 126a6be70f7SScott Jiang ctl = readw(&twi->master_ctl); 127a6be70f7SScott Jiang ctl = (ctl & ~RSTART) | 128fea9b69aSScott Jiang (min(msg->len, 0xff) << 6) | MEN | MDIR; 129a6be70f7SScott Jiang writew(ctl, &twi->master_ctl); 130fea9b69aSScott Jiang } else 131fea9b69aSScott Jiang break; 132fea9b69aSScott Jiang } 133fea9b69aSScott Jiang 134fea9b69aSScott Jiang /* If we were able to do something, reset timeout */ 135fea9b69aSScott Jiang if (int_stat) 136fea9b69aSScott Jiang timebase = get_timer(0); 137fea9b69aSScott Jiang 138fea9b69aSScott Jiang } while (get_timer(timebase) < I2C_TIMEOUT); 139fea9b69aSScott Jiang 140fea9b69aSScott Jiang return msg->len; 141fea9b69aSScott Jiang } 142fea9b69aSScott Jiang 143*c469703bSScott Jiang static int i2c_transfer(struct i2c_adapter *adap, uint8_t chip, uint addr, 144*c469703bSScott Jiang int alen, uint8_t *buffer, int len, uint8_t flags) 145fea9b69aSScott Jiang { 146*c469703bSScott Jiang struct twi_regs *twi = i2c_get_base(adap); 147a6be70f7SScott Jiang int ret; 148a6be70f7SScott Jiang u16 ctl; 149fea9b69aSScott Jiang uchar addr_buffer[] = { 150fea9b69aSScott Jiang (addr >> 0), 151fea9b69aSScott Jiang (addr >> 8), 152fea9b69aSScott Jiang (addr >> 16), 153fea9b69aSScott Jiang }; 154fea9b69aSScott Jiang struct i2c_msg msg = { 155fea9b69aSScott Jiang .flags = flags | (len >= 0xff ? I2C_M_STOP : 0), 156fea9b69aSScott Jiang .buf = buffer, 157fea9b69aSScott Jiang .len = len, 158fea9b69aSScott Jiang .abuf = addr_buffer, 159fea9b69aSScott Jiang .alen = alen, 160fea9b69aSScott Jiang }; 161fea9b69aSScott Jiang 162fea9b69aSScott Jiang /* wait for things to settle */ 163a6be70f7SScott Jiang while (readw(&twi->master_stat) & BUSBUSY) 164fea9b69aSScott Jiang if (ctrlc()) 165fea9b69aSScott Jiang return 1; 166fea9b69aSScott Jiang 167fea9b69aSScott Jiang /* Set Transmit device address */ 168a6be70f7SScott Jiang writew(chip, &twi->master_addr); 169fea9b69aSScott Jiang 170fea9b69aSScott Jiang /* Clear the FIFO before starting things */ 171a6be70f7SScott Jiang writew(XMTFLUSH | RCVFLUSH, &twi->fifo_ctl); 172a6be70f7SScott Jiang writew(0, &twi->fifo_ctl); 173fea9b69aSScott Jiang 174fea9b69aSScott Jiang /* prime the pump */ 175fea9b69aSScott Jiang if (msg.alen) { 176fea9b69aSScott Jiang len = (msg.flags & I2C_M_COMBO) ? msg.alen : msg.alen + len; 177a6be70f7SScott Jiang writew(*(msg.abuf++), &twi->xmt_data8); 178fea9b69aSScott Jiang --msg.alen; 179fea9b69aSScott Jiang } else if (!(msg.flags & I2C_M_READ) && msg.len) { 180a6be70f7SScott Jiang writew(*(msg.buf++), &twi->xmt_data8); 181fea9b69aSScott Jiang --msg.len; 182fea9b69aSScott Jiang } 183fea9b69aSScott Jiang 184fea9b69aSScott Jiang /* clear int stat */ 185a6be70f7SScott Jiang writew(-1, &twi->master_stat); 186a6be70f7SScott Jiang writew(-1, &twi->int_stat); 187a6be70f7SScott Jiang writew(0, &twi->int_mask); 188fea9b69aSScott Jiang 189fea9b69aSScott Jiang /* Master enable */ 190a6be70f7SScott Jiang ctl = readw(&twi->master_ctl); 191a6be70f7SScott Jiang ctl = (ctl & FAST) | (min(len, 0xff) << 6) | MEN | 192fea9b69aSScott Jiang ((msg.flags & I2C_M_READ) ? MDIR : 0); 193a6be70f7SScott Jiang writew(ctl, &twi->master_ctl); 194fea9b69aSScott Jiang 195fea9b69aSScott Jiang /* process the rest */ 196*c469703bSScott Jiang ret = wait_for_completion(twi, &msg); 197fea9b69aSScott Jiang 198fea9b69aSScott Jiang if (ret) { 199a6be70f7SScott Jiang ctl = readw(&twi->master_ctl) & ~MEN; 200a6be70f7SScott Jiang writew(ctl, &twi->master_ctl); 201a6be70f7SScott Jiang ctl = readw(&twi->control) & ~TWI_ENA; 202a6be70f7SScott Jiang writew(ctl, &twi->control); 203a6be70f7SScott Jiang ctl = readw(&twi->control) | TWI_ENA; 204a6be70f7SScott Jiang writew(ctl, &twi->control); 205fea9b69aSScott Jiang } 206fea9b69aSScott Jiang 207fea9b69aSScott Jiang return ret; 208fea9b69aSScott Jiang } 209fea9b69aSScott Jiang 210*c469703bSScott Jiang static uint adi_i2c_setspeed(struct i2c_adapter *adap, uint speed) 211fea9b69aSScott Jiang { 212*c469703bSScott Jiang struct twi_regs *twi = i2c_get_base(adap); 213fea9b69aSScott Jiang u16 clkdiv = I2C_SPEED_TO_DUTY(speed); 214fea9b69aSScott Jiang 215fea9b69aSScott Jiang /* Set TWI interface clock */ 216fea9b69aSScott Jiang if (clkdiv < I2C_DUTY_MAX || clkdiv > I2C_DUTY_MIN) 217fea9b69aSScott Jiang return -1; 218a6be70f7SScott Jiang clkdiv = (clkdiv << 8) | (clkdiv & 0xff); 219a6be70f7SScott Jiang writew(clkdiv, &twi->clkdiv); 220fea9b69aSScott Jiang 221fea9b69aSScott Jiang /* Don't turn it on */ 222a6be70f7SScott Jiang writew(speed > 100000 ? FAST : 0, &twi->master_ctl); 223fea9b69aSScott Jiang 224fea9b69aSScott Jiang return 0; 225fea9b69aSScott Jiang } 226fea9b69aSScott Jiang 227*c469703bSScott Jiang static void adi_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr) 228fea9b69aSScott Jiang { 229*c469703bSScott Jiang struct twi_regs *twi = i2c_get_base(adap); 230*c469703bSScott Jiang u16 prescale = ((get_i2c_clk() / 1000 / 1000 + 5) / 10) & 0x7F; 231fea9b69aSScott Jiang 232fea9b69aSScott Jiang /* Set TWI internal clock as 10MHz */ 233a6be70f7SScott Jiang writew(prescale, &twi->control); 234fea9b69aSScott Jiang 235fea9b69aSScott Jiang /* Set TWI interface clock as specified */ 236fea9b69aSScott Jiang i2c_set_bus_speed(speed); 237fea9b69aSScott Jiang 238fea9b69aSScott Jiang /* Enable it */ 239a6be70f7SScott Jiang writew(TWI_ENA | prescale, &twi->control); 240fea9b69aSScott Jiang } 241fea9b69aSScott Jiang 242*c469703bSScott Jiang static int adi_i2c_read(struct i2c_adapter *adap, uint8_t chip, 243*c469703bSScott Jiang uint addr, int alen, uint8_t *buffer, int len) 244*c469703bSScott Jiang { 245*c469703bSScott Jiang return i2c_transfer(adap, chip, addr, alen, buffer, 246*c469703bSScott Jiang len, alen ? I2C_M_COMBO : I2C_M_READ); 247*c469703bSScott Jiang } 248*c469703bSScott Jiang 249*c469703bSScott Jiang static int adi_i2c_write(struct i2c_adapter *adap, uint8_t chip, 250*c469703bSScott Jiang uint addr, int alen, uint8_t *buffer, int len) 251*c469703bSScott Jiang { 252*c469703bSScott Jiang return i2c_transfer(adap, chip, addr, alen, buffer, len, 0); 253*c469703bSScott Jiang } 254*c469703bSScott Jiang 255*c469703bSScott Jiang static int adi_i2c_probe(struct i2c_adapter *adap, uint8_t chip) 256fea9b69aSScott Jiang { 257fea9b69aSScott Jiang u8 byte; 258*c469703bSScott Jiang return adi_i2c_read(adap, chip, 0, 0, &byte, 1); 259fea9b69aSScott Jiang } 260fea9b69aSScott Jiang 261*c469703bSScott Jiang static struct twi_regs *i2c_get_base(struct i2c_adapter *adap) 262fea9b69aSScott Jiang { 263*c469703bSScott Jiang switch (adap->hwadapnr) { 264*c469703bSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 2 265*c469703bSScott Jiang case 2: 266*c469703bSScott Jiang return (struct twi_regs *)TWI2_CLKDIV; 267fea9b69aSScott Jiang #endif 268fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 1 269a6be70f7SScott Jiang case 1: 270*c469703bSScott Jiang return (struct twi_regs *)TWI1_CLKDIV; 271fea9b69aSScott Jiang #endif 272*c469703bSScott Jiang case 0: 273*c469703bSScott Jiang return (struct twi_regs *)TWI0_CLKDIV; 274*c469703bSScott Jiang 275*c469703bSScott Jiang default: 276*c469703bSScott Jiang printf("wrong hwadapnr: %d\n", adap->hwadapnr); 277fea9b69aSScott Jiang } 278fea9b69aSScott Jiang 279*c469703bSScott Jiang return NULL; 280*c469703bSScott Jiang } 281*c469703bSScott Jiang 282*c469703bSScott Jiang U_BOOT_I2C_ADAP_COMPLETE(adi_i2c0, adi_i2c_init, adi_i2c_probe, 283*c469703bSScott Jiang adi_i2c_read, adi_i2c_write, 284*c469703bSScott Jiang adi_i2c_setspeed, 285*c469703bSScott Jiang CONFIG_SYS_I2C_SPEED, 286*c469703bSScott Jiang 0, 287*c469703bSScott Jiang 0) 288*c469703bSScott Jiang 289fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 1 290*c469703bSScott Jiang U_BOOT_I2C_ADAP_COMPLETE(adi_i2c1, adi_i2c_init, adi_i2c_probe, 291*c469703bSScott Jiang adi_i2c_read, adi_i2c_write, 292*c469703bSScott Jiang adi_i2c_setspeed, 293*c469703bSScott Jiang CONFIG_SYS_I2C_SPEED, 294*c469703bSScott Jiang 0, 295*c469703bSScott Jiang 1) 296fea9b69aSScott Jiang #endif 297*c469703bSScott Jiang 298fea9b69aSScott Jiang #if CONFIG_SYS_MAX_I2C_BUS > 2 299*c469703bSScott Jiang U_BOOT_I2C_ADAP_COMPLETE(adi_i2c2, adi_i2c_init, adi_i2c_probe, 300*c469703bSScott Jiang adi_i2c_read, adi_i2c_write, 301*c469703bSScott Jiang adi_i2c_setspeed, 302*c469703bSScott Jiang CONFIG_SYS_I2C_SPEED, 303*c469703bSScott Jiang 0, 304*c469703bSScott Jiang 2) 305fea9b69aSScott Jiang #endif 306