Commit a1f37cd8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull thermal control fix from Rafael Wysocki:
 "Fix up a recent change in the int340x thermal driver that
  inadvertently broke thermal zone handling on some systems
  (Srinivas Pandruvada)"

* tag 'thermal-5.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  thermal: int340x: Mode setting with new OS handshake
parents 42226c98 7b145802
Loading
Loading
Loading
Loading
+32 −16
Original line number Diff line number Diff line
@@ -194,12 +194,31 @@ static int int3400_thermal_run_osc(acpi_handle handle, char *uuid_str, int *enab
	return result;
}

static int set_os_uuid_mask(struct int3400_thermal_priv *priv, u32 mask)
{
	int cap = 0;

	/*
	 * Capability bits:
	 * Bit 0: set to 1 to indicate DPTF is active
	 * Bi1 1: set to 1 to active cooling is supported by user space daemon
	 * Bit 2: set to 1 to passive cooling is supported by user space daemon
	 * Bit 3: set to 1 to critical trip is handled by user space daemon
	 */
	if (mask)
		cap = (priv->os_uuid_mask << 1) | 0x01;

	return int3400_thermal_run_osc(priv->adev->handle,
				       "b23ba85d-c8b7-3542-88de-8de2ffcfd698",
				       &cap);
}

static ssize_t current_uuid_store(struct device *dev,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
{
	struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
	int i;
	int ret, i;

	for (i = 0; i < INT3400_THERMAL_MAXIMUM_UUID; ++i) {
		if (!strncmp(buf, int3400_thermal_uuids[i],
@@ -231,19 +250,7 @@ static ssize_t current_uuid_store(struct device *dev,
	}

	if (priv->os_uuid_mask) {
		int cap, ret;

		/*
		 * Capability bits:
		 * Bit 0: set to 1 to indicate DPTF is active
		 * Bi1 1: set to 1 to active cooling is supported by user space daemon
		 * Bit 2: set to 1 to passive cooling is supported by user space daemon
		 * Bit 3: set to 1 to critical trip is handled by user space daemon
		 */
		cap = ((priv->os_uuid_mask << 1) | 0x01);
		ret = int3400_thermal_run_osc(priv->adev->handle,
					      "b23ba85d-c8b7-3542-88de-8de2ffcfd698",
					      &cap);
		ret = set_os_uuid_mask(priv, priv->os_uuid_mask);
		if (ret)
			return ret;
	}
@@ -469,17 +476,26 @@ static int int3400_thermal_change_mode(struct thermal_zone_device *thermal,
	if (mode != thermal->mode) {
		int enabled;

		enabled = mode == THERMAL_DEVICE_ENABLED;

		if (priv->os_uuid_mask) {
			if (!enabled) {
				priv->os_uuid_mask = 0;
				result = set_os_uuid_mask(priv, priv->os_uuid_mask);
			}
			goto eval_odvp;
		}

		if (priv->current_uuid_index < 0 ||
		    priv->current_uuid_index >= INT3400_THERMAL_MAXIMUM_UUID)
			return -EINVAL;

		enabled = (mode == THERMAL_DEVICE_ENABLED);
		result = int3400_thermal_run_osc(priv->adev->handle,
						 int3400_thermal_uuids[priv->current_uuid_index],
						 &enabled);
	}


eval_odvp:
	evaluate_odvp(priv);

	return result;