summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/gen83xx/i2c/i2c_init.c
diff options
context:
space:
mode:
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.c113
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;
}