aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch')
-rw-r--r--recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch187
1 files changed, 187 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch b/recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch
new file mode 100644
index 0000000..127129c
--- /dev/null
+++ b/recipes-kernel/linux/linux-handheld-4.0/locomo/0003-leds-port-locomo-leds-driver-to-new-locomo-core.patch
@@ -0,0 +1,187 @@
+From 9ce7fe614b1251e1eb04b714bcb07d48d664e9ca Mon Sep 17 00:00:00 2001
+From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+Date: Mon, 11 Nov 2013 03:04:12 +0400
+Subject: [PATCH 03/20] leds: port locomo leds driver to new locomo core
+
+Adapt locomo leds driver to new locomo core setup.
+
+Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+---
+ drivers/leds/Kconfig | 1 -
+ drivers/leds/leds-locomo.c | 116 +++++++++++++++++++++++++--------------------
+ 2 files changed, 65 insertions(+), 52 deletions(-)
+
+diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
+index 25b320d..aec42ae 100644
+--- a/drivers/leds/Kconfig
++++ b/drivers/leds/Kconfig
+@@ -79,7 +79,6 @@ config LEDS_LM3642
+ config LEDS_LOCOMO
+ tristate "LED Support for Locomo device"
+ depends on LEDS_CLASS
+- depends on SHARP_LOCOMO
+ help
+ This option enables support for the LEDs on Sharp Locomo.
+ Zaurus models SL-5500 and SL-5600.
+diff --git a/drivers/leds/leds-locomo.c b/drivers/leds/leds-locomo.c
+index 80ba048..cecc585 100644
+--- a/drivers/leds/leds-locomo.c
++++ b/drivers/leds/leds-locomo.c
+@@ -9,89 +9,103 @@
+ */
+
+ #include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/device.h>
+ #include <linux/leds.h>
+-
+-#include <mach/hardware.h>
+-#include <asm/hardware/locomo.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/regmap.h>
++#include <linux/mfd/locomo.h>
++
++struct locomo_led {
++ struct led_classdev led;
++ struct regmap *regmap;
++ unsigned int reg;
++};
+
+ static void locomoled_brightness_set(struct led_classdev *led_cdev,
+- enum led_brightness value, int offset)
++ enum led_brightness value)
+ {
+- struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent);
+- unsigned long flags;
+-
+- local_irq_save(flags);
+- if (value)
+- locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset);
+- else
+- locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset);
+- local_irq_restore(flags);
++ struct locomo_led *led = container_of(led_cdev, struct locomo_led, led);
++
++ regmap_write(led->regmap, led->reg,
++ value ? LOCOMO_LPT_TOFH : LOCOMO_LPT_TOFL);
+ }
+
+-static void locomoled_brightness_set0(struct led_classdev *led_cdev,
+- enum led_brightness value)
++static int locomo_led_register(
++ struct locomo_led *led,
++ struct device *dev,
++ const char *name,
++ const char *trigger,
++ struct regmap *regmap,
++ unsigned int reg)
+ {
+- locomoled_brightness_set(led_cdev, value, LOCOMO_LPT0);
++ led->led.name = name;
++ led->led.flags = LED_CORE_SUSPENDRESUME;
++ led->led.default_trigger = trigger;
++ led->led.brightness_set = locomoled_brightness_set;
++ led->regmap = regmap;
++ led->reg = reg;
++
++ return led_classdev_register(dev, &led->led);
+ }
+
+-static void locomoled_brightness_set1(struct led_classdev *led_cdev,
+- enum led_brightness value)
++static int locomoled_probe(struct platform_device *pdev)
+ {
+- locomoled_brightness_set(led_cdev, value, LOCOMO_LPT1);
+-}
++ int ret;
++ struct locomo_led *leds;
++ struct regmap *regmap;
+
+-static struct led_classdev locomo_led0 = {
+- .name = "locomo:amber:charge",
+- .default_trigger = "main-battery-charging",
+- .brightness_set = locomoled_brightness_set0,
+-};
++ leds = devm_kzalloc(&pdev->dev, 2 * sizeof(*leds), GFP_KERNEL);
++ if (!leds)
++ return -ENOMEM;
+
+-static struct led_classdev locomo_led1 = {
+- .name = "locomo:green:mail",
+- .default_trigger = "nand-disk",
+- .brightness_set = locomoled_brightness_set1,
+-};
++ regmap = dev_get_regmap(pdev->dev.parent, NULL);
++ if (!regmap)
++ return -ENODEV;
+
+-static int locomoled_probe(struct locomo_dev *ldev)
+-{
+- int ret;
++ platform_set_drvdata(pdev, leds);
+
+- ret = led_classdev_register(&ldev->dev, &locomo_led0);
++ ret = locomo_led_register(leds,
++ &pdev->dev,
++ "locomo:amber:charge",
++ "main-battery-charging",
++ regmap,
++ LOCOMO_LPT0);
+ if (ret < 0)
+ return ret;
+
+- ret = led_classdev_register(&ldev->dev, &locomo_led1);
++ ret = locomo_led_register(leds + 1,
++ &pdev->dev,
++ "locomo:green:mail",
++ "mmc0",
++ regmap,
++ LOCOMO_LPT1);
+ if (ret < 0)
+- led_classdev_unregister(&locomo_led0);
++ led_classdev_unregister(&leds[0].led);
+
+ return ret;
+ }
+
+-static int locomoled_remove(struct locomo_dev *dev)
++static int locomoled_remove(struct platform_device *pdev)
+ {
+- led_classdev_unregister(&locomo_led0);
+- led_classdev_unregister(&locomo_led1);
++ struct locomo_led *leds = platform_get_drvdata(pdev);
++
++ led_classdev_unregister(&leds[0].led);
++ led_classdev_unregister(&leds[1].led);
++
+ return 0;
+ }
+
+-static struct locomo_driver locomoled_driver = {
+- .drv = {
+- .name = "locomoled"
++static struct platform_driver locomoled_driver = {
++ .driver = {
++ .name = "locomo-led"
+ },
+- .devid = LOCOMO_DEVID_LED,
+ .probe = locomoled_probe,
+ .remove = locomoled_remove,
+ };
+
+-static int __init locomoled_init(void)
+-{
+- return locomo_driver_register(&locomoled_driver);
+-}
+-module_init(locomoled_init);
++module_platform_driver(locomoled_driver);
+
+ MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>");
+ MODULE_DESCRIPTION("Locomo LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:locomo-led");
+--
+1.9.1
+