Commit 42504af7 authored by Mark Pearson's avatar Mark Pearson Committed by Hans de Goede
Browse files

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.com


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent aacb455d
Loading
Loading
Loading
Loading
+18 −27
Original line number Diff line number Diff line
@@ -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();
}