diff options
Diffstat (limited to 'arch/arm/mach-ebsa110')
| -rw-r--r-- | arch/arm/mach-ebsa110/Makefile | 4 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/Makefile.boot | 2 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/core.c | 107 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/core.h | 41 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/debug-macro.S | 22 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/entry-macro.S | 6 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/hardware.h | 39 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/io.h | 11 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/memory.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/system.h | 39 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/timex.h | 19 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/uncompress.h | 1 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/include/mach/vmalloc.h | 10 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/io.c | 20 | ||||
| -rw-r--r-- | arch/arm/mach-ebsa110/leds.c | 82 | 
15 files changed, 188 insertions, 217 deletions
diff --git a/arch/arm/mach-ebsa110/Makefile b/arch/arm/mach-ebsa110/Makefile index 6520ac83580..935e4af01a2 100644 --- a/arch/arm/mach-ebsa110/Makefile +++ b/arch/arm/mach-ebsa110/Makefile @@ -4,9 +4,7 @@  # Object file lists. -obj-y			:= core.o io.o +obj-y			:= core.o io.o leds.o  obj-m			:=  obj-n			:=  obj-			:= - -obj-$(CONFIG_LEDS)	+= leds.o diff --git a/arch/arm/mach-ebsa110/Makefile.boot b/arch/arm/mach-ebsa110/Makefile.boot index 23212604493..83cf07c38ad 100644 --- a/arch/arm/mach-ebsa110/Makefile.boot +++ b/arch/arm/mach-ebsa110/Makefile.boot @@ -1,4 +1,4 @@ -   zreladdr-y	:= 0x00008000 +   zreladdr-y	+= 0x00008000  params_phys-y	:= 0x00000400  initrd_phys-y	:= 0x00800000 diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 5df4099fc14..8254e716b09 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c @@ -22,7 +22,7 @@  #include <asm/mach-types.h>  #include <asm/pgtable.h>  #include <asm/page.h> -#include <asm/system.h> +#include <asm/system_misc.h>  #include <asm/mach/arch.h>  #include <asm/mach/irq.h> @@ -30,25 +30,22 @@  #include <asm/mach/time.h> -#define IRQ_MASK		0xfe000000	/* read */ -#define IRQ_MSET		0xfe000000	/* write */ -#define IRQ_STAT		0xff000000	/* read */ -#define IRQ_MCLR		0xff000000	/* write */ +#include "core.h" -static void ebsa110_mask_irq(unsigned int irq) +static void ebsa110_mask_irq(struct irq_data *d)  { -	__raw_writeb(1 << irq, IRQ_MCLR); +	__raw_writeb(1 << d->irq, IRQ_MCLR);  } -static void ebsa110_unmask_irq(unsigned int irq) +static void ebsa110_unmask_irq(struct irq_data *d)  { -	__raw_writeb(1 << irq, IRQ_MSET); +	__raw_writeb(1 << d->irq, IRQ_MSET);  }  static struct irq_chip ebsa110_irq_chip = { -	.ack	= ebsa110_mask_irq, -	.mask	= ebsa110_mask_irq, -	.unmask = ebsa110_unmask_irq, +	.irq_ack	= ebsa110_mask_irq, +	.irq_mask	= ebsa110_mask_irq, +	.irq_unmask	= ebsa110_unmask_irq,  };  static void __init ebsa110_init_irq(void) @@ -66,8 +63,8 @@ static void __init ebsa110_init_irq(void)  	local_irq_restore(flags);  	for (irq = 0; irq < NR_IRQS; irq++) { -		set_irq_chip(irq, &ebsa110_irq_chip); -		set_irq_handler(irq, handle_level_irq); +		irq_set_chip_and_handler(irq, &ebsa110_irq_chip, +					 handle_level_irq);  		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);  	}  } @@ -77,24 +74,24 @@ static struct map_desc ebsa110_io_desc[] __initdata = {  	 * sparse external-decode ISAIO space  	 */  	{	/* IRQ_STAT/IRQ_MCLR */ -		.virtual	= IRQ_STAT, +		.virtual	= (unsigned long)IRQ_STAT,  		.pfn		= __phys_to_pfn(TRICK4_PHYS), -		.length		= PGDIR_SIZE, +		.length		= TRICK4_SIZE,  		.type		= MT_DEVICE  	}, {	/* IRQ_MASK/IRQ_MSET */ -		.virtual	= IRQ_MASK, +		.virtual	= (unsigned long)IRQ_MASK,  		.pfn		= __phys_to_pfn(TRICK3_PHYS), -		.length		= PGDIR_SIZE, +		.length		= TRICK3_SIZE,  		.type		= MT_DEVICE  	}, {	/* SOFT_BASE */ -		.virtual	= SOFT_BASE, +		.virtual	= (unsigned long)SOFT_BASE,  		.pfn		= __phys_to_pfn(TRICK1_PHYS), -		.length		= PGDIR_SIZE, +		.length		= TRICK1_SIZE,  		.type		= MT_DEVICE  	}, {	/* PIT_BASE */ -		.virtual	= PIT_BASE, +		.virtual	= (unsigned long)PIT_BASE,  		.pfn		= __phys_to_pfn(TRICK0_PHYS), -		.length		= PGDIR_SIZE, +		.length		= TRICK0_SIZE,  		.type		= MT_DEVICE  	}, @@ -119,6 +116,20 @@ static void __init ebsa110_map_io(void)  	iotable_init(ebsa110_io_desc, ARRAY_SIZE(ebsa110_io_desc));  } +static void __iomem *ebsa110_ioremap_caller(phys_addr_t cookie, size_t size, +					    unsigned int flags, void *caller) +{ +	return (void __iomem *)cookie; +} + +static void ebsa110_iounmap(volatile void __iomem *io_addr) +{} + +static void __init ebsa110_init_early(void) +{ +	arch_ioremap_caller = ebsa110_ioremap_caller; +	arch_iounmap = ebsa110_iounmap; +}  #define PIT_CTRL		(PIT_BASE + 0x0d)  #define PIT_T2			(PIT_BASE + 0x09) @@ -147,7 +158,7 @@ static void __init ebsa110_map_io(void)   * interrupt, then the PIT counter will roll over (ie, be negative).   * This actually works out to be convenient.   */ -static unsigned long ebsa110_gettimeoffset(void) +static u32 ebsa110_gettimeoffset(void)  {  	unsigned long offset, count; @@ -170,7 +181,7 @@ static unsigned long ebsa110_gettimeoffset(void)  	 */  	offset = offset * (1000000 / HZ) / COUNT; -	return offset; +	return offset * 1000;  }  static irqreturn_t @@ -195,15 +206,17 @@ ebsa110_timer_interrupt(int irq, void *dev_id)  static struct irqaction ebsa110_timer_irq = {  	.name		= "EBSA110 Timer Tick", -	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, +	.flags		= IRQF_TIMER | IRQF_IRQPOLL,  	.handler	= ebsa110_timer_interrupt,  };  /*   * Set up timer interrupt.   */ -static void __init ebsa110_timer_init(void) +void __init ebsa110_timer_init(void)  { +	arch_gettimeoffset = ebsa110_gettimeoffset; +  	/*  	 * Timer 1, mode 2, LSB/MSB  	 */ @@ -214,11 +227,6 @@ static void __init ebsa110_timer_init(void)  	setup_irq(IRQ_EBSA110_TIMER0, &ebsa110_timer_irq);  } -static struct sys_timer ebsa110_timer = { -	.init		= ebsa110_timer_init, -	.offset		= ebsa110_gettimeoffset, -}; -  static struct plat_serial8250_port serial_platform_data[] = {  	{  		.iobase		= 0x3f8, @@ -271,20 +279,51 @@ static struct platform_device *ebsa110_devices[] = {  	&am79c961_device,  }; +/* + * EBSA110 idling methodology: + * + * We can not execute the "wait for interrupt" instruction since that + * will stop our MCLK signal (which provides the clock for the glue + * logic, and therefore the timer interrupt). + * + * Instead, we spin, polling the IRQ_STAT register for the occurrence + * of any interrupt with core clock down to the memory clock. + */ +static void ebsa110_idle(void) +{ +	const char *irq_stat = (char *)0xff000000; + +	/* disable clock switching */ +	asm volatile ("mcr p15, 0, ip, c15, c2, 2" : : : "cc"); + +	/* wait for an interrupt to occur */ +	while (!*irq_stat); + +	/* enable clock switching */ +	asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); +} +  static int __init ebsa110_init(void)  { +	arm_pm_idle = ebsa110_idle;  	return platform_add_devices(ebsa110_devices, ARRAY_SIZE(ebsa110_devices));  }  arch_initcall(ebsa110_init); +static void ebsa110_restart(enum reboot_mode mode, const char *cmd) +{ +	soft_restart(0x80000000); +} +  MACHINE_START(EBSA110, "EBSA110")  	/* Maintainer: Russell King */ -	.boot_params	= 0x00000400, +	.atag_offset	= 0x400,  	.reserve_lp0	= 1,  	.reserve_lp2	= 1, -	.soft_reboot	= 1,  	.map_io		= ebsa110_map_io, +	.init_early	= ebsa110_init_early,  	.init_irq	= ebsa110_init_irq, -	.timer		= &ebsa110_timer, +	.init_time	= ebsa110_timer_init, +	.restart	= ebsa110_restart,  MACHINE_END diff --git a/arch/arm/mach-ebsa110/core.h b/arch/arm/mach-ebsa110/core.h new file mode 100644 index 00000000000..afe137ee172 --- /dev/null +++ b/arch/arm/mach-ebsa110/core.h @@ -0,0 +1,41 @@ +/* + *  Copyright (C) 1996-2000 Russell King. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This file contains the core hardware definitions of the EBSA-110. + */ +#ifndef CORE_H +#define CORE_H + +/* Physical addresses/sizes */ +#define ISAMEM_PHYS		0xe0000000 +#define ISAMEM_SIZE		0x10000000 + +#define ISAIO_PHYS		0xf0000000 +#define ISAIO_SIZE		PGDIR_SIZE + +#define TRICK0_PHYS		0xf2000000 +#define TRICK0_SIZE		PGDIR_SIZE +#define TRICK1_PHYS		0xf2400000 +#define TRICK1_SIZE		PGDIR_SIZE +#define TRICK2_PHYS		0xf2800000 +#define TRICK3_PHYS		0xf2c00000 +#define TRICK3_SIZE		PGDIR_SIZE +#define TRICK4_PHYS		0xf3000000 +#define TRICK4_SIZE		PGDIR_SIZE +#define TRICK5_PHYS		0xf3400000 +#define TRICK6_PHYS		0xf3800000 +#define TRICK7_PHYS		0xf3c00000 + +/* Virtual addresses */ +#define PIT_BASE		IOMEM(0xfc000000)	/* trick 0 */ +#define SOFT_BASE		IOMEM(0xfd000000)	/* trick 1 */ +#define IRQ_MASK		IOMEM(0xfe000000)	/* trick 3 - read */ +#define IRQ_MSET		IOMEM(0xfe000000)	/* trick 3 - write */ +#define IRQ_STAT		IOMEM(0xff000000)	/* trick 4 - read */ +#define IRQ_MCLR		IOMEM(0xff000000)	/* trick 4 - write */ + +#endif diff --git a/arch/arm/mach-ebsa110/include/mach/debug-macro.S b/arch/arm/mach-ebsa110/include/mach/debug-macro.S deleted file mode 100644 index 7ef5690fd08..00000000000 --- a/arch/arm/mach-ebsa110/include/mach/debug-macro.S +++ /dev/null @@ -1,22 +0,0 @@ -/* arch/arm/mach-ebsa110/include/mach/debug-macro.S - * - * Debugging macro include header - * - *  Copyright (C) 1994-1999 Russell King - *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * -**/ - -		.macro	addruart, rp, rv -		mov	\rp, #0xf0000000 -		orr	\rp, \rp, #0x00000be0 -		mov	\rp, \rv -		.endm - -#define UART_SHIFT	2 -#define FLOW_CONTROL -#include <asm/hardware/debug-8250.S> diff --git a/arch/arm/mach-ebsa110/include/mach/entry-macro.S b/arch/arm/mach-ebsa110/include/mach/entry-macro.S index cc3e5992f6b..14b110de78a 100644 --- a/arch/arm/mach-ebsa110/include/mach/entry-macro.S +++ b/arch/arm/mach-ebsa110/include/mach/entry-macro.S @@ -12,16 +12,10 @@  #define IRQ_STAT		0xff000000	/* read */ -	.macro	disable_fiq -	.endm -  	.macro  get_irqnr_preamble, base, tmp  	mov	\base, #IRQ_STAT  	.endm -	.macro  arch_ret_to_user, tmp1, tmp2 -	.endm -  	.macro	get_irqnr_and_base, irqnr, stat, base, tmp  	ldrb	\stat, [\base]			@ get interrupts  	mov	\irqnr, #0 diff --git a/arch/arm/mach-ebsa110/include/mach/hardware.h b/arch/arm/mach-ebsa110/include/mach/hardware.h index 4b2fb774390..f4e5407bd00 100644 --- a/arch/arm/mach-ebsa110/include/mach/hardware.h +++ b/arch/arm/mach-ebsa110/include/mach/hardware.h @@ -12,48 +12,9 @@  #ifndef __ASM_ARCH_HARDWARE_H  #define __ASM_ARCH_HARDWARE_H -/* - * The EBSA110 has a weird "ISA IO" region: - * - * Region 0 (addr = 0xf0000000 + io << 2) - * -------------------------------------------------------- - * Physical region	IO region - * f0000fe0 - f0000ffc	3f8 - 3ff  ttyS0 - * f0000e60 - f0000e64	398 - 399 - * f0000de0 - f0000dfc	378 - 37f  lp0 - * f0000be0 - f0000bfc	2f8 - 2ff  ttyS1 - * - * Region 1 (addr = 0xf0000000 + (io & ~1) << 1 + (io & 1)) - * -------------------------------------------------------- - * Physical region	IO region - * f00014f1             a79        pnp write data - * f00007c0 - f00007c1	3e0 - 3e1  pcmcia - * f00004f1		279        pnp address - * f0000440 - f000046c  220 - 236  eth0 - * f0000405		203        pnp read data - */ - -#define ISAMEM_PHYS		0xe0000000 -#define ISAMEM_SIZE		0x10000000 - -#define ISAIO_PHYS		0xf0000000 -#define ISAIO_SIZE		PGDIR_SIZE - -#define TRICK0_PHYS		0xf2000000 -#define TRICK1_PHYS		0xf2400000 -#define TRICK2_PHYS		0xf2800000 -#define TRICK3_PHYS		0xf2c00000 -#define TRICK4_PHYS		0xf3000000 -#define TRICK5_PHYS		0xf3400000 -#define TRICK6_PHYS		0xf3800000 -#define TRICK7_PHYS		0xf3c00000 -  #define ISAMEM_BASE		0xe0000000  #define ISAIO_BASE		0xf0000000 -#define PIT_BASE		0xfc000000 -#define SOFT_BASE		0xfd000000 -  /*   * RAM definitions   */ diff --git a/arch/arm/mach-ebsa110/include/mach/io.h b/arch/arm/mach-ebsa110/include/mach/io.h index f68daa632af..11bb0799424 100644 --- a/arch/arm/mach-ebsa110/include/mach/io.h +++ b/arch/arm/mach-ebsa110/include/mach/io.h @@ -13,8 +13,6 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffff -  u8 __inb8(unsigned int port);  void __outb8(u8  val, unsigned int port); @@ -64,15 +62,6 @@ void __writel(u32 val, void __iomem *addr);  #define writew(v,b)		__writew(v,b)  #define writel(v,b)		__writel(v,b) -static inline void __iomem *__arch_ioremap(unsigned long cookie, size_t size, -					   unsigned int flags) -{ -	return (void __iomem *)cookie; -} - -#define __arch_ioremap		__arch_ioremap -#define __arch_iounmap(cookie)	do { } while (0) -  extern void insb(unsigned int port, void *buf, int sz);  extern void insw(unsigned int port, void *buf, int sz);  extern void insl(unsigned int port, void *buf, int sz); diff --git a/arch/arm/mach-ebsa110/include/mach/memory.h b/arch/arm/mach-ebsa110/include/mach/memory.h index 0ca66d080c6..8e49066ad85 100644 --- a/arch/arm/mach-ebsa110/include/mach/memory.h +++ b/arch/arm/mach-ebsa110/include/mach/memory.h @@ -19,7 +19,7 @@  /*   * Physical DRAM offset.   */ -#define PHYS_OFFSET	UL(0x00000000) +#define PLAT_PHYS_OFFSET	UL(0x00000000)  /*   * Cache flushing area - SRAM diff --git a/arch/arm/mach-ebsa110/include/mach/system.h b/arch/arm/mach-ebsa110/include/mach/system.h deleted file mode 100644 index 9a26245bf1f..00000000000 --- a/arch/arm/mach-ebsa110/include/mach/system.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - *  arch/arm/mach-ebsa110/include/mach/system.h - * - *  Copyright (C) 1996-2000 Russell King. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef __ASM_ARCH_SYSTEM_H -#define __ASM_ARCH_SYSTEM_H - -/* - * EBSA110 idling methodology: - * - * We can not execute the "wait for interrupt" instruction since that - * will stop our MCLK signal (which provides the clock for the glue - * logic, and therefore the timer interrupt). - * - * Instead, we spin, polling the IRQ_STAT register for the occurrence - * of any interrupt with core clock down to the memory clock. - */ -static inline void arch_idle(void) -{ -	const char *irq_stat = (char *)0xff000000; - -	/* disable clock switching */ -	asm volatile ("mcr p15, 0, ip, c15, c2, 2" : : : "cc"); - -	/* wait for an interrupt to occur */ -	while (!*irq_stat); - -	/* enable clock switching */ -	asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); -} - -#define arch_reset(mode, cmd)	cpu_reset(0x80000000) - -#endif diff --git a/arch/arm/mach-ebsa110/include/mach/timex.h b/arch/arm/mach-ebsa110/include/mach/timex.h deleted file mode 100644 index 4fb43b22a10..00000000000 --- a/arch/arm/mach-ebsa110/include/mach/timex.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - *  arch/arm/mach-ebsa110/include/mach/timex.h - * - *  Copyright (C) 1997, 1998 Russell King - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - *  EBSA110 architecture timex specifications - */ - -/* - * On the EBSA, the clock ticks at weird rates. - * This is therefore not used to calculate the - * divisor. - */ -#define CLOCK_TICK_RATE		47894000 - diff --git a/arch/arm/mach-ebsa110/include/mach/uncompress.h b/arch/arm/mach-ebsa110/include/mach/uncompress.h index 32041509fbf..ab64bea69c7 100644 --- a/arch/arm/mach-ebsa110/include/mach/uncompress.h +++ b/arch/arm/mach-ebsa110/include/mach/uncompress.h @@ -42,4 +42,3 @@ static inline void flush(void)   * nothing to do   */  #define arch_decomp_setup() -#define arch_decomp_wdog() diff --git a/arch/arm/mach-ebsa110/include/mach/vmalloc.h b/arch/arm/mach-ebsa110/include/mach/vmalloc.h deleted file mode 100644 index 60bde56fba4..00000000000 --- a/arch/arm/mach-ebsa110/include/mach/vmalloc.h +++ /dev/null @@ -1,10 +0,0 @@ -/* - *  arch/arm/mach-ebsa110/include/mach/vmalloc.h - * - *  Copyright (C) 1998 Russell King - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#define VMALLOC_END       0xdf000000 diff --git a/arch/arm/mach-ebsa110/io.c b/arch/arm/mach-ebsa110/io.c index c52e3047a7e..756cc377a73 100644 --- a/arch/arm/mach-ebsa110/io.c +++ b/arch/arm/mach-ebsa110/io.c @@ -177,6 +177,26 @@ void writesl(void __iomem *addr, const void *data, int len)  }  EXPORT_SYMBOL(writesl); +/* + * The EBSA110 has a weird "ISA IO" region: + * + * Region 0 (addr = 0xf0000000 + io << 2) + * -------------------------------------------------------- + * Physical region	IO region + * f0000fe0 - f0000ffc	3f8 - 3ff  ttyS0 + * f0000e60 - f0000e64	398 - 399 + * f0000de0 - f0000dfc	378 - 37f  lp0 + * f0000be0 - f0000bfc	2f8 - 2ff  ttyS1 + * + * Region 1 (addr = 0xf0000000 + (io & ~1) << 1 + (io & 1)) + * -------------------------------------------------------- + * Physical region	IO region + * f00014f1             a79        pnp write data + * f00007c0 - f00007c1	3e0 - 3e1  pcmcia + * f00004f1		279        pnp address + * f0000440 - f000046c  220 - 236  eth0 + * f0000405		203        pnp read data + */  #define SUPERIO_PORT(p) \  	(((p) >> 3) == (0x3f8 >> 3) || \  	 ((p) >> 3) == (0x2f8 >> 3) || \ diff --git a/arch/arm/mach-ebsa110/leds.c b/arch/arm/mach-ebsa110/leds.c index 6a6ea57c2a4..0398258c20c 100644 --- a/arch/arm/mach-ebsa110/leds.c +++ b/arch/arm/mach-ebsa110/leds.c @@ -1,51 +1,71 @@  /* - *  linux/arch/arm/mach-ebsa110/leds.c + * Driver for the LED found on the EBSA110 machine + * Based on Versatile and RealView machine LED code   * - *  Copyright (C) 1998 Russell King - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - *  EBSA-110 LED control routines.  We use the led as follows: - * - *   - Red - toggles state every 50 timer interrupts + * License terms: GNU General Public License (GPL) version 2 + * Author: Bryan Wu <bryan.wu@canonical.com>   */ -#include <linux/module.h> -#include <linux/spinlock.h> +#include <linux/kernel.h>  #include <linux/init.h> +#include <linux/io.h> +#include <linux/slab.h> +#include <linux/leds.h> -#include <mach/hardware.h> -#include <asm/leds.h> -#include <asm/system.h>  #include <asm/mach-types.h> -static spinlock_t leds_lock; +#include "core.h" -static void ebsa110_leds_event(led_event_t ledevt) +#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) +static void ebsa110_led_set(struct led_classdev *cdev, +			      enum led_brightness b)  { -	unsigned long flags; +	u8 reg = __raw_readb(SOFT_BASE); -	spin_lock_irqsave(&leds_lock, flags); +	if (b != LED_OFF) +		reg |= 0x80; +	else +		reg &= ~0x80; -	switch(ledevt) { -	case led_timer: -		*(volatile unsigned char *)SOFT_BASE ^= 128; -		break; +	__raw_writeb(reg, SOFT_BASE); +} -	default: -		break; -	} +static enum led_brightness ebsa110_led_get(struct led_classdev *cdev) +{ +	u8 reg = __raw_readb(SOFT_BASE); -	spin_unlock_irqrestore(&leds_lock, flags); +	return (reg & 0x80) ? LED_FULL : LED_OFF;  } -static int __init leds_init(void) +static int __init ebsa110_leds_init(void)  { -	if (machine_is_ebsa110()) -		leds_event = ebsa110_leds_event; + +	struct led_classdev *cdev; +	int ret; + +	if (!machine_is_ebsa110()) +		return -ENODEV; + +	cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); +	if (!cdev) +		return -ENOMEM; + +	cdev->name = "ebsa110:0"; +	cdev->brightness_set = ebsa110_led_set; +	cdev->brightness_get = ebsa110_led_get; +	cdev->default_trigger = "heartbeat"; + +	ret = led_classdev_register(NULL, cdev); +	if (ret	< 0) { +		kfree(cdev); +		return ret; +	}  	return 0;  } -__initcall(leds_init); +/* + * Since we may have triggers on any subsystem, defer registration + * until after subsystem_init. + */ +fs_initcall(ebsa110_leds_init); +#endif  | 
