1031ed2faSVipin KUMAR /* 2031ed2faSVipin KUMAR * (C) Copyright 2009 3031ed2faSVipin KUMAR * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. 4031ed2faSVipin KUMAR * 5*1a459660SWolfgang 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 <asm/arch/hardware.h> 11031ed2faSVipin KUMAR #include "designware_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 */ 80496ba48fSStefan Roese int i2c_set_bus_speed(int speed) 81031ed2faSVipin KUMAR { 82031ed2faSVipin KUMAR if (speed >= I2C_MAX_SPEED) 83031ed2faSVipin KUMAR set_speed(IC_SPEED_MODE_MAX); 84031ed2faSVipin KUMAR else if (speed >= I2C_FAST_SPEED) 85031ed2faSVipin KUMAR set_speed(IC_SPEED_MODE_FAST); 86031ed2faSVipin KUMAR else 87031ed2faSVipin KUMAR set_speed(IC_SPEED_MODE_STANDARD); 88496ba48fSStefan Roese 89496ba48fSStefan Roese return 0; 90031ed2faSVipin KUMAR } 91031ed2faSVipin KUMAR 92031ed2faSVipin KUMAR /* 93031ed2faSVipin KUMAR * i2c_get_bus_speed - Gets the i2c speed 94031ed2faSVipin KUMAR * 95031ed2faSVipin KUMAR * Gets the i2c speed. 96031ed2faSVipin KUMAR */ 97031ed2faSVipin KUMAR int i2c_get_bus_speed(void) 98031ed2faSVipin KUMAR { 99031ed2faSVipin KUMAR u32 cntl; 100031ed2faSVipin KUMAR 101031ed2faSVipin KUMAR cntl = (readl(&i2c_regs_p->ic_con) & IC_CON_SPD_MSK); 102031ed2faSVipin KUMAR 103031ed2faSVipin KUMAR if (cntl == IC_CON_SPD_HS) 104031ed2faSVipin KUMAR return I2C_MAX_SPEED; 105031ed2faSVipin KUMAR else if (cntl == IC_CON_SPD_FS) 106031ed2faSVipin KUMAR return I2C_FAST_SPEED; 107031ed2faSVipin KUMAR else if (cntl == IC_CON_SPD_SS) 108031ed2faSVipin KUMAR return I2C_STANDARD_SPEED; 109031ed2faSVipin KUMAR 110031ed2faSVipin KUMAR return 0; 111031ed2faSVipin KUMAR } 112031ed2faSVipin KUMAR 113031ed2faSVipin KUMAR /* 114031ed2faSVipin KUMAR * i2c_init - Init function 115031ed2faSVipin KUMAR * @speed: required i2c speed 116031ed2faSVipin KUMAR * @slaveadd: slave address for the device 117031ed2faSVipin KUMAR * 118031ed2faSVipin KUMAR * Initialization function. 119031ed2faSVipin KUMAR */ 120031ed2faSVipin KUMAR void i2c_init(int speed, int slaveadd) 121031ed2faSVipin KUMAR { 122031ed2faSVipin KUMAR unsigned int enbl; 123031ed2faSVipin KUMAR 124031ed2faSVipin KUMAR /* Disable i2c */ 125031ed2faSVipin KUMAR enbl = readl(&i2c_regs_p->ic_enable); 126031ed2faSVipin KUMAR enbl &= ~IC_ENABLE_0B; 127031ed2faSVipin KUMAR writel(enbl, &i2c_regs_p->ic_enable); 128031ed2faSVipin KUMAR 129031ed2faSVipin KUMAR writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_regs_p->ic_con); 130031ed2faSVipin KUMAR writel(IC_RX_TL, &i2c_regs_p->ic_rx_tl); 131031ed2faSVipin KUMAR writel(IC_TX_TL, &i2c_regs_p->ic_tx_tl); 132031ed2faSVipin KUMAR i2c_set_bus_speed(speed); 133031ed2faSVipin KUMAR writel(IC_STOP_DET, &i2c_regs_p->ic_intr_mask); 134031ed2faSVipin KUMAR writel(slaveadd, &i2c_regs_p->ic_sar); 135031ed2faSVipin KUMAR 136031ed2faSVipin KUMAR /* Enable i2c */ 137031ed2faSVipin KUMAR enbl = readl(&i2c_regs_p->ic_enable); 138031ed2faSVipin KUMAR enbl |= IC_ENABLE_0B; 139031ed2faSVipin KUMAR writel(enbl, &i2c_regs_p->ic_enable); 140ac6e2fe6SArmando Visconti 141ac6e2fe6SArmando Visconti #ifdef CONFIG_I2C_MULTI_BUS 142ac6e2fe6SArmando Visconti bus_initialized[current_bus] = 1; 143ac6e2fe6SArmando Visconti #endif 144031ed2faSVipin KUMAR } 145031ed2faSVipin KUMAR 146031ed2faSVipin KUMAR /* 147031ed2faSVipin KUMAR * i2c_setaddress - Sets the target slave address 148031ed2faSVipin KUMAR * @i2c_addr: target i2c address 149031ed2faSVipin KUMAR * 150031ed2faSVipin KUMAR * Sets the target slave address. 151031ed2faSVipin KUMAR */ 152031ed2faSVipin KUMAR static void i2c_setaddress(unsigned int i2c_addr) 153031ed2faSVipin KUMAR { 154031ed2faSVipin KUMAR writel(i2c_addr, &i2c_regs_p->ic_tar); 155031ed2faSVipin KUMAR } 156031ed2faSVipin KUMAR 157031ed2faSVipin KUMAR /* 158031ed2faSVipin KUMAR * i2c_flush_rxfifo - Flushes the i2c RX FIFO 159031ed2faSVipin KUMAR * 160031ed2faSVipin KUMAR * Flushes the i2c RX FIFO 161031ed2faSVipin KUMAR */ 162031ed2faSVipin KUMAR static void i2c_flush_rxfifo(void) 163031ed2faSVipin KUMAR { 164031ed2faSVipin KUMAR while (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) 165031ed2faSVipin KUMAR readl(&i2c_regs_p->ic_cmd_data); 166031ed2faSVipin KUMAR } 167031ed2faSVipin KUMAR 168031ed2faSVipin KUMAR /* 169031ed2faSVipin KUMAR * i2c_wait_for_bb - Waits for bus busy 170031ed2faSVipin KUMAR * 171031ed2faSVipin KUMAR * Waits for bus busy 172031ed2faSVipin KUMAR */ 173031ed2faSVipin KUMAR static int i2c_wait_for_bb(void) 174031ed2faSVipin KUMAR { 175031ed2faSVipin KUMAR unsigned long start_time_bb = get_timer(0); 176031ed2faSVipin KUMAR 177031ed2faSVipin KUMAR while ((readl(&i2c_regs_p->ic_status) & IC_STATUS_MA) || 178031ed2faSVipin KUMAR !(readl(&i2c_regs_p->ic_status) & IC_STATUS_TFE)) { 179031ed2faSVipin KUMAR 180031ed2faSVipin KUMAR /* Evaluate timeout */ 181031ed2faSVipin KUMAR if (get_timer(start_time_bb) > (unsigned long)(I2C_BYTE_TO_BB)) 182031ed2faSVipin KUMAR return 1; 183031ed2faSVipin KUMAR } 184031ed2faSVipin KUMAR 185031ed2faSVipin KUMAR return 0; 186031ed2faSVipin KUMAR } 187031ed2faSVipin KUMAR 188031ed2faSVipin KUMAR /* check parameters for i2c_read and i2c_write */ 189031ed2faSVipin KUMAR static int check_params(uint addr, int alen, uchar *buffer, int len) 190031ed2faSVipin KUMAR { 191031ed2faSVipin KUMAR if (buffer == NULL) { 192031ed2faSVipin KUMAR printf("Buffer is invalid\n"); 193031ed2faSVipin KUMAR return 1; 194031ed2faSVipin KUMAR } 195031ed2faSVipin KUMAR 196031ed2faSVipin KUMAR if (alen > 1) { 197031ed2faSVipin KUMAR printf("addr len %d not supported\n", alen); 198031ed2faSVipin KUMAR return 1; 199031ed2faSVipin KUMAR } 200031ed2faSVipin KUMAR 201031ed2faSVipin KUMAR if (addr + len > 256) { 202031ed2faSVipin KUMAR printf("address out of range\n"); 203031ed2faSVipin KUMAR return 1; 204031ed2faSVipin KUMAR } 205031ed2faSVipin KUMAR 206031ed2faSVipin KUMAR return 0; 207031ed2faSVipin KUMAR } 208031ed2faSVipin KUMAR 209031ed2faSVipin KUMAR static int i2c_xfer_init(uchar chip, uint addr) 210031ed2faSVipin KUMAR { 211496ba48fSStefan Roese if (i2c_wait_for_bb()) 212031ed2faSVipin KUMAR return 1; 213031ed2faSVipin KUMAR 214031ed2faSVipin KUMAR i2c_setaddress(chip); 215031ed2faSVipin KUMAR writel(addr, &i2c_regs_p->ic_cmd_data); 216031ed2faSVipin KUMAR 217031ed2faSVipin KUMAR return 0; 218031ed2faSVipin KUMAR } 219031ed2faSVipin KUMAR 220031ed2faSVipin KUMAR static int i2c_xfer_finish(void) 221031ed2faSVipin KUMAR { 222031ed2faSVipin KUMAR ulong start_stop_det = get_timer(0); 223031ed2faSVipin KUMAR 224031ed2faSVipin KUMAR while (1) { 225031ed2faSVipin KUMAR if ((readl(&i2c_regs_p->ic_raw_intr_stat) & IC_STOP_DET)) { 226031ed2faSVipin KUMAR readl(&i2c_regs_p->ic_clr_stop_det); 227031ed2faSVipin KUMAR break; 228031ed2faSVipin KUMAR } else if (get_timer(start_stop_det) > I2C_STOPDET_TO) { 229031ed2faSVipin KUMAR break; 230031ed2faSVipin KUMAR } 231031ed2faSVipin KUMAR } 232031ed2faSVipin KUMAR 233031ed2faSVipin KUMAR if (i2c_wait_for_bb()) { 234031ed2faSVipin KUMAR printf("Timed out waiting for bus\n"); 235031ed2faSVipin KUMAR return 1; 236031ed2faSVipin KUMAR } 237031ed2faSVipin KUMAR 238031ed2faSVipin KUMAR i2c_flush_rxfifo(); 239031ed2faSVipin KUMAR 240031ed2faSVipin KUMAR /* Wait for read/write operation to complete on actual memory */ 241031ed2faSVipin KUMAR udelay(10000); 242031ed2faSVipin KUMAR 243031ed2faSVipin KUMAR return 0; 244031ed2faSVipin KUMAR } 245031ed2faSVipin KUMAR 246031ed2faSVipin KUMAR /* 247031ed2faSVipin KUMAR * i2c_read - Read from i2c memory 248031ed2faSVipin KUMAR * @chip: target i2c address 249031ed2faSVipin KUMAR * @addr: address to read from 250031ed2faSVipin KUMAR * @alen: 251031ed2faSVipin KUMAR * @buffer: buffer for read data 252031ed2faSVipin KUMAR * @len: no of bytes to be read 253031ed2faSVipin KUMAR * 254031ed2faSVipin KUMAR * Read from i2c memory. 255031ed2faSVipin KUMAR */ 256031ed2faSVipin KUMAR int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) 257031ed2faSVipin KUMAR { 258031ed2faSVipin KUMAR unsigned long start_time_rx; 259031ed2faSVipin KUMAR 260031ed2faSVipin KUMAR if (check_params(addr, alen, buffer, len)) 261031ed2faSVipin KUMAR return 1; 262031ed2faSVipin KUMAR 263031ed2faSVipin KUMAR if (i2c_xfer_init(chip, addr)) 264031ed2faSVipin KUMAR return 1; 265031ed2faSVipin KUMAR 266031ed2faSVipin KUMAR start_time_rx = get_timer(0); 267031ed2faSVipin KUMAR while (len) { 268491739bbSArmando Visconti if (len == 1) 269491739bbSArmando Visconti writel(IC_CMD | IC_STOP, &i2c_regs_p->ic_cmd_data); 270491739bbSArmando Visconti else 271031ed2faSVipin KUMAR writel(IC_CMD, &i2c_regs_p->ic_cmd_data); 272031ed2faSVipin KUMAR 273031ed2faSVipin KUMAR if (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) { 274031ed2faSVipin KUMAR *buffer++ = (uchar)readl(&i2c_regs_p->ic_cmd_data); 275031ed2faSVipin KUMAR len--; 276031ed2faSVipin KUMAR start_time_rx = get_timer(0); 277031ed2faSVipin KUMAR 278031ed2faSVipin KUMAR } else if (get_timer(start_time_rx) > I2C_BYTE_TO) { 279031ed2faSVipin KUMAR return 1; 280031ed2faSVipin KUMAR } 281031ed2faSVipin KUMAR } 282031ed2faSVipin KUMAR 283031ed2faSVipin KUMAR return i2c_xfer_finish(); 284031ed2faSVipin KUMAR } 285031ed2faSVipin KUMAR 286031ed2faSVipin KUMAR /* 287031ed2faSVipin KUMAR * i2c_write - Write to i2c memory 288031ed2faSVipin KUMAR * @chip: target i2c address 289031ed2faSVipin KUMAR * @addr: address to read from 290031ed2faSVipin KUMAR * @alen: 291031ed2faSVipin KUMAR * @buffer: buffer for read data 292031ed2faSVipin KUMAR * @len: no of bytes to be read 293031ed2faSVipin KUMAR * 294031ed2faSVipin KUMAR * Write to i2c memory. 295031ed2faSVipin KUMAR */ 296031ed2faSVipin KUMAR int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) 297031ed2faSVipin KUMAR { 298031ed2faSVipin KUMAR int nb = len; 299031ed2faSVipin KUMAR unsigned long start_time_tx; 300031ed2faSVipin KUMAR 301031ed2faSVipin KUMAR if (check_params(addr, alen, buffer, len)) 302031ed2faSVipin KUMAR return 1; 303031ed2faSVipin KUMAR 304031ed2faSVipin KUMAR if (i2c_xfer_init(chip, addr)) 305031ed2faSVipin KUMAR return 1; 306031ed2faSVipin KUMAR 307031ed2faSVipin KUMAR start_time_tx = get_timer(0); 308031ed2faSVipin KUMAR while (len) { 309031ed2faSVipin KUMAR if (readl(&i2c_regs_p->ic_status) & IC_STATUS_TFNF) { 310491739bbSArmando Visconti if (--len == 0) 311491739bbSArmando Visconti writel(*buffer | IC_STOP, &i2c_regs_p->ic_cmd_data); 312491739bbSArmando Visconti else 313031ed2faSVipin KUMAR writel(*buffer, &i2c_regs_p->ic_cmd_data); 314031ed2faSVipin KUMAR buffer++; 315031ed2faSVipin KUMAR start_time_tx = get_timer(0); 316031ed2faSVipin KUMAR 317031ed2faSVipin KUMAR } else if (get_timer(start_time_tx) > (nb * I2C_BYTE_TO)) { 318031ed2faSVipin KUMAR printf("Timed out. i2c write Failed\n"); 319031ed2faSVipin KUMAR return 1; 320031ed2faSVipin KUMAR } 321031ed2faSVipin KUMAR } 322031ed2faSVipin KUMAR 323031ed2faSVipin KUMAR return i2c_xfer_finish(); 324031ed2faSVipin KUMAR } 325031ed2faSVipin KUMAR 326031ed2faSVipin KUMAR /* 327031ed2faSVipin KUMAR * i2c_probe - Probe the i2c chip 328031ed2faSVipin KUMAR */ 329031ed2faSVipin KUMAR int i2c_probe(uchar chip) 330031ed2faSVipin KUMAR { 331031ed2faSVipin KUMAR u32 tmp; 332496ba48fSStefan Roese int ret; 333031ed2faSVipin KUMAR 334031ed2faSVipin KUMAR /* 335031ed2faSVipin KUMAR * Try to read the first location of the chip. 336031ed2faSVipin KUMAR */ 337496ba48fSStefan Roese ret = i2c_read(chip, 0, 1, (uchar *)&tmp, 1); 338496ba48fSStefan Roese if (ret) 339496ba48fSStefan Roese i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 340496ba48fSStefan Roese 341496ba48fSStefan Roese return ret; 342031ed2faSVipin KUMAR } 343ac6e2fe6SArmando Visconti 344ac6e2fe6SArmando Visconti #ifdef CONFIG_I2C_MULTI_BUS 345ac6e2fe6SArmando Visconti int i2c_set_bus_num(unsigned int bus) 346ac6e2fe6SArmando Visconti { 347ac6e2fe6SArmando Visconti switch (bus) { 348ac6e2fe6SArmando Visconti case 0: 349ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE; 350ac6e2fe6SArmando Visconti break; 351ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE1 352ac6e2fe6SArmando Visconti case 1: 353ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE1; 354ac6e2fe6SArmando Visconti break; 355ac6e2fe6SArmando Visconti #endif 356ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE2 357ac6e2fe6SArmando Visconti case 2: 358ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE2; 359ac6e2fe6SArmando Visconti break; 360ac6e2fe6SArmando Visconti #endif 361ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE3 362ac6e2fe6SArmando Visconti case 3: 363ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE3; 364ac6e2fe6SArmando Visconti break; 365ac6e2fe6SArmando Visconti #endif 366ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE4 367ac6e2fe6SArmando Visconti case 4: 368ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE4; 369ac6e2fe6SArmando Visconti break; 370ac6e2fe6SArmando Visconti #endif 371ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE5 372ac6e2fe6SArmando Visconti case 5: 373ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE5; 374ac6e2fe6SArmando Visconti break; 375ac6e2fe6SArmando Visconti #endif 376ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE6 377ac6e2fe6SArmando Visconti case 6: 378ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE6; 379ac6e2fe6SArmando Visconti break; 380ac6e2fe6SArmando Visconti #endif 381ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE7 382ac6e2fe6SArmando Visconti case 7: 383ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE7; 384ac6e2fe6SArmando Visconti break; 385ac6e2fe6SArmando Visconti #endif 386ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE8 387ac6e2fe6SArmando Visconti case 8: 388ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE8; 389ac6e2fe6SArmando Visconti break; 390ac6e2fe6SArmando Visconti #endif 391ac6e2fe6SArmando Visconti #ifdef CONFIG_SYS_I2C_BASE9 392ac6e2fe6SArmando Visconti case 9: 393ac6e2fe6SArmando Visconti i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE9; 394ac6e2fe6SArmando Visconti break; 395ac6e2fe6SArmando Visconti #endif 396ac6e2fe6SArmando Visconti default: 397ac6e2fe6SArmando Visconti printf("Bad bus: %d\n", bus); 398ac6e2fe6SArmando Visconti return -1; 399ac6e2fe6SArmando Visconti } 400ac6e2fe6SArmando Visconti 401ac6e2fe6SArmando Visconti current_bus = bus; 402ac6e2fe6SArmando Visconti 403ac6e2fe6SArmando Visconti if (!bus_initialized[current_bus]) 404ac6e2fe6SArmando Visconti i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); 405ac6e2fe6SArmando Visconti 406ac6e2fe6SArmando Visconti return 0; 407ac6e2fe6SArmando Visconti } 408ac6e2fe6SArmando Visconti 409ac6e2fe6SArmando Visconti int i2c_get_bus_num(void) 410ac6e2fe6SArmando Visconti { 411ac6e2fe6SArmando Visconti return current_bus; 412ac6e2fe6SArmando Visconti } 413ac6e2fe6SArmando Visconti #endif 414