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: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Mark Pearson <markpearson@lenovo.com> Link: https://lore.kernel.org/r/20220603170212.164963-1-markpearson@lenovo.com Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
aacb455dfe
commit
42504af775
@ -10300,21 +10300,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_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 atomic_t dytc_ignore_event = ATOMIC_INIT(0);
|
||||
static DEFINE_MUTEX(dytc_mutex);
|
||||
static int dytc_capabilities;
|
||||
static bool dytc_mmc_get_available;
|
||||
|
||||
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) {
|
||||
case DYTC_MODE_MMC_LOWPOWER:
|
||||
*profile = PLATFORM_PROFILE_LOW_POWER;
|
||||
@ -10331,7 +10325,7 @@ static int convert_dytc_to_profile(int dytcmode, enum platform_profile_option *p
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_PSC) {
|
||||
if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
|
||||
switch (dytcmode) {
|
||||
case DYTC_MODE_PSC_LOWPOWER:
|
||||
*profile = PLATFORM_PROFILE_LOW_POWER;
|
||||
@ -10353,21 +10347,21 @@ static int convert_profile_to_dytc(enum platform_profile_option profile, int *pe
|
||||
{
|
||||
switch (profile) {
|
||||
case PLATFORM_PROFILE_LOW_POWER:
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_MMC)
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*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;
|
||||
break;
|
||||
case PLATFORM_PROFILE_BALANCED:
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_MMC)
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*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;
|
||||
break;
|
||||
case PLATFORM_PROFILE_PERFORMANCE:
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_MMC)
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*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;
|
||||
break;
|
||||
default: /* Unknown profile */
|
||||
@ -10446,7 +10440,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_MMC) {
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
|
||||
if (profile == PLATFORM_PROFILE_BALANCED) {
|
||||
/*
|
||||
* To get back to balanced mode we need to issue a reset command.
|
||||
@ -10465,7 +10459,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
|
||||
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);
|
||||
if (err)
|
||||
goto unlock;
|
||||
@ -10484,12 +10478,12 @@ static void dytc_profile_refresh(void)
|
||||
int perfmode;
|
||||
|
||||
mutex_lock(&dytc_mutex);
|
||||
if (dytc_profile_available == DYTC_FUNCMODE_MMC) {
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC)) {
|
||||
if (dytc_mmc_get_available)
|
||||
err = dytc_command(DYTC_CMD_MMC_GET, &output);
|
||||
else
|
||||
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);
|
||||
|
||||
mutex_unlock(&dytc_mutex);
|
||||
@ -10518,7 +10512,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
set_bit(PLATFORM_PROFILE_BALANCED, dytc_profile.choices);
|
||||
set_bit(PLATFORM_PROFILE_PERFORMANCE, dytc_profile.choices);
|
||||
|
||||
dytc_profile_available = DYTC_FUNCMODE_NONE;
|
||||
err = dytc_command(DYTC_CMD_QUERY, &output);
|
||||
if (err)
|
||||
return err;
|
||||
@ -10531,13 +10524,12 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
return -ENODEV;
|
||||
|
||||
/* Check what capabilities are supported */
|
||||
err = dytc_command(DYTC_CMD_FUNC_CAP, &output);
|
||||
err = dytc_command(DYTC_CMD_FUNC_CAP, &dytc_capabilities);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (output & BIT(DYTC_FC_MMC)) { /* MMC MODE */
|
||||
dytc_profile_available = DYTC_FUNCMODE_MMC;
|
||||
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC)) { /* MMC MODE */
|
||||
pr_debug("MMC is supported\n");
|
||||
/*
|
||||
* Check if MMC_GET functionality available
|
||||
* Version > 6 and return success from MMC_GET command
|
||||
@ -10548,8 +10540,8 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
if (!err && ((output & DYTC_ERR_MASK) == DYTC_ERR_SUCCESS))
|
||||
dytc_mmc_get_available = true;
|
||||
}
|
||||
} else if (output & BIT(DYTC_FC_PSC)) { /* PSC MODE */
|
||||
dytc_profile_available = DYTC_FUNCMODE_PSC;
|
||||
} else if (dytc_capabilities & BIT(DYTC_FC_PSC)) { /* PSC MODE */
|
||||
pr_debug("PSC is supported\n");
|
||||
} else {
|
||||
dbg_printk(TPACPI_DBG_INIT, "No DYTC support available\n");
|
||||
return -ENODEV;
|
||||
@ -10575,7 +10567,6 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
|
||||
static void dytc_profile_exit(void)
|
||||
{
|
||||
dytc_profile_available = DYTC_FUNCMODE_NONE;
|
||||
platform_profile_remove();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user