diff options
| author | Milo Kim <milo.kim@ti.com> | 2013-12-02 20:21:44 -0500 |
|---|---|---|
| committer | Bryan Wu <cooloney@gmail.com> | 2014-01-10 17:48:07 -0500 |
| commit | e70988d1aaf73221355e06125c9937bd4b27761c (patch) | |
| tree | 8ea603b96e81f39b77696e59605fc53836750d3f | |
| parent | 802eee95bde72fd0cd0f3a5b2098375a487d1eda (diff) | |
leds: lp5521/5523: Remove duplicate mutex
It can be a problem when a pattern is loaded via the firmware interface.
LP55xx common driver has already locked the mutex in 'lp55xx_firmware_loaded()'.
So it should be deleted.
On the other hand, locks are required in store_engine_load()
on updating program memory.
Reported-by: Pali Rohár <pali.rohar@gmail.com>
Reported-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Milo Kim <milo.kim@ti.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
Cc: <stable@vger.kernel.org>
| -rw-r--r-- | drivers/leds/leds-lp5521.c | 12 | ||||
| -rw-r--r-- | drivers/leds/leds-lp5523.c | 12 |
2 files changed, 8 insertions, 16 deletions
diff --git a/drivers/leds/leds-lp5521.c b/drivers/leds/leds-lp5521.c index 05188351711d..a97263e902ff 100644 --- a/drivers/leds/leds-lp5521.c +++ b/drivers/leds/leds-lp5521.c | |||
| @@ -244,18 +244,12 @@ static int lp5521_update_program_memory(struct lp55xx_chip *chip, | |||
| 244 | if (i % 2) | 244 | if (i % 2) |
| 245 | goto err; | 245 | goto err; |
| 246 | 246 | ||
| 247 | mutex_lock(&chip->lock); | ||
| 248 | |||
| 249 | for (i = 0; i < LP5521_PROGRAM_LENGTH; i++) { | 247 | for (i = 0; i < LP5521_PROGRAM_LENGTH; i++) { |
| 250 | ret = lp55xx_write(chip, addr[idx] + i, pattern[i]); | 248 | ret = lp55xx_write(chip, addr[idx] + i, pattern[i]); |
| 251 | if (ret) { | 249 | if (ret) |
| 252 | mutex_unlock(&chip->lock); | ||
| 253 | return -EINVAL; | 250 | return -EINVAL; |
| 254 | } | ||
| 255 | } | 251 | } |
| 256 | 252 | ||
| 257 | mutex_unlock(&chip->lock); | ||
| 258 | |||
| 259 | return size; | 253 | return size; |
| 260 | 254 | ||
| 261 | err: | 255 | err: |
| @@ -427,15 +421,17 @@ static ssize_t store_engine_load(struct device *dev, | |||
| 427 | { | 421 | { |
| 428 | struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); | 422 | struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); |
| 429 | struct lp55xx_chip *chip = led->chip; | 423 | struct lp55xx_chip *chip = led->chip; |
| 424 | int ret; | ||
| 430 | 425 | ||
| 431 | mutex_lock(&chip->lock); | 426 | mutex_lock(&chip->lock); |
| 432 | 427 | ||
| 433 | chip->engine_idx = nr; | 428 | chip->engine_idx = nr; |
| 434 | lp5521_load_engine(chip); | 429 | lp5521_load_engine(chip); |
| 430 | ret = lp5521_update_program_memory(chip, buf, len); | ||
| 435 | 431 | ||
| 436 | mutex_unlock(&chip->lock); | 432 | mutex_unlock(&chip->lock); |
| 437 | 433 | ||
| 438 | return lp5521_update_program_memory(chip, buf, len); | 434 | return ret; |
| 439 | } | 435 | } |
| 440 | store_load(1) | 436 | store_load(1) |
| 441 | store_load(2) | 437 | store_load(2) |
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c index 6b553d9f4266..fd9ab5f61441 100644 --- a/drivers/leds/leds-lp5523.c +++ b/drivers/leds/leds-lp5523.c | |||
| @@ -337,18 +337,12 @@ static int lp5523_update_program_memory(struct lp55xx_chip *chip, | |||
| 337 | if (i % 2) | 337 | if (i % 2) |
| 338 | goto err; | 338 | goto err; |
| 339 | 339 | ||
| 340 | mutex_lock(&chip->lock); | ||
| 341 | |||
| 342 | for (i = 0; i < LP5523_PROGRAM_LENGTH; i++) { | 340 | for (i = 0; i < LP5523_PROGRAM_LENGTH; i++) { |
| 343 | ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + i, pattern[i]); | 341 | ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + i, pattern[i]); |
| 344 | if (ret) { | 342 | if (ret) |
| 345 | mutex_unlock(&chip->lock); | ||
| 346 | return -EINVAL; | 343 | return -EINVAL; |
| 347 | } | ||
| 348 | } | 344 | } |
| 349 | 345 | ||
| 350 | mutex_unlock(&chip->lock); | ||
| 351 | |||
| 352 | return size; | 346 | return size; |
| 353 | 347 | ||
| 354 | err: | 348 | err: |
| @@ -548,15 +542,17 @@ static ssize_t store_engine_load(struct device *dev, | |||
| 548 | { | 542 | { |
| 549 | struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); | 543 | struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev)); |
| 550 | struct lp55xx_chip *chip = led->chip; | 544 | struct lp55xx_chip *chip = led->chip; |
| 545 | int ret; | ||
| 551 | 546 | ||
| 552 | mutex_lock(&chip->lock); | 547 | mutex_lock(&chip->lock); |
| 553 | 548 | ||
| 554 | chip->engine_idx = nr; | 549 | chip->engine_idx = nr; |
| 555 | lp5523_load_engine_and_select_page(chip); | 550 | lp5523_load_engine_and_select_page(chip); |
| 551 | ret = lp5523_update_program_memory(chip, buf, len); | ||
| 556 | 552 | ||
| 557 | mutex_unlock(&chip->lock); | 553 | mutex_unlock(&chip->lock); |
| 558 | 554 | ||
| 559 | return lp5523_update_program_memory(chip, buf, len); | 555 | return ret; |
| 560 | } | 556 | } |
| 561 | store_load(1) | 557 | store_load(1) |
| 562 | store_load(2) | 558 | store_load(2) |
