2007-02-13 02:16:27 +03:00
/*
* Copyright 2006 - Florian Fainelli < florian @ openwrt . org >
*
* Control the Cobalt Qube / RaQ front LED
*/
2007-09-27 12:51:17 +04:00
# include <linux/init.h>
# include <linux/io.h>
# include <linux/ioport.h>
# include <linux/leds.h>
2007-02-13 02:16:27 +03:00
# include <linux/module.h>
2007-09-27 12:51:17 +04:00
# include <linux/platform_device.h>
2007-02-13 02:16:27 +03:00
# include <linux/types.h>
2007-09-27 12:51:17 +04:00
# define LED_FRONT_LEFT 0x01
# define LED_FRONT_RIGHT 0x02
static void __iomem * led_port ;
static u8 led_value ;
static void qube_front_led_set ( struct led_classdev * led_cdev ,
2008-03-09 23:59:57 +03:00
enum led_brightness brightness )
2007-02-13 02:16:27 +03:00
{
if ( brightness )
2007-09-27 12:51:17 +04:00
led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT ;
2007-02-13 02:16:27 +03:00
else
2007-09-27 12:51:17 +04:00
led_value = ~ ( LED_FRONT_LEFT | LED_FRONT_RIGHT ) ;
writeb ( led_value , led_port ) ;
}
static struct led_classdev qube_front_led = {
2009-09-07 17:37:27 +04:00
. name = " qube::front " ,
2007-09-27 12:51:17 +04:00
. brightness = LED_FULL ,
. brightness_set = qube_front_led_set ,
. default_trigger = " ide-disk " ,
} ;
static int __devinit cobalt_qube_led_probe ( struct platform_device * pdev )
{
struct resource * res ;
int retval ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
if ( ! res )
return - EBUSY ;
led_port = ioremap ( res - > start , res - > end - res - > start + 1 ) ;
if ( ! led_port )
return - ENOMEM ;
led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT ;
writeb ( led_value , led_port ) ;
retval = led_classdev_register ( & pdev - > dev , & qube_front_led ) ;
if ( retval )
goto err_iounmap ;
return 0 ;
err_iounmap :
iounmap ( led_port ) ;
led_port = NULL ;
return retval ;
}
static int __devexit cobalt_qube_led_remove ( struct platform_device * pdev )
{
led_classdev_unregister ( & qube_front_led ) ;
if ( led_port ) {
iounmap ( led_port ) ;
led_port = NULL ;
}
return 0 ;
2007-02-13 02:16:27 +03:00
}
2008-04-16 01:34:30 +04:00
/* work with hotplug and coldplug */
MODULE_ALIAS ( " platform:cobalt-qube-leds " ) ;
2007-09-27 12:51:17 +04:00
static struct platform_driver cobalt_qube_led_driver = {
. probe = cobalt_qube_led_probe ,
. remove = __devexit_p ( cobalt_qube_led_remove ) ,
. driver = {
. name = " cobalt-qube-leds " ,
. owner = THIS_MODULE ,
} ,
2007-02-13 02:16:27 +03:00
} ;
2007-09-27 12:51:17 +04:00
static int __init cobalt_qube_led_init ( void )
2007-02-13 02:16:27 +03:00
{
2007-09-27 12:51:17 +04:00
return platform_driver_register ( & cobalt_qube_led_driver ) ;
2007-02-13 02:16:27 +03:00
}
2007-09-27 12:51:17 +04:00
static void __exit cobalt_qube_led_exit ( void )
2007-02-13 02:16:27 +03:00
{
2007-09-27 12:51:17 +04:00
platform_driver_unregister ( & cobalt_qube_led_driver ) ;
2007-02-13 02:16:27 +03:00
}
2007-09-27 12:51:17 +04:00
module_init ( cobalt_qube_led_init ) ;
module_exit ( cobalt_qube_led_exit ) ;
2007-02-13 02:16:27 +03:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Front LED support for Cobalt Server " ) ;
MODULE_AUTHOR ( " Florian Fainelli <florian@openwrt.org> " ) ;