11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/arch/arm/mach-footbridge/ebsa285.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * EBSA285 machine fixup 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds #include <linux/init.h> 770d13e08SRussell King #include <linux/spinlock.h> 8*cf6856d6SBryan Wu #include <linux/slab.h> 9*cf6856d6SBryan Wu #include <linux/leds.h> 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #include <asm/hardware/dec21285.h> 121da177e4SLinus Torvalds #include <asm/mach-types.h> 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #include <asm/mach/arch.h> 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #include "common.h" 171da177e4SLinus Torvalds 18*cf6856d6SBryan Wu /* LEDs */ 19*cf6856d6SBryan Wu #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) 20*cf6856d6SBryan Wu struct ebsa285_led { 21*cf6856d6SBryan Wu struct led_classdev cdev; 22*cf6856d6SBryan Wu u8 mask; 23*cf6856d6SBryan Wu }; 24*cf6856d6SBryan Wu 25*cf6856d6SBryan Wu /* 26*cf6856d6SBryan Wu * The triggers lines up below will only be used if the 27*cf6856d6SBryan Wu * LED triggers are compiled in. 28*cf6856d6SBryan Wu */ 29*cf6856d6SBryan Wu static const struct { 30*cf6856d6SBryan Wu const char *name; 31*cf6856d6SBryan Wu const char *trigger; 32*cf6856d6SBryan Wu } ebsa285_leds[] = { 33*cf6856d6SBryan Wu { "ebsa285:amber", "heartbeat", }, 34*cf6856d6SBryan Wu { "ebsa285:green", "cpu0", }, 35*cf6856d6SBryan Wu { "ebsa285:red",}, 36*cf6856d6SBryan Wu }; 37*cf6856d6SBryan Wu 38*cf6856d6SBryan Wu static void ebsa285_led_set(struct led_classdev *cdev, 39*cf6856d6SBryan Wu enum led_brightness b) 40*cf6856d6SBryan Wu { 41*cf6856d6SBryan Wu struct ebsa285_led *led = container_of(cdev, 42*cf6856d6SBryan Wu struct ebsa285_led, cdev); 43*cf6856d6SBryan Wu 44*cf6856d6SBryan Wu if (b != LED_OFF) 45*cf6856d6SBryan Wu *XBUS_LEDS |= led->mask; 46*cf6856d6SBryan Wu else 47*cf6856d6SBryan Wu *XBUS_LEDS &= ~led->mask; 48*cf6856d6SBryan Wu } 49*cf6856d6SBryan Wu 50*cf6856d6SBryan Wu static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) 51*cf6856d6SBryan Wu { 52*cf6856d6SBryan Wu struct ebsa285_led *led = container_of(cdev, 53*cf6856d6SBryan Wu struct ebsa285_led, cdev); 54*cf6856d6SBryan Wu 55*cf6856d6SBryan Wu return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF; 56*cf6856d6SBryan Wu } 57*cf6856d6SBryan Wu 58*cf6856d6SBryan Wu static int __init ebsa285_leds_init(void) 59*cf6856d6SBryan Wu { 60*cf6856d6SBryan Wu int i; 61*cf6856d6SBryan Wu 62*cf6856d6SBryan Wu if (machine_is_ebsa285()) 63*cf6856d6SBryan Wu return -ENODEV; 64*cf6856d6SBryan Wu 65*cf6856d6SBryan Wu /* 3 LEDS All ON */ 66*cf6856d6SBryan Wu *XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; 67*cf6856d6SBryan Wu 68*cf6856d6SBryan Wu for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) { 69*cf6856d6SBryan Wu struct ebsa285_led *led; 70*cf6856d6SBryan Wu 71*cf6856d6SBryan Wu led = kzalloc(sizeof(*led), GFP_KERNEL); 72*cf6856d6SBryan Wu if (!led) 73*cf6856d6SBryan Wu break; 74*cf6856d6SBryan Wu 75*cf6856d6SBryan Wu led->cdev.name = ebsa285_leds[i].name; 76*cf6856d6SBryan Wu led->cdev.brightness_set = ebsa285_led_set; 77*cf6856d6SBryan Wu led->cdev.brightness_get = ebsa285_led_get; 78*cf6856d6SBryan Wu led->cdev.default_trigger = ebsa285_leds[i].trigger; 79*cf6856d6SBryan Wu led->mask = BIT(i); 80*cf6856d6SBryan Wu 81*cf6856d6SBryan Wu if (led_classdev_register(NULL, &led->cdev) < 0) { 82*cf6856d6SBryan Wu kfree(led); 83*cf6856d6SBryan Wu break; 84*cf6856d6SBryan Wu } 85*cf6856d6SBryan Wu } 86*cf6856d6SBryan Wu 87*cf6856d6SBryan Wu return 0; 88*cf6856d6SBryan Wu } 89*cf6856d6SBryan Wu 90*cf6856d6SBryan Wu /* 91*cf6856d6SBryan Wu * Since we may have triggers on any subsystem, defer registration 92*cf6856d6SBryan Wu * until after subsystem_init. 93*cf6856d6SBryan Wu */ 94*cf6856d6SBryan Wu fs_initcall(ebsa285_leds_init); 95*cf6856d6SBryan Wu #endif 96*cf6856d6SBryan Wu 971da177e4SLinus Torvalds MACHINE_START(EBSA285, "EBSA285") 98e9dea0c6SRussell King /* Maintainer: Russell King */ 9993ef8883SNicolas Pitre .atag_offset = 0x100, 100e9dea0c6SRussell King .video_start = 0x000a0000, 101e9dea0c6SRussell King .video_end = 0x000bffff, 102e9dea0c6SRussell King .map_io = footbridge_map_io, 103e9dea0c6SRussell King .init_irq = footbridge_init_irq, 1041da177e4SLinus Torvalds .timer = &footbridge_timer, 1056fca1e17SRussell King .restart = footbridge_restart, 1061da177e4SLinus Torvalds MACHINE_END 1071da177e4SLinus Torvalds 108