diff options
author | Jacek Anaszewski <j.anaszewski@samsung.com> | 2015-11-20 10:38:50 -0500 |
---|---|---|
committer | Jacek Anaszewski <j.anaszewski@samsung.com> | 2016-01-04 03:57:38 -0500 |
commit | f5db6b8301bf11d8f5422ba8e6cff43add8bd861 (patch) | |
tree | 279e069cf77a3fed45f0f22ca47f6de1bf2afde6 | |
parent | ba1c8179c3b8e742eee65bc50bdd1396ac763e0e (diff) |
leds: powernv: Implement brightness_set_blocking op
Since brightness setting can sleep for this driver, implement
brightness_set_blocking op, instead of brightness_set.
It makes this driver compatible with LED triggers.
Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Cc: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r-- | drivers/leds/leds-powernv.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/leds/leds-powernv.c b/drivers/leds/leds-powernv.c index bc2d76e3be14..dfb8bd390125 100644 --- a/drivers/leds/leds-powernv.c +++ b/drivers/leds/leds-powernv.c | |||
@@ -77,7 +77,7 @@ static int powernv_get_led_type(const char *led_type_desc) | |||
77 | * This function is called from work queue task context when ever it gets | 77 | * This function is called from work queue task context when ever it gets |
78 | * scheduled. This function can sleep at opal_async_wait_response call. | 78 | * scheduled. This function can sleep at opal_async_wait_response call. |
79 | */ | 79 | */ |
80 | static void powernv_led_set(struct powernv_led_data *powernv_led, | 80 | static int powernv_led_set(struct powernv_led_data *powernv_led, |
81 | enum led_brightness value) | 81 | enum led_brightness value) |
82 | { | 82 | { |
83 | int rc, token; | 83 | int rc, token; |
@@ -99,7 +99,7 @@ static void powernv_led_set(struct powernv_led_data *powernv_led, | |||
99 | if (token != -ERESTARTSYS) | 99 | if (token != -ERESTARTSYS) |
100 | dev_err(dev, "%s: Couldn't get OPAL async token\n", | 100 | dev_err(dev, "%s: Couldn't get OPAL async token\n", |
101 | __func__); | 101 | __func__); |
102 | return; | 102 | return token; |
103 | } | 103 | } |
104 | 104 | ||
105 | rc = opal_leds_set_ind(token, powernv_led->loc_code, | 105 | rc = opal_leds_set_ind(token, powernv_led->loc_code, |
@@ -125,6 +125,7 @@ static void powernv_led_set(struct powernv_led_data *powernv_led, | |||
125 | 125 | ||
126 | out_token: | 126 | out_token: |
127 | opal_async_release_token(token); | 127 | opal_async_release_token(token); |
128 | return rc; | ||
128 | } | 129 | } |
129 | 130 | ||
130 | /* | 131 | /* |
@@ -173,20 +174,23 @@ static enum led_brightness powernv_led_get(struct powernv_led_data *powernv_led) | |||
173 | * LED classdev 'brightness_get' function. This schedules work | 174 | * LED classdev 'brightness_get' function. This schedules work |
174 | * to update LED state. | 175 | * to update LED state. |
175 | */ | 176 | */ |
176 | static void powernv_brightness_set(struct led_classdev *led_cdev, | 177 | static int powernv_brightness_set(struct led_classdev *led_cdev, |
177 | enum led_brightness value) | 178 | enum led_brightness value) |
178 | { | 179 | { |
179 | struct powernv_led_data *powernv_led = | 180 | struct powernv_led_data *powernv_led = |
180 | container_of(led_cdev, struct powernv_led_data, cdev); | 181 | container_of(led_cdev, struct powernv_led_data, cdev); |
181 | struct powernv_led_common *powernv_led_common = powernv_led->common; | 182 | struct powernv_led_common *powernv_led_common = powernv_led->common; |
183 | int rc; | ||
182 | 184 | ||
183 | /* Do not modify LED in unload path */ | 185 | /* Do not modify LED in unload path */ |
184 | if (powernv_led_common->led_disabled) | 186 | if (powernv_led_common->led_disabled) |
185 | return; | 187 | return 0; |
186 | 188 | ||
187 | mutex_lock(&powernv_led_common->lock); | 189 | mutex_lock(&powernv_led_common->lock); |
188 | powernv_led_set(powernv_led, value); | 190 | rc = powernv_led_set(powernv_led, value); |
189 | mutex_unlock(&powernv_led_common->lock); | 191 | mutex_unlock(&powernv_led_common->lock); |
192 | |||
193 | return rc; | ||
190 | } | 194 | } |
191 | 195 | ||
192 | /* LED classdev 'brightness_get' function */ | 196 | /* LED classdev 'brightness_get' function */ |
@@ -227,7 +231,7 @@ static int powernv_led_create(struct device *dev, | |||
227 | return -ENOMEM; | 231 | return -ENOMEM; |
228 | } | 232 | } |
229 | 233 | ||
230 | powernv_led->cdev.brightness_set = powernv_brightness_set; | 234 | powernv_led->cdev.brightness_set_blocking = powernv_brightness_set; |
231 | powernv_led->cdev.brightness_get = powernv_brightness_get; | 235 | powernv_led->cdev.brightness_get = powernv_brightness_get; |
232 | powernv_led->cdev.brightness = LED_OFF; | 236 | powernv_led->cdev.brightness = LED_OFF; |
233 | powernv_led->cdev.max_brightness = LED_FULL; | 237 | powernv_led->cdev.max_brightness = LED_FULL; |