2005-04-16 15:20:36 -07:00
/*
* linux / arch / arm / mach - footbridge / ebsa285 . c
*
* EBSA285 machine fixup
*/
# include <linux/init.h>
2013-11-30 13:41:26 +00:00
# include <linux/io.h>
2008-12-06 08:25:16 +00:00
# include <linux/spinlock.h>
2012-03-14 02:05:24 +08:00
# include <linux/slab.h>
# include <linux/leds.h>
2005-04-16 15:20:36 -07:00
# include <asm/hardware/dec21285.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include "common.h"
2012-03-14 02:05:24 +08:00
/* LEDs */
# if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
2013-11-30 13:41:26 +00:00
# define XBUS_AMBER_L BIT(0)
# define XBUS_GREEN_L BIT(1)
# define XBUS_RED_L BIT(2)
# define XBUS_TOGGLE BIT(7)
2012-03-14 02:05:24 +08:00
struct ebsa285_led {
struct led_classdev cdev ;
u8 mask ;
} ;
/*
* The triggers lines up below will only be used if the
* LED triggers are compiled in .
*/
static const struct {
const char * name ;
const char * trigger ;
} ebsa285_leds [ ] = {
2013-11-29 00:54:38 +00:00
{ " ebsa285:amber " , " cpu0 " , } ,
{ " ebsa285:green " , " heartbeat " , } ,
2012-03-14 02:05:24 +08:00
{ " ebsa285:red " , } ,
} ;
2013-11-29 00:54:38 +00:00
static unsigned char hw_led_state ;
2013-11-30 13:41:26 +00:00
static void __iomem * xbus ;
2013-11-29 00:54:38 +00:00
2012-03-14 02:05:24 +08:00
static void ebsa285_led_set ( struct led_classdev * cdev ,
enum led_brightness b )
{
struct ebsa285_led * led = container_of ( cdev ,
struct ebsa285_led , cdev ) ;
2013-11-29 00:54:38 +00:00
if ( b = = LED_OFF )
hw_led_state | = led - > mask ;
2012-03-14 02:05:24 +08:00
else
2013-11-29 00:54:38 +00:00
hw_led_state & = ~ led - > mask ;
2013-11-30 13:41:26 +00:00
writeb ( hw_led_state , xbus ) ;
2012-03-14 02:05:24 +08:00
}
static enum led_brightness ebsa285_led_get ( struct led_classdev * cdev )
{
struct ebsa285_led * led = container_of ( cdev ,
struct ebsa285_led , cdev ) ;
2013-11-29 00:54:38 +00:00
return hw_led_state & led - > mask ? LED_OFF : LED_FULL ;
2012-03-14 02:05:24 +08:00
}
static int __init ebsa285_leds_init ( void )
{
int i ;
2013-11-29 00:54:38 +00:00
if ( ! machine_is_ebsa285 ( ) )
2012-03-14 02:05:24 +08:00
return - ENODEV ;
2013-11-30 13:41:26 +00:00
xbus = ioremap ( XBUS_CS2 , SZ_4K ) ;
if ( ! xbus )
return - ENOMEM ;
2013-11-29 00:54:38 +00:00
/* 3 LEDS all off */
2013-11-30 13:41:26 +00:00
hw_led_state = XBUS_AMBER_L | XBUS_GREEN_L | XBUS_RED_L ;
writeb ( hw_led_state , xbus ) ;
2012-03-14 02:05:24 +08:00
for ( i = 0 ; i < ARRAY_SIZE ( ebsa285_leds ) ; i + + ) {
struct ebsa285_led * led ;
led = kzalloc ( sizeof ( * led ) , GFP_KERNEL ) ;
if ( ! led )
break ;
led - > cdev . name = ebsa285_leds [ i ] . name ;
led - > cdev . brightness_set = ebsa285_led_set ;
led - > cdev . brightness_get = ebsa285_led_get ;
led - > cdev . default_trigger = ebsa285_leds [ i ] . trigger ;
led - > mask = BIT ( i ) ;
if ( led_classdev_register ( NULL , & led - > cdev ) < 0 ) {
kfree ( led ) ;
break ;
}
}
return 0 ;
}
/*
* Since we may have triggers on any subsystem , defer registration
* until after subsystem_init .
*/
fs_initcall ( ebsa285_leds_init ) ;
# endif
2005-04-16 15:20:36 -07:00
MACHINE_START ( EBSA285 , " EBSA285 " )
2005-07-03 17:38:58 +01:00
/* Maintainer: Russell King */
2011-07-05 22:38:11 -04:00
. atag_offset = 0x100 ,
2005-07-03 17:38:58 +01:00
. video_start = 0x000a0000 ,
. video_end = 0x000bffff ,
. map_io = footbridge_map_io ,
2013-11-29 01:03:35 +00:00
. init_early = footbridge_sched_clock ,
2005-07-03 17:38:58 +01:00
. init_irq = footbridge_init_irq ,
2012-11-08 12:40:59 -07:00
. init_time = footbridge_timer_init ,
2011-11-03 19:47:54 +00:00
. restart = footbridge_restart ,
2005-04-16 15:20:36 -07:00
MACHINE_END