diff -ruNb u-boot-cvs-0/cpu/mpc5xx/Makefile u-boot-cvs/cpu/mpc5xx/Makefile --- u-boot-cvs-0/cpu/mpc5xx/Makefile Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc5xx/Makefile Mon Jun 9 14:07:39 2003 @@ -35,7 +35,7 @@ LIB = lib$(CPU).a START = start.S -OBJS = serial.o cpu.o cpu_init.o interrupts.o traps.o speed.o status_led.o +OBJS = serial.o cpu.o cpu_init.o interrupts.o traps.o speed.o all: .depend $(START) $(LIB) diff -ruNb u-boot-cvs-0/cpu/mpc5xx/status_led.c u-boot-cvs/cpu/mpc5xx/status_led.c --- u-boot-cvs-0/cpu/mpc5xx/status_led.c Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc5xx/status_led.c Thu Jan 1 02:00:00 1970 @@ -1,161 +0,0 @@ -/* - * (C) Copyright 2000-2002 Wolfgang Denk, DENX Software Engineering, wd@denx.de - * (C) Copyright 2003 Martin Winistoerfer, martinwinistoerfer@gmx.ch. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -/* - * File: status_led.c - * - * Discription: Blink a board led to show boot progress. Led's - * are connected via the MIOS module. - */ - -#include -#include -#include - -#ifdef CONFIG_STATUS_LED - -typedef struct { - ulong mask; - int state; - int period; - int cnt; -} led_dev_t; - -led_dev_t led_dev[] = { - { STATUS_LED_BIT, - STATUS_LED_STATE, - STATUS_LED_PERIOD, - 0, - }, -#if defined(STATUS_LED_BIT1) - { STATUS_LED_BIT1, - STATUS_LED_STATE1, - STATUS_LED_PERIOD1, - 0, - }, -#endif -#if defined(STATUS_LED_BIT2) - { STATUS_LED_BIT2, - STATUS_LED_STATE2, - STATUS_LED_PERIOD2, - 0, - }, -#endif -#if defined(STATUS_LED_BIT3) - { STATUS_LED_BIT3, - STATUS_LED_STATE3, - STATUS_LED_PERIOD3, - 0, - }, -#endif -}; - -#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) - -static int status_led_init_done = 0; - -static void status_led_init (void) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - for (i=0; iSTATUS_LED_DIR = STATUS_LED_BIT; - -#if (STATUS_LED_ACTIVE == 0) - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT &= ~(ld->mask); - else - immr->STATUS_LED_DAT |= ld->mask ; -#else - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT |= ld->mask ; - else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - } - - status_led_init_done = 1; -} - -void status_led_tick (ulong timestamp) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - if (!status_led_init_done) - status_led_init(); - - for (i=0; istate != STATUS_LED_BLINKING) - continue; - - if (++(ld->cnt) >= ld->period) { - immr->STATUS_LED_DAT ^= ld->mask; - ld->cnt -= ld->period; - } - } -} - -void status_led_set (int led, int state) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - led_dev_t *ld; - - if (led < 0 || led >= MAX_LED_DEV) - return; - - if (!status_led_init_done) - status_led_init(); - - ld = &led_dev[led]; - - switch (state) { - default: - return; - case STATUS_LED_BLINKING: - ld->cnt = 0; /* always start with full period */ - /* fall through */ /* always start with LED _ON_ */ - case STATUS_LED_ON: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT &= ~(ld->mask); -#else - immr->STATUS_LED_DAT |= ld->mask ; -#endif - break; - case STATUS_LED_OFF: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT |= ld->mask ; -#else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - break; - } - ld->state = state; -} - -#endif /* CONFIG_STATUS_LED */ diff -ruNb u-boot-cvs-0/cpu/mpc8260/Makefile u-boot-cvs/cpu/mpc8260/Makefile --- u-boot-cvs-0/cpu/mpc8260/Makefile Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc8260/Makefile Mon Jun 9 13:20:20 2003 @@ -28,7 +28,7 @@ START = start.o kgdb.o OBJS = traps.o serial_smc.o serial_scc.o cpu.o cpu_init.o speed.o \ interrupts.o ether_scc.o ether_fcc.o i2c.o commproc.o \ - bedbug_603e.o status_led.o pci.o spi.o + bedbug_603e.o pci.o spi.o all: .depend $(START) $(LIB) diff -ruNb u-boot-cvs-0/cpu/mpc8260/status_led.c u-boot-cvs/cpu/mpc8260/status_led.c --- u-boot-cvs-0/cpu/mpc8260/status_led.c Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc8260/status_led.c Thu Jan 1 02:00:00 1970 @@ -1,160 +0,0 @@ -/* - * (C) Copyright 2000 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include -#include - -/* - * The purpose of this code is to signal the operational status of a - * target which usually boots over the network; while running in - * PCBoot, a status LED is blinking. As soon as a valid BOOTP reply - * message has been received, the LED is turned off. The Linux - * kernel, once it is running, will start blinking the LED again, - * with another frequency. - */ - -/* ------------------------------------------------------------------------- */ - -#ifdef CONFIG_STATUS_LED - -typedef struct { - ulong mask; - int state; - int period; - int cnt; -} led_dev_t; - -led_dev_t led_dev[] = { - { STATUS_LED_BIT, - STATUS_LED_STATE, - STATUS_LED_PERIOD, - 0, - }, -#if defined(STATUS_LED_BIT1) - { STATUS_LED_BIT1, - STATUS_LED_STATE1, - STATUS_LED_PERIOD1, - 0, - }, -#endif -#if defined(STATUS_LED_BIT2) - { STATUS_LED_BIT2, - STATUS_LED_STATE2, - STATUS_LED_PERIOD2, - 0, - }, -#endif -}; - -#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) - -static int status_led_init_done = 0; - -static void status_led_init (void) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - for (i=0; iSTATUS_LED_PAR &= ~(ld->mask); -#ifdef STATUS_LED_ODR - immr->STATUS_LED_ODR &= ~(ld->mask); -#endif -#if (STATUS_LED_ACTIVE == 0) - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT &= ~(ld->mask); - else - immr->STATUS_LED_DAT |= ld->mask ; -#else - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT |= ld->mask ; - else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - immr->STATUS_LED_DIR |= ld->mask ; - } - - status_led_init_done = 1; -} - -void status_led_tick (ulong timestamp) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - if (!status_led_init_done) - status_led_init(); - - for (i=0; istate != STATUS_LED_BLINKING) - continue; - - if (++(ld->cnt) >= ld->period) { - immr->STATUS_LED_DAT ^= ld->mask; - ld->cnt -= ld->period; - } - } -} - -void status_led_set (int led, int state) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - led_dev_t *ld; - - if (led < 0 || led >= MAX_LED_DEV) - return; - - if (!status_led_init_done) - status_led_init(); - - ld = &led_dev[led]; - - switch (state) { - default: - return; - case STATUS_LED_BLINKING: - ld->cnt = 0; /* always start with full period */ - /* fall through */ /* always start with LED _ON_ */ - case STATUS_LED_ON: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT &= ~(ld->mask); -#else - immr->STATUS_LED_DAT |= ld->mask ; -#endif - break; - case STATUS_LED_OFF: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT |= ld->mask ; -#else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - break; - } - ld->state = state; -} - -#endif /* CONFIG_STATUS_LED */ diff -ruNb u-boot-cvs-0/cpu/mpc8xx/Makefile u-boot-cvs/cpu/mpc8xx/Makefile --- u-boot-cvs-0/cpu/mpc8xx/Makefile Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc8xx/Makefile Mon Jun 9 14:07:59 2003 @@ -30,7 +30,7 @@ START = start.o kgdb.o OBJS = bedbug_860.o commproc.o cpu.o cpu_init.o \ fec.o i2c.o interrupts.o lcd.o scc.o \ - serial.o speed.o spi.o status_led.o\ + serial.o speed.o spi.o \ traps.o upatch.o video.o all: .depend $(START) $(LIB) diff -ruNb u-boot-cvs-0/cpu/mpc8xx/status_led.c u-boot-cvs/cpu/mpc8xx/status_led.c --- u-boot-cvs-0/cpu/mpc8xx/status_led.c Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/cpu/mpc8xx/status_led.c Thu Jan 1 02:00:00 1970 @@ -1,168 +0,0 @@ -/* - * (C) Copyright 2000 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include -#include -#include - -/* - * The purpose of this code is to signal the operational status of a - * target which usually boots over the network; while running in - * PCBoot, a status LED is blinking. As soon as a valid BOOTP reply - * message has been received, the LED is turned off. The Linux - * kernel, once it is running, will start blinking the LED again, - * with another frequency. - */ - -/* ------------------------------------------------------------------------- */ - -#ifdef CONFIG_STATUS_LED - -typedef struct { - ulong mask; - int state; - int period; - int cnt; -} led_dev_t; - -led_dev_t led_dev[] = { - { STATUS_LED_BIT, - STATUS_LED_STATE, - STATUS_LED_PERIOD, - 0, - }, -#if defined(STATUS_LED_BIT1) - { STATUS_LED_BIT1, - STATUS_LED_STATE1, - STATUS_LED_PERIOD1, - 0, - }, -#endif -#if defined(STATUS_LED_BIT2) - { STATUS_LED_BIT2, - STATUS_LED_STATE2, - STATUS_LED_PERIOD2, - 0, - }, -#endif -#if defined(STATUS_LED_BIT3) - { STATUS_LED_BIT3, - STATUS_LED_STATE3, - STATUS_LED_PERIOD3, - 0, - }, -#endif -}; - -#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) - -static int status_led_init_done = 0; - -static void status_led_init (void) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - for (i=0; iSTATUS_LED_PAR &= ~(ld->mask); -#ifdef STATUS_LED_ODR - immr->STATUS_LED_ODR &= ~(ld->mask); -#endif -#if (STATUS_LED_ACTIVE == 0) - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT &= ~(ld->mask); - else - immr->STATUS_LED_DAT |= ld->mask ; -#else - if (ld->state == STATUS_LED_ON) - immr->STATUS_LED_DAT |= ld->mask ; - else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - immr->STATUS_LED_DIR |= ld->mask ; - } - - status_led_init_done = 1; -} - -void status_led_tick (ulong timestamp) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - int i; - - if (!status_led_init_done) - status_led_init(); - - for (i=0; istate != STATUS_LED_BLINKING) - continue; - - if (++(ld->cnt) >= ld->period) { - immr->STATUS_LED_DAT ^= ld->mask; - ld->cnt -= ld->period; - } - } -} - -void status_led_set (int led, int state) -{ - volatile immap_t *immr = (immap_t *)CFG_IMMR; - led_dev_t *ld; - - if (led < 0 || led >= MAX_LED_DEV) - return; - - if (!status_led_init_done) - status_led_init(); - - ld = &led_dev[led]; - - switch (state) { - default: - return; - case STATUS_LED_BLINKING: - ld->cnt = 0; /* always start with full period */ - /* fall through */ /* always start with LED _ON_ */ - case STATUS_LED_ON: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT &= ~(ld->mask); -#else - immr->STATUS_LED_DAT |= ld->mask ; -#endif - break; - case STATUS_LED_OFF: -#if (STATUS_LED_ACTIVE == 0) - immr->STATUS_LED_DAT |= ld->mask ; -#else - immr->STATUS_LED_DAT &= ~(ld->mask); -#endif - break; - } - ld->state = state; -} - -#endif /* CONFIG_STATUS_LED */ diff -ruNb u-boot-cvs-0/drivers/Makefile u-boot-cvs/drivers/Makefile --- u-boot-cvs-0/drivers/Makefile Mon Jun 9 13:15:50 2003 +++ u-boot-cvs/drivers/Makefile Mon Jun 9 13:19:16 2003 @@ -38,7 +38,8 @@ pcnet.o plb2800_eth.o \ s3c24x0_i2c.o sed13806.o serial.o \ smc91111.o smiLynxEM.o sym53c8xx.o \ - ti_pci1410a.o tigon3.o w83c553f.o + ti_pci1410a.o tigon3.o w83c553f.o \ + status_led.o ## Disabled for now: ## cs8900.o ct69000.o dc2114x.o ds1722.o \ diff -ruNb u-boot-cvs-0/drivers/status_led.c u-boot-cvs/drivers/status_led.c --- u-boot-cvs-0/drivers/status_led.c Thu Jan 1 02:00:00 1970 +++ u-boot-cvs/drivers/status_led.c Tue Jun 10 09:19:23 2003 @@ -0,0 +1,139 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include + +/* + * The purpose of this code is to signal the operational status of a + * target which usually boots over the network; while running in + * PCBoot, a status LED is blinking. As soon as a valid BOOTP reply + * message has been received, the LED is turned off. The Linux + * kernel, once it is running, will start blinking the LED again, + * with another frequency. + */ + +/* ------------------------------------------------------------------------- */ + +#ifdef CONFIG_STATUS_LED + +#ifndef CONFIG_BOARD_SPECIFIC_LED + +#if defined(CONFIG_8xx) || defined(CONFIG_8260) || defined(CONFIG_5xx) +#include +#endif + +#endif + +typedef struct { + led_id_t mask; + int state; + int period; + int cnt; +} led_dev_t; + +led_dev_t led_dev[] = { + { STATUS_LED_BIT, + STATUS_LED_STATE, + STATUS_LED_PERIOD, + 0, + }, +#if defined(STATUS_LED_BIT1) + { STATUS_LED_BIT1, + STATUS_LED_STATE1, + STATUS_LED_PERIOD1, + 0, + }, +#endif +#if defined(STATUS_LED_BIT2) + { STATUS_LED_BIT2, + STATUS_LED_STATE2, + STATUS_LED_PERIOD2, + 0, + }, +#endif +#if defined(STATUS_LED_BIT3) + { STATUS_LED_BIT3, + STATUS_LED_STATE3, + STATUS_LED_PERIOD3, + 0, + }, +#endif +}; + +#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) + +static int status_led_init_done = 0; + +static void status_led_init (void) +{ + led_dev_t *ld; + int i; + + for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) + __led_init(ld->mask, ld->state); + status_led_init_done = 1; +} + +void status_led_tick (ulong timestamp) +{ + led_dev_t *ld; + int i; + + if (!status_led_init_done) + status_led_init(); + + for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) { + + if (ld->state != STATUS_LED_BLINKING) + continue; + + if (++ld->cnt >= ld->period) { + __led_toggle(ld->mask); + ld->cnt -= ld->period; + } + + } +} + +void status_led_set (int led, int state) +{ + led_dev_t *ld; + + if (led < 0 || led >= MAX_LED_DEV) + return; + + if (!status_led_init_done) + status_led_init(); + + ld = &led_dev[led]; + + ld->state = state; + if (state == STATUS_LED_BLINKING) { + ld->cnt = 0; /* always start with full period */ + state = STATUS_LED_ON; /* always start with LED _ON_ */ + } + __led_set(ld->mask, state); +} + +#endif /* CONFIG_STATUS_LED */ diff -ruNb u-boot-cvs-0/include/mpc_led.h u-boot-cvs/include/mpc_led.h --- u-boot-cvs-0/include/mpc_led.h Thu Jan 1 02:00:00 1970 +++ u-boot-cvs/include/mpc_led.h Mon Jun 9 15:55:52 2003 @@ -0,0 +1,82 @@ +/* + * mpc_led.h + * + * MPC8xx/MPC8260/MPC5xx based board default led behaviour. + */ + +#ifndef __MPC8XX_LED_H__ +#define __MPC8XX_LED_H__ + +/* must be included */ +#include + +/* if not overriden */ +#ifndef CONFIG_BOARD_SPECIFIC_LED + +#if defined(CONFIG_8xx) +#include +#elif defined(CONFIG_8260) +#include +#elif defined(CONFIG_5xx) +#include +#else +#error Status LED cpu not known. +#endif + +/* led_id_t is unsigned long mask */ +typedef unsigned long led_id_t; + +static inline void __led_init(led_id_t mask, int state) +{ + volatile immap_t *immr = (immap_t *)CFG_IMMR; + +#ifdef STATUS_LED_PAR + immr->STATUS_LED_PAR &= ~mask; +#endif +#ifdef STATUS_LED_ODR + immr->STATUS_LED_ODR &= ~mask; +#endif + +#if (STATUS_LED_ACTIVE == 0) + if (state == STATUS_LED_ON) + immr->STATUS_LED_DAT &= ~mask; + else + immr->STATUS_LED_DAT |= mask; +#else + if (state == STATUS_LED_ON) + immr->STATUS_LED_DAT |= mask; + else + immr->STATUS_LED_DAT &= ~mask; +#endif +#ifdef STATUS_LED_DIR + immr->STATUS_LED_DIR |= mask; +#endif +} + +static inline void __led_toggle(led_id_t mask) +{ + ((immap_t *)CFG_IMMR)->STATUS_LED_DAT ^= mask; +} + +static inline void __led_set(led_id_t mask, int state) +{ + volatile immap_t *immr = (immap_t *)CFG_IMMR; + +#if (STATUS_LED_ACTIVE == 0) + if (state == STATUS_LED_ON) + immr->STATUS_LED_DAT &= ~mask; + else + immr->STATUS_LED_DAT |= mask; +#else + if (state == STATUS_LED_ON) + immr->STATUS_LED_DAT |= mask; + else + immr->STATUS_LED_DAT &= ~mask; +#endif + +} + +#endif + +#endif +