From 9ce7fe614b1251e1eb04b714bcb07d48d664e9ca Mon Sep 17 00:00:00 2001 From: Dmitry Eremin-Solenikov 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 --- 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 -#include -#include -#include #include - -#include -#include +#include +#include +#include +#include + +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 "); MODULE_DESCRIPTION("Locomo LED driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:locomo-led"); -- 1.9.1