bsps/powerpc: Add probe handler to I2C driver

This commit is contained in:
Sebastian Huber
2013-01-09 13:17:18 +01:00
parent 339646e887
commit aeff597721
3 changed files with 57 additions and 54 deletions

View File

@@ -23,7 +23,27 @@
#include <bsp/irq.h> #include <bsp/irq.h>
#include <bsp.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 */ /* first channel */
{ {
{/* public fields */ {/* public fields */
@@ -34,27 +54,26 @@ static mpc83xx_i2c_desc_t mpc83xx_i2c_bus_tbl[2] = {
.reg_ptr = &mpc83xx.i2c[0], .reg_ptr = &mpc83xx.i2c[0],
.initialized = FALSE, .initialized = FALSE,
.irq_number = BSP_IPIC_IRQ_I2C1, .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 */ /* second channel */
{ , {
{ /* public fields */ { /* public fields */
.ops = &mpc83xx_i2c_ops, .ops = &mpc83xx_i2c_ops,
.size = sizeof(mpc83xx_i2c_bus_tbl[1]), .size = sizeof(mpc83xx_i2c_bus_tbl[0]),
}, },
{ /* our private fields */ { /* our private fields */
.reg_ptr = &mpc83xx.i2c[1], .reg_ptr = &mpc83xx.i2c[1],
.initialized = FALSE, .initialized = FALSE,
.irq_number = BSP_IPIC_IRQ_I2C2, .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
} }
} }
}; #endif /* MPC83XX_BOARD_BR_UID */
rtems_libi2c_bus_t *mpc83xx_i2c_bus_descriptor[2] = {
&mpc83xx_i2c_bus_tbl[0].bus_desc,
&mpc83xx_i2c_bus_tbl[1].bus_desc
}; };
/*=========================================================================*\ /*=========================================================================*\
@@ -76,8 +95,10 @@ rtems_status_code bsp_register_i2c
\*=========================================================================*/ \*=========================================================================*/
{ {
int ret_code; char device_path[] = "/dev/i2c?";
int i2c1_busno,i2c2_busno; size_t n = RTEMS_ARRAY_SIZE(mpc83xx_i2c_bus_tbl);
size_t i;
int i2c_busno[n];
/* /*
* init I2C library (if not already done) * init I2C library (if not already done)
@@ -85,54 +106,30 @@ rtems_status_code bsp_register_i2c
rtems_libi2c_initialize (); rtems_libi2c_initialize ();
/* /*
* update input frequency of I2c modules into descriptor * init I2C buses
*/ */
/* for (i = 0; i < n; ++i) {
* I2C1 is clocked with TSEC 1 mpc83xx_i2c_desc_t *desc = &mpc83xx_i2c_bus_tbl[i];
*/
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));
}
mpc83xx_i2c_bus_tbl[1].softc.base_frq = BSP_bus_frequency; (*desc->softc.probe)(&desc->softc);
/* device_path[sizeof(device_path) - 2] = (char) ('1' + i);
* register first I2C bus i2c_busno[i] = rtems_libi2c_register_bus(device_path, &desc->bus_desc);
*/
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;
}
i2c2_busno = ret_code;
#ifdef RTEMS_BSP_I2C_EEPROM_DEVICE_NAME #ifdef RTEMS_BSP_I2C_EEPROM_DEVICE_NAME
if (n > 0) {
/* /*
* register EEPROM to bus 1, Address 0x50 * register EEPROM to bus 1, Address 0x50
*/ */
ret_code = rtems_libi2c_register_drv(RTEMS_BSP_I2C_EEPROM_DEVICE_NAME, rtems_libi2c_register_drv(RTEMS_BSP_I2C_EEPROM_DEVICE_NAME,
i2c_2b_eeprom_driver_descriptor, i2c_2b_eeprom_driver_descriptor,
i2c1_busno,0x50); i2c_busno[0],0x50);
if (ret_code < 0) {
return -ret_code;
} }
#endif /* RTEMS_BSP_I2C_EEPROM_DEVICE_NAME */ #endif /* RTEMS_BSP_I2C_EEPROM_DEVICE_NAME */
/* /*
* FIXME: register RTC driver, when available * FIXME: register RTC driver, when available
*/ */
return 0;
return RTEMS_SUCCESSFUL;
} }

View File

@@ -24,6 +24,11 @@
#include <bsp/mpc83xx_i2cdrv.h> #include <bsp/mpc83xx_i2cdrv.h>
#if MPC55XX_CHIP_FAMILY == 551 #if MPC55XX_CHIP_FAMILY == 551
static void i2c_probe(mpc83xx_i2c_softc_t *self)
{
self->base_frq = bsp_clock_speed;
}
static mpc83xx_i2c_desc_t mpc55xx_i2c_bus = { static mpc83xx_i2c_desc_t mpc55xx_i2c_bus = {
.bus_desc = { .bus_desc = {
.ops = &mpc83xx_i2c_ops, .ops = &mpc83xx_i2c_ops,
@@ -33,7 +38,8 @@
.reg_ptr = (m83xxI2CRegisters_t *) 0xfff88000, .reg_ptr = (m83xxI2CRegisters_t *) 0xfff88000,
.initialized = FALSE, .initialized = FALSE,
.irq_number = MPC55XX_IRQ_I2C(0), .irq_number = MPC55XX_IRQ_I2C(0),
.base_frq = 0 .base_frq = 0,
.probe = i2c_probe
} }
}; };
@@ -44,7 +50,6 @@
rtems_libi2c_initialize (); rtems_libi2c_initialize ();
mpc55xx_i2c_bus.softc.base_frq = bsp_clock_speed;
busno = rtems_libi2c_register_bus( busno = rtems_libi2c_register_bus(
"/dev/i2c1", "/dev/i2c1",
&mpc55xx_i2c_bus.bus_desc &mpc55xx_i2c_bus.bus_desc

View File

@@ -49,6 +49,7 @@ typedef struct mpc83xx_i2c_softc {
rtems_irq_number irq_number; /* IRQ number used for this module */ rtems_irq_number irq_number; /* IRQ number used for this module */
uint32_t base_frq; /* input frq for baud rate divider */ uint32_t base_frq; /* input frq for baud rate divider */
rtems_id irq_sema_id; /* SEMA used for IRQ signalling */ rtems_id irq_sema_id; /* SEMA used for IRQ signalling */
void (*probe)(struct mpc83xx_i2c_softc *self);
} mpc83xx_i2c_softc_t ; } mpc83xx_i2c_softc_t ;
typedef struct { typedef struct {