Extract common DYTC constants/functions into a dedicated header file to avoid code duplication. Rename DYTC_MODE_BALANCE to DYTC_MODE_BALANCED and DYTC_MODE_PERFORM to DYTC_MODE_PERFORMANCE to be consistent with the platform_profile_option enum. Signed-off-by: Barnabás Pőcze <pobrn@xxxxxxxxxxxxxx> create mode 100644 drivers/platform/x86/lenovo/dytc.h diff --git a/drivers/platform/x86/lenovo/dytc.h b/drivers/platform/x86/lenovo/dytc.h new file mode 100644 index 000000000000..9ec341bdef70 --- /dev/null +++ b/drivers/platform/x86/lenovo/dytc.h @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#ifndef _LENOVO_DYTC_H_ +#define _LENOVO_DYTC_H_ + +#include <linux/platform_profile.h> + +#define DYTC_CMD_QUERY 0 /* To get DYTC status - enable/revision */ +#define DYTC_CMD_SET 1 /* To enable/disable IC function mode */ +#define DYTC_CMD_GET 2 /* To get current IC function and mode */ +#define DYTC_CMD_RESET 511 /* To reset back to default */ + +#define DYTC_QUERY_ENABLE_BIT 8 /* Bit 8 - 0 = disabled, 1 = enabled */ +#define DYTC_QUERY_SUBREV_BIT 16 /* Bits 16 - 27 - sub revision */ +#define DYTC_QUERY_REV_BIT 28 /* Bits 28 - 31 - revision */ + +#define DYTC_GET_FUNCTION_BIT 8 /* Bits 8 - 11 - function setting */ +#define DYTC_GET_MODE_BIT 12 /* Bits 12 - 15 - mode setting */ +#define DYTC_GET_LAPMODE_BIT 17 /* Bit 17 - set when in lapmode */ + +#define DYTC_SET_FUNCTION_BIT 12 /* Bits 12 - 15 - function setting */ +#define DYTC_SET_MODE_BIT 16 /* Bits 16 - 19 - mode setting */ +#define DYTC_SET_VALID_BIT 20 /* Bit 20 - 1 = on, 0 = off */ + +#define DYTC_FUNCTION_STD 0 /* Function = 0, standard mode */ +#define DYTC_FUNCTION_CQL 1 /* Function = 1, lap mode */ +#define DYTC_FUNCTION_MMC 11 /* Function = 11, desk mode */ + +#define DYTC_MODE_PERFORMANCE 2 /* High power mode aka performance */ +#define DYTC_MODE_LOW_POWER 3 /* Low power mode aka quiet */ +#define DYTC_MODE_BALANCED 15 /* Default mode aka balanced */ + +#define DYTC_SET_COMMAND(function, mode, on) \ + (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \ + (mode) << DYTC_SET_MODE_BIT | \ + (on) << DYTC_SET_VALID_BIT) + +#define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCED, 0) + +#define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCED, 1) + +static int inline convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) +{ + switch (dytcmode) { + case DYTC_MODE_LOW_POWER: + *profile = PLATFORM_PROFILE_LOW_POWER; + break; + case DYTC_MODE_BALANCED: + *profile = PLATFORM_PROFILE_BALANCED; + break; + case DYTC_MODE_PERFORMANCE: + *profile = PLATFORM_PROFILE_PERFORMANCE; + break; + default: /* Unknown mode */ + return -EINVAL; + } + + return 0; +} + +static inline int convert_profile_to_dytc(enum platform_profile_option profile, int *dytcmode) +{ + switch (profile) { + case PLATFORM_PROFILE_LOW_POWER: + *dytcmode = DYTC_MODE_LOW_POWER; + break; + case PLATFORM_PROFILE_BALANCED: + *dytcmode = DYTC_MODE_BALANCED; + break; + case PLATFORM_PROFILE_PERFORMANCE: + *dytcmode = DYTC_MODE_PERFORMANCE; + break; + default: /* Unknown profile */ + return -EOPNOTSUPP; + } + + return 0; +} + +#endif /* _LENOVO_DYTC_H_ */ diff --git a/drivers/platform/x86/lenovo/ideapad-laptop.c b/drivers/platform/x86/lenovo/ideapad-laptop.c index 6cb5ad4be231..387c8c86b8bb 100644 --- a/drivers/platform/x86/lenovo/ideapad-laptop.c +++ b/drivers/platform/x86/lenovo/ideapad-laptop.c @@ -35,6 +35,8 @@ #include <dt-bindings/leds/common.h> +#include "dytc.h" + #define IDEAPAD_RFKILL_DEV_NUM 3 #if IS_ENABLED(CONFIG_ACPI_WMI) @@ -676,76 +678,6 @@ static const struct attribute_group ideapad_attribute_group = { /* * DYTC Platform profile */ -#define DYTC_CMD_QUERY 0 /* To get DYTC status - enable/revision */ -#define DYTC_CMD_SET 1 /* To enable/disable IC function mode */ -#define DYTC_CMD_GET 2 /* To get current IC function and mode */ -#define DYTC_CMD_RESET 0x1ff /* To reset back to default */ - -#define DYTC_QUERY_ENABLE_BIT 8 /* Bit 8 - 0 = disabled, 1 = enabled */ -#define DYTC_QUERY_SUBREV_BIT 16 /* Bits 16 - 27 - sub revision */ -#define DYTC_QUERY_REV_BIT 28 /* Bits 28 - 31 - revision */ - -#define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */ -#define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */ - -#define DYTC_SET_FUNCTION_BIT 12 /* Bits 12-15 - function setting */ -#define DYTC_SET_MODE_BIT 16 /* Bits 16-19 - mode setting */ -#define DYTC_SET_VALID_BIT 20 /* Bit 20 - 1 = on, 0 = off */ - -#define DYTC_FUNCTION_STD 0 /* Function = 0, standard mode */ -#define DYTC_FUNCTION_CQL 1 /* Function = 1, lap mode */ -#define DYTC_FUNCTION_MMC 11 /* Function = 11, desk mode */ - -#define DYTC_MODE_PERFORM 2 /* High power mode aka performance */ -#define DYTC_MODE_LOW_POWER 3 /* Low power mode aka quiet */ -#define DYTC_MODE_BALANCE 0xF /* Default mode aka balanced */ - -#define DYTC_SET_COMMAND(function, mode, on) \ - (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \ - (mode) << DYTC_SET_MODE_BIT | \ - (on) << DYTC_SET_VALID_BIT) - -#define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCE, 0) - -#define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCE, 1) - -static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) -{ - switch (dytcmode) { - case DYTC_MODE_LOW_POWER: - *profile = PLATFORM_PROFILE_LOW_POWER; - break; - case DYTC_MODE_BALANCE: - *profile = PLATFORM_PROFILE_BALANCED; - break; - case DYTC_MODE_PERFORM: - *profile = PLATFORM_PROFILE_PERFORMANCE; - break; - default: /* Unknown mode */ - return -EINVAL; - } - - return 0; -} - -static int convert_profile_to_dytc(enum platform_profile_option profile, int *perfmode) -{ - switch (profile) { - case PLATFORM_PROFILE_LOW_POWER: - *perfmode = DYTC_MODE_LOW_POWER; - break; - case PLATFORM_PROFILE_BALANCED: - *perfmode = DYTC_MODE_BALANCE; - break; - case PLATFORM_PROFILE_PERFORMANCE: - *perfmode = DYTC_MODE_PERFORM; - break; - default: /* Unknown profile */ - return -EOPNOTSUPP; - } - - return 0; -} /* * dytc_profile_get: Function to register with platform_profile diff --git a/drivers/platform/x86/lenovo/thinkpad_acpi.c b/drivers/platform/x86/lenovo/thinkpad_acpi.c index b881044b31b0..61990fc9870c 100644 --- a/drivers/platform/x86/lenovo/thinkpad_acpi.c +++ b/drivers/platform/x86/lenovo/thinkpad_acpi.c @@ -74,6 +74,8 @@ #include <acpi/battery.h> #include <acpi/video.h> +#include "dytc.h" + /* ThinkPad CMOS commands */ #define TP_CMOS_VOLUME_DOWN 0 #define TP_CMOS_VOLUME_UP 1 @@ -9845,9 +9847,6 @@ static struct ibm_struct lcdshadow_driver_data = { * Thinkpad sensor interfaces */ -#define DYTC_CMD_GET 2 /* To get current IC function and mode */ -#define DYTC_GET_LAPMODE_BIT 17 /* Set when in lapmode */ - #define PALMSENSOR_PRESENT_BIT 0 /* Determine if psensor present */ #define PALMSENSOR_ON_BIT 1 /* psensor status */ @@ -9999,79 +9998,11 @@ static struct ibm_struct proxsensor_driver_data = { * DYTC Platform Profile interface */ -#define DYTC_CMD_QUERY 0 /* To get DYTC status - enable/revision */ -#define DYTC_CMD_SET 1 /* To enable/disable IC function mode */ -#define DYTC_CMD_RESET 0x1ff /* To reset back to default */ - -#define DYTC_QUERY_ENABLE_BIT 8 /* Bit 8 - 0 = disabled, 1 = enabled */ -#define DYTC_QUERY_SUBREV_BIT 16 /* Bits 16 - 27 - sub revision */ -#define DYTC_QUERY_REV_BIT 28 /* Bits 28 - 31 - revision */ - -#define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */ -#define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */ - -#define DYTC_SET_FUNCTION_BIT 12 /* Bits 12-15 - function setting */ -#define DYTC_SET_MODE_BIT 16 /* Bits 16-19 - mode setting */ -#define DYTC_SET_VALID_BIT 20 /* Bit 20 - 1 = on, 0 = off */ - -#define DYTC_FUNCTION_STD 0 /* Function = 0, standard mode */ -#define DYTC_FUNCTION_CQL 1 /* Function = 1, lap mode */ -#define DYTC_FUNCTION_MMC 11 /* Function = 11, desk mode */ - -#define DYTC_MODE_PERFORM 2 /* High power mode aka performance */ -#define DYTC_MODE_LOWPOWER 3 /* Low power mode */ -#define DYTC_MODE_BALANCE 0xF /* Default mode aka balanced */ - -#define DYTC_SET_COMMAND(function, mode, on) \ - (DYTC_CMD_SET | (function) << DYTC_SET_FUNCTION_BIT | \ - (mode) << DYTC_SET_MODE_BIT | \ - (on) << DYTC_SET_VALID_BIT) - -#define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCE, 0) - -#define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_BALANCE, 1) - static bool dytc_profile_available; static enum platform_profile_option dytc_current_profile; static atomic_t dytc_ignore_event = ATOMIC_INIT(0); static DEFINE_MUTEX(dytc_mutex); -static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) -{ - switch (dytcmode) { - case DYTC_MODE_LOWPOWER: - *profile = PLATFORM_PROFILE_LOW_POWER; - break; - case DYTC_MODE_BALANCE: - *profile = PLATFORM_PROFILE_BALANCED; - break; - case DYTC_MODE_PERFORM: - *profile = PLATFORM_PROFILE_PERFORMANCE; - break; - default: /* Unknown mode */ - return -EINVAL; - } - return 0; -} - -static int convert_profile_to_dytc(enum platform_profile_option profile, int *perfmode) -{ - switch (profile) { - case PLATFORM_PROFILE_LOW_POWER: - *perfmode = DYTC_MODE_LOWPOWER; - break; - case PLATFORM_PROFILE_BALANCED: - *perfmode = DYTC_MODE_BALANCE; - break; - case PLATFORM_PROFILE_PERFORMANCE: - *perfmode = DYTC_MODE_PERFORM; - break; - default: /* Unknown profile */ - return -EOPNOTSUPP; - } - return 0; -} - /* * dytc_profile_get: Function to register with platform_profile * handler. Returns current platform profile. -- 2.30.0