brcm2708: update 4.1 patches
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-4.1 / 0055-Fix-LED-input-trigger-implementation-for-3.19.patch
1 From d34fbe19c2d2c7bb36c2f6432529f8404144a135 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Thu, 12 Feb 2015 11:17:53 +0000
4 Subject: [PATCH 055/148] Fix LED "input" trigger implementation for 3.19
5
6 ---
7 drivers/leds/leds-gpio.c | 10 +++++++++-
8 drivers/leds/trigger/ledtrig-input.c | 19 ++++---------------
9 include/linux/leds.h | 3 +++
10 3 files changed, 16 insertions(+), 16 deletions(-)
11
12 --- a/drivers/leds/leds-gpio.c
13 +++ b/drivers/leds/leds-gpio.c
14 @@ -41,6 +41,13 @@ static void gpio_led_work(struct work_st
15 led_dat->platform_gpio_blink_set(led_dat->gpiod,
16 led_dat->new_level, NULL, NULL);
17 led_dat->blinking = 0;
18 + } else if (led_dat->cdev.flags & SET_GPIO_INPUT) {
19 + gpiod_direction_input(led_dat->gpiod);
20 + led_dat->cdev.flags &= ~SET_GPIO_INPUT;
21 + }
22 + else if (led_dat->cdev.flags & SET_GPIO_OUTPUT) {
23 + gpiod_direction_output(led_dat->gpiod, led_dat->new_level);
24 + led_dat->cdev.flags &= ~SET_GPIO_OUTPUT;
25 } else
26 gpiod_set_value_cansleep(led_dat->gpiod, led_dat->new_level);
27 }
28 @@ -61,7 +68,8 @@ static void gpio_led_set(struct led_clas
29 * seem to have a reliable way to know if we're already in one; so
30 * let's just assume the worst.
31 */
32 - if (led_dat->can_sleep) {
33 + if (led_dat->can_sleep ||
34 + (led_dat->cdev.flags & (SET_GPIO_INPUT | SET_GPIO_OUTPUT) )) {
35 led_dat->new_level = level;
36 schedule_work(&led_dat->work);
37 } else {
38 --- a/drivers/leds/trigger/ledtrig-input.c
39 +++ b/drivers/leds/trigger/ledtrig-input.c
40 @@ -18,27 +18,16 @@
41 #include <linux/gpio.h>
42 #include "../leds.h"
43
44 -/* This is a hack to get at the private 'gpio' member */
45 -
46 -struct gpio_led_data {
47 - struct led_classdev cdev;
48 - unsigned gpio;
49 -};
50 -
51 static void input_trig_activate(struct led_classdev *led_cdev)
52 {
53 - struct gpio_led_data *led_dat =
54 - container_of(led_cdev, struct gpio_led_data, cdev);
55 - if (gpio_is_valid(led_dat->gpio))
56 - gpio_direction_input(led_dat->gpio);
57 + led_cdev->flags |= SET_GPIO_INPUT;
58 + led_set_brightness_async(led_cdev, 0);
59 }
60
61 static void input_trig_deactivate(struct led_classdev *led_cdev)
62 {
63 - struct gpio_led_data *led_dat =
64 - container_of(led_cdev, struct gpio_led_data, cdev);
65 - if (gpio_is_valid(led_dat->gpio))
66 - gpio_direction_output(led_dat->gpio, 0);
67 + led_cdev->flags |= SET_GPIO_OUTPUT;
68 + led_set_brightness_async(led_cdev, 0);
69 }
70
71 static struct led_trigger input_led_trigger = {
72 --- a/include/linux/leds.h
73 +++ b/include/linux/leds.h
74 @@ -47,6 +47,9 @@ struct led_classdev {
75 #define SET_BRIGHTNESS_ASYNC (1 << 21)
76 #define SET_BRIGHTNESS_SYNC (1 << 22)
77 #define LED_DEV_CAP_FLASH (1 << 23)
78 + /* Additions for Raspberry Pi PWR LED */
79 +#define SET_GPIO_INPUT (1 << 30)
80 +#define SET_GPIO_OUTPUT (1 << 31)
81
82 /* Set LED brightness level */
83 /* Must not sleep, use a workqueue if needed */