[U-Boot-Users] Status LEDs status?

Hi
I face the following problem. In a new version of my board with a mpc850 the location of the status leds moved to an external register, instead of being on a CPU port.
However the status LED code assumes that the LEDs are on a port.
As I scanned the other cpu directories I saw that the status led code is copied in each of them.
I dont want to special case the status_led code with my board, so I'm inclined to make a new status led interface in the common or drivers directory.
IMHO the duplication of the status led code and it's placement in the cpu directory is not very intuitive.
Your thoughts on that?
Regards
Pantelis

Hi,
in message 3EE452B3.8000603@intracom.gr you wrote:
I face the following problem. In a new version of my board with a mpc850 the location of the status leds moved to an external register, instead of being on a CPU port.
However the status LED code assumes that the LEDs are on a port.
That's because so far all boards where support for the status LED has been enabled fall intot his group. Feel free to add your own version.
As I scanned the other cpu directories I saw that the status led code is copied in each of them.
This is not correct. There is a "status_led.c" file only in the CPU directories for 5xx, 8xx and 82xx CPUs. These are pretty similar as far as the status LED is affected.
I dont want to special case the status_led code with my board, so I'm inclined to make a new status led interface in the common or drivers directory.
I think this should go to drivers/ .
IMHO the duplication of the status led code and it's placement in the cpu directory is not very intuitive.
But the current implementation is CPU dependend.
Best regards,
Wolfgang Denk

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 */

In message 3EE46FBE.3020803@intracom.gr you wrote:
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?
This is exactly what I do NOT want.
I do not want tosee processor specific code in common directories. The drivers/ directory is intended for general code that applies for all CPUs.
Best regards,
Wolfgang Denk

Wolfgang Denk wrote:
In message 3EE46FBE.3020803@intracom.gr you wrote:
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?
This is exactly what I do NOT want.
I do not want tosee processor specific code in common directories. The drivers/ directory is intended for general code that applies for all CPUs.
Best regards,
Wolfgang Denk
Whoa, hold on.
First of all when you have three copies of the the same thing in different directories there's bound to be trouble. For example the 8260 & 5xx copies are already slightly out of sync.
Secondly LEDs are board specific and not cpu specific. It was a coincidence that up to now the LEDs happened to be in cpu ports and could be groupped under the cpu directories.
I think it is trivial to abstract the led operations into their respective cpu include files for the common case. The existing board config headers shouldn't be modified, while allowing other boards to override them.
In this case the status led code would be generic for all configurations that support them.
Regards
Pantelis

In message 3EE47B1C.3090601@intracom.gr you wrote:
First of all when you have three copies of the the same thing in different directories there's bound to be trouble.
These are three similar files for similar processors, not necessarily identical copies.
For example the 8260 & 5xx copies are already slightly out of sync.
Probably because the 5xx is slightly different than the 8260?
Secondly LEDs are board specific and not cpu specific.
OK, you are right in a way. In the same way, the ethernet port configuration is board dependend. BUt nevertheless the ethernet drivers are specific to the ethernet controllers as for example provided by the MPC8xx or MPC8260 chips, sothe ethernet drivers for these are in the 8xx resp. 8260 CPU directories.
It was a coincidence that up to now the LEDs happened to be in cpu ports and could be groupped under the cpu directories.
It is not a coincidence. The common fact is that they all use (processor specific) port pins.
I think it is trivial to abstract the led operations into their respective cpu include files for the common case. The existing board config headers shouldn't be modified, while allowing other boards to override them.
In this case the status led code would be generic for all configurations that support them.
If you have such a patch, please submit it. But please note that I don't want to add any CPU specific code in the drivers/ directory.
Best regards,
Wolfgang Denk

Wolfgang Denk wrote:
In message 3EE47B1C.3090601@intracom.gr you wrote:
snip
If you have such a patch, please submit it. But please note that I don't want to add any CPU specific code in the drivers/ directory.
Best regards,
Wolfgang Denk
OK
How about this patch.
The main idea is to do all the hardware specific stuff in a header while the file in the drivers directory is very simple and common to all the configurations.
The key is the new include file mpc_led.h which implements the current behaviour for the 8xx/8260/5xx.
If your board has LEDs that don't fall into the current scheme then in the board include file you define CONFIG_BOARD_SPECIFIC_LED and provide the __led_init __led_toggle and __led_set inline functions.
IMHO this cleans up the current scheme, allows boards that have non standard LED configurations to work, and I think makes it easier for arches other that ppc to support LEDs.
Regards
Pantelis

In message 3EE57F28.1020208@intracom.gr you wrote:
How about this patch.
The main idea is to do all the hardware specific stuff in a header while the file in the drivers directory is very simple and common to all the configurations.
Added (after fixing the bugs).
Will show up on CVS soon.
Thanks.
Best regards,
Wolfgang Denk

Oops, sorry here is the patch attached.
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 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 <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 + +#ifndef CONFIG_BOARD_SPECIFIC_LED + +#if defined(CONFIG_8xx) || defined(CONFIG_8260) || defined(CONFIG_5xx) +#include <mpc_led.h> +#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 <status_led.h> + +/* if not overriden */ +#ifndef CONFIG_BOARD_SPECIFIC_LED + +#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 + +/* 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 +
participants (2)
-
Pantelis Antoniou
-
Wolfgang Denk