diff options
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.24/1039-gta02-leds.patch.patch')
-rw-r--r-- | target/linux/s3c24xx/patches-2.6.24/1039-gta02-leds.patch.patch | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.24/1039-gta02-leds.patch.patch b/target/linux/s3c24xx/patches-2.6.24/1039-gta02-leds.patch.patch new file mode 100644 index 0000000000..5e5ad45c21 --- /dev/null +++ b/target/linux/s3c24xx/patches-2.6.24/1039-gta02-leds.patch.patch @@ -0,0 +1,276 @@ +From b265be540c1169a5d6c32c5b09bb3f7b72a96a9d Mon Sep 17 00:00:00 2001 +From: mokopatches <mokopatches@openmoko.org> +Date: Fri, 4 Apr 2008 11:35:53 +0100 +Subject: [PATCH] gta02-leds.patch + +--- + drivers/leds/Kconfig | 6 + + drivers/leds/Makefile | 1 + + drivers/leds/leds-neo1973-gta02.c | 226 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 233 insertions(+), 0 deletions(-) + create mode 100644 drivers/leds/leds-neo1973-gta02.c + +diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig +index 4579a88..2f95707 100644 +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -120,6 +120,12 @@ config LEDS_NEO1973_VIBRATOR + help + This option enables support for the vibrator on the FIC Neo1973. + ++config LEDS_NEO1973_GTA02 ++ tristate "LED Support for the FIC Neo1973 (GTA02)" ++ depends on LEDS_CLASS && MACH_NEO1973_GTA02 ++ help ++ This option enables support for the LEDs on the FIC Neo1973. ++ + comment "LED Triggers" + + config LEDS_TRIGGERS +diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile +index f64332d..c4ff826 100644 +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -20,6 +20,7 @@ obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o + obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o + obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o + obj-$(CONFIG_LEDS_NEO1973_VIBRATOR) += leds-neo1973-vibrator.o ++obj-$(CONFIG_LEDS_NEO1973_GTA02) += leds-neo1973-gta02.o + + # LED Triggers + obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o +diff --git a/drivers/leds/leds-neo1973-gta02.c b/drivers/leds/leds-neo1973-gta02.c +new file mode 100644 +index 0000000..bf1d540 +--- /dev/null ++++ b/drivers/leds/leds-neo1973-gta02.c +@@ -0,0 +1,226 @@ ++/* ++ * LED driver for the FIC Neo1973 GTA02 GSM phone ++ * ++ * (C) 2006-2007 by OpenMoko, Inc. ++ * Author: Harald Welte <laforge@openmoko.org> ++ * All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/leds.h> ++#include <asm/hardware.h> ++#include <asm/mach-types.h> ++#include <asm/arch/pwm.h> ++#include <asm/arch/gta02.h> ++#include <asm/plat-s3c/regs-timer.h> ++ ++#define MAX_LEDS 3 ++#define COUNTER 256 ++ ++struct gta02_led_priv ++{ ++ struct mutex mutex; ++ struct led_classdev cdev; ++ struct s3c2410_pwm pwm; ++ unsigned int gpio; ++ unsigned int has_pwm; ++}; ++ ++struct gta02_led_bundle ++{ ++ int num_leds; ++ struct gta02_led_priv led[MAX_LEDS]; ++}; ++ ++static inline struct gta02_led_priv *to_priv(struct led_classdev *led_cdev) ++{ ++ return container_of(led_cdev, struct gta02_led_priv, cdev); ++} ++ ++static inline struct gta02_led_bundle *to_bundle(struct led_classdev *led_cdev) ++{ ++ return dev_get_drvdata(led_cdev->dev); ++} ++ ++static void gta02led_set(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ struct gta02_led_priv *lp = to_priv(led_cdev); ++ ++ /* ++ * value == 255 -> 99% duty cycle (full power) ++ * value == 128 -> 50% duty cycle (medium power) ++ * value == 0 -> 0% duty cycle (zero power) ++ */ ++ mutex_lock(&lp->mutex); ++ if (lp->has_pwm) { ++ s3c2410_pwm_duty_cycle(value, &lp->pwm); ++ } else { ++ if (value) ++ s3c2410_gpio_setpin(lp->gpio, 1); ++ else ++ s3c2410_gpio_setpin(lp->gpio, 0); ++ } ++ mutex_unlock(&lp->mutex); ++} ++ ++#ifdef CONFIG_PM ++static int gta02led_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev); ++ int i; ++ ++ for (i = 0; i < bundle->num_leds; i++) ++ led_classdev_suspend(&bundle->led[i].cdev); ++ ++ return 0; ++} ++ ++static int gta02led_resume(struct platform_device *pdev) ++{ ++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev); ++ int i; ++ ++ for (i = 0; i < bundle->num_leds; i++) ++ led_classdev_resume(&bundle->led[i].cdev); ++ ++ return 0; ++} ++#endif ++ ++static int __init gta02led_probe(struct platform_device *pdev) ++{ ++ int i, rc; ++ struct gta02_led_bundle *bundle; ++ ++ if (!machine_is_neo1973_gta02()) ++ return -EIO; ++ ++ bundle = kzalloc(sizeof(struct gta02_led_bundle), GFP_KERNEL); ++ if (!bundle) ++ return -ENOMEM; ++ platform_set_drvdata(pdev, bundle); ++ ++ for (i = 0; i < pdev->num_resources; i++) { ++ struct gta02_led_priv *lp; ++ struct resource *r; ++ ++ if (i >= MAX_LEDS) ++ break; ++ ++ r = platform_get_resource(pdev, 0, i); ++ if (!r || !r->start || !r->name) ++ continue; ++ ++ lp = &bundle->led[i]; ++ ++ lp->gpio = r->start; ++ lp->cdev.name = r->name; ++ lp->cdev.brightness_set = gta02led_set; ++ ++ switch (lp->gpio) { ++ case S3C2410_GPB0: ++ lp->has_pwm = 1; ++ lp->pwm.timerid = PWM0; ++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB0_TOUT0); ++ break; ++ case S3C2410_GPB1: ++ lp->has_pwm = 1; ++ lp->pwm.timerid = PWM1; ++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB1_TOUT1); ++ break; ++ case S3C2410_GPB2: ++ lp->has_pwm = 1; ++ lp->pwm.timerid = PWM2; ++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB2_TOUT2); ++ break; ++ case S3C2410_GPB3: ++ lp->has_pwm = 1; ++ lp->pwm.timerid = PWM3; ++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB3_TOUT3); ++ break; ++ default: ++ break; ++ } ++ ++ lp->pwm.prescaler = 0; ++ lp->pwm.divider = S3C2410_TCFG1_MUX3_DIV8; ++ lp->pwm.counter = COUNTER; ++ lp->pwm.comparer = COUNTER; ++ s3c2410_pwm_enable(&lp->pwm); ++ s3c2410_pwm_start(&lp->pwm); ++ ++ switch (lp->gpio) { ++ case S3C2410_GPB0: ++ case S3C2410_GPB1: ++ case S3C2410_GPB2: ++ lp->has_pwm = 0; ++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPIO_OUTPUT); ++ s3c2410_gpio_setpin(lp->gpio, 0); ++ break; ++ default: ++ break; ++ } ++ ++ mutex_init(&lp->mutex); ++ rc = led_classdev_register(&pdev->dev, &lp->cdev); ++ } ++ ++ return 0; ++} ++ ++static int gta02led_remove(struct platform_device *pdev) ++{ ++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev); ++ int i; ++ ++ for (i = 0; i < bundle->num_leds; i++) { ++ struct gta02_led_priv *lp = &bundle->led[i]; ++ if (lp->has_pwm) ++ s3c2410_pwm_disable(&lp->pwm); ++ ++ led_classdev_unregister(&lp->cdev); ++ mutex_destroy(&lp->mutex); ++ } ++ ++ platform_set_drvdata(pdev, NULL); ++ kfree(bundle); ++ ++ return 0; ++} ++ ++static struct platform_driver gta02led_driver = { ++ .probe = gta02led_probe, ++ .remove = gta02led_remove, ++#ifdef CONFIG_PM ++ .suspend = gta02led_suspend, ++ .resume = gta02led_resume, ++#endif ++ .driver = { ++ .name = "gta02-led", ++ }, ++}; ++ ++static int __init gta02led_init(void) ++{ ++ return platform_driver_register(>a02led_driver); ++} ++ ++static void __exit gta02led_exit(void) ++{ ++ platform_driver_unregister(>a02led_driver); ++} ++ ++module_init(gta02led_init); ++module_exit(gta02led_exit); ++ ++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>"); ++MODULE_DESCRIPTION("FIC Neo1973 GTA02 LED driver"); ++MODULE_LICENSE("GPL"); +-- +1.5.6.5 + |