Commit 38831eaf authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Hans de Goede

platform/x86: thinkpad_acpi: use lockdep annotations

Instead of relying on free-form comments to document locking
requirements use well-known lockdep annotations.
These can also be validated at runtime make sure the invariants are not
violated.
Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
Link: https://lore.kernel.org/r/20230704-thinkpad_acpi-lockdep-v1-2-60129548a738@weissschuh.netReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent ce55dbe5
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/lockdep.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/nvram.h> #include <linux/nvram.h>
...@@ -2071,11 +2072,11 @@ static int hotkey_get_tablet_mode(int *status) ...@@ -2071,11 +2072,11 @@ static int hotkey_get_tablet_mode(int *status)
* hotkey_acpi_mask accordingly. Also resets any bits * hotkey_acpi_mask accordingly. Also resets any bits
* from hotkey_user_mask that are unavailable to be * from hotkey_user_mask that are unavailable to be
* delivered (shadow requirement of the userspace ABI). * delivered (shadow requirement of the userspace ABI).
*
* Call with hotkey_mutex held
*/ */
static int hotkey_mask_get(void) static int hotkey_mask_get(void)
{ {
lockdep_assert_held(&hotkey_mutex);
if (tp_features.hotkey_mask) { if (tp_features.hotkey_mask) {
u32 m = 0; u32 m = 0;
...@@ -2111,8 +2112,6 @@ static void hotkey_mask_warn_incomplete_mask(void) ...@@ -2111,8 +2112,6 @@ static void hotkey_mask_warn_incomplete_mask(void)
* Also calls hotkey_mask_get to update hotkey_acpi_mask. * Also calls hotkey_mask_get to update hotkey_acpi_mask.
* *
* NOTE: does not set bits in hotkey_user_mask, but may reset them. * NOTE: does not set bits in hotkey_user_mask, but may reset them.
*
* Call with hotkey_mutex held
*/ */
static int hotkey_mask_set(u32 mask) static int hotkey_mask_set(u32 mask)
{ {
...@@ -2121,6 +2120,8 @@ static int hotkey_mask_set(u32 mask) ...@@ -2121,6 +2120,8 @@ static int hotkey_mask_set(u32 mask)
const u32 fwmask = mask & ~hotkey_source_mask; const u32 fwmask = mask & ~hotkey_source_mask;
lockdep_assert_held(&hotkey_mutex);
if (tp_features.hotkey_mask) { if (tp_features.hotkey_mask) {
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
if (!acpi_evalf(hkey_handle, if (!acpi_evalf(hkey_handle,
...@@ -2152,13 +2153,13 @@ static int hotkey_mask_set(u32 mask) ...@@ -2152,13 +2153,13 @@ static int hotkey_mask_set(u32 mask)
/* /*
* Sets hotkey_user_mask and tries to set the firmware mask * Sets hotkey_user_mask and tries to set the firmware mask
*
* Call with hotkey_mutex held
*/ */
static int hotkey_user_mask_set(const u32 mask) static int hotkey_user_mask_set(const u32 mask)
{ {
int rc; int rc;
lockdep_assert_held(&hotkey_mutex);
/* Give people a chance to notice they are doing something that /* Give people a chance to notice they are doing something that
* is bound to go boom on their users sooner or later */ * is bound to go boom on their users sooner or later */
if (!tp_warned.hotkey_mask_ff && if (!tp_warned.hotkey_mask_ff &&
...@@ -2519,21 +2520,23 @@ static int hotkey_kthread(void *data) ...@@ -2519,21 +2520,23 @@ static int hotkey_kthread(void *data)
return 0; return 0;
} }
/* call with hotkey_mutex held */
static void hotkey_poll_stop_sync(void) static void hotkey_poll_stop_sync(void)
{ {
lockdep_assert_held(&hotkey_mutex);
if (tpacpi_hotkey_task) { if (tpacpi_hotkey_task) {
kthread_stop(tpacpi_hotkey_task); kthread_stop(tpacpi_hotkey_task);
tpacpi_hotkey_task = NULL; tpacpi_hotkey_task = NULL;
} }
} }
/* call with hotkey_mutex held */
static void hotkey_poll_setup(const bool may_warn) static void hotkey_poll_setup(const bool may_warn)
{ {
const u32 poll_driver_mask = hotkey_driver_mask & hotkey_source_mask; const u32 poll_driver_mask = hotkey_driver_mask & hotkey_source_mask;
const u32 poll_user_mask = hotkey_user_mask & hotkey_source_mask; const u32 poll_user_mask = hotkey_user_mask & hotkey_source_mask;
lockdep_assert_held(&hotkey_mutex);
if (hotkey_poll_freq > 0 && if (hotkey_poll_freq > 0 &&
(poll_driver_mask || (poll_driver_mask ||
(poll_user_mask && tpacpi_inputdev->users > 0))) { (poll_user_mask && tpacpi_inputdev->users > 0))) {
...@@ -2562,9 +2565,10 @@ static void hotkey_poll_setup_safe(const bool may_warn) ...@@ -2562,9 +2565,10 @@ static void hotkey_poll_setup_safe(const bool may_warn)
mutex_unlock(&hotkey_mutex); mutex_unlock(&hotkey_mutex);
} }
/* call with hotkey_mutex held */
static void hotkey_poll_set_freq(unsigned int freq) static void hotkey_poll_set_freq(unsigned int freq)
{ {
lockdep_assert_held(&hotkey_mutex);
if (!freq) if (!freq)
hotkey_poll_stop_sync(); hotkey_poll_stop_sync();
...@@ -6664,12 +6668,13 @@ static unsigned int brightness_enable = 2; /* 2 = auto, 0 = no, 1 = yes */ ...@@ -6664,12 +6668,13 @@ static unsigned int brightness_enable = 2; /* 2 = auto, 0 = no, 1 = yes */
static struct mutex brightness_mutex; static struct mutex brightness_mutex;
/* NVRAM brightness access, /* NVRAM brightness access */
* call with brightness_mutex held! */
static unsigned int tpacpi_brightness_nvram_get(void) static unsigned int tpacpi_brightness_nvram_get(void)
{ {
u8 lnvram; u8 lnvram;
lockdep_assert_held(&brightness_mutex);
lnvram = (nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS) lnvram = (nvram_read_byte(TP_NVRAM_ADDR_BRIGHTNESS)
& TP_NVRAM_MASK_LEVEL_BRIGHTNESS) & TP_NVRAM_MASK_LEVEL_BRIGHTNESS)
>> TP_NVRAM_POS_LEVEL_BRIGHTNESS; >> TP_NVRAM_POS_LEVEL_BRIGHTNESS;
...@@ -6717,11 +6722,12 @@ static void tpacpi_brightness_checkpoint_nvram(void) ...@@ -6717,11 +6722,12 @@ static void tpacpi_brightness_checkpoint_nvram(void)
} }
/* call with brightness_mutex held! */
static int tpacpi_brightness_get_raw(int *status) static int tpacpi_brightness_get_raw(int *status)
{ {
u8 lec = 0; u8 lec = 0;
lockdep_assert_held(&brightness_mutex);
switch (brightness_mode) { switch (brightness_mode) {
case TPACPI_BRGHT_MODE_UCMS_STEP: case TPACPI_BRGHT_MODE_UCMS_STEP:
*status = tpacpi_brightness_nvram_get(); *status = tpacpi_brightness_nvram_get();
...@@ -6737,12 +6743,13 @@ static int tpacpi_brightness_get_raw(int *status) ...@@ -6737,12 +6743,13 @@ static int tpacpi_brightness_get_raw(int *status)
} }
} }
/* call with brightness_mutex held! */
/* do NOT call with illegal backlight level value */ /* do NOT call with illegal backlight level value */
static int tpacpi_brightness_set_ec(unsigned int value) static int tpacpi_brightness_set_ec(unsigned int value)
{ {
u8 lec = 0; u8 lec = 0;
lockdep_assert_held(&brightness_mutex);
if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec))) if (unlikely(!acpi_ec_read(TP_EC_BACKLIGHT, &lec)))
return -EIO; return -EIO;
...@@ -6754,12 +6761,13 @@ static int tpacpi_brightness_set_ec(unsigned int value) ...@@ -6754,12 +6761,13 @@ static int tpacpi_brightness_set_ec(unsigned int value)
return 0; return 0;
} }
/* call with brightness_mutex held! */
static int tpacpi_brightness_set_ucmsstep(unsigned int value) static int tpacpi_brightness_set_ucmsstep(unsigned int value)
{ {
int cmos_cmd, inc; int cmos_cmd, inc;
unsigned int current_value, i; unsigned int current_value, i;
lockdep_assert_held(&brightness_mutex);
current_value = tpacpi_brightness_nvram_get(); current_value = tpacpi_brightness_nvram_get();
if (value == current_value) if (value == current_value)
...@@ -8208,11 +8216,10 @@ static bool fan_select_fan2(void) ...@@ -8208,11 +8216,10 @@ static bool fan_select_fan2(void)
return true; return true;
} }
/*
* Call with fan_mutex held
*/
static void fan_update_desired_level(u8 status) static void fan_update_desired_level(u8 status)
{ {
lockdep_assert_held(&fan_mutex);
if ((status & if ((status &
(TP_EC_FAN_AUTO | TP_EC_FAN_FULLSPEED)) == 0) { (TP_EC_FAN_AUTO | TP_EC_FAN_FULLSPEED)) == 0) {
if (status > 7) if (status > 7)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment