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> 9031ed2faSVipin KUMAR #include <asm/io.h> 10031ed2faSVipin KUMAR #include "designware_i2c.h" 11*c69ecd97SJeroen Hofstee #include <i2c.h> 12031ed2faSVipin KUMAR 13ac6e2fe6SArmando Visconti #ifdef CONFIG_I2C_MULTI_BUS 14ac6e2fe6SArmando Visconti static unsigned int bus_initialized[CONFIG_SYS_I2C_BUS_MAX]; 15ac6e2fe6SArmando Visconti static unsigned int current_bus = 0; 16ac6e2fe6SArmando Visconti #endif 17ac6e2fe6SArmando Visconti 18ac6e2fe6SArmando Visconti static struct i2c_regs *i2c_regs_p = 19031ed2faSVipin KUMAR (struct i2c_regs *)CONFIG_SYS_I2C_BASE; 20031ed2faSVipin KUMAR 21031ed2faSVipin KUMAR /* 22031ed2faSVipin KUMAR * set_speed - Set the i2c speed mode (standard, high, fast) 23031ed2faSVipin KUMAR * @i2c_spd: required i2c speed mode 24031ed2faSVipin KUMAR * 25031ed2faSVipin KUMAR * Set the i2c speed mode (standard, high, fast) 26031ed2faSVipin KUMAR */ 27031ed2faSVipin KUMAR static void set_speed(int i2c_spd) 28031ed2faSVipin KUMAR { 29031ed2faSVipin KUMAR unsigned int cntl; 30031ed2faSVipin KUMAR unsigned int hcnt, lcnt; 315e3e8ddaSArmando Visconti unsigned int enbl; 325e3e8ddaSArmando Visconti 335e3e8ddaSArmando Visconti /* to set speed cltr must be disabled */ 345e3e8ddaSArmando Visconti enbl = readl(&i2c_regs_p->ic_enable); 355e3e8ddaSArmando Visconti enbl &= ~IC_ENABLE_0B; 365e3e8ddaSArmando Visconti writel(enbl, &i2c_regs_p->ic_enable); 375e3e8ddaSArmando Visconti 38031ed2faSVipin KUMAR cntl = (readl(&i2c_regs_p->ic_con) & (~IC_CON_SPD_MSK)); 39031ed2faSVipin KUMAR 40031ed2faSVipin KUMAR switch (i2c_spd) { 41031ed2faSVipin KUMAR case IC_SPEED_MODE_MAX: 42031ed2faSVipin KUMAR cntl |= IC_CON_SPD_HS; 435b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO; 445b8439bbSArmando Visconti writel(hcnt, &i2c_regs_p->ic_hs_scl_hcnt); 455b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO; 465b8439bbSArmando Visconti writel(lcnt, &i2c_regs_p->ic_hs_scl_lcnt); 47031ed2faSVipin KUMAR break; 48031ed2faSVipin KUMAR 49031ed2faSVipin KUMAR case IC_SPEED_MODE_STANDARD: 50031ed2faSVipin KUMAR cntl |= IC_CON_SPD_SS; 515b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO; 525b8439bbSArmando Visconti writel(hcnt, &i2c_regs_p->ic_ss_scl_hcnt); 535b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO; 545b8439bbSArmando Visconti writel(lcnt, &i2c_regs_p->ic_ss_scl_lcnt); 55031ed2faSVipin KUMAR break; 56031ed2faSVipin KUMAR 57031ed2faSVipin KUMAR case IC_SPEED_MODE_FAST: 58031ed2faSVipin KUMAR default: 59031ed2faSVipin KUMAR cntl |= IC_CON_SPD_FS; 605b8439bbSArmando Visconti hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO; 615b8439bbSArmando Visconti writel(hcnt, &i2c_regs_p->ic_fs_scl_hcnt); 625b8439bbSArmando Visconti lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO; 635b8439bbSArmando Visconti writel(lcnt, &i2c_regs_p->ic_fs_scl_lcnt); 64031ed2faSVipin KUMAR break; 65031ed2faSVipin KUMAR } 66031ed2faSVipin KUMAR 67031ed2faSVipin KUMAR writel(cntl, &i2c_regs_p->ic_con); 68031ed2faSVipin KUMAR 695b8439bbSArmando Visconti /* Enable back i2c now speed set */ 705e3e8ddaSArmando Visconti enbl |= IC_ENABLE_0B; 715e3e8ddaSArmando Visconti writel(enbl, &i2c_regs_p->ic_enable); 72031ed2faSVipin KUMAR } 73031ed2faSVipin KUMAR 74031ed2faSVipin KUMAR /* 75031ed2faSVipin KUMAR * i2c_set_bus_speed - Set the i2c speed 76031ed2faSVipin KUMAR * @speed: required i2c speed 77031ed2faSVipin KUMAR * 78031ed2faSVipin KUMAR * Set the i2c speed. 79031ed2faSVipin KUMAR */ 80*c69ecd97SJeroen Hofstee int i2c_set_bus_speed(unsigned int speed) 81031ed2faSVipin KUMAR { 82*c69ecd97SJeroen Hofstee int i2c_spd; 83496ba48fSStefan Roese 84*c69ecd97SJeroen Hofstee if (speed >= I2C_MAX_SPEED) 85*c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_MAX; 86*c69ecd97SJeroen Hofstee else if (speed >= I2C_FAST_SPEED) 87*c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_FAST; 88*c69ecd97SJeroen Hofstee else 89*c69ecd97SJeroen Hofstee i2c_spd = IC_SPEED_MODE_STANDARD; 90*c69ecd97SJeroen Hofstee 91*c69ecd97SJeroen Hofstee set_speed(i2c_spd); 92*c69ecd97SJeroen Hofstee 93*c69ecd97SJeroen Hofstee return i2c_spd; 94031ed2faSVipin KUMAR } 95031ed2faSVipin KUMAR 96031ed2faSVipin KUMAR /* 97031ed2faSVipin KUMAR * i2c_get_bus_speed - Gets the i2c speed 98031ed2faSVipin KUMAR * 99031ed2faSVipin KUMAR * Gets the i2c speed. 100031ed2faSVipin KUMAR */ 101*c69ecd97SJeroen Hofstee unsigned int i2c_get_bus_speed(void) 102031ed2faSVipin KUMAR { 103031ed2faSVipin KUMAR u32 cntl; 104031ed2faSVipin KUMAR 105031ed2faSVipin KUMAR cntl = (readl(&i2c_regs_p->ic_con) & IC_CON_SPD_MSK); 106031ed2faSVipin KUMAR 107031ed2faSVipin KUMAR if (cntl == IC_CON_SPD_HS) 108031ed2faSVipin KUMAR return I2C_MAX_SPEED; 109031ed2faSVipin KUMAR else if (cntl == IC_CON_SPD_FS) 110031ed2faSVipin KUMAR return I2C_FAST_SPEED; 111031ed2faSVipin KUMAR else if (cntl == IC_CON_SPD_SS) 112031ed2faSVipin KUMAR return I2C_STANDARD_SPEED; 113031ed2faSVipin KUMAR 114031ed2faSVipin KUMAR return 0; 115031ed2faSVipin KUMAR } 116031ed2faSVipin KUMAR 117031ed2faSVipin KUMAR /* 118031ed2faSVipin KUMAR * i2c_init - Init function 119031ed2faSVipin KUMAR * @speed: required i2c speed 120031ed2faSVipin KUMAR * @slaveadd: slave address for the device 121031ed2faSVipin KUMAR * 122031ed2faSVipin KUMAR * Initialization function. 123031ed2faSVipin KUMAR */ 124031ed2faSVipin KUMAR void i2c_init(int speed, int slaveadd) 125031ed2faSVipin KUMAR { 126031ed2faSVipin KUMAR unsigned int enbl; 127031ed2faSVipin KUMAR 128031ed2faSVipin KUMAR /* Disable i2c */ 129031ed2faSVipin KUMAR enbl = readl(&i2c_regs_p->ic_enable); 130031ed2faSVipin KUMAR enbl &= ~IC_ENABLE_0B; 131031ed2faSVipin KUMAR writel(enbl, &i2c_regs_p->ic_enable); 132031ed2faSVipin KUMAR 133031ed2faSVipin KUMAR writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_regs_p->ic_con); 134031ed2faSVipin KUMAR writel(IC_RX_TL, &i2c_regs_p->ic_rx_tl); 135031ed2faSVipin KUMAR writel(IC_TX_TL, &i2c_regs_p->ic_tx_tl); 136031ed2faSVipin KUMAR i2c_set_bus_speed(speed); 137031ed2faSVipin KUMAR writel(IC_STOP_DET, &i2c_regs_p->ic_intr_mask); 138031ed2faSVipin KUMAR writel(slaveadd, &i2c_regs_p->ic_sar); 139031ed2faSVipin KUMAR 140031ed2faSVipin KUMAR /* Enable i2c */ 141031ed2faSVipin KUMAR enbl = readl(&i2c_regs_p->ic_enable); 142031ed2faSVipin KUMAR enbl |= IC_ENABLE_0B; 143031ed2faSVipin KUMAR writel(enbl, &i2c_regs_p->ic_enable); 144ac6e2fe6SArmando Visconti 145ac6e2fe6SArmando Visconti #ifdef CONFIG_I2C_MULTI_BUS 146ac6e2fe6SArmando Visconti bus_initialized[current_bus] = 1; 147ac6e2fe6SArmando Visconti #endif 148031ed2faSVipin KUMAR } 149031ed2faSVipin KUMAR 150031ed2faSVipin KUMAR /* 151031ed2faSVipin KUMAR * i2c_setaddress - Sets the target slave address 152031ed2faSVipin KUMAR * @i2c_addr: target i2c address 153031ed2faSVipin KUMAR * 154031ed2faSVipin KUMAR * Sets the target slave address. 155031ed2faSVipin KUMAR */ 156031ed2faSVipin KUMAR static void i2c_setaddress(unsigned int i2c_addr) 157031ed2faSVipin KUMAR { 1588b7c8725SAlexey Brodkin unsigned int enbl; 1598b7c8725SAlexey Brodkin 1608b7c8725SAlexey Brodkin /* Disable i2c */ 1618b7c8725SAlexey Brodkin enbl = readl(&i2c_regs_p->ic_enable); 1628b7c8725SAlexey Brodkin enbl &= ~IC_ENABLE_0B; 1638b7c8725SAlexey Brodkin writel(enbl, &i2c_regs_p->ic_enable); 1648b7c8725SAlexey Brodkin 165031ed2faSVipin KUMAR writel(i2c_addr, &i2c_regs_p->ic_tar); 1668b7c8725SAlexey Brodkin 1678b7c8725SAlexey Brodkin /* Enable i2c */ 1688b7c8725SAlexey Brodkin enbl = readl(&i2c_regs_p->ic_enable); 1698b7c8725SAlexey Brodkin enbl |= IC_ENABLE_0B; 1708b7c8725SAlexey Brodkin writel(enbl, &i2c_regs_p->ic_enable); 171031ed2faSVipin KUMAR } 172031ed2faSVipin KUMAR 173031ed2faSVipin KUMAR /* 174031ed2faSVipin KUMAR * i2c_flush_rxfifo - Flushes the i2c RX FIFO 175031ed2faSVipin KUMAR * 176031ed2faSVipin KUMAR * Flushes the i2c RX FIFO 177031ed2faSVipin KUMAR */ 178031ed2faSVipin KUMAR static void i2c_flush_rxfifo(void) 179031ed2faSVipin KUMAR { 180031ed2faSVipin KUMAR while (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) 181031ed2faSVipin KUMAR readl(&i2c_regs_p->ic_cmd_data); 182031ed2faSVipin KUMAR } 183031ed2faSVipin KUMAR 184031ed2faSVipin KUMAR /* 185031ed2faSVipin KUMAR * i2c_wait_for_bb - Waits for bus busy 186031ed2faSVipin KUMAR * 187031ed2faSVipin KUMAR * Waits for bus busy 188031ed2faSVipin KUMAR */ 189031ed2faSVipin KUMAR static int i2c_wait_for_bb(void) 190031ed2faSVipin KUMAR { 191031ed2faSVipin KUMAR unsigned long start_time_bb = get_timer(0); 192031ed2faSVipin KUMAR 193031ed2faSVipin KUMAR while ((readl(&i2c_regs_p->ic_status) & IC_STATUS_MA) || 194031ed2faSVipin KUMAR !(readl(&i2c_regs_p->ic_status) & IC_STATUS_TFE)) { 195031ed2faSVipin KUMAR 196031ed2faSVipin KUMAR /* Evaluate timeout */ 197031ed2faSVipin KUMAR if (get_timer(start_time_bb) > (unsigned long)(I2C_BYTE_TO_BB)) 198031ed2faSVipin KUMAR return 1; 199031ed2faSVipin KUMAR } 200031ed2faSVipin KUMAR 201031ed2faSVipin KUMAR return 0; 202031ed2faSVipin KUMAR } 203031ed2faSVipin KUMAR 204070cbaf8SChin Liang See static int i2c_xfer_init(uchar chip, uint addr, int alen) 205031ed2faSVipin KUMAR { 206496ba48fSStefan Roese if (i2c_wait_for_bb()) 207031ed2faSVipin KUMAR return 1; 208031ed2faSVipin KUMAR 209031ed2faSVipin KUMAR i2c_setaddress(chip); 210070cbaf8SChin Liang See while (alen) { 211070cbaf8SChin Liang See alen--; 212070cbaf8SChin Liang See /* high byte address going out first */ 213070cbaf8SChin Liang See writel((addr >> (alen * 8)) & 0xff, 214070cbaf8SChin Liang See &i2c_regs_p->ic_cmd_data); 215070cbaf8SChin Liang See } 216031ed2faSVipin KUMAR return 0; 217031ed2faSVipin KUMAR } 218031ed2faSVipin KUMAR 219031ed2faSVipin KUMAR static int i2c_xfer_finish(void) 220031ed2faSVipin KUMAR { 221031ed2faSVipin KUMAR ulong start_stop_det = get_timer(0); 222031ed2faSVipin KUMAR 223031ed2faSVipin KUMAR while (1) { 224031ed2faSVipin KUMAR if ((readl(&i2c_regs_p->ic_raw_intr_stat) & IC_STOP_DET)) { 225031ed2faSVipin KUMAR readl(&i2c_regs_p->ic_clr_stop_det); 226031ed2faSVipin KUMAR break; 227031ed2faSVipin KUMAR } else if (get_timer(start_stop_det) > I2C_STOPDET_TO) { 228031ed2faSVipin KUMAR break; 229031ed2faSVipin KUMAR } 230031ed2faSVipin KUMAR } 231031ed2faSVipin KUMAR 232031ed2faSVipin KUMAR if (i2c_wait_for_bb()) { 233031ed2faSVipin KUMAR printf("Timed out waiting for bus\n"); 234031ed2faSVipin KUMAR return 1; 235031ed2faSVipin KUMAR } 236031ed2faSVipin KUMAR 237031ed2faSVipin KUMAR i2c_flush_rxfifo(); 238031ed2faSVipin KUMAR 239031ed2faSVipin KUMAR return 0; 240031ed2faSVipin KUMAR } 241031ed2faSVipin KUMAR 242031ed2faSVipin KUMAR /* 243031ed2faSVipin KUMAR * i2c_read - Read from i2c memory 244031ed2faSVipin KUMAR * @chip: target i2c address 245031ed2faSVipin KUMAR * @addr: address to read from 246031ed2faSVipin KUMAR * @alen: 247031ed2faSVipin KUMAR * @buffer: buffer for read data 248031ed2faSVipin KUMAR * @len: no of bytes to be read 249031ed2faSVipin KUMAR * 250031ed2faSVipin KUMAR * Read from i2c memory. 251031ed2faSVipin KUMAR */ 252031ed2faSVipin KUMAR int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) 253031ed2faSVipin KUMAR { 254031ed2faSVipin KUMAR unsigned long start_time_rx; 255031ed2faSVipin KUMAR 25632d041e2SAlexey Brodkin #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 25732d041e2SAlexey Brodkin /* 25832d041e2SAlexey Brodkin * EEPROM chips that implement "address overflow" are ones 25932d041e2SAlexey Brodkin * like Catalyst 24WC04/08/16 which has 9/10/11 bits of 26032d041e2SAlexey Brodkin * address and the extra bits end up in the "chip address" 26132d041e2SAlexey Brodkin * bit slots. This makes a 24WC08 (1Kbyte) chip look like 26232d041e2SAlexey Brodkin * four 256 byte chips. 26332d041e2SAlexey Brodkin * 26432d041e2SAlexey Brodkin * Note that we consider the length of the address field to 26532d041e2SAlexey Brodkin * still be one byte because the extra address bits are 26632d041e2SAlexey Brodkin * hidden in the chip address. 26732d041e2SAlexey Brodkin */ 26832d041e2SAlexey Brodkin chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW); 26932d041e2SAlexey Brodkin addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8)); 27032d041e2SAlexey Brodkin 27132d041e2SAlexey Brodkin debug("%s: fix addr_overflow: chip %02x addr %02x\n", __func__, chip, 27232d041e2SAlexey Brodkin addr); 27332d041e2SAlexey Brodkin #endif 27432d041e2SAlexey Brodkin 275070cbaf8SChin Liang See if (i2c_xfer_init(chip, addr, alen)) 276031ed2faSVipin KUMAR return 1; 277031ed2faSVipin KUMAR 278031ed2faSVipin KUMAR start_time_rx = get_timer(0); 279031ed2faSVipin KUMAR while (len) { 280491739bbSArmando Visconti if (len == 1) 281491739bbSArmando Visconti writel(IC_CMD | IC_STOP, &i2c_regs_p->ic_cmd_data); 282491739bbSArmando Visconti else 283031ed2faSVipin KUMAR writel(IC_CMD, &i2c_regs_p->ic_cmd_data); 284031ed2faSVipin KUMAR 285031ed2faSVipin KUMAR if (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) { 286031ed2faSVipin KUMAR *buffer++ = (uchar)readl(&i2c_regs_p->ic_cmd_data); 287031ed2faSVipin KUMAR len--; 288031ed2faSVipin KUMAR start_time_rx = get_timer(0); 289031ed2faSVipin KUMAR 290031ed2faSVipin KUMAR } else if (get_timer(start_time_rx) > I2C_BYTE_TO) { 291031ed2faSVipin KUMAR return 1; 292031ed2faSVipin KUMAR } 293031ed2faSVipin KUMAR } 294031ed2faSVipin KUMAR 295031ed2faSVipin KUMAR return i2c_xfer_finish(); 296031ed2faSVipin KUMAR } 297031ed2faSVipin KUMAR 298031ed2faSVipin KUMAR /* 299031ed2faSVipin KUMAR * i2c_write - Write to i2c memory 300031ed2faSVipin KUMAR * @chip: target i2c address 301031ed2faSVipin KUMAR * @addr: address to read from 302031ed2faSVipin KUMAR * @alen: 303031ed2faSVipin KUMAR * @buffer: buffer for read data 304031ed2faSVipin KUMAR * @len: no of bytes to be read 305031ed2faSVipin KUMAR * 306031ed2faSVipin KUMAR * Write to i2c memory. 307031ed2faSVipin KUMAR */ 308031ed2faSVipin KUMAR int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) 309031ed2faSVipin KUMAR { 310031ed2faSVipin KUMAR int nb = len; 311031ed2faSVipin KUMAR unsigned long start_time_tx; 312031ed2faSVipin KUMAR 31332d041e2SAlexey Brodkin #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 31432d041e2SAlexey Brodkin /* 31532d041e2SAlexey Brodkin * EEPROM chips that implement "address overflow" are ones 31632d041e2SAlexey Brodkin * like Catalyst 24WC04/08/16 which has 9/10/11 bits of 31732d041e2SAlexey Brodkin * address and the extra bits end up in the "chip address" 31832d041e2SAlexey Brodkin * bit slots. This makes a 24WC08 (1Kbyte) chip look like 31932d041e2SAlexey Brodkin * four 256 byte chips. 32032d041e2SAlexey Brodkin * 32132d041e2SAlexey Brodkin * Note that we consider the length of the address field to 32232d041e2SAlexey Brodkin * still be one byte because the extra address bits are 32332d041e2SAlexey Brodkin * hidden in the chip address. 32432d041e2SAlexey Brodkin */ 32532d041e2SAlexey Brodkin chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW); 32632d041e2SAlexey Brodkin addr &= ~(CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW << (alen * 8)); 32732d041e2SAlexey Brodkin 32832d041e2SAlexey Brodkin debug("%s: fix addr_overflow: chip %02x addr %02x\n", __func__, chip, 32932d041e2SAlexey Brodkin addr); 33032d041e2SAlexey Brodkin #endif 33132d041e2SAlexey Brodkin 332070cbaf8SChin Liang See if (i2c_xfer_init(chip, addr, alen)) 333031ed2faSVipin KUMAR return 1; 334031ed2faSVipin KUMAR 335031ed2faSVipin KUMAR start_time_tx = get_timer(0); 336031ed2faSVipin KUMAR while (len) { 337031ed2faSVipin KUMAR if (readl(&i2c_regs_p->ic_status) & IC_STATUS_TFNF) { 338491739bbSArmando Visconti if (--len == 0) 339491739bbSArmando Visconti writel(*buffer | IC_STOP, &i2c_regs_p->ic_cmd_data); 340491739bbSArmando Visconti else 341031ed2faSVipin KUMAR writel(*buffer, &i2c_regs_p->ic_cmd_data); 342031ed2faSVipin KUMAR buffer++; 343031ed2faSVipin KUMAR start_time_tx = get_timer(0); 344031ed2faSVipin KUMAR 345031ed2faSVipin KUMAR } else if (get_timer(start_time_tx) > (nb * I2C_BYTE_TO)) { 346031ed2faSVipin KUMAR printf("Timed out. i2c write Failed\n"); 347031ed2faSVipin KUMAR return 1; 348031ed2faSVipin KUMAR } 349031ed2faSVipin KUMAR } 350031ed2faSVipin KUMAR 351031ed2faSVipin KUMAR return i2c_xfer_finish(); 352031ed2faSVipin KUMAR } 353031ed2faSVipin KUMAR 354031ed2faSVipin KUMAR /* 355031ed2faSVipin KUMAR * i2c_probe - Probe the i2c chip 356031ed2faSVipin KUMAR */ 357031ed2faSVipin KUMAR int i2c_probe(uchar chip) 358031ed2faSVipin KUMAR { 359031ed2faSVipin KUMAR u32 tmp; 360496ba48fSStefan Roese int ret; 361031ed2faSVipin KUMAR 362031ed2faSVipin KUMAR /* 363031ed2faSVipin KUMAR * Try to read the first location of the chip. 364031ed2faSVipin KUMAR */ 365496ba48fSStefan Roese ret = i2c_read(chip, 0, 1, (uchar *)&tmp, 1); 366496ba48fSStefan Roese if (ret) 367496ba48fSStefan Roese i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 368496ba48fSStefan Roese 369496ba48fSStefan Roese return ret; 370031ed2faSVipin KUMAR } 371ac6e2fe6SArmando Visconti 372ac6e2fe6SArmando Visconti #ifdef CONFIG_I2C_MULTI_BUS 373ac6e2fe6SArmando Visconti int i2c_set_bus_num(unsigned int bus) 374ac6e2fe6SArmando Visconti { 375ac6e2fe6SArmando Visconti switch (bus) { 376ac6e2fe6SArmando Visconti case 0: 377ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE; 378ac6e2fe6SArmando Visconti break; 379ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE1 380ac6e2fe6SArmando Visconti case 1: 381ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE1; 382ac6e2fe6SArmando Visconti break; 383ac6e2fe6SArmando Visconti #endif 384ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE2 385ac6e2fe6SArmando Visconti case 2: 386ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE2; 387ac6e2fe6SArmando Visconti break; 388ac6e2fe6SArmando Visconti #endif 389ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE3 390ac6e2fe6SArmando Visconti case 3: 391ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE3; 392ac6e2fe6SArmando Visconti break; 393ac6e2fe6SArmando Visconti #endif 394ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE4 395ac6e2fe6SArmando Visconti case 4: 396ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE4; 397ac6e2fe6SArmando Visconti break; 398ac6e2fe6SArmando Visconti #endif 399ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE5 400ac6e2fe6SArmando Visconti case 5: 401ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE5; 402ac6e2fe6SArmando Visconti break; 403ac6e2fe6SArmando Visconti #endif 404ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE6 405ac6e2fe6SArmando Visconti case 6: 406ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE6; 407ac6e2fe6SArmando Visconti break; 408ac6e2fe6SArmando Visconti #endif 409ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE7 410ac6e2fe6SArmando Visconti case 7: 411ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE7; 412ac6e2fe6SArmando Visconti break; 413ac6e2fe6SArmando Visconti #endif 414ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE8 415ac6e2fe6SArmando Visconti case 8: 416ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE8; 417ac6e2fe6SArmando Visconti break; 418ac6e2fe6SArmando Visconti #endif 419ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE9 420ac6e2fe6SArmando Visconti case 9: 421ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE9; 422ac6e2fe6SArmando Visconti break; 423ac6e2fe6SArmando Visconti #endif 424ac6e2fe6SArmando Visconti default: 425ac6e2fe6SArmando Visconti printf("Bad bus: %d\n", bus); 426ac6e2fe6SArmando Visconti return -1; 427ac6e2fe6SArmando Visconti } 428ac6e2fe6SArmando Visconti 429ac6e2fe6SArmando Visconti current_bus = bus; 430ac6e2fe6SArmando Visconti 431ac6e2fe6SArmando Visconti if (!bus_initialized[current_bus]) 432ac6e2fe6SArmando Visconti i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 433ac6e2fe6SArmando Visconti 434ac6e2fe6SArmando Visconti return 0; 435ac6e2fe6SArmando Visconti } 436ac6e2fe6SArmando Visconti 437*c69ecd97SJeroen Hofstee unsigned int i2c_get_bus_num(void) 438ac6e2fe6SArmando Visconti { 439ac6e2fe6SArmando Visconti return current_bus; 440ac6e2fe6SArmando Visconti } 441ac6e2fe6SArmando Visconti #endif 442