Commit 045aaeda authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds

Pull LED update from Bryan Wu:
 "Basically we have some bug fixing and clean up and one big thing is we
  start to merge patch to add support LED Flash class"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds:
  leds: gpio: cleanup the leds-gpio driver
  led: gpio: Fix possible ZERO_SIZE_PTR pointer dereferencing error.
  led: gpio: Sort include headers alphabetically
  leds: Improve and export led_update_brightness
  leds: trigger: gpio: fix warning in gpio trigger for gpios whose accessor function may sleep
  leds: lp3944: fix sparse warning
  leds: avoid using DEVICE_ATTR macro for max_brightness attribute
  leds: make brightness type consistent across whole subsystem
  leds: Reorder include directives
parents 5b9c8972 a4c84e6a
...@@ -9,26 +9,21 @@ ...@@ -9,26 +9,21 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/module.h> #include <linux/ctype.h>
#include <linux/kernel.h> #include <linux/device.h>
#include <linux/err.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/device.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/err.h>
#include <linux/ctype.h>
#include <linux/leds.h>
#include "leds.h" #include "leds.h"
static struct class *leds_class; static struct class *leds_class;
static void led_update_brightness(struct led_classdev *led_cdev)
{
if (led_cdev->brightness_get)
led_cdev->brightness = led_cdev->brightness_get(led_cdev);
}
static ssize_t brightness_show(struct device *dev, static ssize_t brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
...@@ -59,14 +54,14 @@ static ssize_t brightness_store(struct device *dev, ...@@ -59,14 +54,14 @@ static ssize_t brightness_store(struct device *dev,
} }
static DEVICE_ATTR_RW(brightness); static DEVICE_ATTR_RW(brightness);
static ssize_t led_max_brightness_show(struct device *dev, static ssize_t max_brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct led_classdev *led_cdev = dev_get_drvdata(dev); struct led_classdev *led_cdev = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", led_cdev->max_brightness); return sprintf(buf, "%u\n", led_cdev->max_brightness);
} }
static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL); static DEVICE_ATTR_RO(max_brightness);
#ifdef CONFIG_LEDS_TRIGGERS #ifdef CONFIG_LEDS_TRIGGERS
static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store); static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);
......
...@@ -12,10 +12,11 @@ ...@@ -12,10 +12,11 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h>
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/leds.h>
#include "leds.h" #include "leds.h"
DECLARE_RWSEM(leds_list_lock); DECLARE_RWSEM(leds_list_lock);
...@@ -126,3 +127,19 @@ void led_set_brightness(struct led_classdev *led_cdev, ...@@ -126,3 +127,19 @@ void led_set_brightness(struct led_classdev *led_cdev,
__led_set_brightness(led_cdev, brightness); __led_set_brightness(led_cdev, brightness);
} }
EXPORT_SYMBOL(led_set_brightness); EXPORT_SYMBOL(led_set_brightness);
int led_update_brightness(struct led_classdev *led_cdev)
{
int ret = 0;
if (led_cdev->brightness_get) {
ret = led_cdev->brightness_get(led_cdev);
if (ret >= 0) {
led_cdev->brightness = ret;
return 0;
}
}
return ret;
}
EXPORT_SYMBOL(led_update_brightness);
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
* Free Software Foundation. * Free Software Foundation.
*/ */
#include <linux/err.h> #include <linux/err.h>
#include <linux/leds.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/leds.h>
/** /**
* gpio_led_register_device - register a gpio-led device * gpio_led_register_device - register a gpio-led device
...@@ -28,6 +28,9 @@ struct platform_device *__init gpio_led_register_device( ...@@ -28,6 +28,9 @@ struct platform_device *__init gpio_led_register_device(
struct platform_device *ret; struct platform_device *ret;
struct gpio_led_platform_data _pdata = *pdata; struct gpio_led_platform_data _pdata = *pdata;
if (!pdata->num_leds)
return ERR_PTR(-EINVAL);
_pdata.leds = kmemdup(pdata->leds, _pdata.leds = kmemdup(pdata->leds,
pdata->num_leds * sizeof(*pdata->leds), GFP_KERNEL); pdata->num_leds * sizeof(*pdata->leds), GFP_KERNEL);
if (!_pdata.leds) if (!_pdata.leds)
......
...@@ -10,17 +10,17 @@ ...@@ -10,17 +10,17 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
*/ */
#include <linux/kernel.h> #include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/kernel.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/module.h>
#include <linux/err.h>
struct gpio_led_data { struct gpio_led_data {
struct led_classdev cdev; struct led_classdev cdev;
...@@ -36,7 +36,7 @@ struct gpio_led_data { ...@@ -36,7 +36,7 @@ struct gpio_led_data {
static void gpio_led_work(struct work_struct *work) static void gpio_led_work(struct work_struct *work)
{ {
struct gpio_led_data *led_dat = struct gpio_led_data *led_dat =
container_of(work, struct gpio_led_data, work); container_of(work, struct gpio_led_data, work);
if (led_dat->blinking) { if (led_dat->blinking) {
...@@ -235,14 +235,12 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) ...@@ -235,14 +235,12 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
} }
#endif /* CONFIG_OF_GPIO */ #endif /* CONFIG_OF_GPIO */
static int gpio_led_probe(struct platform_device *pdev) static int gpio_led_probe(struct platform_device *pdev)
{ {
struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev); struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
struct gpio_leds_priv *priv; struct gpio_leds_priv *priv;
int i, ret = 0; int i, ret = 0;
if (pdata && pdata->num_leds) { if (pdata && pdata->num_leds) {
priv = devm_kzalloc(&pdev->dev, priv = devm_kzalloc(&pdev->dev,
sizeof_gpio_leds_priv(pdata->num_leds), sizeof_gpio_leds_priv(pdata->num_leds),
......
...@@ -335,7 +335,8 @@ static int lp3944_configure(struct i2c_client *client, ...@@ -335,7 +335,8 @@ static int lp3944_configure(struct i2c_client *client,
} }
/* to expose the default value to userspace */ /* to expose the default value to userspace */
led->ldev.brightness = led->status; led->ldev.brightness =
(enum led_brightness) led->status;
/* Set the default led status */ /* Set the default led status */
err = lp3944_led_set(led, led->status); err = lp3944_led_set(led, led->status);
......
...@@ -48,7 +48,7 @@ static void gpio_trig_work(struct work_struct *work) ...@@ -48,7 +48,7 @@ static void gpio_trig_work(struct work_struct *work)
if (!gpio_data->gpio) if (!gpio_data->gpio)
return; return;
tmp = gpio_get_value(gpio_data->gpio); tmp = gpio_get_value_cansleep(gpio_data->gpio);
if (gpio_data->inverted) if (gpio_data->inverted)
tmp = !tmp; tmp = !tmp;
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
#define __LINUX_LEDS_H_INCLUDED #define __LINUX_LEDS_H_INCLUDED
#include <linux/list.h> #include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/spinlock.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
...@@ -31,8 +31,8 @@ enum led_brightness { ...@@ -31,8 +31,8 @@ enum led_brightness {
struct led_classdev { struct led_classdev {
const char *name; const char *name;
int brightness; enum led_brightness brightness;
int max_brightness; enum led_brightness max_brightness;
int flags; int flags;
/* Lower 16 bits reflect status */ /* Lower 16 bits reflect status */
...@@ -140,6 +140,16 @@ extern void led_blink_set_oneshot(struct led_classdev *led_cdev, ...@@ -140,6 +140,16 @@ extern void led_blink_set_oneshot(struct led_classdev *led_cdev,
*/ */
extern void led_set_brightness(struct led_classdev *led_cdev, extern void led_set_brightness(struct led_classdev *led_cdev,
enum led_brightness brightness); enum led_brightness brightness);
/**
* led_update_brightness - update LED brightness
* @led_cdev: the LED to query
*
* Get an LED's current brightness and update led_cdev->brightness
* member with the obtained value.
*
* Returns: 0 on success or negative error value on failure
*/
extern int led_update_brightness(struct led_classdev *led_cdev);
/* /*
* LED Triggers * LED Triggers
......
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