summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c')
-rw-r--r--c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c b/c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c
index 57b97a0967..7db790b37b 100644
--- a/c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c
+++ b/c/src/lib/libcpu/powerpc/mpc83xx/i2c/mpc83xx_i2cdrv.c
@@ -31,7 +31,7 @@
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
-static int mpc83xx_i2c_find_clock_divider
+static rtems_status_code mpc83xx_i2c_find_clock_divider
(
/*-------------------------------------------------------------------------*\
| Purpose: |
@@ -49,6 +49,7 @@ static int mpc83xx_i2c_find_clock_divider
{
int i;
int fdr_val;
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
struct {
int divider;
int fdr_val;
@@ -68,15 +69,23 @@ static int mpc83xx_i2c_find_clock_divider
{49152,0x1E }, {61440,0x1F }
};
- for (i = 0, fdr_val = -1; i < sizeof(dividers)/sizeof(dividers[0]); i++) {
- fdr_val = dividers[i].fdr_val;
- if (dividers[i].divider >= divider)
- {
- break;
- }
+ if (divider <= 0) {
+ sc = RTEMS_INVALID_NUMBER;
}
- *result = fdr_val;
- return 0;
+
+ if (sc == RTEMS_SUCCESSFUL) {
+ sc = RTEMS_INVALID_NUMBER;
+ for (i = 0, fdr_val = -1; i < sizeof(dividers)/sizeof(dividers[0]); i++) {
+ fdr_val = dividers[i].fdr_val;
+ if (dividers[i].divider >= divider)
+ {
+ sc = RTEMS_SUCCESSFUL;
+ *result = fdr_val;
+ break;
+ }
+ }
+ }
+ return sc;
}
/*=========================================================================*\
@@ -313,7 +322,7 @@ static rtems_status_code mpc83xx_i2c_init
* init frequency divider to 100kHz
*/
errval = mpc83xx_i2c_find_clock_divider(&fdr_val,
- BSP_CSB_CLK_FRQ/3/100000);
+ softc_ptr->base_frq/100000);
if (errval != 0) {
return errval;
}
@@ -471,9 +480,6 @@ static rtems_status_code mpc83xx_i2c_send_addr
return rc;
}
}
- addr_byte = (0xf0
- | ((addr >> 7) & 0x06)
- | ((rw) ? 1 : 0));
/*
* send (final) byte
*/
@@ -525,6 +531,10 @@ static int mpc83xx_i2c_read_bytes
softc_ptr->reg_ptr->i2ccr &= ~MPC83XX_I2CCR_MTX;
softc_ptr->reg_ptr->i2ccr &= ~MPC83XX_I2CCR_TXAK;
/*
+ * FIXME: do we need to deactivate TXAK from the start,
+ * when only one byte is to be received?
+ */
+ /*
* we need a dummy transfer here to start the first read
*/
dummy = softc_ptr->reg_ptr->i2cdr;