brcm2708: add linux 4.1 support
[openwrt.git] / target / linux / brcm2708 / patches-4.1 / 0055-Fix-LED-input-trigger-implementation-for-3.19.patch
1 From 39cf4677b7c38fac3da503b75d5cd7efc64dd19a 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/121] 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 */