diff options
Diffstat (limited to 'drivers/leds/leds-gpio.c')
-rw-r--r-- | drivers/leds/leds-gpio.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index edd370dbb22f..ba4698c32bb0 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c | |||
@@ -28,7 +28,7 @@ struct gpio_led_data { | |||
28 | u8 new_level; | 28 | u8 new_level; |
29 | u8 can_sleep; | 29 | u8 can_sleep; |
30 | u8 blinking; | 30 | u8 blinking; |
31 | int (*platform_gpio_blink_set)(unsigned gpio, int state, | 31 | int (*platform_gpio_blink_set)(struct gpio_desc *desc, int state, |
32 | unsigned long *delay_on, unsigned long *delay_off); | 32 | unsigned long *delay_on, unsigned long *delay_off); |
33 | }; | 33 | }; |
34 | 34 | ||
@@ -38,13 +38,8 @@ static void gpio_led_work(struct work_struct *work) | |||
38 | container_of(work, struct gpio_led_data, work); | 38 | container_of(work, struct gpio_led_data, work); |
39 | 39 | ||
40 | if (led_dat->blinking) { | 40 | if (led_dat->blinking) { |
41 | int gpio = desc_to_gpio(led_dat->gpiod); | 41 | led_dat->platform_gpio_blink_set(led_dat->gpiod, |
42 | int level = led_dat->new_level; | 42 | led_dat->new_level, NULL, NULL); |
43 | |||
44 | if (gpiod_is_active_low(led_dat->gpiod)) | ||
45 | level = !level; | ||
46 | |||
47 | led_dat->platform_gpio_blink_set(gpio, level, NULL, NULL); | ||
48 | led_dat->blinking = 0; | 43 | led_dat->blinking = 0; |
49 | } else | 44 | } else |
50 | gpiod_set_value_cansleep(led_dat->gpiod, led_dat->new_level); | 45 | gpiod_set_value_cansleep(led_dat->gpiod, led_dat->new_level); |
@@ -71,13 +66,8 @@ static void gpio_led_set(struct led_classdev *led_cdev, | |||
71 | schedule_work(&led_dat->work); | 66 | schedule_work(&led_dat->work); |
72 | } else { | 67 | } else { |
73 | if (led_dat->blinking) { | 68 | if (led_dat->blinking) { |
74 | int gpio = desc_to_gpio(led_dat->gpiod); | 69 | led_dat->platform_gpio_blink_set(led_dat->gpiod, level, |
75 | 70 | NULL, NULL); | |
76 | if (gpiod_is_active_low(led_dat->gpiod)) | ||
77 | level = !level; | ||
78 | |||
79 | led_dat->platform_gpio_blink_set(gpio, level, NULL, | ||
80 | NULL); | ||
81 | led_dat->blinking = 0; | 71 | led_dat->blinking = 0; |
82 | } else | 72 | } else |
83 | gpiod_set_value(led_dat->gpiod, level); | 73 | gpiod_set_value(led_dat->gpiod, level); |
@@ -89,20 +79,25 @@ static int gpio_blink_set(struct led_classdev *led_cdev, | |||
89 | { | 79 | { |
90 | struct gpio_led_data *led_dat = | 80 | struct gpio_led_data *led_dat = |
91 | container_of(led_cdev, struct gpio_led_data, cdev); | 81 | container_of(led_cdev, struct gpio_led_data, cdev); |
92 | int gpio = desc_to_gpio(led_dat->gpiod); | ||
93 | 82 | ||
94 | led_dat->blinking = 1; | 83 | led_dat->blinking = 1; |
95 | return led_dat->platform_gpio_blink_set(gpio, GPIO_LED_BLINK, | 84 | return led_dat->platform_gpio_blink_set(led_dat->gpiod, GPIO_LED_BLINK, |
96 | delay_on, delay_off); | 85 | delay_on, delay_off); |
97 | } | 86 | } |
98 | 87 | ||
99 | static int create_gpio_led(const struct gpio_led *template, | 88 | static int create_gpio_led(const struct gpio_led *template, |
100 | struct gpio_led_data *led_dat, struct device *parent, | 89 | struct gpio_led_data *led_dat, struct device *parent, |
101 | int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) | 90 | int (*blink_set)(struct gpio_desc *, int, unsigned long *, |
91 | unsigned long *)) | ||
102 | { | 92 | { |
103 | int ret, state; | 93 | int ret, state; |
104 | 94 | ||
105 | if (!template->gpiod) { | 95 | if (!template->gpiod) { |
96 | /* | ||
97 | * This is the legacy code path for platform code that | ||
98 | * still uses GPIO numbers. Ultimately we would like to get | ||
99 | * rid of this block completely. | ||
100 | */ | ||
106 | unsigned long flags = 0; | 101 | unsigned long flags = 0; |
107 | 102 | ||
108 | /* skip leds that aren't available */ | 103 | /* skip leds that aren't available */ |