]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/arch/arm/mach-footbridge/ebsa285.c | |
3 | * | |
4 | * EBSA285 machine fixup | |
5 | */ | |
6 | #include <linux/init.h> | |
70d13e08 | 7 | #include <linux/spinlock.h> |
cf6856d6 BW |
8 | #include <linux/slab.h> |
9 | #include <linux/leds.h> | |
1da177e4 LT |
10 | |
11 | #include <asm/hardware/dec21285.h> | |
12 | #include <asm/mach-types.h> | |
13 | ||
14 | #include <asm/mach/arch.h> | |
15 | ||
16 | #include "common.h" | |
17 | ||
cf6856d6 BW |
18 | /* LEDs */ |
19 | #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) | |
20 | struct ebsa285_led { | |
21 | struct led_classdev cdev; | |
22 | u8 mask; | |
23 | }; | |
24 | ||
25 | /* | |
26 | * The triggers lines up below will only be used if the | |
27 | * LED triggers are compiled in. | |
28 | */ | |
29 | static const struct { | |
30 | const char *name; | |
31 | const char *trigger; | |
32 | } ebsa285_leds[] = { | |
33 | { "ebsa285:amber", "heartbeat", }, | |
34 | { "ebsa285:green", "cpu0", }, | |
35 | { "ebsa285:red",}, | |
36 | }; | |
37 | ||
38 | static void ebsa285_led_set(struct led_classdev *cdev, | |
39 | enum led_brightness b) | |
40 | { | |
41 | struct ebsa285_led *led = container_of(cdev, | |
42 | struct ebsa285_led, cdev); | |
43 | ||
44 | if (b != LED_OFF) | |
45 | *XBUS_LEDS |= led->mask; | |
46 | else | |
47 | *XBUS_LEDS &= ~led->mask; | |
48 | } | |
49 | ||
50 | static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) | |
51 | { | |
52 | struct ebsa285_led *led = container_of(cdev, | |
53 | struct ebsa285_led, cdev); | |
54 | ||
55 | return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF; | |
56 | } | |
57 | ||
58 | static int __init ebsa285_leds_init(void) | |
59 | { | |
60 | int i; | |
61 | ||
62 | if (machine_is_ebsa285()) | |
63 | return -ENODEV; | |
64 | ||
65 | /* 3 LEDS All ON */ | |
66 | *XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; | |
67 | ||
68 | for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) { | |
69 | struct ebsa285_led *led; | |
70 | ||
71 | led = kzalloc(sizeof(*led), GFP_KERNEL); | |
72 | if (!led) | |
73 | break; | |
74 | ||
75 | led->cdev.name = ebsa285_leds[i].name; | |
76 | led->cdev.brightness_set = ebsa285_led_set; | |
77 | led->cdev.brightness_get = ebsa285_led_get; | |
78 | led->cdev.default_trigger = ebsa285_leds[i].trigger; | |
79 | led->mask = BIT(i); | |
80 | ||
81 | if (led_classdev_register(NULL, &led->cdev) < 0) { | |
82 | kfree(led); | |
83 | break; | |
84 | } | |
85 | } | |
86 | ||
87 | return 0; | |
88 | } | |
89 | ||
90 | /* | |
91 | * Since we may have triggers on any subsystem, defer registration | |
92 | * until after subsystem_init. | |
93 | */ | |
94 | fs_initcall(ebsa285_leds_init); | |
95 | #endif | |
96 | ||
1da177e4 | 97 | MACHINE_START(EBSA285, "EBSA285") |
e9dea0c6 | 98 | /* Maintainer: Russell King */ |
93ef8883 | 99 | .atag_offset = 0x100, |
e9dea0c6 RK |
100 | .video_start = 0x000a0000, |
101 | .video_end = 0x000bffff, | |
102 | .map_io = footbridge_map_io, | |
103 | .init_irq = footbridge_init_irq, | |
6bb27d73 | 104 | .init_time = footbridge_timer_init, |
6fca1e17 | 105 | .restart = footbridge_restart, |
1da177e4 LT |
106 | MACHINE_END |
107 |