2019-05-28 09:57:21 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07:00
/*
2011-06-30 22:56:17 +08:00
* Driver for the LED found on the EBSA110 machine
* Based on Versatile and RealView machine LED code
2005-04-16 15:20:36 -07:00
*
2011-06-30 22:56:17 +08:00
* Author : Bryan Wu < bryan . wu @ canonical . com >
2005-04-16 15:20:36 -07:00
*/
2011-06-30 22:56:17 +08:00
# include <linux/kernel.h>
2005-04-16 15:20:36 -07:00
# include <linux/init.h>
2011-06-30 22:56:17 +08:00
# include <linux/io.h>
# include <linux/slab.h>
# include <linux/leds.h>
2005-04-16 15:20:36 -07:00
# include <asm/mach-types.h>
2011-06-10 11:13:05 +01:00
# include "core.h"
2011-06-30 22:56:17 +08:00
# if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
static void ebsa110_led_set ( struct led_classdev * cdev ,
enum led_brightness b )
2005-04-16 15:20:36 -07:00
{
2011-06-30 22:56:17 +08:00
u8 reg = __raw_readb ( SOFT_BASE ) ;
2005-04-16 15:20:36 -07:00
2011-06-30 22:56:17 +08:00
if ( b ! = LED_OFF )
reg | = 0x80 ;
else
reg & = ~ 0x80 ;
2005-04-16 15:20:36 -07:00
2011-06-30 22:56:17 +08:00
__raw_writeb ( reg , SOFT_BASE ) ;
}
2005-04-16 15:20:36 -07:00
2011-06-30 22:56:17 +08:00
static enum led_brightness ebsa110_led_get ( struct led_classdev * cdev )
{
u8 reg = __raw_readb ( SOFT_BASE ) ;
2005-04-16 15:20:36 -07:00
2011-06-30 22:56:17 +08:00
return ( reg & 0x80 ) ? LED_FULL : LED_OFF ;
2005-04-16 15:20:36 -07:00
}
2011-06-30 22:56:17 +08:00
static int __init ebsa110_leds_init ( void )
2005-04-16 15:20:36 -07:00
{
2011-06-30 22:56:17 +08:00
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 ;
}
2005-04-16 15:20:36 -07:00
return 0 ;
}
2011-06-30 22:56:17 +08:00
/*
* Since we may have triggers on any subsystem , defer registration
* until after subsystem_init .
*/
fs_initcall ( ebsa110_leds_init ) ;
# endif