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: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/r/20230704-thinkpad_acpi-lockdep-v1-2-60129548a738@weissschuh.net Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
ce55dbe55f
commit
38831eaf7d
@ -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)
|
|||||||
* 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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* 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 @@ exit:
|
|||||||
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)
|
|||||||
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 */
|
|||||||
|
|
||||||
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 @@ unlock:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* 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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user