diff options
Diffstat (limited to 'recipes-kernel/linux/linux-handheld-4.4/locomo/0002-leds-port-locomo-leds-driver-to-new-locomo-core.patch')
-rw-r--r-- | recipes-kernel/linux/linux-handheld-4.4/locomo/0002-leds-port-locomo-leds-driver-to-new-locomo-core.patch | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-handheld-4.4/locomo/0002-leds-port-locomo-leds-driver-to-new-locomo-core.patch b/recipes-kernel/linux/linux-handheld-4.4/locomo/0002-leds-port-locomo-leds-driver-to-new-locomo-core.patch new file mode 100644 index 0000000..b69b0d2 --- /dev/null +++ b/recipes-kernel/linux/linux-handheld-4.4/locomo/0002-leds-port-locomo-leds-driver-to-new-locomo-core.patch @@ -0,0 +1,173 @@ +From 85364621aaf2713d719f336de7c46a697b3118e2 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 02/44] 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> +Acked-by: Jacek Anaszewski <j.anaszewski@samsung.com> +--- + drivers/leds/Kconfig | 2 +- + drivers/leds/leds-locomo.c | 106 +++++++++++++++++++++++++-------------------- + 2 files changed, 61 insertions(+), 47 deletions(-) + +diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig +index b1ab8bd..9c1c219 100644 +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -102,7 +102,7 @@ config LEDS_LM3642 + config LEDS_LOCOMO + tristate "LED Support for Locomo device" + depends on LEDS_CLASS +- depends on SHARP_LOCOMO ++ depends on MFD_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 24c4b53..a4286e9 100644 +--- a/drivers/leds/leds-locomo.c ++++ b/drivers/leds/leds-locomo.c +@@ -9,78 +9,92 @@ + */ + + #include <linux/kernel.h> +-#include <linux/init.h> +-#include <linux/module.h> +-#include <linux/device.h> + #include <linux/leds.h> ++#include <linux/mfd/locomo.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/regmap.h> + +-#include <mach/hardware.h> +-#include <asm/hardware/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; ++ struct locomo_led *led = container_of(led_cdev, struct locomo_led, led); + +- 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); ++ 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 device *dev, ++ struct locomo_led *led, ++ 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 devm_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; ++ ret = locomo_led_register( ++ &pdev->dev, ++ leds, ++ "locomo:amber:charge", ++ "main-battery-charging", ++ regmap, ++ LOCOMO_LPT0); ++ if (ret < 0) ++ return ret; + +- ret = devm_led_classdev_register(&ldev->dev, &locomo_led0); ++ ret = locomo_led_register( ++ &pdev->dev, ++ leds + 1, ++ "locomo:green:mail", ++ "mmc0", ++ regmap, ++ LOCOMO_LPT1); + if (ret < 0) + return ret; + +- return devm_led_classdev_register(&ldev->dev, &locomo_led1); ++ 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, + }; + +-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 + |