add latch driver modifications for the mi424wr

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13392 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
Imre Kaloz 2008-11-28 12:29:54 +00:00
parent 6aaf7f354f
commit 771db11892
1 changed files with 20 additions and 11 deletions

View File

@ -15,7 +15,7 @@
depends on LEDS_CLASS && MACH_ARMCORE depends on LEDS_CLASS && MACH_ARMCORE
--- /dev/null --- /dev/null
+++ b/drivers/leds/leds-latch.c +++ b/drivers/leds/leds-latch.c
@@ -0,0 +1,141 @@ @@ -0,0 +1,149 @@
+/* +/*
+ * LEDs driver for Memory Latched Devices + * LEDs driver for Memory Latched Devices
+ * + *
@ -44,8 +44,19 @@
+ struct work_struct work; + struct work_struct work;
+ u8 new_level; + u8 new_level;
+ u8 bit; + u8 bit;
+ void (*set_led)(u8 bit, enum led_brightness value);
+}; +};
+ +
+static void latch_set_led(u8 bit, enum led_brightness value)
+{
+ if (value == LED_OFF)
+ mem_keep |= (0x1 << bit);
+ else
+ mem_keep &= ~(0x1 << bit);
+
+ writeb(mem_keep, iobase);
+}
+
+static void latch_led_set(struct led_classdev *led_cdev, +static void latch_led_set(struct led_classdev *led_cdev,
+ enum led_brightness value) + enum led_brightness value)
+{ +{
@ -54,12 +65,7 @@
+ +
+ spin_lock(mem_lock); + spin_lock(mem_lock);
+ +
+ if (value == LED_OFF) + led_dat->set_led(led_dat->bit, value);
+ mem_keep |= (0x1 << led_dat->bit);
+ else
+ mem_keep &= ~(0x1 << led_dat->bit);
+
+ writeb(mem_keep, iobase);
+ +
+ spin_unlock(mem_lock); + spin_unlock(mem_lock);
+} +}
@ -79,9 +85,6 @@
+ if (!leds_data) + if (!leds_data)
+ return -ENOMEM; + return -ENOMEM;
+ +
+ iobase = ioremap_nocache(pdata->mem, 0x1000);
+ writeb(0xFF, iobase);
+
+ for (i = 0; i < pdata->num_leds; i++) { + for (i = 0; i < pdata->num_leds; i++) {
+ cur_led = &pdata->leds[i]; + cur_led = &pdata->leds[i];
+ led_dat = &leds_data[i]; + led_dat = &leds_data[i];
@ -91,6 +94,7 @@
+ led_dat->cdev.brightness_set = latch_led_set; + led_dat->cdev.brightness_set = latch_led_set;
+ led_dat->cdev.brightness = LED_OFF; + led_dat->cdev.brightness = LED_OFF;
+ led_dat->bit = cur_led->bit; + led_dat->bit = cur_led->bit;
+ led_dat->set_led = pdata->set_led ? pdata->set_led : latch_set_led;
+ +
+ ret = led_classdev_register(&pdev->dev, &led_dat->cdev); + ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
+ if (ret < 0) { + if (ret < 0) {
@ -98,6 +102,10 @@
+ } + }
+ } + }
+ +
+ if (!pdata->set_led) {
+ iobase = ioremap_nocache(pdata->mem, 0x1000);
+ writeb(0xFF, iobase);
+ }
+ platform_set_drvdata(pdev, leds_data); + platform_set_drvdata(pdev, leds_data);
+ +
+ return 0; + return 0;
@ -169,7 +177,7 @@
obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o
--- a/include/linux/leds.h --- a/include/linux/leds.h
+++ b/include/linux/leds.h +++ b/include/linux/leds.h
@@ -148,5 +148,18 @@ struct gpio_led_platform_data { @@ -148,5 +148,19 @@ struct gpio_led_platform_data {
unsigned long *delay_off); unsigned long *delay_off);
}; };
@ -184,6 +192,7 @@
+ int num_leds; + int num_leds;
+ u32 mem; + u32 mem;
+ struct latch_led *leds; + struct latch_led *leds;
+ void (*set_led)(u8 bit, enum led_brightness value);
+}; +};
+ +