aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacek Anaszewski <j.anaszewski@samsung.com>2015-11-20 10:38:50 -0500
committerJacek Anaszewski <j.anaszewski@samsung.com>2016-01-04 03:57:38 -0500
commitf5db6b8301bf11d8f5422ba8e6cff43add8bd861 (patch)
tree279e069cf77a3fed45f0f22ca47f6de1bf2afde6
parentba1c8179c3b8e742eee65bc50bdd1396ac763e0e (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.c16
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 */
80static void powernv_led_set(struct powernv_led_data *powernv_led, 80static 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
126out_token: 126out_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 */
176static void powernv_brightness_set(struct led_classdev *led_cdev, 177static 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;