From: Adam Lee Date: Sat, 8 Jun 2013 08:51:15 +0000 (+0800) Subject: thinkpad_acpi: return -NODEV while operating uninitialized LEDs X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=edf2d7780da5d96a168da7e31b36fb11620106d3;p=deliverable%2Flinux.git 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 Acked-by: Henrique de Moraes Holschuh Signed-off-by: Matthew Garrett --- 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 { struct led_classdev led_classdev; struct work_struct work; enum led_status_t new_state; - unsigned int led; + int led; }; /* brightness level capabilities */ @@ -5313,6 +5313,8 @@ static int __init led_init(struct ibm_init_struct *iibm) ARRAY_SIZE(led_useful_qtable)); for (i = 0; i < TPACPI_LED_NUMLEDS; i++) { + tpacpi_leds[i].led = -1; + if (!tpacpi_is_led_restricted(i) && test_bit(i, &useful_leds)) { rc = tpacpi_init_led(i); @@ -5370,9 +5372,13 @@ static int led_write(char *buf) return -ENODEV; while ((cmd = next_cmd(&buf))) { - if (sscanf(cmd, "%d", &led) != 1 || led < 0 || led > 15) + if (sscanf(cmd, "%d", &led) != 1) return -EINVAL; + if (led < 0 || led > (TPACPI_LED_NUMLEDS - 1) || + tpacpi_leds[led].led < 0) + return -ENODEV; + if (strstr(cmd, "off")) { s = TPACPI_LED_OFF; } else if (strstr(cmd, "on")) {