Re: [External] [RFC PATCH 2/2] platform/x86: thinkpad_acpi/ideapad-laptop: extract common DYTC constants/functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for doing this Barnabas - feel like I should have contributed to
this exercise :)

Looks excellent

Mark

On 04/02/2021 15:40, Barnabás Pőcze wrote:
> 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.
> 



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux