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

View File

@ -31,8 +31,10 @@
#include <asm/ifxmips/ifxmips.h> #include <asm/ifxmips/ifxmips.h>
#include <asm/ifxmips/ifxmips_gpio.h> #include <asm/ifxmips/ifxmips_gpio.h>
#include <asm/ifxmips/ifxmips_pmu.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_FALLING
//#define IFXMIPS_LED_CLK_EDGE IFXMIPS_LED_RISING //#define IFXMIPS_LED_CLK_EDGE IFXMIPS_LED_RISING
@ -41,7 +43,12 @@
#define IFXMIPS_LED_GPIO_PORT 0 #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 void
ifxmips_led_set (unsigned int led) ifxmips_led_set (unsigned int led)
@ -75,6 +82,17 @@ ifxmips_led_blink_clear (unsigned int led)
} }
EXPORT_SYMBOL(ifxmips_led_blink_clear); 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 void
ifxmips_led_setup_gpio (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 static int
ifxmips_led_probe(struct platform_device *dev) ifxmips_led_probe(struct platform_device *dev)
{ {
int ret = 0; int i = 0;
ifxmips_led_setup_gpio(); ifxmips_led_setup_gpio();
@ -155,26 +142,23 @@ ifxmips_led_probe(struct platform_device *dev)
/* per default, the leds are turned on */ /* per default, the leds are turned on */
ifxmips_pmu_enable(IFXMIPS_PMU_PWDCR_LED); ifxmips_pmu_enable(IFXMIPS_PMU_PWDCR_LED);
ifxmips_led_major = register_chrdev(0, "ifxmips_led", &ifxmips_led_fops); for(i = 0; i < IFXMIPS_MAX_LED; i++)
if (!ifxmips_led_major)
{ {
printk("ifxmips_led: Error! Could not register device. %d\n", ifxmips_led_major); struct ifxmips_led *tmp = kzalloc(sizeof(struct ifxmips_led), GFP_KERNEL);
ret = -EINVAL; tmp->cdev.brightness_set = ifxmips_ledapi_set;
tmp->cdev.name = kmalloc(sizeof("ifxmips:led:00"), GFP_KERNEL);
goto out; 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); return 0;
out:
return ret;
} }
static int static int
ifxmips_led_remove(struct platform_device *pdev) ifxmips_led_remove(struct platform_device *pdev)
{ {
unregister_chrdev(ifxmips_led_major, "ifxmips_led");
return 0; 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 int __init
ifxmips_led_init (void) ifxmips_led_init (void)
{ {