X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=board%2Finnokom%2Finnokom.c;h=7f8f47c3a2ef7338acf9d60fc70a50d9bf61523a;hb=d4fc6012fd0a5c211b825691f44b06f8032c0551;hp=7d2702f658215b934b765ba18603d1c265557974;hpb=43d9616cffb4a130e1620e3e33fc9bc1bcabe399;p=oweals%2Fu-boot.git diff --git a/board/innokom/innokom.c b/board/innokom/innokom.c index 7d2702f658..7f8f47c3a2 100644 --- a/board/innokom/innokom.c +++ b/board/innokom/innokom.c @@ -25,6 +25,9 @@ #include #include +#include + +DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_SHOW_BOOT_PROGRESS # define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg) @@ -32,9 +35,58 @@ # define SHOW_BOOT_PROGRESS(arg) #endif -/* - * Miscelaneous platform dependent initialisations +/** + * i2c_init_board - reset i2c bus. When the board is powercycled during a + * bus transfer it might hang; for details see doc/I2C_Edge_Conditions. + * The Innokom board has GPIO70 connected to SCLK which can be toggled + * until all chips think that their current cycles are finished. */ +int i2c_init_board(void) +{ + int i, icr; + + /* disable I2C controller first, otherwhise it thinks we want to */ + /* talk to the slave port... */ + icr = ICR; ICR &= ~(ICR_SCLE | ICR_IUE); + + /* set gpio pin low _before_ we change direction to output */ + GPCR(70) = GPIO_bit(70); + + /* now toggle between output=low and high-impedance */ + for (i = 0; i < 20; i++) { + GPDR(70) |= GPIO_bit(70); /* output */ + udelay(10); + GPDR(70) &= ~GPIO_bit(70); /* input */ + udelay(10); + } + + ICR = icr; + + return 0; +} + + +/** + * misc_init_r: - misc initialisation routines + */ + +int misc_init_r(void) +{ + uchar *str; + + /* determine if the software update key is pressed during startup */ + if (GPLR0 & 0x00000800) { + printf("using bootcmd_normal (sw-update button not pressed)\n"); + str = getenv("bootcmd_normal"); + } else { + printf("using bootcmd_update (sw-update button pressed)\n"); + str = getenv("bootcmd_update"); + } + + setenv("bootcmd",str); + + return 0; +} /** @@ -45,16 +97,12 @@ int board_init (void) { - DECLARE_GLOBAL_DATA_PTR; - /* memory and cpu-speed are setup before relocation */ /* so we do _nothing_ here */ - /* arch number of Innokom board */ - gd->bd->bi_arch_number = 258; - - /* adress of boot parameters */ + gd->bd->bi_arch_number = MACH_TYPE_INNOKOM; gd->bd->bi_boot_params = 0xa0000100; + gd->bd->bi_baudrate = CONFIG_BAUDRATE; return 0; } @@ -68,8 +116,6 @@ int board_init (void) int dram_init (void) { - DECLARE_GLOBAL_DATA_PTR; - gd->bd->bi_dram[0].start = PHYS_SDRAM_1; gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; @@ -96,18 +142,18 @@ void innokom_set_led(int led, int state) break; case 1: if (state==1) { - GPCR0 |= CSB226_USER_LED1; - } else if (state==0) { - GPSR0 |= CSB226_USER_LED1; - } - break; + GPCR0 |= CSB226_USER_LED1; + } else if (state==0) { + GPSR0 |= CSB226_USER_LED1; + } + break; case 2: if (state==1) { - GPCR0 |= CSB226_USER_LED2; - } else if (state==0) { - GPSR0 |= CSB226_USER_LED2; - } - break; + GPCR0 |= CSB226_USER_LED2; + } else if (state==0) { + GPSR0 |= CSB226_USER_LED2; + } + break; */ } @@ -136,4 +182,3 @@ void show_boot_progress (int status) return; } -