diff options
Diffstat (limited to 'cpu')
-rw-r--r-- | cpu/mpc824x/drivers/i2c/i2c1.c | 9 | ||||
-rw-r--r-- | cpu/mpc8260/i2c.c | 7 | ||||
-rw-r--r-- | cpu/mpc8xx/i2c.c | 7 | ||||
-rw-r--r-- | cpu/ppc4xx/i2c.c | 8 | ||||
-rw-r--r-- | cpu/xscale/i2c.c | 7 | ||||
-rw-r--r-- | cpu/xscale/start.S | 26 |
6 files changed, 63 insertions, 1 deletions
diff --git a/cpu/mpc824x/drivers/i2c/i2c1.c b/cpu/mpc824x/drivers/i2c/i2c1.c index be6ec60..7a2eb66 100644 --- a/cpu/mpc824x/drivers/i2c/i2c1.c +++ b/cpu/mpc824x/drivers/i2c/i2c1.c @@ -1128,6 +1128,15 @@ static void I2C_Set_Stat (unsigned int eumbbar, I2C_STAT stat) void i2c_init (int speed, int slaveadd) { +#ifdef CFG_I2C_INIT_BOARD + /* + * call board specific i2c bus reset routine before accessing the + * environment, which might be in a chip on that bus. For details + * about this problem see doc/I2C_Edge_Conditions. + */ + i2c_init_board(); +#endif + #ifdef DEBUG I2C_Initialize (0x7f, 0, (void *) printf); #else diff --git a/cpu/mpc8260/i2c.c b/cpu/mpc8260/i2c.c index 8bfa2e8..2d65e32 100644 --- a/cpu/mpc8260/i2c.c +++ b/cpu/mpc8260/i2c.c @@ -221,6 +221,13 @@ void i2c_init(int speed, int slaveadd) volatile I2C_BD *rxbd, *txbd; uint dpaddr; +#ifdef CFG_I2C_INIT_BOARD + /* call board specific i2c bus reset routine before accessing the */ + /* environment, which might be in a chip on that bus. For details */ + /* about this problem see doc/I2C_Edge_Conditions. */ + i2c_init_board(); +#endif + dpaddr = *((unsigned short*)(&immap->im_dprambase[PROFF_I2C_BASE])); if (dpaddr == 0) { /* need to allocate dual port ram */ diff --git a/cpu/mpc8xx/i2c.c b/cpu/mpc8xx/i2c.c index 9d5d9d2..9e8b8c7 100644 --- a/cpu/mpc8xx/i2c.c +++ b/cpu/mpc8xx/i2c.c @@ -215,6 +215,13 @@ i2c_init(int speed, int slaveaddr) volatile I2C_BD *rxbd, *txbd; uint dpaddr; +#ifdef CFG_I2C_INIT_BOARD + /* call board specific i2c bus reset routine before accessing the */ + /* environment, which might be in a chip on that bus. For details */ + /* about this problem see doc/I2C_Edge_Conditions. */ + i2c_init_board(); +#endif + #ifdef CFG_I2C_UCODE_PATCH iip = (iic_t *)&cp->cp_dpmem[iip->iic_rpbase]; #else diff --git a/cpu/ppc4xx/i2c.c b/cpu/ppc4xx/i2c.c index 68af057..7d8db9b 100644 --- a/cpu/ppc4xx/i2c.c +++ b/cpu/ppc4xx/i2c.c @@ -85,7 +85,15 @@ void i2c_init (int speed, int slaveadd) unsigned long freqOPB; int val, divisor; +#ifdef CFG_I2C_INIT_BOARD + /* call board specific i2c bus reset routine before accessing the */ + /* environment, which might be in a chip on that bus. For details */ + /* about this problem see doc/I2C_Edge_Conditions. */ + i2c_init_board(); +#endif + /* Handle possible failed I2C state */ + /* FIXME: put this into i2c_init_board()? */ _i2c_bus_reset (); /* clear lo master address */ diff --git a/cpu/xscale/i2c.c b/cpu/xscale/i2c.c index f546f14..406f825 100644 --- a/cpu/xscale/i2c.c +++ b/cpu/xscale/i2c.c @@ -41,6 +41,7 @@ * - I2C_PXA_SLAVE_ADDR */ +#include <asm/arch/hardware.h> #include <asm/arch/pxa-regs.h> #include <i2c.h> @@ -244,6 +245,12 @@ i2c_transfer_finish: void i2c_init(int speed, int slaveaddr) { +#ifdef CFG_I2C_INIT_BOARD + /* call board specific i2c bus reset routine before accessing the */ + /* environment, which might be in a chip on that bus. For details */ + /* about this problem see doc/I2C_Edge_Conditions. */ + i2c_init_board(); +#endif } diff --git a/cpu/xscale/start.S b/cpu/xscale/start.S index e63fece..3d9784e 100644 --- a/cpu/xscale/start.S +++ b/cpu/xscale/start.S @@ -84,6 +84,17 @@ _armboot_end: .word armboot_end /* + * This is defined in the board specific linker script + */ +.globl _bss_start +_bss_start: + .word bss_start + +.globl _bss_end +_bss_end: + .word bss_end + +/* * _armboot_real_end is the first usable RAM address behind armboot * and the various stacks */ @@ -143,7 +154,20 @@ copy_loop: ldr r0, _uboot_reloc /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ /* FIXME: bdinfo should be here */ - sub sp, r0, #12 /* leave 3 words for abort-stack */ + sub sp, r0, #12 /* leave 3 words for abort-stack */ + +clear_bss: + + ldr r0, _bss_start /* find start of bss segment */ + add r0, r0, #4 /* start at first byte of bss */ + ldr r1, _bss_end /* stop here */ + mov r2, #0x00000000 /* clear */ + +clbss_l:str r2, [r0] /* clear loop... */ + add r0, r0, #4 + cmp r0, r1 + bne clbss_l + ldr pc, _start_armboot |