aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Lee <adam.lee@canonical.com>2013-06-08 04:51:15 -0400
committerMatthew Garrett <matthew.garrett@nebula.com>2013-09-05 08:51:13 -0400
commitedf2d7780da5d96a168da7e31b36fb11620106d3 (patch)
treef96a474335640bc8a71bf4d74ddbdd36bbe994cd
parentcb3e4330e697dffaf3d9cefebc9c7e7d39c89f2e (diff)
thinkpad_acpi: return -NODEV while operating uninitialized LEDs
Not all 0-15 LEDs are available for all models, sometimes it's even not safe. This patch return -NODEV while operating uninitialized LEDs. Signed-off-by: Adam Lee <adam.lee@canonical.com> Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index be67e5e28d18..359c87b3b1b2 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -369,7 +369,7 @@ struct tpacpi_led_classdev {
369 struct led_classdev led_classdev; 369 struct led_classdev led_classdev;
370 struct work_struct work; 370 struct work_struct work;
371 enum led_status_t new_state; 371 enum led_status_t new_state;
372 unsigned int led; 372 int led;
373}; 373};
374 374
375/* brightness level capabilities */ 375/* brightness level capabilities */
@@ -5313,6 +5313,8 @@ static int __init led_init(struct ibm_init_struct *iibm)
5313 ARRAY_SIZE(led_useful_qtable)); 5313 ARRAY_SIZE(led_useful_qtable));
5314 5314
5315 for (i = 0; i < TPACPI_LED_NUMLEDS; i++) { 5315 for (i = 0; i < TPACPI_LED_NUMLEDS; i++) {
5316 tpacpi_leds[i].led = -1;
5317
5316 if (!tpacpi_is_led_restricted(i) && 5318 if (!tpacpi_is_led_restricted(i) &&
5317 test_bit(i, &useful_leds)) { 5319 test_bit(i, &useful_leds)) {
5318 rc = tpacpi_init_led(i); 5320 rc = tpacpi_init_led(i);
@@ -5370,9 +5372,13 @@ static int led_write(char *buf)
5370 return -ENODEV; 5372 return -ENODEV;
5371 5373
5372 while ((cmd = next_cmd(&buf))) { 5374 while ((cmd = next_cmd(&buf))) {
5373 if (sscanf(cmd, "%d", &led) != 1 || led < 0 || led > 15) 5375 if (sscanf(cmd, "%d", &led) != 1)
5374 return -EINVAL; 5376 return -EINVAL;
5375 5377
5378 if (led < 0 || led > (TPACPI_LED_NUMLEDS - 1) ||
5379 tpacpi_leds[led].led < 0)
5380 return -ENODEV;
5381
5376 if (strstr(cmd, "off")) { 5382 if (strstr(cmd, "off")) {
5377 s = TPACPI_LED_OFF; 5383 s = TPACPI_LED_OFF;
5378 } else if (strstr(cmd, "on")) { 5384 } else if (strstr(cmd, "on")) {