mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 20:01:55 +00:00
ec976d6eb0
Move all the gpio functions out of <mach/hardware.h> as this file is for defining the generic IO base addresses for the kernel IO calls. Make a new header <mach/gpio-fns.h> to take this and include it via the chain from <linux/gpio.h> which is what most of these files should be using (and will be changed as soon as possible). Note, this does make minor changes to some drivers but should not mess up any pending merges. CC: Richard Purdie <rpurdie@rpsys.net> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> CC: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
171 lines
3.7 KiB
C
171 lines
3.7 KiB
C
/*
|
|
* drivers/leds/leds-h1940.c
|
|
* Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive for
|
|
* more details.
|
|
*
|
|
* H1940 leds driver
|
|
*
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/string.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/leds.h>
|
|
#include <linux/gpio.h>
|
|
|
|
#include <mach/regs-gpio.h>
|
|
#include <mach/hardware.h>
|
|
#include <mach/h1940-latch.h>
|
|
|
|
/*
|
|
* Green led.
|
|
*/
|
|
static void h1940_greenled_set(struct led_classdev *led_dev,
|
|
enum led_brightness value)
|
|
{
|
|
switch (value) {
|
|
case LED_HALF:
|
|
h1940_latch_control(0, H1940_LATCH_LED_FLASH);
|
|
s3c2410_gpio_setpin(S3C2410_GPA7, 1);
|
|
break;
|
|
case LED_FULL:
|
|
h1940_latch_control(0, H1940_LATCH_LED_GREEN);
|
|
s3c2410_gpio_setpin(S3C2410_GPA7, 1);
|
|
break;
|
|
default:
|
|
case LED_OFF:
|
|
h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
|
|
h1940_latch_control(H1940_LATCH_LED_GREEN, 0);
|
|
s3c2410_gpio_setpin(S3C2410_GPA7, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static struct led_classdev h1940_greenled = {
|
|
.name = "h1940:green",
|
|
.brightness_set = h1940_greenled_set,
|
|
.default_trigger = "h1940-charger",
|
|
};
|
|
|
|
/*
|
|
* Red led.
|
|
*/
|
|
static void h1940_redled_set(struct led_classdev *led_dev,
|
|
enum led_brightness value)
|
|
{
|
|
switch (value) {
|
|
case LED_HALF:
|
|
h1940_latch_control(0, H1940_LATCH_LED_FLASH);
|
|
s3c2410_gpio_setpin(S3C2410_GPA1, 1);
|
|
break;
|
|
case LED_FULL:
|
|
h1940_latch_control(0, H1940_LATCH_LED_RED);
|
|
s3c2410_gpio_setpin(S3C2410_GPA1, 1);
|
|
break;
|
|
default:
|
|
case LED_OFF:
|
|
h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
|
|
h1940_latch_control(H1940_LATCH_LED_RED, 0);
|
|
s3c2410_gpio_setpin(S3C2410_GPA1, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static struct led_classdev h1940_redled = {
|
|
.name = "h1940:red",
|
|
.brightness_set = h1940_redled_set,
|
|
.default_trigger = "h1940-charger",
|
|
};
|
|
|
|
/*
|
|
* Blue led.
|
|
* (it can only be blue flashing led)
|
|
*/
|
|
static void h1940_blueled_set(struct led_classdev *led_dev,
|
|
enum led_brightness value)
|
|
{
|
|
if (value) {
|
|
/* flashing Blue */
|
|
h1940_latch_control(0, H1940_LATCH_LED_FLASH);
|
|
s3c2410_gpio_setpin(S3C2410_GPA3, 1);
|
|
} else {
|
|
h1940_latch_control(H1940_LATCH_LED_FLASH, 0);
|
|
s3c2410_gpio_setpin(S3C2410_GPA3, 0);
|
|
}
|
|
|
|
}
|
|
|
|
static struct led_classdev h1940_blueled = {
|
|
.name = "h1940:blue",
|
|
.brightness_set = h1940_blueled_set,
|
|
.default_trigger = "h1940-bluetooth",
|
|
};
|
|
|
|
static int __devinit h1940leds_probe(struct platform_device *pdev)
|
|
{
|
|
int ret;
|
|
|
|
ret = led_classdev_register(&pdev->dev, &h1940_greenled);
|
|
if (ret)
|
|
goto err_green;
|
|
|
|
ret = led_classdev_register(&pdev->dev, &h1940_redled);
|
|
if (ret)
|
|
goto err_red;
|
|
|
|
ret = led_classdev_register(&pdev->dev, &h1940_blueled);
|
|
if (ret)
|
|
goto err_blue;
|
|
|
|
return 0;
|
|
|
|
err_blue:
|
|
led_classdev_unregister(&h1940_redled);
|
|
err_red:
|
|
led_classdev_unregister(&h1940_greenled);
|
|
err_green:
|
|
return ret;
|
|
}
|
|
|
|
static int h1940leds_remove(struct platform_device *pdev)
|
|
{
|
|
led_classdev_unregister(&h1940_greenled);
|
|
led_classdev_unregister(&h1940_redled);
|
|
led_classdev_unregister(&h1940_blueled);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static struct platform_driver h1940leds_driver = {
|
|
.driver = {
|
|
.name = "h1940-leds",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
.probe = h1940leds_probe,
|
|
.remove = h1940leds_remove,
|
|
};
|
|
|
|
|
|
static int __init h1940leds_init(void)
|
|
{
|
|
return platform_driver_register(&h1940leds_driver);
|
|
}
|
|
|
|
static void __exit h1940leds_exit(void)
|
|
{
|
|
platform_driver_unregister(&h1940leds_driver);
|
|
}
|
|
|
|
module_init(h1940leds_init);
|
|
module_exit(h1940leds_exit);
|
|
|
|
MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
|
|
MODULE_DESCRIPTION("LED driver for the iPAQ H1940");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS("platform:h1940-leds");
|