[PATCH] sony-laptop: add new thermal control handle

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

 



Hi,

this patch enables thermal control options on my VAIO Duo 11. I hope I have not made too many mistakes with it.

On at least the SVD11 there is an additional thermal control setting that
is found at a different handle address but otherwise behaves the same as
the other one.

Signed-off-by: Stefan Seidel <lkml@xxxxxxxxxxxxxxxxx>
---
 drivers/platform/x86/sony-laptop.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index 1dba359..550e8fa 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -148,7 +148,8 @@ static int sony_nc_battery_care_setup(struct platform_device *pd,
 		unsigned int handle);
 static void sony_nc_battery_care_cleanup(struct platform_device *pd);

-static int sony_nc_thermal_setup(struct platform_device *pd);
+static int sony_nc_thermal_setup(struct platform_device *pd,
+				 unsigned int handle);
 static void sony_nc_thermal_cleanup(struct platform_device *pd);

 static int sony_nc_lid_resume_setup(struct platform_device *pd,
@@ -1363,7 +1364,8 @@ static void sony_nc_function_setup(struct acpi_device *device,
 						result);
 			break;
 		case 0x0122:
-			result = sony_nc_thermal_setup(pf_device);
+		case 0x015F:
+			result = sony_nc_thermal_setup(pf_device, handle);
 			if (result)
 				pr_err("couldn't set up thermal profile function (%d)\n",
 						result);
@@ -1446,9 +1448,6 @@ static void sony_nc_function_cleanup(struct platform_device *pd)
 {
 	unsigned int i, result, bitmask, handle;

-	if (!handles)
-		return;
-
 	/* get enabled events and disable them */
 	sony_nc_int_call(sony_nc_acpi_handle, "SN01", NULL, &bitmask);
 	sony_nc_int_call(sony_nc_acpi_handle, "SN03", &bitmask, &result);
@@ -1476,6 +1475,7 @@ static void sony_nc_function_cleanup(struct platform_device *pd)
 			sony_nc_lid_resume_cleanup(pd);
 			break;
 		case 0x0122:
+		case 0x015F:
 			sony_nc_thermal_cleanup(pd);
 			break;
 		case 0x0128:
@@ -1547,6 +1547,7 @@ static void sony_nc_function_resume(void)
 			sony_call_snc_handle(handle, 0x100, &result);
 			break;
 		case 0x0122:
+		case 0x015F:
 			sony_nc_thermal_resume();
 			break;
 		case 0x0124:
@@ -2150,14 +2151,16 @@ struct snc_thermal_ctrl {
 	unsigned int profiles;
 	struct device_attribute mode_attr;
 	struct device_attribute profiles_attr;
+	unsigned int handle;
 };
 static struct snc_thermal_ctrl *th_handle;

-#define THM_PROFILE_MAX 3
+#define THM_PROFILE_MAX 4
 static const char * const snc_thermal_profiles[] = {
 	"balanced",
 	"silent",
-	"performance"
+	"performance",
+	"cooling"
 };

 static int sony_nc_thermal_mode_set(unsigned short mode)
@@ -2173,7 +2176,8 @@ static int sony_nc_thermal_mode_set(unsigned short mode)
 	if ((mode && !(th_handle->profiles & mode)) || mode >= THM_PROFILE_MAX)
 		return -EINVAL;

-	if (sony_call_snc_handle(0x0122, mode << 0x10 | 0x0200, &result))
+	if (sony_call_snc_handle(th_handle->handle, mode << 0x10 | 0x0200,
+				 &result))
 		return -EIO;

 	th_handle->mode = mode;
@@ -2185,7 +2189,7 @@ static int sony_nc_thermal_mode_get(void)
 {
 	unsigned int result;

-	if (sony_call_snc_handle(0x0122, 0x0100, &result))
+	if (sony_call_snc_handle(th_handle->handle, 0x0100, &result))
 		return -EIO;

 	return result & 0xff;
@@ -2245,14 +2249,17 @@ static ssize_t sony_nc_thermal_mode_show(struct device *dev,
 	return count;
 }

-static int sony_nc_thermal_setup(struct platform_device *pd)
+static int sony_nc_thermal_setup(struct platform_device *pd,
+				 unsigned int handle)
 {
 	int ret = 0;
 	th_handle = kzalloc(sizeof(struct snc_thermal_ctrl), GFP_KERNEL);
 	if (!th_handle)
 		return -ENOMEM;

-	ret = sony_call_snc_handle(0x0122, 0x0000, &th_handle->profiles);
+	th_handle->handle = handle;
+
+	ret = sony_call_snc_handle(handle, 0x0000, &th_handle->profiles);
 	if (ret) {
 		pr_warn("couldn't to read the thermal profiles\n");
 		goto outkzalloc;
--
2.8.3



--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



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

  Powered by Linux