forked from Imagelibrary/rtems
bsps/powerpc: Add probe handler to I2C driver
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user