Commit 6fe391dd authored by Mark Pearson's avatar Mark Pearson Committed by Hans de Goede

platform/x86: thinkpad-acpi: profile capabilities as integer

Currently the active mode (PSC/MMC) is stored in an enum and queried
throughout the driver.

Other driver changes will enumerate additional submodes that are relevant
to be tracked, so instead track PSC/MMC in a single integer variable.
Co-developed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarMark Pearson <markpearson@lenovo.com>
Link: https://lore.kernel.org/r/20220603170212.164963-1-markpearson@lenovo.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 7518eefe
...@@ -10299,21 +10299,15 @@ static struct ibm_struct proxsensor_driver_data = { ...@@ -10299,21 +10299,15 @@ static struct ibm_struct proxsensor_driver_data = {
#define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 0) #define DYTC_DISABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 0)
#define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 1) #define DYTC_ENABLE_CQL DYTC_SET_COMMAND(DYTC_FUNCTION_CQL, DYTC_MODE_MMC_BALANCE, 1)
enum dytc_profile_funcmode {
DYTC_FUNCMODE_NONE = 0,
DYTC_FUNCMODE_MMC,
DYTC_FUNCMODE_PSC,
};
static enum dytc_profile_funcmode dytc_profile_available;
static enum platform_profile_option dytc_current_profile; static enum platform_profile_option dytc_current_profile;
static atomic_t dytc_ignore_event = ATOMIC_INIT(0); static atomic_t dytc_ignore_event = ATOMIC_INIT(0);
static DEFINE_MUTEX(dytc_mutex); static DEFINE_MUTEX(dytc_mutex);
static int dytc_capabilities;
static bool dytc_mmc_get_available; static bool dytc_mmc_get_available;
static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile) static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *profile)
{ {
if (dytc_profile_available == DYTC_FUNCMODE_MMC) { if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
switch (dytcmode) { switch (dytcmode) {
case DYTC_MODE_MMC_LOWPOWER: case DYTC_MODE_MMC_LOWPOWER:
*profile = PLATFORM_PROFILE_LOW_POWER; *profile = PLATFORM_PROFILE_LOW_POWER;
...@@ -10330,7 +10324,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p ...@@ -10330,7 +10324,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
} }
return 0; return 0;
} }
if (dytc_profile_available == DYTC_FUNCMODE_PSC) { if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
switch (dytcmode) { switch (dytcmode) {
case DYTC_MODE_PSC_LOWPOWER: case DYTC_MODE_PSC_LOWPOWER:
*profile = PLATFORM_PROFILE_LOW_POWER; *profile = PLATFORM_PROFILE_LOW_POWER;
...@@ -10352,21 +10346,21 @@ static int convert_profile_to_dytc(enum platform_profile_option profile, int *pe ...@@ -10352,21 +10346,21 @@ static int convert_profile_to_dytc(enum platform_profile_option profile, int *pe
{ {
switch (profile) { switch (profile) {
case PLATFORM_PROFILE_LOW_POWER: case PLATFORM_PROFILE_LOW_POWER:
if (dytc_profile_available == DYTC_FUNCMODE_MMC) if (dytc_capabilities & BIT(DYTC_FC_MMC))
*perfmode = DYTC_MODE_MMC_LOWPOWER; *perfmode = DYTC_MODE_MMC_LOWPOWER;
else if (dytc_profile_available == DYTC_FUNCMODE_PSC) else if (dytc_capabilities & BIT(DYTC_FC_PSC))
*perfmode = DYTC_MODE_PSC_LOWPOWER; *perfmode = DYTC_MODE_PSC_LOWPOWER;
break; break;
case PLATFORM_PROFILE_BALANCED: case PLATFORM_PROFILE_BALANCED:
if (dytc_profile_available == DYTC_FUNCMODE_MMC) if (dytc_capabilities & BIT(DYTC_FC_MMC))
*perfmode = DYTC_MODE_MMC_BALANCE; *perfmode = DYTC_MODE_MMC_BALANCE;
else if (dytc_profile_available == DYTC_FUNCMODE_PSC) else if (dytc_capabilities & BIT(DYTC_FC_PSC))
*perfmode = DYTC_MODE_PSC_BALANCE; *perfmode = DYTC_MODE_PSC_BALANCE;
break; break;
case PLATFORM_PROFILE_PERFORMANCE: case PLATFORM_PROFILE_PERFORMANCE:
if (dytc_profile_available == DYTC_FUNCMODE_MMC) if (dytc_capabilities & BIT(DYTC_FC_MMC))
*perfmode = DYTC_MODE_MMC_PERFORM; *perfmode = DYTC_MODE_MMC_PERFORM;
else if (dytc_profile_available == DYTC_FUNCMODE_PSC) else if (dytc_capabilities & BIT(DYTC_FC_PSC))
*perfmode = DYTC_MODE_PSC_PERFORM; *perfmode = DYTC_MODE_PSC_PERFORM;
break; break;
default: /* Unknown profile */ default: /* Unknown profile */
...@@ -10445,7 +10439,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof, ...@@ -10445,7 +10439,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
if (err) if (err)
goto unlock; goto unlock;
if (dytc_profile_available == DYTC_FUNCMODE_MMC) { if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
if (profile == PLATFORM_PROFILE_BALANCED) { if (profile == PLATFORM_PROFILE_BALANCED) {
/* /*
* To get back to balanced mode we need to issue a reset command. * To get back to balanced mode we need to issue a reset command.
...@@ -10464,7 +10458,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof, ...@@ -10464,7 +10458,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
goto unlock; goto unlock;
} }
} }
if (dytc_profile_available == DYTC_FUNCMODE_PSC) { if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output); err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output);
if (err) if (err)
goto unlock; goto unlock;
...@@ -10483,12 +10477,12 @@ static void dytc_profile_refresh(void) ...@@ -10483,12 +10477,12 @@ static void dytc_profile_refresh(void)
int perfmode; int perfmode;
mutex_lock(&dytc_mutex); mutex_lock(&dytc_mutex);
if (dytc_profile_available == DYTC_FUNCMODE_MMC) { if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
if (dytc_mmc_get_available) if (dytc_mmc_get_available)
err = dytc_command(DYTC_CMD_MMC_GET, &output); err = dytc_command(DYTC_CMD_MMC_GET, &output);
else else
err = dytc_cql_command(DYTC_CMD_GET, &output); err = dytc_cql_command(DYTC_CMD_GET, &output);
} else if (dytc_profile_available == DYTC_FUNCMODE_PSC) } else if (dytc_capabilities & BIT(DYTC_FC_PSC))
err = dytc_command(DYTC_CMD_GET, &output); err = dytc_command(DYTC_CMD_GET, &output);
mutex_unlock(&dytc_mutex); mutex_unlock(&dytc_mutex);
...@@ -10517,7 +10511,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) ...@@ -10517,7 +10511,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
set_bit(PLATFORM_PROFILE_BALANCED, dytc_profile.choices); set_bit(PLATFORM_PROFILE_BALANCED, dytc_profile.choices);
set_bit(PLATFORM_PROFILE_PERFORMANCE, dytc_profile.choices); set_bit(PLATFORM_PROFILE_PERFORMANCE, dytc_profile.choices);
dytc_profile_available = DYTC_FUNCMODE_NONE;
err = dytc_command(DYTC_CMD_QUERY, &output); err = dytc_command(DYTC_CMD_QUERY, &output);
if (err) if (err)
return err; return err;
...@@ -10530,13 +10523,12 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) ...@@ -10530,13 +10523,12 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
return -ENODEV; return -ENODEV;
/* Check what capabilities are supported */ /* Check what capabilities are supported */
err = dytc_command(DYTC_CMD_FUNC_CAP, &output); err = dytc_command(DYTC_CMD_FUNC_CAP, &dytc_capabilities);
if (err) if (err)
return err; return err;
if (output & BIT(DYTC_FC_MMC)) { /* MMC MODE */ if (dytc_capabilities & BIT(DYTC_FC_MMC)) { /* MMC MODE */
dytc_profile_available = DYTC_FUNCMODE_MMC; pr_debug("MMC is supported\n");
/* /*
* Check if MMC_GET functionality available * Check if MMC_GET functionality available
* Version > 6 and return success from MMC_GET command * Version > 6 and return success from MMC_GET command
...@@ -10547,8 +10539,8 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) ...@@ -10547,8 +10539,8 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS)) if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS))
dytc_mmc_get_available = true; dytc_mmc_get_available = true;
} }
} else if (output & BIT(DYTC_FC_PSC)) { /* PSC MODE */ } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) { /* PSC MODE */
dytc_profile_available = DYTC_FUNCMODE_PSC; pr_debug("PSC is supported\n");
} else { } else {
dbg_printk(TPACPI_DBG_INIT, "No DYTC support available\n"); dbg_printk(TPACPI_DBG_INIT, "No DYTC support available\n");
return -ENODEV; return -ENODEV;
...@@ -10574,7 +10566,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm) ...@@ -10574,7 +10566,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
static void dytc_profile_exit(void) static void dytc_profile_exit(void)
{ {
dytc_profile_available = DYTC_FUNCMODE_NONE;
platform_profile_remove(); platform_profile_remove();
} }
......
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