diff options
Diffstat (limited to 'c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c | 113 |
1 files changed, 61 insertions, 52 deletions
diff --git a/c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c b/c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c index 9b30d0fd74..b427da7314 100644 --- a/c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c +++ b/c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c @@ -20,10 +20,31 @@ #include <mpc83xx/mpc83xx_i2cdrv.h> #include <libchip/i2c-2b-eeprom.h> +#include <libchip/i2c-sc620.h> #include <bsp/irq.h> #include <bsp.h> -static mpc83xx_i2c_desc_t mpc83xx_i2c_bus_tbl[2] = { +static void i2c1_probe(mpc83xx_i2c_softc_t *self) +{ +#if MPC83XX_CHIP_TYPE != 8309 + if (((mpc83xx.clk.sccr >> (31-1)) & 0x03) > 0) { + self->base_frq = + (BSP_bus_frequency + /((mpc83xx.clk.sccr >> (31-1)) & 0x03)); + } +#else /* MPC83XX_CHIP_TYPE != 8309 */ + self->base_frq = BSP_bus_frequency; +#endif /* MPC83XX_CHIP_TYPE != 8309 */ +} + +#ifndef MPC83XX_BOARD_BR_UID +static void i2c2_probe(mpc83xx_i2c_softc_t *self) +{ + self->base_frq = BSP_bus_frequency; +} +#endif /* MPC83XX_BOARD_BR_UID */ + +static mpc83xx_i2c_desc_t mpc83xx_i2c_bus_tbl[] = { /* first channel */ { {/* public fields */ @@ -34,27 +55,26 @@ static mpc83xx_i2c_desc_t mpc83xx_i2c_bus_tbl[2] = { .reg_ptr = &mpc83xx.i2c[0], .initialized = FALSE, .irq_number = BSP_IPIC_IRQ_I2C1, - .base_frq = 0 /* will be set during initiailization */ + .base_frq = 0, /* will be set during probe */ + .probe = i2c1_probe } - }, + } +#ifndef MPC83XX_BOARD_BR_UID /* second channel */ - { + , { { /* public fields */ .ops = &mpc83xx_i2c_ops, - .size = sizeof(mpc83xx_i2c_bus_tbl[1]), + .size = sizeof(mpc83xx_i2c_bus_tbl[0]), }, { /* our private fields */ .reg_ptr = &mpc83xx.i2c[1], .initialized = FALSE, .irq_number = BSP_IPIC_IRQ_I2C2, - .base_frq = 0 /* will be set during initiailization */ + .base_frq = 0, /* will be set during probe */ + .probe = i2c2_probe } } -}; - -rtems_libi2c_bus_t *mpc83xx_i2c_bus_descriptor[2] = { - &mpc83xx_i2c_bus_tbl[0].bus_desc, - &mpc83xx_i2c_bus_tbl[1].bus_desc +#endif /* MPC83XX_BOARD_BR_UID */ }; /*=========================================================================*\ @@ -76,8 +96,10 @@ rtems_status_code bsp_register_i2c \*=========================================================================*/ { - int ret_code; - int i2c1_busno,i2c2_busno; + char device_path[] = "/dev/i2c?"; + size_t n = RTEMS_ARRAY_SIZE(mpc83xx_i2c_bus_tbl); + size_t i; + int i2c_busno[n]; /* * init I2C library (if not already done) @@ -85,54 +107,41 @@ rtems_status_code bsp_register_i2c rtems_libi2c_initialize (); /* - * update input frequency of I2c modules into descriptor - */ - /* - * I2C1 is clocked with TSEC 1 + * init I2C buses */ - if (((mpc83xx.clk.sccr >> (31-1)) & 0x03) > 0) { - mpc83xx_i2c_bus_tbl[0].softc.base_frq = - (BSP_bus_frequency - /((mpc83xx.clk.sccr >> (31-1)) & 0x03)); - } + for (i = 0; i < n; ++i) { + mpc83xx_i2c_desc_t *desc = &mpc83xx_i2c_bus_tbl[i]; - mpc83xx_i2c_bus_tbl[1].softc.base_frq = BSP_bus_frequency; - /* - * register first I2C bus - */ - ret_code = rtems_libi2c_register_bus("/dev/i2c1", - mpc83xx_i2c_bus_descriptor[0]); - if (ret_code < 0) { - return -ret_code; - } - i2c1_busno = ret_code; - /* - * register second I2C bus - */ - ret_code = rtems_libi2c_register_bus("/dev/i2c2", - mpc83xx_i2c_bus_descriptor[1]); - if (ret_code < 0) { - return -ret_code; + (*desc->softc.probe)(&desc->softc); + device_path[sizeof(device_path) - 2] = (char) ('1' + i); + i2c_busno[i] = rtems_libi2c_register_bus(device_path, &desc->bus_desc); } - i2c2_busno = ret_code; #ifdef RTEMS_BSP_I2C_EEPROM_DEVICE_NAME - - /* - * register EEPROM to bus 1, Address 0x50 - */ - ret_code = rtems_libi2c_register_drv(RTEMS_BSP_I2C_EEPROM_DEVICE_NAME, - i2c_2b_eeprom_driver_descriptor, - i2c1_busno,0x50); - - if (ret_code < 0) { - return -ret_code; + if (n > 0) { + /* + * register EEPROM to bus 1, Address 0x50 + */ + rtems_libi2c_register_drv(RTEMS_BSP_I2C_EEPROM_DEVICE_NAME, + i2c_2b_eeprom_driver_descriptor, + i2c_busno[0],0x50); } - #endif /* RTEMS_BSP_I2C_EEPROM_DEVICE_NAME */ +#ifdef MPC83XX_BOARD_BR_UID + if (n > 0) { + rtems_libi2c_register_drv( + "sc620", + &i2c_sc620_driver, + i2c_busno[0], + 0x70 + ); + } +#endif /* MPC83XX_BOARD_BR_UID */ + /* * FIXME: register RTC driver, when available */ - return 0; + + return RTEMS_SUCCESSFUL; } |