From: Matthew Lewis/M. <Mat...@mo...> - 2004-04-22 13:04:19
|
On Tue, Apr 20, 2004, Klaasjan wrote: > > What is still missing from this patch is the corresponding > additions/changes to Documentation/Configure.help. > Those would serve as, well, documentation, configuration, help. > Could you add those to the patch? > Amended patch below. One wrinkle: I don't think the CONFIG_LEDS help is correct about the LART platform (I checked the 2.6.5 kernel too - help text is the same, but it lives in arch/arm/Kconfig). The patch below just ignores this and adds information about the netBook/S7. I'll ask the ARM Linux and LART people about the LART. -Matthew. diff -Naur linux-2.4.21-netBook-clean/arch/arm/def-configs/netbook_series7 linux-2.4.21-netBook2/arch/arm/def-configs/netbook_series7 --- linux-2.4.21-netBook-clean/arch/arm/def-configs/netbook_series7 2004-04-14 14:46:30.000000000 +0100 +++ linux-2.4.21-netBook2/arch/arm/def-configs/netbook_series7 2004-04-14 15:36:05.000000000 +0100 @@ -193,7 +193,9 @@ # CONFIG_PM is not set # CONFIG_ARTHUR is not set CONFIG_CMDLINE="keepinitrd" -# CONFIG_LEDS is not set +CONFIG_LEDS=y +CONFIG_LEDS_TIMER=y +CONFIG_LEDS_CPU=y CONFIG_ALIGNMENT_TRAP=y # diff -Naur linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/Makefile linux-2.4.21-netBook2/arch/arm/mach-sa1100/Makefile --- linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/Makefile 2004-04-14 14:46:30.000000000 +0100 +++ linux-2.4.21-netBook2/arch/arm/mach-sa1100/Makefile 2004-04-14 15:02:25.000000000 +0100 @@ -98,6 +98,7 @@ leds-$(CONFIG_SA1100_PFS168) += leds-pfs168.o leds-$(CONFIG_SA1100_SIMPAD) += leds-simpad.o leds-$(CONFIG_SA1100_PT_SYSTEM3) += leds-system3.o +leds-$(CONFIG_SA1100_PSION_SERIES7) += leds-series7.o obj-$(CONFIG_LEDS) += $(leds-y) # SA1110 USB client support diff -Naur linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds-series7.c linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds-series7.c --- linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds-series7.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds-series7.c 2004-04-14 15:02:25.000000000 +0100 @@ -0,0 +1,165 @@ +/* + * linux/arch/arm/mach-sa1100/leds-series7.c + * + * By Matthew Lewis + * Copyright (C) 2004 Mobile Innovation Ltd, www.mobileinnovation.co.uk + * + * Series7/netBook LEDs: + * - Green/Amber LED is hardware controlled (external power/charger) + * - Red LED is software controlled + * + * Use of red LED depends on macros: + * CONFIG_LEDS_TIMER: Toggle every 50 timer interrupts + * CONFIG_LEDS_CPU: LED on when CPU not in idle + * + * If both are defined then the timer wins - the timer can be stopped + * (with event led_stop_timer_mode) in which case the CPU LED starts. + * + * The LEDs can also be "claimed": the timer/CPU behaviour stops and + * the LEDs respond to on/off requests. + */ + +#include <asm/hardware.h> +#include <asm/leds.h> +#include <asm/system.h> +#include "leds.h" + + +#define LED_STATE_ENABLED 1 +#define LED_STATE_CLAIMED 2 +#ifdef CONFIG_LEDS_TIMER +#define LED_STATE_TIMER_STOPPED 4 +#endif + +static unsigned int led_state; +static unsigned int hw_led_state; + +#define SERIES7_LED_RED GPIO_GPIO(14) +#define SERIES7_LED_MASK (SERIES7_LED_RED) + +/* + * Helper functions + */ + +static inline void init_unclaimed_led(void) +{ +#if defined CONFIG_LEDS_TIMER || defined CONFIG_LEDS_CPU + hw_led_state |= SERIES7_LED_RED; +#else + hw_led_state = 0; +#endif +} + + +#ifdef CONFIG_LEDS_CPU +static inline int cpu_led_available(void) +{ +# ifdef CONFIG_LEDS_TIMER + return !(led_state & LED_STATE_CLAIMED) + && (led_state & LED_STATE_TIMER_STOPPED); +# else + return !(led_state & LED_STATE_CLAIMED); +# endif +} +#endif + + +static void series7_led_update(unsigned int state) +{ + GPSR = state; + GPCR = state ^ SERIES7_LED_MASK; +} + + +/* + * The function that does the work + */ +void series7_leds_event(led_event_t evt) +{ + unsigned long flags; + + local_irq_save(flags); + + switch (evt) { /* The set of events is defined in include/asm-arm/leds.h */ + + case led_start: + if (!(led_state & (LED_STATE_ENABLED | LED_STATE_CLAIMED))) + init_unclaimed_led(); + led_state |= LED_STATE_ENABLED; + break; + + case led_stop: + /* Leave hw_led_state flags unchanged, but switch off LEDs */ + series7_led_update(0); + led_state &= ~LED_STATE_ENABLED; + break; + + case led_claim: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state = 0; + led_state |= LED_STATE_CLAIMED; + break; + + case led_release: + if (led_state & LED_STATE_CLAIMED) { + if (led_state & LED_STATE_ENABLED) + init_unclaimed_led(); + else + hw_led_state = 0; + } + led_state &= ~LED_STATE_CLAIMED; + break; + +#ifdef CONFIG_LEDS_TIMER + case led_start_timer_mode: + /* Just leave LED in current state - it will toggle soon enough */ + led_state &= ~LED_STATE_TIMER_STOPPED; + break; + + case led_stop_timer_mode: + if (!(led_state & (LED_STATE_CLAIMED|LED_STATE_TIMER_STOPPED))) +#ifdef CONFIG_LEDS_CPU + hw_led_state |= SERIES7_LED_RED; +#else + hw_led_state &= ~SERIES7_LED_RED; +#endif + led_state |= LED_STATE_TIMER_STOPPED; + break; + + case led_timer: + if (!(led_state & (LED_STATE_CLAIMED|LED_STATE_TIMER_STOPPED))) + hw_led_state ^= SERIES7_LED_RED; + break; +#endif + +#ifdef CONFIG_LEDS_CPU + case led_idle_start: + if (cpu_led_available()) + hw_led_state &= ~SERIES7_LED_RED; + break; + + case led_idle_end: + if (cpu_led_available()) + hw_led_state |= SERIES7_LED_RED; + break; +#endif + + case led_red_on: + if (led_state & LED_STATE_CLAIMED) + hw_led_state |= SERIES7_LED_RED; + break; + + case led_red_off: + if (led_state & LED_STATE_CLAIMED) + hw_led_state &= ~SERIES7_LED_RED; + break; + + default: + break; + } + + if (led_state & LED_STATE_ENABLED) + series7_led_update(hw_led_state); + + local_irq_restore(flags); +} diff -Naur linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds.c linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds.c --- linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds.c 2004-04-14 14:42:34.000000000 +0100 +++ linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds.c 2004-04-14 15:02:25.000000000 +0100 @@ -43,6 +43,8 @@ leds_event = lart_leds_event; if (machine_is_pfs168()) leds_event = pfs168_leds_event; + if (machine_is_psion_series7()) + leds_event = series7_leds_event; if (machine_is_pt_system3()) leds_event = system3_leds_event; diff -Naur linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds.h linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds.h --- linux-2.4.21-netBook-clean/arch/arm/mach-sa1100/leds.h 2004-04-14 14:42:34.000000000 +0100 +++ linux-2.4.21-netBook2/arch/arm/mach-sa1100/leds.h 2004-04-14 15:02:25.000000000 +0100 @@ -12,4 +12,5 @@ extern void hackkit_leds_event(led_event_t evt); extern void lart_leds_event(led_event_t evt); extern void pfs168_leds_event(led_event_t evt); +extern void series7_leds_event(led_event_t evt); extern void system3_leds_event(led_event_t evt); diff -Naur linux-2.4.21-netBook-clean/Documentation/Configure.help linux-2.4.21-netBook2/Documentation/Configure.help --- linux-2.4.21-netBook-clean/Documentation/Configure.help 2004-04-14 14:46:30.000000000 +0100 +++ linux-2.4.21-netBook2/Documentation/Configure.help 2004-04-22 12:06:17.000000000 +0100 @@ -316,24 +316,25 @@ If you say Y here, the LEDs on your machine will be used to provide useful information about your current system status. - If you are compiling a kernel for a NetWinder or EBSA-285, you will - be able to select which LEDs are active using the options below. If - you are compiling a kernel for the EBSA-110 or the LART however, the - red LED will simply flash regularly to indicate that the system is - still functional. It is safe to say Y here if you have a CATS - system, but the driver will do nothing. + If you are compiling a kernel for a NetWinder, EBSA-285 or Psion + netBook/Series 7, you will be able to select which LEDs are active + using the options below. If you are compiling a kernel for the + EBSA-110 or the LART however, the red LED will simply flash + regularly to indicate that the system is still functional. It is + safe to say Y here if you have a CATS system, but the driver will + do nothing. Timer LED CONFIG_LEDS_TIMER If you say Y here, one of the system LEDs (the green one on the - NetWinder, the amber one on the EBSA285, or the red one on the LART) - will flash regularly to indicate that the system is still - operational. This is mainly useful to kernel hackers who are - debugging unstable kernels. - - The LART uses the same LED for both Timer LED and CPU usage LED - functions. You may choose to use both, but the Timer LED function - will overrule the CPU usage LED. + NetWinder, the amber one on the EBSA285, or the red one on the LART + and Psion netBook/Series 7) will flash regularly to indicate that the + system is still operational. This is mainly useful to kernel hackers + who are debugging unstable kernels. + + The LART and Psion netBook/Series 7 use the same LED for both Timer + and CPU usage LED functions. You may choose to use both, but the + Timer LED function will overrule the CPU usage LED. CPU usage LED CONFIG_LEDS_CPU @@ -341,9 +342,9 @@ time indication of CPU usage, by lighting whenever the idle task is not currently executing. - The LART uses the same LED for both Timer LED and CPU usage LED - functions. You may choose to use both, but the Timer LED function - will overrule the CPU usage LED. + The LART and Psion netBook/Series 7 use the same LED for both Timer + and CPU usage LED functions. You may choose to use both, but the + Timer LED function will overrule the CPU usage LED. Kernel FP software completion CONFIG_MATHEMU |