add proper led support to ifxmips

SVN-Revision: 11137
This commit is contained in:
John Crispin 2008-05-14 13:43:18 +00:00
parent 3c143ca859
commit 9b340cf3df
1 changed files with 30 additions and 63 deletions

View File

@ -31,8 +31,10 @@
#include <asm/ifxmips/ifxmips.h>
#include <asm/ifxmips/ifxmips_gpio.h>
#include <asm/ifxmips/ifxmips_pmu.h>
#include <linux/leds.h>
#include <linux/delay.h>
#define DRVNAME "ifxmips_led"
#define DRVNAME "ifxmips_led"
#define IFXMIPS_LED_CLK_EDGE IFXMIPS_LED_FALLING
//#define IFXMIPS_LED_CLK_EDGE IFXMIPS_LED_RISING
@ -41,7 +43,12 @@
#define IFXMIPS_LED_GPIO_PORT 0
static int ifxmips_led_major;
#define IFXMIPS_MAX_LED 24
struct ifxmips_led {
struct led_classdev cdev;
u8 bit;
};
void
ifxmips_led_set (unsigned int led)
@ -75,6 +82,17 @@ ifxmips_led_blink_clear (unsigned int led)
}
EXPORT_SYMBOL(ifxmips_led_blink_clear);
void
ifxmips_ledapi_set(struct led_classdev *led_cdev, enum led_brightness value)
{
struct ifxmips_led *led_dev = container_of(led_cdev, struct ifxmips_led, cdev);
if(value)
ifxmips_led_set(1 << led_dev->bit);
else
ifxmips_led_clear(1 << led_dev->bit);
}
void
ifxmips_led_setup_gpio (void)
{
@ -90,41 +108,10 @@ ifxmips_led_setup_gpio (void)
}
}
static int
led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
int ret = -EINVAL;
switch ( cmd )
{
}
return ret;
}
static int
led_open (struct inode *inode, struct file *file)
{
return 0;
}
static int
led_release (struct inode *inode, struct file *file)
{
return 0;
}
static struct file_operations ifxmips_led_fops = {
.owner = THIS_MODULE,
.ioctl = led_ioctl,
.open = led_open,
.release = led_release
};
static int
ifxmips_led_probe(struct platform_device *dev)
{
int ret = 0;
int i = 0;
ifxmips_led_setup_gpio();
@ -155,26 +142,23 @@ ifxmips_led_probe(struct platform_device *dev)
/* per default, the leds are turned on */
ifxmips_pmu_enable(IFXMIPS_PMU_PWDCR_LED);
ifxmips_led_major = register_chrdev(0, "ifxmips_led", &ifxmips_led_fops);
if (!ifxmips_led_major)
for(i = 0; i < IFXMIPS_MAX_LED; i++)
{
printk("ifxmips_led: Error! Could not register device. %d\n", ifxmips_led_major);
ret = -EINVAL;
goto out;
struct ifxmips_led *tmp = kzalloc(sizeof(struct ifxmips_led), GFP_KERNEL);
tmp->cdev.brightness_set = ifxmips_ledapi_set;
tmp->cdev.name = kmalloc(sizeof("ifxmips:led:00"), GFP_KERNEL);
sprintf(tmp->cdev.name, "ifxmips:led:%02d", i);
tmp->cdev.default_trigger = NULL;
tmp->bit = i;
led_classdev_register(&dev->dev, &tmp->cdev);
}
printk(KERN_INFO "ifxmips_led: device successfully initialized #%d.\n", ifxmips_led_major);
out:
return ret;
return 0;
}
static int
ifxmips_led_remove(struct platform_device *pdev)
{
unregister_chrdev(ifxmips_led_major, "ifxmips_led");
return 0;
}
@ -188,23 +172,6 @@ platform_driver ifxmips_led_driver = {
},
};
/*
Map for LED on reference board
WLAN_READ LED11 OUT1 15
WARNING LED12 OUT2 14
FXS1_LINK LED13 OUT3 13
FXS2_LINK LED14 OUT4 12
FXO_ACT LED15 OUT5 11
USB_LINK LED16 OUT6 10
ADSL2_LINK LED19 OUT7 9
BT_LINK LED17 OUT8 8
SD_LINK LED20 OUT9 7
ADSL2_TRAFFIC LED31 OUT16 0
Map for hardware relay on reference board
USB Power On OUT11 5
RELAY OUT12 4
*/
int __init
ifxmips_led_init (void)
{