1031ed2faSVipin KUMAR /* 2031ed2faSVipin KUMAR * (C) Copyright 2009 3031ed2faSVipin KUMAR * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. 4031ed2faSVipin KUMAR * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6031ed2faSVipin KUMAR */ 7031ed2faSVipin KUMAR 8031ed2faSVipin KUMAR #include <common.h> 9678398b1SStefan Roese #include <i2c.h> 10031ed2faSVipin KUMAR #include <asm/io.h> 11031ed2faSVipin KUMAR #include "designware_i2c.h" 12031ed2faSVipin KUMAR 13678398b1SStefan Roese static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap) 14678398b1SStefan Roese { 15678398b1SStefan Roese switch (adap->hwadapnr) { 16678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 4 17678398b1SStefan Roese case 3: 18678398b1SStefan Roese return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3; 19ac6e2fe6SArmando Visconti #endif 20678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 3 21678398b1SStefan Roese case 2: 22678398b1SStefan Roese return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2; 23678398b1SStefan Roese #endif 24678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 2 25678398b1SStefan Roese case 1: 26678398b1SStefan Roese return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1; 27678398b1SStefan Roese #endif 28678398b1SStefan Roese case 0: 29678398b1SStefan Roese return (struct i2c_regs *)CONFIG_SYS_I2C_BASE; 30678398b1SStefan Roese default: 31678398b1SStefan Roese printf("Wrong I2C-adapter number %d\n", adap->hwadapnr); 32678398b1SStefan Roese } 33ac6e2fe6SArmando Visconti 34678398b1SStefan Roese return NULL; 35678398b1SStefan Roese } 36031ed2faSVipin KUMAR 37*1c8b089bSStefan Roese static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable) 38*1c8b089bSStefan Roese { 39*1c8b089bSStefan Roese u32 ena = enable ? IC_ENABLE_0B : 0; 40*1c8b089bSStefan Roese int timeout = 100; 41*1c8b089bSStefan Roese 42*1c8b089bSStefan Roese do { 43*1c8b089bSStefan Roese writel(ena, &i2c_base->ic_enable); 44*1c8b089bSStefan Roese if ((readl(&i2c_base->ic_enable_status) & IC_ENABLE_0B) == ena) 45*1c8b089bSStefan Roese return; 46*1c8b089bSStefan Roese 47*1c8b089bSStefan Roese /* 48*1c8b089bSStefan Roese * Wait 10 times the signaling period of the highest I2C 49*1c8b089bSStefan Roese * transfer supported by the driver (for 400KHz this is 50*1c8b089bSStefan Roese * 25us) as described in the DesignWare I2C databook. 51*1c8b089bSStefan Roese */ 52*1c8b089bSStefan Roese udelay(25); 53*1c8b089bSStefan Roese } while (timeout--); 54*1c8b089bSStefan Roese 55*1c8b089bSStefan Roese printf("timeout in %sabling I2C adapter\n", enable ? "en" : "dis"); 56*1c8b089bSStefan Roese } 57*1c8b089bSStefan Roese 58031ed2faSVipin KUMAR /* 59031ed2faSVipin KUMAR * set_speed - Set the i2c speed mode (standard, high, fast) 60031ed2faSVipin KUMAR * @i2c_spd: required i2c speed mode 61031ed2faSVipin KUMAR * 62031ed2faSVipin KUMAR * Set the i2c speed mode (standard, high, fast) 63031ed2faSVipin KUMAR */ 64678398b1SStefan Roese static void set_speed(struct i2c_adapter *adap, int i2c_spd) 65031ed2faSVipin KUMAR { 66678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 67031ed2faSVipin KUMAR unsigned int cntl; 68031ed2faSVipin KUMAR unsigned int hcnt, lcnt; 695e3e8ddaSArmando Visconti 705e3e8ddaSArmando Visconti /* to set speed cltr must be disabled */ 71*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, false); 725e3e8ddaSArmando Visconti 73678398b1SStefan Roese cntl = (readl(&i2c_base->ic_con) & (~IC_CON_SPD_MSK)); 74031ed2faSVipin KUMAR 75031ed2faSVipin KUMAR switch (i2c_spd) { 76031ed2faSVipin KUMAR case IC_SPEED_MODE_MAX: 77031ed2faSVipin KUMAR cntl |= IC_CON_SPD_HS; 785b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO; 79678398b1SStefan Roese writel(hcnt, &i2c_base->ic_hs_scl_hcnt); 805b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO; 81678398b1SStefan Roese writel(lcnt, &i2c_base->ic_hs_scl_lcnt); 82031ed2faSVipin KUMAR break; 83031ed2faSVipin KUMAR 84031ed2faSVipin KUMAR case IC_SPEED_MODE_STANDARD: 85031ed2faSVipin KUMAR cntl |= IC_CON_SPD_SS; 865b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO; 87678398b1SStefan Roese writel(hcnt, &i2c_base->ic_ss_scl_hcnt); 885b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO; 89678398b1SStefan Roese writel(lcnt, &i2c_base->ic_ss_scl_lcnt); 90031ed2faSVipin KUMAR break; 91031ed2faSVipin KUMAR 92031ed2faSVipin KUMAR case IC_SPEED_MODE_FAST: 93031ed2faSVipin KUMAR default: 94031ed2faSVipin KUMAR cntl |= IC_CON_SPD_FS; 955b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO; 96678398b1SStefan Roese writel(hcnt, &i2c_base->ic_fs_scl_hcnt); 975b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO; 98678398b1SStefan Roese writel(lcnt, &i2c_base->ic_fs_scl_lcnt); 99031ed2faSVipin KUMAR break; 100031ed2faSVipin KUMAR } 101031ed2faSVipin KUMAR 102678398b1SStefan Roese writel(cntl, &i2c_base->ic_con); 103031ed2faSVipin KUMAR 1045b8439bbSArmando Visconti /* Enable back i2c now speed set */ 105*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, true); 106031ed2faSVipin KUMAR } 107031ed2faSVipin KUMAR 108031ed2faSVipin KUMAR /* 109031ed2faSVipin KUMAR * i2c_set_bus_speed - Set the i2c speed 110031ed2faSVipin KUMAR * @speed: required i2c speed 111031ed2faSVipin KUMAR * 112031ed2faSVipin KUMAR * Set the i2c speed. 113031ed2faSVipin KUMAR */ 114678398b1SStefan Roese static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap, 115678398b1SStefan Roese unsigned int speed) 116031ed2faSVipin KUMAR { 117c69ecd97SJeroen Hofstee int i2c_spd; 118496ba48fSStefan Roese 119c69ecd97SJeroen Hofstee if (speed >= I2C_MAX_SPEED) 120c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_MAX; 121c69ecd97SJeroen Hofstee else if (speed >= I2C_FAST_SPEED) 122c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_FAST; 123c69ecd97SJeroen Hofstee else 124c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_STANDARD; 125c69ecd97SJeroen Hofstee 126678398b1SStefan Roese set_speed(adap, i2c_spd); 127678398b1SStefan Roese adap->speed = speed; 128031ed2faSVipin KUMAR 129031ed2faSVipin KUMAR return 0; 130031ed2faSVipin KUMAR } 131031ed2faSVipin KUMAR 132031ed2faSVipin KUMAR /* 133031ed2faSVipin KUMAR * i2c_init - Init function 134031ed2faSVipin KUMAR * @speed: required i2c speed 135678398b1SStefan Roese * @slaveaddr: slave address for the device 136031ed2faSVipin KUMAR * 137031ed2faSVipin KUMAR * Initialization function. 138031ed2faSVipin KUMAR */ 139678398b1SStefan Roese static void dw_i2c_init(struct i2c_adapter *adap, int speed, 140678398b1SStefan Roese int slaveaddr) 141031ed2faSVipin KUMAR { 142678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 143031ed2faSVipin KUMAR 144031ed2faSVipin KUMAR /* Disable i2c */ 145*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, false); 146031ed2faSVipin KUMAR 147678398b1SStefan Roese writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con); 148678398b1SStefan Roese writel(IC_RX_TL, &i2c_base->ic_rx_tl); 149678398b1SStefan Roese writel(IC_TX_TL, &i2c_base->ic_tx_tl); 150678398b1SStefan Roese dw_i2c_set_bus_speed(adap, speed); 151678398b1SStefan Roese writel(IC_STOP_DET, &i2c_base->ic_intr_mask); 152678398b1SStefan Roese writel(slaveaddr, &i2c_base->ic_sar); 153031ed2faSVipin KUMAR 154031ed2faSVipin KUMAR /* Enable i2c */ 155*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, true); 156031ed2faSVipin KUMAR } 157031ed2faSVipin KUMAR 158031ed2faSVipin KUMAR /* 159031ed2faSVipin KUMAR * i2c_setaddress - Sets the target slave address 160031ed2faSVipin KUMAR * @i2c_addr: target i2c address 161031ed2faSVipin KUMAR * 162031ed2faSVipin KUMAR * Sets the target slave address. 163031ed2faSVipin KUMAR */ 164678398b1SStefan Roese static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr) 165031ed2faSVipin KUMAR { 166678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 1678b7c8725SAlexey Brodkin 1688b7c8725SAlexey Brodkin /* Disable i2c */ 169*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, false); 1708b7c8725SAlexey Brodkin 171678398b1SStefan Roese writel(i2c_addr, &i2c_base->ic_tar); 1728b7c8725SAlexey Brodkin 1738b7c8725SAlexey Brodkin /* Enable i2c */ 174*1c8b089bSStefan Roese dw_i2c_enable(i2c_base, true); 175031ed2faSVipin KUMAR } 176031ed2faSVipin KUMAR 177031ed2faSVipin KUMAR /* 178031ed2faSVipin KUMAR * i2c_flush_rxfifo - Flushes the i2c RX FIFO 179031ed2faSVipin KUMAR * 180031ed2faSVipin KUMAR * Flushes the i2c RX FIFO 181031ed2faSVipin KUMAR */ 182678398b1SStefan Roese static void i2c_flush_rxfifo(struct i2c_adapter *adap) 183031ed2faSVipin KUMAR { 184678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 185678398b1SStefan Roese 186678398b1SStefan Roese while (readl(&i2c_base->ic_status) & IC_STATUS_RFNE) 187678398b1SStefan Roese readl(&i2c_base->ic_cmd_data); 188031ed2faSVipin KUMAR } 189031ed2faSVipin KUMAR 190031ed2faSVipin KUMAR /* 191031ed2faSVipin KUMAR * i2c_wait_for_bb - Waits for bus busy 192031ed2faSVipin KUMAR * 193031ed2faSVipin KUMAR * Waits for bus busy 194031ed2faSVipin KUMAR */ 195678398b1SStefan Roese static int i2c_wait_for_bb(struct i2c_adapter *adap) 196031ed2faSVipin KUMAR { 197678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 198031ed2faSVipin KUMAR unsigned long start_time_bb = get_timer(0); 199031ed2faSVipin KUMAR 200678398b1SStefan Roese while ((readl(&i2c_base->ic_status) & IC_STATUS_MA) || 201678398b1SStefan Roese !(readl(&i2c_base->ic_status) & IC_STATUS_TFE)) { 202031ed2faSVipin KUMAR 203031ed2faSVipin KUMAR /* Evaluate timeout */ 204031ed2faSVipin KUMAR if (get_timer(start_time_bb) > (unsigned long)(I2C_BYTE_TO_BB)) 205031ed2faSVipin KUMAR return 1; 206031ed2faSVipin KUMAR } 207031ed2faSVipin KUMAR 208031ed2faSVipin KUMAR return 0; 209031ed2faSVipin KUMAR } 210031ed2faSVipin KUMAR 211678398b1SStefan Roese static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr, 212678398b1SStefan Roese int alen) 213031ed2faSVipin KUMAR { 214678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 215678398b1SStefan Roese 216678398b1SStefan Roese if (i2c_wait_for_bb(adap)) 217031ed2faSVipin KUMAR return 1; 218031ed2faSVipin KUMAR 219678398b1SStefan Roese i2c_setaddress(adap, chip); 220070cbaf8SChin Liang See while (alen) { 221070cbaf8SChin Liang See alen--; 222070cbaf8SChin Liang See /* high byte address going out first */ 223070cbaf8SChin Liang See writel((addr >> (alen * 8)) & 0xff, 224678398b1SStefan Roese &i2c_base->ic_cmd_data); 225070cbaf8SChin Liang See } 226031ed2faSVipin KUMAR return 0; 227031ed2faSVipin KUMAR } 228031ed2faSVipin KUMAR 229678398b1SStefan Roese static int i2c_xfer_finish(struct i2c_adapter *adap) 230031ed2faSVipin KUMAR { 231678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 232031ed2faSVipin KUMAR ulong start_stop_det = get_timer(0); 233031ed2faSVipin KUMAR 234031ed2faSVipin KUMAR while (1) { 235678398b1SStefan Roese if ((readl(&i2c_base->ic_raw_intr_stat) & IC_STOP_DET)) { 236678398b1SStefan Roese readl(&i2c_base->ic_clr_stop_det); 237031ed2faSVipin KUMAR break; 238031ed2faSVipin KUMAR } else if (get_timer(start_stop_det) > I2C_STOPDET_TO) { 239031ed2faSVipin KUMAR break; 240031ed2faSVipin KUMAR } 241031ed2faSVipin KUMAR } 242031ed2faSVipin KUMAR 243678398b1SStefan Roese if (i2c_wait_for_bb(adap)) { 244031ed2faSVipin KUMAR printf("Timed out waiting for bus\n"); 245031ed2faSVipin KUMAR return 1; 246031ed2faSVipin KUMAR } 247031ed2faSVipin KUMAR 248678398b1SStefan Roese i2c_flush_rxfifo(adap); 249031ed2faSVipin KUMAR 250031ed2faSVipin KUMAR return 0; 251031ed2faSVipin KUMAR } 252031ed2faSVipin KUMAR 253031ed2faSVipin KUMAR /* 254031ed2faSVipin KUMAR * i2c_read - Read from i2c memory 255031ed2faSVipin KUMAR * @chip: target i2c address 256031ed2faSVipin KUMAR * @addr: address to read from 257031ed2faSVipin KUMAR * @alen: 258031ed2faSVipin KUMAR * @buffer: buffer for read data 259031ed2faSVipin KUMAR * @len: no of bytes to be read 260031ed2faSVipin KUMAR * 261031ed2faSVipin KUMAR * Read from i2c memory. 262031ed2faSVipin KUMAR */ 263678398b1SStefan Roese static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr, 264678398b1SStefan Roese int alen, u8 *buffer, int len) 265031ed2faSVipin KUMAR { 266678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 267031ed2faSVipin KUMAR unsigned long start_time_rx; 268031ed2faSVipin KUMAR 26932d041e2SAlexey Brodkin #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 27032d041e2SAlexey Brodkin /* 27132d041e2SAlexey Brodkin * EEPROM chips that implement "address overflow" are ones 27232d041e2SAlexey Brodkin * like Catalyst 24WC04/08/16 which has 9/10/11 bits of 27332d041e2SAlexey Brodkin * address and the extra bits end up in the "chip address" 27432d041e2SAlexey Brodkin * bit slots. This makes a 24WC08 (1Kbyte) chip look like 27532d041e2SAlexey Brodkin * four 256 byte chips. 27632d041e2SAlexey Brodkin * 27732d041e2SAlexey Brodkin * Note that we consider the length of the address field to 27832d041e2SAlexey Brodkin * still be one byte because the extra address bits are 27932d041e2SAlexey Brodkin * hidden in the chip address. 28032d041e2SAlexey Brodkin */ 281678398b1SStefan Roese dev |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW); 28232d041e2SAlexey Brodkin addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8)); 28332d041e2SAlexey Brodkin 284678398b1SStefan Roese debug("%s: fix addr_overflow: dev %02x addr %02x\n", __func__, dev, 28532d041e2SAlexey Brodkin addr); 28632d041e2SAlexey Brodkin #endif 28732d041e2SAlexey Brodkin 288678398b1SStefan Roese if (i2c_xfer_init(adap, dev, addr, alen)) 289031ed2faSVipin KUMAR return 1; 290031ed2faSVipin KUMAR 291031ed2faSVipin KUMAR start_time_rx = get_timer(0); 292031ed2faSVipin KUMAR while (len) { 293491739bbSArmando Visconti if (len == 1) 294678398b1SStefan Roese writel(IC_CMD | IC_STOP, &i2c_base->ic_cmd_data); 295491739bbSArmando Visconti else 296678398b1SStefan Roese writel(IC_CMD, &i2c_base->ic_cmd_data); 297031ed2faSVipin KUMAR 298678398b1SStefan Roese if (readl(&i2c_base->ic_status) & IC_STATUS_RFNE) { 299678398b1SStefan Roese *buffer++ = (uchar)readl(&i2c_base->ic_cmd_data); 300031ed2faSVipin KUMAR len--; 301031ed2faSVipin KUMAR start_time_rx = get_timer(0); 302031ed2faSVipin KUMAR 303031ed2faSVipin KUMAR } else if (get_timer(start_time_rx) > I2C_BYTE_TO) { 304031ed2faSVipin KUMAR return 1; 305031ed2faSVipin KUMAR } 306031ed2faSVipin KUMAR } 307031ed2faSVipin KUMAR 308678398b1SStefan Roese return i2c_xfer_finish(adap); 309031ed2faSVipin KUMAR } 310031ed2faSVipin KUMAR 311031ed2faSVipin KUMAR /* 312031ed2faSVipin KUMAR * i2c_write - Write to i2c memory 313031ed2faSVipin KUMAR * @chip: target i2c address 314031ed2faSVipin KUMAR * @addr: address to read from 315031ed2faSVipin KUMAR * @alen: 316031ed2faSVipin KUMAR * @buffer: buffer for read data 317031ed2faSVipin KUMAR * @len: no of bytes to be read 318031ed2faSVipin KUMAR * 319031ed2faSVipin KUMAR * Write to i2c memory. 320031ed2faSVipin KUMAR */ 321678398b1SStefan Roese static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr, 322678398b1SStefan Roese int alen, u8 *buffer, int len) 323031ed2faSVipin KUMAR { 324678398b1SStefan Roese struct i2c_regs *i2c_base = i2c_get_base(adap); 325031ed2faSVipin KUMAR int nb = len; 326031ed2faSVipin KUMAR unsigned long start_time_tx; 327031ed2faSVipin KUMAR 32832d041e2SAlexey Brodkin #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 32932d041e2SAlexey Brodkin /* 33032d041e2SAlexey Brodkin * EEPROM chips that implement "address overflow" are ones 33132d041e2SAlexey Brodkin * like Catalyst 24WC04/08/16 which has 9/10/11 bits of 33232d041e2SAlexey Brodkin * address and the extra bits end up in the "chip address" 33332d041e2SAlexey Brodkin * bit slots. This makes a 24WC08 (1Kbyte) chip look like 33432d041e2SAlexey Brodkin * four 256 byte chips. 33532d041e2SAlexey Brodkin * 33632d041e2SAlexey Brodkin * Note that we consider the length of the address field to 33732d041e2SAlexey Brodkin * still be one byte because the extra address bits are 33832d041e2SAlexey Brodkin * hidden in the chip address. 33932d041e2SAlexey Brodkin */ 340678398b1SStefan Roese dev |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW); 34132d041e2SAlexey Brodkin addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8)); 34232d041e2SAlexey Brodkin 343678398b1SStefan Roese debug("%s: fix addr_overflow: dev %02x addr %02x\n", __func__, dev, 34432d041e2SAlexey Brodkin addr); 34532d041e2SAlexey Brodkin #endif 34632d041e2SAlexey Brodkin 347678398b1SStefan Roese if (i2c_xfer_init(adap, dev, addr, alen)) 348031ed2faSVipin KUMAR return 1; 349031ed2faSVipin KUMAR 350031ed2faSVipin KUMAR start_time_tx = get_timer(0); 351031ed2faSVipin KUMAR while (len) { 352678398b1SStefan Roese if (readl(&i2c_base->ic_status) & IC_STATUS_TFNF) { 353678398b1SStefan Roese if (--len == 0) { 354678398b1SStefan Roese writel(*buffer | IC_STOP, 355678398b1SStefan Roese &i2c_base->ic_cmd_data); 356678398b1SStefan Roese } else { 357678398b1SStefan Roese writel(*buffer, &i2c_base->ic_cmd_data); 358678398b1SStefan Roese } 359031ed2faSVipin KUMAR buffer++; 360031ed2faSVipin KUMAR start_time_tx = get_timer(0); 361031ed2faSVipin KUMAR 362031ed2faSVipin KUMAR } else if (get_timer(start_time_tx) > (nb * I2C_BYTE_TO)) { 363031ed2faSVipin KUMAR printf("Timed out. i2c write Failed\n"); 364031ed2faSVipin KUMAR return 1; 365031ed2faSVipin KUMAR } 366031ed2faSVipin KUMAR } 367031ed2faSVipin KUMAR 368678398b1SStefan Roese return i2c_xfer_finish(adap); 369031ed2faSVipin KUMAR } 370031ed2faSVipin KUMAR 371031ed2faSVipin KUMAR /* 372031ed2faSVipin KUMAR * i2c_probe - Probe the i2c chip 373031ed2faSVipin KUMAR */ 374678398b1SStefan Roese static int dw_i2c_probe(struct i2c_adapter *adap, u8 dev) 375031ed2faSVipin KUMAR { 376031ed2faSVipin KUMAR u32 tmp; 377496ba48fSStefan Roese int ret; 378031ed2faSVipin KUMAR 379031ed2faSVipin KUMAR /* 380031ed2faSVipin KUMAR * Try to read the first location of the chip. 381031ed2faSVipin KUMAR */ 382678398b1SStefan Roese ret = dw_i2c_read(adap, dev, 0, 1, (uchar *)&tmp, 1); 383496ba48fSStefan Roese if (ret) 384678398b1SStefan Roese dw_i2c_init(adap, adap->speed, adap->slaveaddr); 385496ba48fSStefan Roese 386496ba48fSStefan Roese return ret; 387031ed2faSVipin KUMAR } 388ac6e2fe6SArmando Visconti 389678398b1SStefan Roese U_BOOT_I2C_ADAP_COMPLETE(dw_0, dw_i2c_init, dw_i2c_probe, dw_i2c_read, 390678398b1SStefan Roese dw_i2c_write, dw_i2c_set_bus_speed, 391678398b1SStefan Roese CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE, 0) 392ac6e2fe6SArmando Visconti 393678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 2 394678398b1SStefan Roese U_BOOT_I2C_ADAP_COMPLETE(dw_1, dw_i2c_init, dw_i2c_probe, dw_i2c_read, 395678398b1SStefan Roese dw_i2c_write, dw_i2c_set_bus_speed, 396678398b1SStefan Roese CONFIG_SYS_I2C_SPEED1, CONFIG_SYS_I2C_SLAVE1, 1) 397678398b1SStefan Roese #endif 398ac6e2fe6SArmando Visconti 399678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 3 400678398b1SStefan Roese U_BOOT_I2C_ADAP_COMPLETE(dw_2, dw_i2c_init, dw_i2c_probe, dw_i2c_read, 401678398b1SStefan Roese dw_i2c_write, dw_i2c_set_bus_speed, 402678398b1SStefan Roese CONFIG_SYS_I2C_SPEED2, CONFIG_SYS_I2C_SLAVE2, 2) 403678398b1SStefan Roese #endif 404ac6e2fe6SArmando Visconti 405678398b1SStefan Roese #if CONFIG_SYS_I2C_BUS_MAX >= 4 406678398b1SStefan Roese U_BOOT_I2C_ADAP_COMPLETE(dw_3, dw_i2c_init, dw_i2c_probe, dw_i2c_read, 407678398b1SStefan Roese dw_i2c_write, dw_i2c_set_bus_speed, 408678398b1SStefan Roese CONFIG_SYS_I2C_SPEED3, CONFIG_SYS_I2C_SLAVE3, 3) 409ac6e2fe6SArmando Visconti #endif 410