
Hi Wolfgang
Well the first thing we can do is removing the redundant code.
With the following patch I moved the status LED code from the cpu directories and placed it in the drivers directory.
The code for mpc8xx is the superset of both the 8260 and 5xx code, so this is the base for it.
Patch applies cleanly againt CVS and is tested to build in 8xx/8260/5xx configs that use LEDs.
What do you think?
Regards
Pantelis
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 <common.h> -#include <mpc5xx.h> -#include <status_led.h> - -#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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - immr->STATUS_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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - if (ld->state != 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 <common.h> -#include <status_led.h> - -/* - * 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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - immr->STATUS_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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - if (ld->state != 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 <common.h> -#include <mpc8xx.h> -#include <status_led.h> - -/* - * 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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - immr->STATUS_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; i<MAX_LED_DEV; ++i) { - led_dev_t *ld = &led_dev[i]; - - if (ld->state != 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 Mon Jun 9 14:06:48 2003 @@ -0,0 +1,181 @@ +/* + * (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 <common.h> + +#if defined(CONFIG_8xx) +#include <mpc8xx.h> +#elif defined(CONFIG_8260) +#include <mpc8260.h> +#elif defined(CONFIG_5xx) +#include <mpc5xx.h> +#else +#error Status LED cpu not known. +#endif + +#include <status_led.h> + +/* + * 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; i<MAX_LED_DEV; ++i) { + led_dev_t *ld = &led_dev[i]; + +#if defined(CONFIG_8xx) || defined(CONFIG_8260) + immr->STATUS_LED_PAR &= ~(ld->mask); +#endif +#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; i<MAX_LED_DEV; ++i) { + led_dev_t *ld = &led_dev[i]; + + if (ld->state != 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 */