2019-05-19 16:51:31 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2007-09-27 12:51:05 +04:00
/*
* LEDs driver for the Cobalt Raq series .
*
2009-07-02 19:39:38 +04:00
* Copyright ( C ) 2007 Yoichi Yuasa < yuasa @ linux - mips . org >
2007-09-27 12:51:05 +04:00
*/
# include <linux/init.h>
# include <linux/io.h>
# include <linux/ioport.h>
# include <linux/leds.h>
# include <linux/platform_device.h>
# include <linux/spinlock.h>
# include <linux/types.h>
2011-07-10 20:24:44 +04:00
# include <linux/export.h>
2007-09-27 12:51:05 +04:00
# define LED_WEB 0x04
# define LED_POWER_OFF 0x08
static void __iomem * led_port ;
static u8 led_value ;
static DEFINE_SPINLOCK ( led_value_lock ) ;
static void raq_web_led_set ( struct led_classdev * led_cdev ,
2008-03-09 23:59:57 +03:00
enum led_brightness brightness )
2007-09-27 12:51:05 +04:00
{
unsigned long flags ;
spin_lock_irqsave ( & led_value_lock , flags ) ;
if ( brightness )
led_value | = LED_WEB ;
else
led_value & = ~ LED_WEB ;
writeb ( led_value , led_port ) ;
spin_unlock_irqrestore ( & led_value_lock , flags ) ;
}
static struct led_classdev raq_web_led = {
2009-09-07 17:37:27 +04:00
. name = " raq::web " ,
2007-09-27 12:51:05 +04:00
. brightness_set = raq_web_led_set ,
} ;
static void raq_power_off_led_set ( struct led_classdev * led_cdev ,
2008-03-09 23:59:57 +03:00
enum led_brightness brightness )
2007-09-27 12:51:05 +04:00
{
unsigned long flags ;
spin_lock_irqsave ( & led_value_lock , flags ) ;
if ( brightness )
led_value | = LED_POWER_OFF ;
else
led_value & = ~ LED_POWER_OFF ;
writeb ( led_value , led_port ) ;
spin_unlock_irqrestore ( & led_value_lock , flags ) ;
}
static struct led_classdev raq_power_off_led = {
2009-09-07 17:37:27 +04:00
. name = " raq::power-off " ,
2007-09-27 12:51:05 +04:00
. brightness_set = raq_power_off_led_set ,
. default_trigger = " power-off " ,
} ;
2012-11-19 22:23:02 +04:00
static int cobalt_raq_led_probe ( struct platform_device * pdev )
2007-09-27 12:51:05 +04:00
{
struct resource * res ;
int retval ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
if ( ! res )
return - EBUSY ;
2012-10-23 16:20:50 +04:00
led_port = devm_ioremap ( & pdev - > dev , res - > start , resource_size ( res ) ) ;
2007-09-27 12:51:05 +04:00
if ( ! led_port )
return - ENOMEM ;
retval = led_classdev_register ( & pdev - > dev , & raq_power_off_led ) ;
if ( retval )
2012-10-23 16:20:50 +04:00
goto err_null ;
2007-09-27 12:51:05 +04:00
retval = led_classdev_register ( & pdev - > dev , & raq_web_led ) ;
if ( retval )
goto err_unregister ;
return 0 ;
err_unregister :
led_classdev_unregister ( & raq_power_off_led ) ;
2012-10-23 16:20:50 +04:00
err_null :
2007-09-27 12:51:05 +04:00
led_port = NULL ;
return retval ;
}
static struct platform_driver cobalt_raq_led_driver = {
. probe = cobalt_raq_led_probe ,
. driver = {
. name = " cobalt-raq-leds " ,
} ,
} ;
2016-11-23 17:50:05 +03:00
builtin_platform_driver ( cobalt_raq_led_driver ) ;