From 4be3b6cddde0dbf2d66493466f00a1ea930bdfaf Mon Sep 17 00:00:00 2001 From: mokopatches Date: Wed, 19 Nov 2008 17:03:18 +0000 Subject: introduce-fiq-migrate-vibrator-gta02-only.patch On GTA02 we use FIQ to manage the vibrator IO now. That is necessary because we stole timer3 from doing hw pwm for vibrator. This keeps the same UI in /sys but does "bitbang pwm" on the same vibrator GPIO From: Andy Green Signed-off-by: Andy Green --- drivers/leds/Kconfig | 1 + drivers/leds/leds-neo1973-vibrator.c | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'drivers/leds') diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 4435859beca..6dad9d030e1 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -168,6 +168,7 @@ config LEDS_DA903X config LEDS_NEO1973_VIBRATOR tristate "Vibrator Support for the FIC Neo1973 GSM phone" depends on LEDS_CLASS && MACH_NEO1973 + select S3C2440_C_FIQ help This option enables support for the vibrator on the FIC Neo1973. diff --git a/drivers/leds/leds-neo1973-vibrator.c b/drivers/leds/leds-neo1973-vibrator.c index c943a6a6988..36ed216a504 100644 --- a/drivers/leds/leds-neo1973-vibrator.c +++ b/drivers/leds/leds-neo1973-vibrator.c @@ -23,6 +23,8 @@ #include #include +#include + #define COUNTER 64 struct neo1973_vib_priv { @@ -39,6 +41,11 @@ static void neo1973_vib_vib_set(struct led_classdev *led_cdev, struct neo1973_vib_priv *vp = container_of(led_cdev, struct neo1973_vib_priv, cdev); + if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */ + fiq_ipc.vib_pwm = value; /* set it for FIQ */ + fiq_kick(); /* start up FIQs if not already going */ + return; + } /* * value == 255 -> 99% duty cycle (full power) * value == 128 -> 50% duty cycle (medium power) @@ -46,7 +53,7 @@ static void neo1973_vib_vib_set(struct led_classdev *led_cdev, */ mutex_lock(&vp->mutex); if (vp->has_pwm) - s3c2410_pwm_duty_cycle(value/4, &vp->pwm); + s3c2410_pwm_duty_cycle(value / 4, &vp->pwm); else { if (value) s3c2410_gpio_setpin(vp->gpio, 1); @@ -123,6 +130,15 @@ static int __init neo1973_vib_probe(struct platform_device *pdev) neo1973_vib_led.gpio = r->start; platform_set_drvdata(pdev, &neo1973_vib_led); + if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */ + s3c2410_gpio_setpin(neo1973_vib_led.gpio, 0); /* off */ + s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPIO_OUTPUT); + /* safe, kmalloc'd copy needed for FIQ ISR */ + fiq_ipc.vib_gpio_pin = neo1973_vib_led.gpio; + fiq_ipc.vib_pwm = 0; /* off */ + goto configured; + } + /* TOUT3 */ if (neo1973_vib_led.gpio == S3C2410_GPB3) { rc = neo1973_vib_init_hw(&neo1973_vib_led); @@ -133,7 +149,7 @@ static int __init neo1973_vib_probe(struct platform_device *pdev) s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPB3_TOUT3); neo1973_vib_led.has_pwm = 1; } - +configured: mutex_init(&neo1973_vib_led.mutex); return led_classdev_register(&pdev->dev, &neo1973_vib_led.cdev); @@ -141,6 +157,10 @@ static int __init neo1973_vib_probe(struct platform_device *pdev) static int neo1973_vib_remove(struct platform_device *pdev) { + if (machine_is_neo1973_gta02()) /* use FIQ to control GPIO */ + fiq_ipc.vib_pwm = 0; /* off */ + /* would only need kick if already off so no kick needed */ + if (neo1973_vib_led.has_pwm) s3c2410_pwm_disable(&neo1973_vib_led.pwm); -- cgit v1.2.3