parent
f0e08dea14
commit
5c69bcd309
@ -0,0 +1,116 @@ |
|||||||
|
/*
|
||||||
|
* LED driver for MTX-1 boards |
||||||
|
* |
||||||
|
* Copyright 2007 Florian Fainelli <florian@openwrt.org> |
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License version 2 as |
||||||
|
* published by the Free Software Foundation. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <linux/kernel.h> |
||||||
|
#include <linux/init.h> |
||||||
|
#include <linux/platform_device.h> |
||||||
|
#include <linux/leds.h> |
||||||
|
#include <linux/err.h> |
||||||
|
#include <asm/mach-au1x00/au1000.h> |
||||||
|
|
||||||
|
static struct platform_device *pdev; |
||||||
|
|
||||||
|
static void mtx1_green_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) |
||||||
|
{ |
||||||
|
/* The power LED cannot be controlled the same way as for the Status LED */ |
||||||
|
if (brightness) { |
||||||
|
au_writel( 0x18000800, GPIO2_OUTPUT ); |
||||||
|
} else { |
||||||
|
au_writel( 0x18000000, GPIO2_OUTPUT); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void mtx1_red_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) |
||||||
|
{ |
||||||
|
/* We store GPIO address (originally address - 200) in the "flags" field*/ |
||||||
|
unsigned long pinmask = 1 << led_cdev->flags;
|
||||||
|
if (brightness) { |
||||||
|
au_writel((pinmask << 16) | pinmask, GPIO2_OUTPUT);
|
||||||
|
} else {
|
||||||
|
au_writel((pinmask << 16) | 0, GPIO2_OUTPUT); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static struct led_classdev mtx1_green_led = { |
||||||
|
.name = "mtx1:green", |
||||||
|
.brightness_set = mtx1_green_led_set, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct led_classdev mtx1_red_led = { |
||||||
|
.name = "mtx1:red", |
||||||
|
.flags = 12, |
||||||
|
.brightness_set = mtx1_red_led_set, |
||||||
|
.default_trigger = "ide-disk", |
||||||
|
}; |
||||||
|
|
||||||
|
static int mtx1_leds_probe(struct platform_device *pdev) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
|
||||||
|
ret = led_classdev_register(&pdev->dev, &mtx1_green_led); |
||||||
|
if (ret < 0) |
||||||
|
goto out; |
||||||
|
|
||||||
|
ret = led_classdev_register(&pdev->dev, &mtx1_red_led); |
||||||
|
if (ret < 0) |
||||||
|
led_classdev_unregister(&mtx1_green_led); |
||||||
|
|
||||||
|
out: |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
static int mtx1_leds_remove(struct platform_device *pdev) |
||||||
|
{ |
||||||
|
led_classdev_unregister(&mtx1_green_led); |
||||||
|
led_classdev_unregister(&mtx1_red_led); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static struct platform_driver mtx1_leds_driver = { |
||||||
|
.probe = mtx1_leds_probe, |
||||||
|
.remove = mtx1_leds_remove, |
||||||
|
.driver = { |
||||||
|
.name = "mtx1-leds", |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
static int __init mtx1_leds_init(void) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
|
||||||
|
ret = platform_driver_register(&mtx1_leds_driver); |
||||||
|
if (ret < 0) |
||||||
|
goto out; |
||||||
|
|
||||||
|
pdev = platform_device_register_simple("mtx1-leds", -1, NULL, 0); |
||||||
|
if (IS_ERR(pdev)) { |
||||||
|
ret = PTR_ERR(pdev); |
||||||
|
platform_driver_unregister(&mtx1_leds_driver); |
||||||
|
goto out; |
||||||
|
} |
||||||
|
|
||||||
|
out: |
||||||
|
return ret; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
static void __exit mtx1_leds_exit(void) |
||||||
|
{ |
||||||
|
platform_device_unregister(pdev); |
||||||
|
platform_driver_unregister(&mtx1_leds_driver); |
||||||
|
} |
||||||
|
|
||||||
|
module_init(mtx1_leds_init); |
||||||
|
module_exit(mtx1_leds_exit); |
||||||
|
|
||||||
|
MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); |
||||||
|
MODULE_DESCRIPTION("MTX-1 LED driver"); |
||||||
|
MODULE_LICENSE("GPL"); |
Loading…
Reference in new issue