Skip to content

Commit e1b08c6

Browse files
jwrdegoedelag-linaro
authored andcommitted
leds: rgb: leds-ktd202x: Initialize mutex earlier
The mutex must be initialized before the LED class device is registered otherwise there is a race where it may get used before it is initialized: DEBUG_LOCKS_WARN_ON(lock->magic != lock) WARNING: CPU: 2 PID: 2045 at kernel/locking/mutex.c:587 __mutex_lock ... RIP: 0010:__mutex_lock+0x7db/0xc10 ... set_brightness_delayed_set_brightness.part.0+0x17/0x60 set_brightness_delayed+0xf1/0x100 process_one_work+0x222/0x5a0 Move the mutex_init() call earlier to avoid this race condition and switch to devm_mutex_init() to avoid the need to add error-exit cleanup to probe() if probe() fails later on. Signed-off-by: Hans de Goede <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent 75bd07a commit e1b08c6

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/leds/rgb/leds-ktd202x.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,10 @@ static int ktd202x_probe(struct i2c_client *client)
556556
return ret;
557557
}
558558

559+
ret = devm_mutex_init(dev, &chip->mutex);
560+
if (ret)
561+
return ret;
562+
559563
chip->num_leds = (unsigned long)i2c_get_match_data(client);
560564

561565
chip->regulators[0].supply = "vin";
@@ -584,8 +588,6 @@ static int ktd202x_probe(struct i2c_client *client)
584588
return ret;
585589
}
586590

587-
mutex_init(&chip->mutex);
588-
589591
return 0;
590592
}
591593

@@ -594,8 +596,6 @@ static void ktd202x_remove(struct i2c_client *client)
594596
struct ktd202x *chip = i2c_get_clientdata(client);
595597

596598
ktd202x_chip_disable(chip);
597-
598-
mutex_destroy(&chip->mutex);
599599
}
600600

601601
static void ktd202x_shutdown(struct i2c_client *client)

0 commit comments

Comments
 (0)