add latch driver modifications for the mi424wr
authorImre Kaloz <kaloz@openwrt.org>
Fri, 28 Nov 2008 12:29:54 +0000 (12:29 +0000)
committerImre Kaloz <kaloz@openwrt.org>
Fri, 28 Nov 2008 12:29:54 +0000 (12:29 +0000)
SVN-Revision: 13392

target/linux/ixp4xx/patches-2.6.27/295-latch_led_driver.patch

index c1f5059ef28e5dc7292685f18639de6e208eb121..2d025337ddf5f8c2fd1471927907f8e222b79bf8 100644 (file)
@@ -15,7 +15,7 @@
        depends on LEDS_CLASS && MACH_ARMCORE
 --- /dev/null
 +++ b/drivers/leds/leds-latch.c
        depends on LEDS_CLASS && MACH_ARMCORE
 --- /dev/null
 +++ 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
 + *
 +      struct work_struct work;
 +      u8 new_level;
 +      u8 bit;
 +      struct work_struct work;
 +      u8 new_level;
 +      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,
 +      enum led_brightness value)
 +{
 +static void latch_led_set(struct led_classdev *led_cdev,
 +      enum led_brightness value)
 +{
 +
 +      spin_lock(mem_lock);
 +
 +
 +      spin_lock(mem_lock);
 +
-+      if (value == LED_OFF)
-+              mem_keep |= (0x1 << led_dat->bit);
-+      else
-+              mem_keep &= ~(0x1 << led_dat->bit);
-+
-+      writeb(mem_keep, iobase);
++      led_dat->set_led(led_dat->bit, value);
 +
 +      spin_unlock(mem_lock);
 +}
 +
 +      spin_unlock(mem_lock);
 +}
@@ -79,9 +85,6 @@
 +      if (!leds_data)
 +              return -ENOMEM;
 +
 +      if (!leds_data)
 +              return -ENOMEM;
 +
-+      iobase = ioremap_nocache(pdata->mem, 0x1000);
-+      writeb(0xFF, iobase);
-+
 +      for (i = 0; i < pdata->num_leds; i++) {
 +              cur_led = &pdata->leds[i];
 +              led_dat = &leds_data[i];
 +      for (i = 0; i < pdata->num_leds; i++) {
 +              cur_led = &pdata->leds[i];
 +              led_dat = &leds_data[i];
@@ -91,6 +94,7 @@
 +              led_dat->cdev.brightness_set = latch_led_set;
 +              led_dat->cdev.brightness = LED_OFF;
 +              led_dat->bit = cur_led->bit;
 +              led_dat->cdev.brightness_set = latch_led_set;
 +              led_dat->cdev.brightness = LED_OFF;
 +              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);
 +              if (ret < 0) {
 +
 +              ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
 +              if (ret < 0) {
 +              }
 +      }
 +
 +              }
 +      }
 +
++      if (!pdata->set_led) {
++              iobase = ioremap_nocache(pdata->mem, 0x1000);
++              writeb(0xFF, iobase);
++      }
 +      platform_set_drvdata(pdev, leds_data);
 +
 +      return 0;
 +      platform_set_drvdata(pdev, leds_data);
 +
 +      return 0;
  obj-$(CONFIG_LEDS_HP6XX)              += leds-hp6xx.o
 --- a/include/linux/leds.h
 +++ b/include/linux/leds.h
  obj-$(CONFIG_LEDS_HP6XX)              += leds-hp6xx.o
 --- a/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);
  };
  
 +      int     num_leds;
 +      u32     mem;
 +      struct latch_led *leds;
 +      int     num_leds;
 +      u32     mem;
 +      struct latch_led *leds;
++      void    (*set_led)(u8 bit, enum led_brightness value);
 +};
 +
  
 +};
 +