Commit 97cc2657 authored by Ilya Petrov's avatar Ilya Petrov Committed by Greg Kroah-Hartman

staging: nvec: add LED support

This patch adds support for LEDs connect to a nvec. A single brightness
property is exported to sysfs. LEDs are selected via bitfields in the
brightness value. Also the blinking behavior is selected through this
method. Vendors may use different values for different HW designs.
Signed-off-by: default avatarIlya Petrov <ilya.muromec@gmail.com>
Signed-off-by: default avatarMarc Dietrich <marvin24@gmx.de>
[jak@jak-linux.org: Fixed checkpatch warnings]
Signed-off-by: default avatarJulian Andres Klode <jak@jak-linux.org>
Acked-by: default avatarMarc Dietrich <marvin24@gmx.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 6dca320c
...@@ -25,3 +25,9 @@ config NVEC_POWER ...@@ -25,3 +25,9 @@ config NVEC_POWER
help help
Say Y to enable support for battery and charger interface for Say Y to enable support for battery and charger interface for
nVidia compliant embedded controllers. nVidia compliant embedded controllers.
config NVEC_LEDS
bool "NVEC leds"
depends on MFD_NVEC && LEDS_CLASS
help
Say Y to enable yellow side leds on AC100 or other nVidia tegra nvec leds
...@@ -2,3 +2,4 @@ obj-$(CONFIG_SERIO_NVEC_PS2) += nvec_ps2.o ...@@ -2,3 +2,4 @@ obj-$(CONFIG_SERIO_NVEC_PS2) += nvec_ps2.o
obj-$(CONFIG_MFD_NVEC) += nvec.o obj-$(CONFIG_MFD_NVEC) += nvec.o
obj-$(CONFIG_NVEC_POWER) += nvec_power.o obj-$(CONFIG_NVEC_POWER) += nvec_power.o
obj-$(CONFIG_KEYBOARD_NVEC) += nvec_kbd.o obj-$(CONFIG_KEYBOARD_NVEC) += nvec_kbd.o
obj-$(CONFIG_NVEC_LEDS) += nvec_leds.o
...@@ -63,6 +63,10 @@ static struct mfd_cell nvec_devices[] = { ...@@ -63,6 +63,10 @@ static struct mfd_cell nvec_devices[] = {
.name = "nvec-power", .name = "nvec-power",
.id = 2, .id = 2,
}, },
{
.name = "nvec-leds",
.id = 1,
},
}; };
int nvec_register_notifier(struct nvec_chip *nvec, struct notifier_block *nb, int nvec_register_notifier(struct nvec_chip *nvec, struct notifier_block *nb,
......
...@@ -99,8 +99,8 @@ static int __devinit nvec_kbd_probe(struct platform_device *pdev) ...@@ -99,8 +99,8 @@ static int __devinit nvec_kbd_probe(struct platform_device *pdev)
keycodes[j++] = extcode_tab_us102[i]; keycodes[j++] = extcode_tab_us102[i];
idev = input_allocate_device(); idev = input_allocate_device();
idev->name = "Tegra nvec keyboard"; idev->name = "nvec keyboard";
idev->phys = "i2c3_slave/nvec"; idev->phys = "nvec";
idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | BIT_MASK(EV_LED); idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | BIT_MASK(EV_LED);
idev->ledbit[0] = BIT_MASK(LED_CAPSL); idev->ledbit[0] = BIT_MASK(LED_CAPSL);
idev->event = nvec_kbd_event; idev->event = nvec_kbd_event;
......
/*
* nvec_leds: LED driver for a NVIDIA compliant embedded controller
*
* Copyright (C) 2011 The AC100 Kernel Team <ac100@lists.launchpad.net>
*
* Authors: Ilya Petrov <ilya.muromec@gmail.com>
*
* 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.
*
*/
#include <linux/module.h>
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include "nvec.h"
#define to_nvec_led(led_cdev) \
container_of(led_cdev, struct nvec_led, cdev)
#define NVEC_LED_REQ {'\x0d', '\x10', '\x45', '\x10', '\x00'}
#define NVEC_LED_MAX 8
struct nvec_led {
struct led_classdev cdev;
struct nvec_chip *nvec;
};
static void nvec_led_brightness_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct nvec_led *led = to_nvec_led(led_cdev);
unsigned char buf[] = NVEC_LED_REQ;
buf[4] = value;
nvec_write_async(led->nvec, buf, sizeof(buf));
led->cdev.brightness = value;
}
static int __devinit nvec_led_probe(struct platform_device *pdev)
{
struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent);
struct nvec_led *led;
int ret = 0;
led = kzalloc(sizeof(*led), GFP_KERNEL);
if (led == NULL)
return -ENOMEM;
led->cdev.max_brightness = NVEC_LED_MAX;
led->cdev.brightness_set = nvec_led_brightness_set;
led->cdev.name = "nvec-led";
led->cdev.flags |= LED_CORE_SUSPENDRESUME;
led->nvec = nvec;
platform_set_drvdata(pdev, led);
ret = led_classdev_register(&pdev->dev, &led->cdev);
if (ret < 0)
goto err_led;
/* to expose the default value to userspace */
led->cdev.brightness = 0;
return 0;
err_led:
kfree(led);
return ret;
}
static int __devexit nvec_led_remove(struct platform_device *pdev)
{
struct nvec_led *led = platform_get_drvdata(pdev);
led_classdev_unregister(&led->cdev);
kfree(led);
return 0;
}
static struct platform_driver nvec_led_driver = {
.probe = nvec_led_probe,
.remove = __devexit_p(nvec_led_remove),
.driver = {
.name = "nvec-leds",
.owner = THIS_MODULE,
},
};
static int __init nvec_led_init(void)
{
return platform_driver_register(&nvec_led_driver);
}
module_init(nvec_led_init);
static void __exit nvec_led_exit(void)
{
platform_driver_unregister(&nvec_led_driver);
}
module_exit(nvec_led_exit);
MODULE_AUTHOR("Ilya Petrov <ilya.muromec@gmail.com>");
MODULE_DESCRIPTION("Tegra NVEC LED driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:nvec-leds");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment