* [PATCH v3 0/4] Support INT3406 Display thermal device
@ 2016-04-27 12:45 Aaron Lu
2016-04-27 12:45 ` [PATCH v3 1/4] video / backlight: add two APIs for drivers to use Aaron Lu
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Aaron Lu @ 2016-04-27 12:45 UTC (permalink / raw)
To: Rafael J. Wysocki, Zhang Rui, Jingoo Han
Cc: linux-fbdev, linux-acpi, linux-pm, Srinivas Pandruvada
v3:
Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
and one adds the int3406 driver as suggested by Rafael. There should
be no functionality change compared to v2.
v2:
The display thermal device represents the LED/LCD display panel
that may or may not include touch support. The main function of
the display thermal device is to allow control of the display
brightness in order to address a thermal condition or to reduce
power consumed by display device.
Due to the way this thermal device changes brightness level is said
to be deprecated so we are using the raw interface to do the actual
backlight change. This requires the backlight core support so two
new APIs are added and exported in patch 1/3. With this, the previous
API backlight_device_registered can be removed and this is done in
patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
The 1st version is here:
http://thread.gmane.org/gmane.linux.acpi.devel/72619
This whole series should go through the thermal tree if applied.
Aaron Lu (3):
video / backlight: add two APIs for drivers to use
video / backlight: remove the backlight_device_registered API
Thermal: add INT3406 thermal driver
drivers/acpi/acpi_video.c | 83 ++++----
drivers/acpi/video_detect.c | 2 +-
drivers/thermal/Kconfig | 28 +--
drivers/thermal/int340x_thermal/Kconfig | 42 ++++
drivers/thermal/int340x_thermal/Makefile | 1 +
drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
drivers/video/backlight/backlight.c | 39 ++--
include/acpi/video.h | 20 ++
include/linux/backlight.h | 3 +-
9 files changed, 374 insertions(+), 80 deletions(-)
create mode 100644 drivers/thermal/int340x_thermal/Kconfig
create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
--
2.5.5
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 1/4] video / backlight: add two APIs for drivers to use
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
@ 2016-04-27 12:45 ` Aaron Lu
2016-04-27 12:45 ` [PATCH v3 2/4] video / backlight: remove the backlight_device_registered API Aaron Lu
` (3 subsequent siblings)
4 siblings, 0 replies; 15+ messages in thread
From: Aaron Lu @ 2016-04-27 12:45 UTC (permalink / raw)
To: Rafael J. Wysocki, Zhang Rui, Jingoo Han
Cc: linux-fbdev, linux-acpi, linux-pm, Srinivas Pandruvada
It is useful to get the backlight device's pointer and use it to set
backlight in some cases(the following patch will make use of it) so add
the two APIs and export them.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
Acked-by: Jingoo Han <jg1.han@samsung.com>
---
drivers/video/backlight/backlight.c | 43 +++++++++++++++++++++++++------------
include/linux/backlight.h | 2 ++
2 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index bddc8b17a4d8..18901b9b1eb4 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -164,18 +164,10 @@ static ssize_t brightness_show(struct device *dev,
return sprintf(buf, "%d\n", bd->props.brightness);
}
-static ssize_t brightness_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t count)
+int backlight_device_set_brightness(struct backlight_device *bd,
+ unsigned long brightness)
{
- int rc;
- struct backlight_device *bd = to_backlight_device(dev);
- unsigned long brightness;
-
- rc = kstrtoul(buf, 0, &brightness);
- if (rc)
- return rc;
-
- rc = -ENXIO;
+ int rc = -ENXIO;
mutex_lock(&bd->ops_lock);
if (bd->ops) {
@@ -185,7 +177,7 @@ static ssize_t brightness_store(struct device *dev,
pr_debug("set brightness to %lu\n", brightness);
bd->props.brightness = brightness;
backlight_update_status(bd);
- rc = count;
+ rc = 0;
}
}
mutex_unlock(&bd->ops_lock);
@@ -194,6 +186,23 @@ static ssize_t brightness_store(struct device *dev,
return rc;
}
+EXPORT_SYMBOL(backlight_device_set_brightness);
+
+static ssize_t brightness_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int rc;
+ struct backlight_device *bd = to_backlight_device(dev);
+ unsigned long brightness;
+
+ rc = kstrtoul(buf, 0, &brightness);
+ if (rc)
+ return rc;
+
+ rc = backlight_device_set_brightness(bd, brightness);
+
+ return rc ? rc : count;
+}
static DEVICE_ATTR_RW(brightness);
static ssize_t type_show(struct device *dev, struct device_attribute *attr,
@@ -380,7 +389,7 @@ struct backlight_device *backlight_device_register(const char *name,
}
EXPORT_SYMBOL(backlight_device_register);
-bool backlight_device_registered(enum backlight_type type)
+struct backlight_device *backlight_device_get_by_type(enum backlight_type type)
{
bool found = false;
struct backlight_device *bd;
@@ -394,7 +403,13 @@ bool backlight_device_registered(enum backlight_type type)
}
mutex_unlock(&backlight_dev_list_mutex);
- return found;
+ return found ? bd : NULL;
+}
+EXPORT_SYMBOL(backlight_device_get_by_type);
+
+bool backlight_device_registered(enum backlight_type type)
+{
+ return backlight_device_get_by_type(type) ? true : false;
}
EXPORT_SYMBOL(backlight_device_registered);
diff --git a/include/linux/backlight.h b/include/linux/backlight.h
index 1e7a69adbe6f..f46b88fa4a09 100644
--- a/include/linux/backlight.h
+++ b/include/linux/backlight.h
@@ -144,6 +144,8 @@ extern void backlight_force_update(struct backlight_device *bd,
extern bool backlight_device_registered(enum backlight_type type);
extern int backlight_register_notifier(struct notifier_block *nb);
extern int backlight_unregister_notifier(struct notifier_block *nb);
+extern struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
+extern int backlight_device_set_brightness(struct backlight_device *bd, unsigned long brightness);
#define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
--
2.5.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 2/4] video / backlight: remove the backlight_device_registered API
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
2016-04-27 12:45 ` [PATCH v3 1/4] video / backlight: add two APIs for drivers to use Aaron Lu
@ 2016-04-27 12:45 ` Aaron Lu
2016-04-27 12:45 ` [PATCH v3 3/4] ACPI/video: export acpi_video_get_levels Aaron Lu
` (2 subsequent siblings)
4 siblings, 0 replies; 15+ messages in thread
From: Aaron Lu @ 2016-04-27 12:45 UTC (permalink / raw)
To: Rafael J. Wysocki, Zhang Rui, Jingoo Han
Cc: linux-fbdev, linux-acpi, linux-pm, Srinivas Pandruvada
Since we will need the backlight_device_get_by_type API, we can use it
instead of the backlight_device_registered API whenever necessary so
remove the backlight_device_registered API.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
Acked-by: Jingoo Han <jg1.han@samsung.com>
---
drivers/acpi/video_detect.c | 2 +-
drivers/video/backlight/backlight.c | 6 ------
include/linux/backlight.h | 1 -
3 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
index 1316ddd92fac..3d1327615f72 100644
--- a/drivers/acpi/video_detect.c
+++ b/drivers/acpi/video_detect.c
@@ -358,7 +358,7 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void)
if (!(video_caps & ACPI_VIDEO_BACKLIGHT))
return acpi_backlight_vendor;
- if (acpi_osi_is_win8() && backlight_device_registered(BACKLIGHT_RAW))
+ if (acpi_osi_is_win8() && backlight_device_get_by_type(BACKLIGHT_RAW))
return acpi_backlight_native;
return acpi_backlight_video;
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index 18901b9b1eb4..288318ad21dd 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -407,12 +407,6 @@ struct backlight_device *backlight_device_get_by_type(enum backlight_type type)
}
EXPORT_SYMBOL(backlight_device_get_by_type);
-bool backlight_device_registered(enum backlight_type type)
-{
- return backlight_device_get_by_type(type) ? true : false;
-}
-EXPORT_SYMBOL(backlight_device_registered);
-
/**
* backlight_device_unregister - unregisters a backlight device object.
* @bd: the backlight device object to be unregistered and freed.
diff --git a/include/linux/backlight.h b/include/linux/backlight.h
index f46b88fa4a09..5f2fd61ef4fb 100644
--- a/include/linux/backlight.h
+++ b/include/linux/backlight.h
@@ -141,7 +141,6 @@ extern void devm_backlight_device_unregister(struct device *dev,
struct backlight_device *bd);
extern void backlight_force_update(struct backlight_device *bd,
enum backlight_update_reason reason);
-extern bool backlight_device_registered(enum backlight_type type);
extern int backlight_register_notifier(struct notifier_block *nb);
extern int backlight_unregister_notifier(struct notifier_block *nb);
extern struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
--
2.5.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 3/4] ACPI/video: export acpi_video_get_levels
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
2016-04-27 12:45 ` [PATCH v3 1/4] video / backlight: add two APIs for drivers to use Aaron Lu
2016-04-27 12:45 ` [PATCH v3 2/4] video / backlight: remove the backlight_device_registered API Aaron Lu
@ 2016-04-27 12:45 ` Aaron Lu
2016-04-27 12:45 ` [PATCH v3 4/4] Thermal: add INT3406 thermal driver Aaron Lu
2016-04-27 19:38 ` [PATCH v3 0/4] Support INT3406 Display thermal device Rafael J. Wysocki
4 siblings, 0 replies; 15+ messages in thread
From: Aaron Lu @ 2016-04-27 12:45 UTC (permalink / raw)
To: Rafael J. Wysocki, Zhang Rui, Jingoo Han
Cc: linux-fbdev, linux-acpi, linux-pm, Srinivas Pandruvada
The acpi_video_get_levels is useful for other drivers, i.e. the
to-be-added int3406 thermal driver, so export it.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
drivers/acpi/acpi_video.c | 83 +++++++++++++++++++++++++----------------------
include/acpi/video.h | 20 ++++++++++++
2 files changed, 65 insertions(+), 38 deletions(-)
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index 4361bc98ef4c..3d5b8a099351 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -191,19 +191,6 @@ struct acpi_video_device_cap {
u8 _DDC:1; /* Return the EDID for this device */
};
-struct acpi_video_brightness_flags {
- u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */
- u8 _BCL_reversed:1; /* _BCL package is in a reversed order */
- u8 _BQC_use_index:1; /* _BQC returns an index value */
-};
-
-struct acpi_video_device_brightness {
- int curr;
- int count;
- int *levels;
- struct acpi_video_brightness_flags flags;
-};
-
struct acpi_video_device {
unsigned long device_id;
struct acpi_video_device_flags flags;
@@ -325,7 +312,7 @@ static const struct thermal_cooling_device_ops video_cooling_ops = {
*/
static int
-acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
+acpi_video_device_lcd_query_levels(acpi_handle handle,
union acpi_object **levels)
{
int status;
@@ -335,7 +322,7 @@ acpi_video_device_lcd_query_levels(struct acpi_video_device *device,
*levels = NULL;
- status = acpi_evaluate_object(device->dev->handle, "_BCL", NULL, &buffer);
+ status = acpi_evaluate_object(handle, "_BCL", NULL, &buffer);
if (!ACPI_SUCCESS(status))
return status;
obj = (union acpi_object *)buffer.pointer;
@@ -766,36 +753,28 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device,
return 0;
}
-
-/*
- * Arg:
- * device : video output device (LCD, CRT, ..)
- *
- * Return Value:
- * Maximum brightness level
- *
- * Allocate and initialize device->brightness.
- */
-
-static int
-acpi_video_init_brightness(struct acpi_video_device *device)
+int acpi_video_get_levels(struct acpi_device *device,
+ struct acpi_video_device_brightness **dev_br)
{
union acpi_object *obj = NULL;
int i, max_level = 0, count = 0, level_ac_battery = 0;
- unsigned long long level, level_old;
union acpi_object *o;
struct acpi_video_device_brightness *br = NULL;
- int result = -EINVAL;
+ int result = 0;
u32 value;
- if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) {
+ if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device->handle,
+ &obj))) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available "
"LCD brightness level\n"));
+ result = -ENODEV;
goto out;
}
- if (obj->package.count < 2)
+ if (obj->package.count < 2) {
+ result = -EINVAL;
goto out;
+ }
br = kzalloc(sizeof(*br), GFP_KERNEL);
if (!br) {
@@ -861,6 +840,38 @@ acpi_video_init_brightness(struct acpi_video_device *device)
"Found unordered _BCL package"));
br->count = count;
+ *dev_br = br;
+
+out:
+ kfree(obj);
+ return result;
+out_free:
+ kfree(br);
+ goto out;
+}
+EXPORT_SYMBOL(acpi_video_get_levels);
+
+/*
+ * Arg:
+ * device : video output device (LCD, CRT, ..)
+ *
+ * Return Value:
+ * Maximum brightness level
+ *
+ * Allocate and initialize device->brightness.
+ */
+
+static int
+acpi_video_init_brightness(struct acpi_video_device *device)
+{
+ int i, max_level = 0;
+ unsigned long long level, level_old;
+ struct acpi_video_device_brightness *br = NULL;
+ int result = -EINVAL;
+
+ result = acpi_video_get_levels(device->dev, &br);
+ if (result)
+ return result;
device->brightness = br;
/* _BQC uses INDEX while _BCL uses VALUE in some laptops */
@@ -903,17 +914,13 @@ set_level:
goto out_free_levels;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
- "found %d brightness levels\n", count - 2));
- kfree(obj);
- return result;
+ "found %d brightness levels\n", br->count - 2));
+ return 0;
out_free_levels:
kfree(br->levels);
-out_free:
kfree(br);
-out:
device->brightness = NULL;
- kfree(obj);
return result;
}
diff --git a/include/acpi/video.h b/include/acpi/video.h
index 5ca2f2c16458..a4b96c971564 100644
--- a/include/acpi/video.h
+++ b/include/acpi/video.h
@@ -4,6 +4,19 @@
#include <linux/errno.h> /* for ENODEV */
#include <linux/types.h> /* for bool */
+struct acpi_video_brightness_flags {
+ u8 _BCL_no_ac_battery_levels:1; /* no AC/Battery levels in _BCL */
+ u8 _BCL_reversed:1; /* _BCL package is in a reversed order */
+ u8 _BQC_use_index:1; /* _BQC returns an index value */
+};
+
+struct acpi_video_device_brightness {
+ int curr;
+ int count;
+ int *levels;
+ struct acpi_video_brightness_flags flags;
+};
+
struct acpi_device;
#define ACPI_VIDEO_CLASS "video"
@@ -37,6 +50,8 @@ extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type);
* may change over time and should not be cached.
*/
extern bool acpi_video_handles_brightness_key_presses(void);
+extern int acpi_video_get_levels(struct acpi_device *device,
+ struct acpi_video_device_brightness **dev_br);
#else
static inline int acpi_video_register(void) { return 0; }
static inline void acpi_video_unregister(void) { return; }
@@ -56,6 +71,11 @@ static inline bool acpi_video_handles_brightness_key_presses(void)
{
return false;
}
+static int acpi_video_get_levels(struct acpi_device *device,
+ struct acpi_video_device_brightness **dev_br)
+{
+ return -ENODEV;
+}
#endif
#endif
--
2.5.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 4/4] Thermal: add INT3406 thermal driver
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
` (2 preceding siblings ...)
2016-04-27 12:45 ` [PATCH v3 3/4] ACPI/video: export acpi_video_get_levels Aaron Lu
@ 2016-04-27 12:45 ` Aaron Lu
2016-05-09 7:47 ` Zhang, Rui
2016-04-27 19:38 ` [PATCH v3 0/4] Support INT3406 Display thermal device Rafael J. Wysocki
4 siblings, 1 reply; 15+ messages in thread
From: Aaron Lu @ 2016-04-27 12:45 UTC (permalink / raw)
To: Rafael J. Wysocki, Zhang Rui, Jingoo Han
Cc: linux-fbdev, linux-acpi, linux-pm, Srinivas Pandruvada
INT3406 ACPI device object resembles an ACPI video output device, but its
_BCM is said to be deprecated and should not be used. So we will make
use of the raw interface to do the actual cooling.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
drivers/thermal/Kconfig | 28 +--
drivers/thermal/int340x_thermal/Kconfig | 42 ++++
drivers/thermal/int340x_thermal/Makefile | 1 +
drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
4 files changed, 282 insertions(+), 25 deletions(-)
create mode 100644 drivers/thermal/int340x_thermal/Kconfig
create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index c37eedc35a24..cb1ba70ceaa7 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -338,31 +338,9 @@ config INTEL_QUARK_DTS_THERMAL
hot & critical. The critical trip point default value is set by
underlying BIOS/Firmware.
-config INT340X_THERMAL
- tristate "ACPI INT340X thermal drivers"
- depends on X86 && ACPI
- select THERMAL_GOV_USER_SPACE
- select ACPI_THERMAL_REL
- select ACPI_FAN
- select INTEL_SOC_DTS_IOSF_CORE
- select THERMAL_WRITABLE_TRIPS
- help
- Newer laptops and tablets that use ACPI may have thermal sensors and
- other devices with thermal control capabilities outside the core
- CPU/SOC, for thermal safety reasons.
- They are exposed for the OS to use via the INT3400 ACPI device object
- as the master, and INT3401~INT340B ACPI device objects as the slaves.
- Enable this to expose the temperature information and cooling ability
- from these objects to userspace via the normal thermal framework.
- This means that a wide range of applications and GUI widgets can show
- the information to the user or use this information for making
- decisions. For example, the Intel Thermal Daemon can use this
- information to allow the user to select his laptop to run without
- turning on the fans.
-
-config ACPI_THERMAL_REL
- tristate
- depends on ACPI
+menu "ACPI INT340X thermal drivers"
+source drivers/thermal/int340x_thermal/Kconfig
+endmenu
config INTEL_PCH_THERMAL
tristate "Intel PCH Thermal Reporting Driver"
diff --git a/drivers/thermal/int340x_thermal/Kconfig b/drivers/thermal/int340x_thermal/Kconfig
new file mode 100644
index 000000000000..0582bd12a239
--- /dev/null
+++ b/drivers/thermal/int340x_thermal/Kconfig
@@ -0,0 +1,42 @@
+#
+# ACPI INT340x thermal drivers configuration
+#
+
+config INT340X_THERMAL
+ tristate "ACPI INT340X thermal drivers"
+ depends on X86 && ACPI
+ select THERMAL_GOV_USER_SPACE
+ select ACPI_THERMAL_REL
+ select ACPI_FAN
+ select INTEL_SOC_DTS_IOSF_CORE
+ help
+ Newer laptops and tablets that use ACPI may have thermal sensors and
+ other devices with thermal control capabilities outside the core
+ CPU/SOC, for thermal safety reasons.
+ They are exposed for the OS to use via the INT3400 ACPI device object
+ as the master, and INT3401~INT340B ACPI device objects as the slaves.
+ Enable this to expose the temperature information and cooling ability
+ from these objects to userspace via the normal thermal framework.
+ This means that a wide range of applications and GUI widgets can show
+ the information to the user or use this information for making
+ decisions. For example, the Intel Thermal Daemon can use this
+ information to allow the user to select his laptop to run without
+ turning on the fans.
+
+config ACPI_THERMAL_REL
+ tristate
+ depends on ACPI
+
+if INT340X_THERMAL
+
+config INT3406_THERMAL
+ tristate "ACPI INT3406 display thermal driver"
+ depends on ACPI_VIDEO
+ help
+ The display thermal device represents the LED/LCD display panel
+ that may or may not include touch support. The main function of
+ the display thermal device is to allow control of the display
+ brightness in order to address a thermal condition or to reduce
+ power consumed by display device.
+
+endif
diff --git a/drivers/thermal/int340x_thermal/Makefile b/drivers/thermal/int340x_thermal/Makefile
index ba77a34f659f..df0df055e7ff 100644
--- a/drivers/thermal/int340x_thermal/Makefile
+++ b/drivers/thermal/int340x_thermal/Makefile
@@ -3,4 +3,5 @@ obj-$(CONFIG_INT340X_THERMAL) += int340x_thermal_zone.o
obj-$(CONFIG_INT340X_THERMAL) += int3402_thermal.o
obj-$(CONFIG_INT340X_THERMAL) += int3403_thermal.o
obj-$(CONFIG_INT340X_THERMAL) += processor_thermal_device.o
+obj-$(CONFIG_INT3406_THERMAL) += int3406_thermal.o
obj-$(CONFIG_ACPI_THERMAL_REL) += acpi_thermal_rel.o
diff --git a/drivers/thermal/int340x_thermal/int3406_thermal.c b/drivers/thermal/int340x_thermal/int3406_thermal.c
new file mode 100644
index 000000000000..1c9b7590f098
--- /dev/null
+++ b/drivers/thermal/int340x_thermal/int3406_thermal.c
@@ -0,0 +1,236 @@
+/*
+ * INT3406 thermal driver for display participant device
+ *
+ * Copyright (C) 2014, Intel Corporation
+ * Authors: Aaron Lu <aaron.lu@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/acpi.h>
+#include <linux/backlight.h>
+#include <linux/thermal.h>
+#include <acpi/video.h>
+
+#define INT3406_BRIGHTNESS_LIMITS_CHANGED 0x80
+
+struct int3406_thermal_data {
+ int upper_limit;
+ int upper_limit_index;
+ int lower_limit;
+ int lower_limit_index;
+ acpi_handle handle;
+ struct acpi_video_device_brightness *br;
+ struct backlight_device *raw_bd;
+ struct thermal_cooling_device *cooling_dev;
+};
+
+static int int3406_thermal_to_raw(int level, struct int3406_thermal_data *d)
+{
+ int max_level = d->br->levels[d->br->count - 1];
+ int raw_max = d->raw_bd->props.max_brightness;
+
+ return level * raw_max / max_level;
+}
+
+static int int3406_thermal_to_acpi(int level, struct int3406_thermal_data *d)
+{
+ int raw_max = d->raw_bd->props.max_brightness;
+ int max_level = d->br->levels[d->br->count - 1];
+
+ return level * max_level / raw_max;
+}
+
+static int
+int3406_thermal_get_max_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long *state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int index = d->lower_limit_index ? d->lower_limit_index : 2;
+
+ *state = d->br->count - 1 - index;
+ return 0;
+}
+
+static int
+int3406_thermal_set_cur_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int level, raw_level;
+
+ if (state > d->br->count - 3)
+ return -EINVAL;
+
+ state = d->br->count - 1 - state;
+ level = d->br->levels[state];
+
+ if ((d->upper_limit && level > d->upper_limit) ||
+ (d->lower_limit && level < d->lower_limit))
+ return -EINVAL;
+
+ raw_level = int3406_thermal_to_raw(level, d);
+ return backlight_device_set_brightness(d->raw_bd, raw_level);
+}
+
+static int
+int3406_thermal_get_cur_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long *state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int raw_level, level, i;
+ int *levels = d->br->levels;
+
+ raw_level = d->raw_bd->props.brightness;
+ level = int3406_thermal_to_acpi(raw_level, d);
+
+ /*
+ * There is no 1:1 mapping between the firmware interface level with the
+ * raw interface level, we will have to find one that is close enough.
+ */
+ for (i = 2; i < d->br->count; i++) {
+ if (level < levels[i]) {
+ if (i = 2)
+ break;
+ if ((level - levels[i - 1]) < (levels[i] - level))
+ i--;
+ break;
+ }
+ }
+
+ *state = d->br->count - 1 - i;
+ return 0;
+}
+
+static const struct thermal_cooling_device_ops video_cooling_ops = {
+ .get_max_state = int3406_thermal_get_max_state,
+ .get_cur_state = int3406_thermal_get_cur_state,
+ .set_cur_state = int3406_thermal_set_cur_state,
+};
+
+static int int3406_thermal_get_index(int *array, int nr, int value)
+{
+ int i;
+
+ for (i = 0; i < nr; i++) {
+ if (array[i] = value)
+ break;
+ }
+ return i = nr ? -ENOENT : i;
+}
+
+static void int3406_thermal_get_limit(struct int3406_thermal_data *d)
+{
+ acpi_status status;
+ unsigned long long lower_limit, upper_limit;
+ int index;
+
+ status = acpi_evaluate_integer(d->handle, "DDDL", NULL, &lower_limit);
+ if (ACPI_SUCCESS(status)) {
+ index = int3406_thermal_get_index(d->br->levels, d->br->count,
+ lower_limit);
+ if (index > 0) {
+ d->lower_limit = (int)lower_limit;
+ d->lower_limit_index = index;
+ }
+ }
+
+ status = acpi_evaluate_integer(d->handle, "DDPC", NULL, &upper_limit);
+ if (ACPI_SUCCESS(status)) {
+ index = int3406_thermal_get_index(d->br->levels, d->br->count,
+ upper_limit);
+ if (index > 0) {
+ d->upper_limit = (int)upper_limit;
+ d->upper_limit_index = index;
+ }
+ }
+}
+
+static void int3406_notify(acpi_handle handle, u32 event, void *data)
+{
+ if (event = INT3406_BRIGHTNESS_LIMITS_CHANGED)
+ int3406_thermal_get_limit(data);
+}
+
+static int int3406_thermal_probe(struct platform_device *pdev)
+{
+ struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+ struct int3406_thermal_data *d;
+ struct backlight_device *bd;
+ int ret;
+
+ if (!ACPI_HANDLE(&pdev->dev))
+ return -ENODEV;
+
+ d = devm_kzalloc(&pdev->dev, sizeof(*d), GFP_KERNEL);
+ if (!d)
+ return -ENOMEM;
+ d->handle = ACPI_HANDLE(&pdev->dev);
+
+ bd = backlight_device_get_by_type(BACKLIGHT_RAW);
+ if (!bd)
+ return -ENODEV;
+ d->raw_bd = bd;
+
+ ret = acpi_video_get_levels(ACPI_COMPANION(&pdev->dev), &d->br);
+ if (ret)
+ return ret;
+
+ int3406_thermal_get_limit(d);
+
+ d->cooling_dev = thermal_cooling_device_register(acpi_device_bid(adev),
+ d, &video_cooling_ops);
+ if (IS_ERR(d->cooling_dev))
+ goto err;
+
+ ret = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
+ int3406_notify, d);
+ if (ret)
+ goto err_cdev;
+
+ platform_set_drvdata(pdev, d);
+
+ return 0;
+
+err_cdev:
+ thermal_cooling_device_unregister(d->cooling_dev);
+err:
+ kfree(d->br);
+ return -ENODEV;
+}
+
+static int int3406_thermal_remove(struct platform_device *pdev)
+{
+ struct int3406_thermal_data *d = platform_get_drvdata(pdev);
+
+ thermal_cooling_device_unregister(d->cooling_dev);
+ kfree(d->br);
+ return 0;
+}
+
+static const struct acpi_device_id int3406_thermal_match[] = {
+ {"INT3406", 0},
+ {}
+};
+
+MODULE_DEVICE_TABLE(acpi, int3406_thermal_match);
+
+static struct platform_driver int3406_thermal_driver = {
+ .probe = int3406_thermal_probe,
+ .remove = int3406_thermal_remove,
+ .driver = {
+ .name = "int3406 thermal",
+ .owner = THIS_MODULE,
+ .acpi_match_table = int3406_thermal_match,
+ },
+};
+
+module_platform_driver(int3406_thermal_driver);
+
+MODULE_DESCRIPTION("INT3406 Thermal driver");
+MODULE_LICENSE("GPL");
--
2.5.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
` (3 preceding siblings ...)
2016-04-27 12:45 ` [PATCH v3 4/4] Thermal: add INT3406 thermal driver Aaron Lu
@ 2016-04-27 19:38 ` Rafael J. Wysocki
2016-04-28 1:48 ` Aaron Lu
4 siblings, 1 reply; 15+ messages in thread
From: Rafael J. Wysocki @ 2016-04-27 19:38 UTC (permalink / raw)
To: Aaron Lu
Cc: Rafael J. Wysocki, Zhang Rui, Jingoo Han,
open list:FRAMEBUFFER LAYER, ACPI Devel Maling List,
linux-pm@vger.kernel.org, Srinivas Pandruvada
On Wed, Apr 27, 2016 at 2:45 PM, Aaron Lu <aaron.lu@intel.com> wrote:
> v3:
> Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
> and one adds the int3406 driver as suggested by Rafael. There should
> be no functionality change compared to v2.
>
> v2:
> The display thermal device represents the LED/LCD display panel
> that may or may not include touch support. The main function of
> the display thermal device is to allow control of the display
> brightness in order to address a thermal condition or to reduce
> power consumed by display device.
>
> Due to the way this thermal device changes brightness level is said
> to be deprecated so we are using the raw interface to do the actual
> backlight change. This requires the backlight core support so two
> new APIs are added and exported in patch 1/3. With this, the previous
> API backlight_device_registered can be removed and this is done in
> patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
>
> The 1st version is here:
> http://thread.gmane.org/gmane.linux.acpi.devel/72619
>
> This whole series should go through the thermal tree if applied.
>
> Aaron Lu (3):
> video / backlight: add two APIs for drivers to use
> video / backlight: remove the backlight_device_registered API
> Thermal: add INT3406 thermal driver
>
> drivers/acpi/acpi_video.c | 83 ++++----
> drivers/acpi/video_detect.c | 2 +-
> drivers/thermal/Kconfig | 28 +--
> drivers/thermal/int340x_thermal/Kconfig | 42 ++++
> drivers/thermal/int340x_thermal/Makefile | 1 +
> drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
> drivers/video/backlight/backlight.c | 39 ++--
> include/acpi/video.h | 20 ++
> include/linux/backlight.h | 3 +-
> 9 files changed, 374 insertions(+), 80 deletions(-)
> create mode 100644 drivers/thermal/int340x_thermal/Kconfig
> create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
The first three patches in this series look OK to me, so
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
for the [1-3/4].
That said it may be better if those three go in via ACPI. I can put
them into a separate branch for Rui to pull from.
Please let me know what you think.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-04-27 19:38 ` [PATCH v3 0/4] Support INT3406 Display thermal device Rafael J. Wysocki
@ 2016-04-28 1:48 ` Aaron Lu
2016-05-04 21:47 ` Rafael J. Wysocki
0 siblings, 1 reply; 15+ messages in thread
From: Aaron Lu @ 2016-04-28 1:48 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Rafael J. Wysocki, Zhang Rui, Jingoo Han,
open list:FRAMEBUFFER LAYER, ACPI Devel Maling List,
linux-pm@vger.kernel.org, Srinivas Pandruvada
On 04/28/2016 03:38 AM, Rafael J. Wysocki wrote:
> On Wed, Apr 27, 2016 at 2:45 PM, Aaron Lu <aaron.lu@intel.com> wrote:
>> v3:
>> Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
>> and one adds the int3406 driver as suggested by Rafael. There should
>> be no functionality change compared to v2.
>>
>> v2:
>> The display thermal device represents the LED/LCD display panel
>> that may or may not include touch support. The main function of
>> the display thermal device is to allow control of the display
>> brightness in order to address a thermal condition or to reduce
>> power consumed by display device.
>>
>> Due to the way this thermal device changes brightness level is said
>> to be deprecated so we are using the raw interface to do the actual
>> backlight change. This requires the backlight core support so two
>> new APIs are added and exported in patch 1/3. With this, the previous
>> API backlight_device_registered can be removed and this is done in
>> patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
>>
>> The 1st version is here:
>> http://thread.gmane.org/gmane.linux.acpi.devel/72619
>>
>> This whole series should go through the thermal tree if applied.
>>
>> Aaron Lu (3):
>> video / backlight: add two APIs for drivers to use
>> video / backlight: remove the backlight_device_registered API
>> Thermal: add INT3406 thermal driver
>>
>> drivers/acpi/acpi_video.c | 83 ++++----
>> drivers/acpi/video_detect.c | 2 +-
>> drivers/thermal/Kconfig | 28 +--
>> drivers/thermal/int340x_thermal/Kconfig | 42 ++++
>> drivers/thermal/int340x_thermal/Makefile | 1 +
>> drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
>> drivers/video/backlight/backlight.c | 39 ++--
>> include/acpi/video.h | 20 ++
>> include/linux/backlight.h | 3 +-
>> 9 files changed, 374 insertions(+), 80 deletions(-)
>> create mode 100644 drivers/thermal/int340x_thermal/Kconfig
>> create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
>
> The first three patches in this series look OK to me, so
>
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> for the [1-3/4].
>
> That said it may be better if those three go in via ACPI. I can put
> them into a separate branch for Rui to pull from.
>
> Please let me know what you think.
I have no problem with that.
Regards,
Aaron
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-04-28 1:48 ` Aaron Lu
@ 2016-05-04 21:47 ` Rafael J. Wysocki
2016-05-06 6:45 ` Aaron Lu
0 siblings, 1 reply; 15+ messages in thread
From: Rafael J. Wysocki @ 2016-05-04 21:47 UTC (permalink / raw)
To: Aaron Lu
Cc: Rafael J. Wysocki, Zhang Rui, Jingoo Han,
open list:FRAMEBUFFER LAYER, ACPI Devel Maling List,
linux-pm@vger.kernel.org, Srinivas Pandruvada
On Thursday, April 28, 2016 09:48:30 AM Aaron Lu wrote:
> On 04/28/2016 03:38 AM, Rafael J. Wysocki wrote:
> > On Wed, Apr 27, 2016 at 2:45 PM, Aaron Lu <aaron.lu@intel.com> wrote:
> >> v3:
> >> Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
> >> and one adds the int3406 driver as suggested by Rafael. There should
> >> be no functionality change compared to v2.
> >>
> >> v2:
> >> The display thermal device represents the LED/LCD display panel
> >> that may or may not include touch support. The main function of
> >> the display thermal device is to allow control of the display
> >> brightness in order to address a thermal condition or to reduce
> >> power consumed by display device.
> >>
> >> Due to the way this thermal device changes brightness level is said
> >> to be deprecated so we are using the raw interface to do the actual
> >> backlight change. This requires the backlight core support so two
> >> new APIs are added and exported in patch 1/3. With this, the previous
> >> API backlight_device_registered can be removed and this is done in
> >> patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
> >>
> >> The 1st version is here:
> >> http://thread.gmane.org/gmane.linux.acpi.devel/72619
> >>
> >> This whole series should go through the thermal tree if applied.
> >>
> >> Aaron Lu (3):
> >> video / backlight: add two APIs for drivers to use
> >> video / backlight: remove the backlight_device_registered API
> >> Thermal: add INT3406 thermal driver
> >>
> >> drivers/acpi/acpi_video.c | 83 ++++----
> >> drivers/acpi/video_detect.c | 2 +-
> >> drivers/thermal/Kconfig | 28 +--
> >> drivers/thermal/int340x_thermal/Kconfig | 42 ++++
> >> drivers/thermal/int340x_thermal/Makefile | 1 +
> >> drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
> >> drivers/video/backlight/backlight.c | 39 ++--
> >> include/acpi/video.h | 20 ++
> >> include/linux/backlight.h | 3 +-
> >> 9 files changed, 374 insertions(+), 80 deletions(-)
> >> create mode 100644 drivers/thermal/int340x_thermal/Kconfig
> >> create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
> >
> > The first three patches in this series look OK to me, so
> >
> > Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> >
> > for the [1-3/4].
> >
> > That said it may be better if those three go in via ACPI. I can put
> > them into a separate branch for Rui to pull from.
> >
> > Please let me know what you think.
>
> I have no problem with that.
OK
[1-3/4] have been queued up for 4.7 in my tree. Please let me know if you
want me to expose the branch containing them.
Thanks,
Rafael
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-05-04 21:47 ` Rafael J. Wysocki
@ 2016-05-06 6:45 ` Aaron Lu
2016-05-09 7:49 ` Zhang, Rui
0 siblings, 1 reply; 15+ messages in thread
From: Aaron Lu @ 2016-05-06 6:45 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Rafael J. Wysocki, Zhang Rui, Jingoo Han,
open list:FRAMEBUFFER LAYER, ACPI Devel Maling List,
linux-pm@vger.kernel.org, Srinivas Pandruvada
On 05/05/2016 05:47 AM, Rafael J. Wysocki wrote:
> On Thursday, April 28, 2016 09:48:30 AM Aaron Lu wrote:
>> On 04/28/2016 03:38 AM, Rafael J. Wysocki wrote:
>>> On Wed, Apr 27, 2016 at 2:45 PM, Aaron Lu <aaron.lu@intel.com> wrote:
>>>> v3:
>>>> Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
>>>> and one adds the int3406 driver as suggested by Rafael. There should
>>>> be no functionality change compared to v2.
>>>>
>>>> v2:
>>>> The display thermal device represents the LED/LCD display panel
>>>> that may or may not include touch support. The main function of
>>>> the display thermal device is to allow control of the display
>>>> brightness in order to address a thermal condition or to reduce
>>>> power consumed by display device.
>>>>
>>>> Due to the way this thermal device changes brightness level is said
>>>> to be deprecated so we are using the raw interface to do the actual
>>>> backlight change. This requires the backlight core support so two
>>>> new APIs are added and exported in patch 1/3. With this, the previous
>>>> API backlight_device_registered can be removed and this is done in
>>>> patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
>>>>
>>>> The 1st version is here:
>>>> http://thread.gmane.org/gmane.linux.acpi.devel/72619
>>>>
>>>> This whole series should go through the thermal tree if applied.
>>>>
>>>> Aaron Lu (3):
>>>> video / backlight: add two APIs for drivers to use
>>>> video / backlight: remove the backlight_device_registered API
>>>> Thermal: add INT3406 thermal driver
>>>>
>>>> drivers/acpi/acpi_video.c | 83 ++++----
>>>> drivers/acpi/video_detect.c | 2 +-
>>>> drivers/thermal/Kconfig | 28 +--
>>>> drivers/thermal/int340x_thermal/Kconfig | 42 ++++
>>>> drivers/thermal/int340x_thermal/Makefile | 1 +
>>>> drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
>>>> drivers/video/backlight/backlight.c | 39 ++--
>>>> include/acpi/video.h | 20 ++
>>>> include/linux/backlight.h | 3 +-
>>>> 9 files changed, 374 insertions(+), 80 deletions(-)
>>>> create mode 100644 drivers/thermal/int340x_thermal/Kconfig
>>>> create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
>>>
>>> The first three patches in this series look OK to me, so
>>>
>>> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>>>
>>> for the [1-3/4].
>>>
>>> That said it may be better if those three go in via ACPI. I can put
>>> them into a separate branch for Rui to pull from.
>>>
>>> Please let me know what you think.
>>
>> I have no problem with that.
>
> OK
>
> [1-3/4] have been queued up for 4.7 in my tree. Please let me know if you
> want me to expose the branch containing them.
Thanks a lot!
Rui,
Do you need a branch so that you can pull and merge 4/4 on top of that?
Regards,
Aaron
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 4/4] Thermal: add INT3406 thermal driver
2016-04-27 12:45 ` [PATCH v3 4/4] Thermal: add INT3406 thermal driver Aaron Lu
@ 2016-05-09 7:47 ` Zhang, Rui
2016-05-09 7:54 ` [PATCH v3 update " Aaron Lu
0 siblings, 1 reply; 15+ messages in thread
From: Zhang, Rui @ 2016-05-09 7:47 UTC (permalink / raw)
To: Lu, Aaron
Cc: jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-pm@vger.kernel.org, rjw@rjwysocki.net,
linux-acpi@vger.kernel.org
T24gV2VkLCAyMDE2LTA0LTI3IGF0IDIwOjQ1ICswODAwLCBBYXJvbiBMdSB3cm90ZToNCj4gZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvaW50MzQwNl90aGVybWFs
LmMgYi9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0MDZfdGhlcm1hbC5jDQo+
IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMWM5Yjc1OTBmMDk4
DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1h
bC9pbnQzNDA2X3RoZXJtYWwuYw0KPiBAQCAtMCwwICsxLDIzNiBAQA0KPiArLyoNCj4gKyAqIElO
VDM0MDYgdGhlcm1hbCBkcml2ZXIgZm9yIGRpc3BsYXkgcGFydGljaXBhbnQgZGV2aWNlDQo+ICsg
Kg0KPiArICogQ29weXJpZ2h0IChDKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbg0KDQpTaG91bGQg
YmUgMjAxNiwgcmlnaHQ/DQoNCj4gKyAqIEF1dGhvcnM6IEFhcm9uIEx1IDxhYXJvbi5sdUBpbnRl
bC5jb20+DQo+ICsgKg0KPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzDQo+ICsgKiBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCj4gKyAqDQo+ICsgKi8N
Cj4gKw0KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L3Bs
YXRmb3JtX2RldmljZS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4NCj4gKyNpbmNsdWRl
IDxsaW51eC9iYWNrbGlnaHQuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+DQo+ICsj
aW5jbHVkZSA8YWNwaS92aWRlby5oPg0KPiArDQoNCj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNw
aSwgaW50MzQwNl90aGVybWFsX21hdGNoKTsNCj4gKw0KPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9y
bV9kcml2ZXIgaW50MzQwNl90aGVybWFsX2RyaXZlciA9IHsNCj4gKwkucHJvYmUgPSBpbnQzNDA2
X3RoZXJtYWxfcHJvYmUsDQo+ICsJLnJlbW92ZSA9IGludDM0MDZfdGhlcm1hbF9yZW1vdmUsDQo+
ICsJLmRyaXZlciA9IHsNCj4gKwkJICAgLm5hbWUgPSAiaW50MzQwNiB0aGVybWFsIiwNCj4gKwkJ
ICAgLm93bmVyID0gVEhJU19NT0RVTEUsDQo+ICsJCSAgIC5hY3BpX21hdGNoX3RhYmxlID0gaW50
MzQwNl90aGVybWFsX21hdGNoLA0KPiArCQkgICB9LA0KPiArfTsNCj4gKw0KPiArbW9kdWxlX3Bs
YXRmb3JtX2RyaXZlcihpbnQzNDA2X3RoZXJtYWxfZHJpdmVyKTsNCj4gKw0KPiArTU9EVUxFX0RF
U0NSSVBUSU9OKCJJTlQzNDA2IFRoZXJtYWwgZHJpdmVyIik7DQo+ICtNT0RVTEVfTElDRU5TRSgi
R1BMIik7DQoNCk1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKQ0KDQp0aGFua3MsDQpydWkNCg0K
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-05-06 6:45 ` Aaron Lu
@ 2016-05-09 7:49 ` Zhang, Rui
2016-05-09 12:23 ` Rafael J. Wysocki
0 siblings, 1 reply; 15+ messages in thread
From: Zhang, Rui @ 2016-05-09 7:49 UTC (permalink / raw)
To: Lu, Aaron
Cc: jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-acpi@vger.kernel.org,
linux-pm@vger.kernel.org, rjw@rjwysocki.net, rafael@kernel.org
T24gRnJpLCAyMDE2LTA1LTA2IGF0IDE0OjQ1ICswODAwLCBBYXJvbiBMdSB3cm90ZToNCj4gT24g
MDUvMDUvMjAxNiAwNTo0NyBBTSwgUmFmYWVsIEouIFd5c29ja2kgd3JvdGU6DQo+ID4gT24gVGh1
cnNkYXksIEFwcmlsIDI4LCAyMDE2IDA5OjQ4OjMwIEFNIEFhcm9uIEx1IHdyb3RlOg0KPiA+PiBP
biAwNC8yOC8yMDE2IDAzOjM4IEFNLCBSYWZhZWwgSi4gV3lzb2NraSB3cm90ZToNCj4gPj4+IE9u
IFdlZCwgQXByIDI3LCAyMDE2IGF0IDI6NDUgUE0sIEFhcm9uIEx1IDxhYXJvbi5sdUBpbnRlbC5j
b20+IHdyb3RlOg0KPiA+Pj4+IHYzOg0KPiA+Pj4+IFNwbGl0IHBhdGNoIDMvMyBpbiB2MiBpbnRv
IDIgcGF0Y2hlczogb25lIG1ha2VzIGNoYW5nZXMgdG8gYWNwaV92aWRlbw0KPiA+Pj4+IGFuZCBv
bmUgYWRkcyB0aGUgaW50MzQwNiBkcml2ZXIgYXMgc3VnZ2VzdGVkIGJ5IFJhZmFlbC4gVGhlcmUg
c2hvdWxkDQo+ID4+Pj4gYmUgbm8gZnVuY3Rpb25hbGl0eSBjaGFuZ2UgY29tcGFyZWQgdG8gdjIu
DQo+ID4+Pj4NCj4gPj4+PiB2MjoNCj4gPj4+PiBUaGUgZGlzcGxheSB0aGVybWFsIGRldmljZSBy
ZXByZXNlbnRzIHRoZSBMRUQvTENEIGRpc3BsYXkgcGFuZWwNCj4gPj4+PiB0aGF0IG1heSBvciBt
YXkgbm90IGluY2x1ZGUgdG91Y2ggc3VwcG9ydC4gVGhlIG1haW4gZnVuY3Rpb24gb2YNCj4gPj4+
PiB0aGUgZGlzcGxheSB0aGVybWFsIGRldmljZSBpcyB0byBhbGxvdyBjb250cm9sIG9mIHRoZSBk
aXNwbGF5DQo+ID4+Pj4gYnJpZ2h0bmVzcyBpbiBvcmRlciB0byBhZGRyZXNzIGEgdGhlcm1hbCBj
b25kaXRpb24gb3IgdG8gcmVkdWNlDQo+ID4+Pj4gcG93ZXIgY29uc3VtZWQgYnkgZGlzcGxheSBk
ZXZpY2UuDQo+ID4+Pj4NCj4gPj4+PiBEdWUgdG8gdGhlIHdheSB0aGlzIHRoZXJtYWwgZGV2aWNl
IGNoYW5nZXMgYnJpZ2h0bmVzcyBsZXZlbCBpcyBzYWlkDQo+ID4+Pj4gdG8gYmUgZGVwcmVjYXRl
ZCBzbyB3ZSBhcmUgdXNpbmcgdGhlIHJhdyBpbnRlcmZhY2UgdG8gZG8gdGhlIGFjdHVhbA0KPiA+
Pj4+IGJhY2tsaWdodCBjaGFuZ2UuIFRoaXMgcmVxdWlyZXMgdGhlIGJhY2tsaWdodCBjb3JlIHN1
cHBvcnQgc28gdHdvDQo+ID4+Pj4gbmV3IEFQSXMgYXJlIGFkZGVkIGFuZCBleHBvcnRlZCBpbiBw
YXRjaCAxLzMuIFdpdGggdGhpcywgdGhlIHByZXZpb3VzDQo+ID4+Pj4gQVBJIGJhY2tsaWdodF9k
ZXZpY2VfcmVnaXN0ZXJlZCBjYW4gYmUgcmVtb3ZlZCBhbmQgdGhpcyBpcyBkb25lIGluDQo+ID4+
Pj4gcGF0Y2ggMi8zLiBQYXRjaCAzLzMgYWRkcyB0aGUgbmV3IGludDM0MDYgdGhlcm1hbCBkcml2
ZXIuDQo+ID4+Pj4NCj4gPj4+PiBUaGUgMXN0IHZlcnNpb24gaXMgaGVyZToNCj4gPj4+PiBodHRw
Oi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5saW51eC5hY3BpLmRldmVsLzcyNjE5DQo+ID4+Pj4N
Cj4gPj4+PiBUaGlzIHdob2xlIHNlcmllcyBzaG91bGQgZ28gdGhyb3VnaCB0aGUgdGhlcm1hbCB0
cmVlIGlmIGFwcGxpZWQuDQo+ID4+Pj4NCj4gPj4+PiBBYXJvbiBMdSAoMyk6DQo+ID4+Pj4gICB2
aWRlbyAvIGJhY2tsaWdodDogYWRkIHR3byBBUElzIGZvciBkcml2ZXJzIHRvIHVzZQ0KPiA+Pj4+
ICAgdmlkZW8gLyBiYWNrbGlnaHQ6IHJlbW92ZSB0aGUgYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rl
cmVkIEFQSQ0KPiA+Pj4+ICAgVGhlcm1hbDogYWRkIElOVDM0MDYgdGhlcm1hbCBkcml2ZXINCj4g
Pj4+Pg0KPiA+Pj4+ICBkcml2ZXJzL2FjcGkvYWNwaV92aWRlby5jICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgIDgzICsrKystLS0tDQo+ID4+Pj4gIGRyaXZlcnMvYWNwaS92aWRlb19kZXRlY3Qu
YyAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0NCj4gPj4+PiAgZHJpdmVycy90aGVybWFs
L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyOCArLS0NCj4gPj4+PiAgZHJp
dmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9LY29uZmlnICAgICAgICAgICB8ICA0MiArKysr
DQo+ID4+Pj4gIGRyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvTWFrZWZpbGUgICAgICAg
ICAgfCAgIDEgKw0KPiA+Pj4+ICBkcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0
MDZfdGhlcm1hbC5jIHwgMjM2ICsrKysrKysrKysrKysrKysrKysrKysNCj4gPj4+PiAgZHJpdmVy
cy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMgICAgICAgICAgICAgICB8ICAzOSArKy0tDQo+
ID4+Pj4gIGluY2x1ZGUvYWNwaS92aWRlby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
fCAgMjAgKysNCj4gPj4+PiAgaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaCAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgMyArLQ0KPiA+Pj4+ICA5IGZpbGVzIGNoYW5nZWQsIDM3NCBpbnNlcnRp
b25zKCspLCA4MCBkZWxldGlvbnMoLSkNCj4gPj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl
cnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvS2NvbmZpZw0KPiA+Pj4+ICBjcmVhdGUgbW9kZSAx
MDA2NDQgZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYw0K
PiA+Pj4NCj4gPj4+IFRoZSBmaXJzdCB0aHJlZSBwYXRjaGVzIGluIHRoaXMgc2VyaWVzIGxvb2sg
T0sgdG8gbWUsIHNvDQo+ID4+Pg0KPiA+Pj4gQWNrZWQtYnk6IFJhZmFlbCBKLiBXeXNvY2tpIDxy
YWZhZWwuai53eXNvY2tpQGludGVsLmNvbT4NCj4gPj4+DQo+ID4+PiBmb3IgdGhlIFsxLTMvNF0u
DQo+ID4+Pg0KPiA+Pj4gVGhhdCBzYWlkIGl0IG1heSBiZSBiZXR0ZXIgaWYgdGhvc2UgdGhyZWUg
Z28gaW4gdmlhIEFDUEkuICBJIGNhbiBwdXQNCj4gPj4+IHRoZW0gaW50byBhIHNlcGFyYXRlIGJy
YW5jaCBmb3IgUnVpIHRvIHB1bGwgZnJvbS4NCj4gPj4+DQo+ID4+PiBQbGVhc2UgbGV0IG1lIGtu
b3cgd2hhdCB5b3UgdGhpbmsuDQo+ID4+DQo+ID4+IEkgaGF2ZSBubyBwcm9ibGVtIHdpdGggdGhh
dC4NCj4gPiANCj4gPiBPSw0KPiA+IA0KPiA+IFsxLTMvNF0gaGF2ZSBiZWVuIHF1ZXVlZCB1cCBm
b3IgNC43IGluIG15IHRyZWUuICBQbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91DQo+ID4gd2FudCBt
ZSB0byBleHBvc2UgdGhlIGJyYW5jaCBjb250YWluaW5nIHRoZW0uDQo+IA0KPiBUaGFua3MgYSBs
b3QhDQo+IA0KPiBSdWksDQo+IA0KPiBEbyB5b3UgbmVlZCBhIGJyYW5jaCBzbyB0aGF0IHlvdSBj
YW4gcHVsbCBhbmQgbWVyZ2UgNC80IG9uIHRvcCBvZiB0aGF0Pw0KPiANClJhZmFlbCwgY2FuIHlv
dSBwbGVhc2UgdGFrZSBwYXRjaCA0LzQgYXMgd2VsbD8NCkl0IHNob3VsZCBub3QgY29uZmxpY3Qg
d2l0aCBteSBvdGhlciB0aGVybWFsIG1hdGVyaWFsLg0KDQp0aGFua3MsDQpydWkNCg=
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 update 4/4] Thermal: add INT3406 thermal driver
2016-05-09 7:47 ` Zhang, Rui
@ 2016-05-09 7:54 ` Aaron Lu
2016-05-10 8:08 ` Zhang, Rui
0 siblings, 1 reply; 15+ messages in thread
From: Aaron Lu @ 2016-05-09 7:54 UTC (permalink / raw)
To: Zhang, Rui
Cc: jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-pm@vger.kernel.org, rjw@rjwysocki.net,
linux-acpi@vger.kernel.org
INT3406 ACPI device object resembles an ACPI video output device, but its
_BCM is said to be deprecated and should not be used. So we will make
use of the raw interface to do the actual cooling.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
update: change copyright to 2016 and license to GPL v2 as suggested by Rui.
drivers/thermal/Kconfig | 28 +--
drivers/thermal/int340x_thermal/Kconfig | 42 ++++
drivers/thermal/int340x_thermal/Makefile | 1 +
drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
4 files changed, 282 insertions(+), 25 deletions(-)
create mode 100644 drivers/thermal/int340x_thermal/Kconfig
create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index c37eedc35a24..cb1ba70ceaa7 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -338,31 +338,9 @@ config INTEL_QUARK_DTS_THERMAL
hot & critical. The critical trip point default value is set by
underlying BIOS/Firmware.
-config INT340X_THERMAL
- tristate "ACPI INT340X thermal drivers"
- depends on X86 && ACPI
- select THERMAL_GOV_USER_SPACE
- select ACPI_THERMAL_REL
- select ACPI_FAN
- select INTEL_SOC_DTS_IOSF_CORE
- select THERMAL_WRITABLE_TRIPS
- help
- Newer laptops and tablets that use ACPI may have thermal sensors and
- other devices with thermal control capabilities outside the core
- CPU/SOC, for thermal safety reasons.
- They are exposed for the OS to use via the INT3400 ACPI device object
- as the master, and INT3401~INT340B ACPI device objects as the slaves.
- Enable this to expose the temperature information and cooling ability
- from these objects to userspace via the normal thermal framework.
- This means that a wide range of applications and GUI widgets can show
- the information to the user or use this information for making
- decisions. For example, the Intel Thermal Daemon can use this
- information to allow the user to select his laptop to run without
- turning on the fans.
-
-config ACPI_THERMAL_REL
- tristate
- depends on ACPI
+menu "ACPI INT340X thermal drivers"
+source drivers/thermal/int340x_thermal/Kconfig
+endmenu
config INTEL_PCH_THERMAL
tristate "Intel PCH Thermal Reporting Driver"
diff --git a/drivers/thermal/int340x_thermal/Kconfig b/drivers/thermal/int340x_thermal/Kconfig
new file mode 100644
index 000000000000..0582bd12a239
--- /dev/null
+++ b/drivers/thermal/int340x_thermal/Kconfig
@@ -0,0 +1,42 @@
+#
+# ACPI INT340x thermal drivers configuration
+#
+
+config INT340X_THERMAL
+ tristate "ACPI INT340X thermal drivers"
+ depends on X86 && ACPI
+ select THERMAL_GOV_USER_SPACE
+ select ACPI_THERMAL_REL
+ select ACPI_FAN
+ select INTEL_SOC_DTS_IOSF_CORE
+ help
+ Newer laptops and tablets that use ACPI may have thermal sensors and
+ other devices with thermal control capabilities outside the core
+ CPU/SOC, for thermal safety reasons.
+ They are exposed for the OS to use via the INT3400 ACPI device object
+ as the master, and INT3401~INT340B ACPI device objects as the slaves.
+ Enable this to expose the temperature information and cooling ability
+ from these objects to userspace via the normal thermal framework.
+ This means that a wide range of applications and GUI widgets can show
+ the information to the user or use this information for making
+ decisions. For example, the Intel Thermal Daemon can use this
+ information to allow the user to select his laptop to run without
+ turning on the fans.
+
+config ACPI_THERMAL_REL
+ tristate
+ depends on ACPI
+
+if INT340X_THERMAL
+
+config INT3406_THERMAL
+ tristate "ACPI INT3406 display thermal driver"
+ depends on ACPI_VIDEO
+ help
+ The display thermal device represents the LED/LCD display panel
+ that may or may not include touch support. The main function of
+ the display thermal device is to allow control of the display
+ brightness in order to address a thermal condition or to reduce
+ power consumed by display device.
+
+endif
diff --git a/drivers/thermal/int340x_thermal/Makefile b/drivers/thermal/int340x_thermal/Makefile
index ba77a34f659f..df0df055e7ff 100644
--- a/drivers/thermal/int340x_thermal/Makefile
+++ b/drivers/thermal/int340x_thermal/Makefile
@@ -3,4 +3,5 @@ obj-$(CONFIG_INT340X_THERMAL) += int340x_thermal_zone.o
obj-$(CONFIG_INT340X_THERMAL) += int3402_thermal.o
obj-$(CONFIG_INT340X_THERMAL) += int3403_thermal.o
obj-$(CONFIG_INT340X_THERMAL) += processor_thermal_device.o
+obj-$(CONFIG_INT3406_THERMAL) += int3406_thermal.o
obj-$(CONFIG_ACPI_THERMAL_REL) += acpi_thermal_rel.o
diff --git a/drivers/thermal/int340x_thermal/int3406_thermal.c b/drivers/thermal/int340x_thermal/int3406_thermal.c
new file mode 100644
index 000000000000..13d431cbd29e
--- /dev/null
+++ b/drivers/thermal/int340x_thermal/int3406_thermal.c
@@ -0,0 +1,236 @@
+/*
+ * INT3406 thermal driver for display participant device
+ *
+ * Copyright (C) 2016, Intel Corporation
+ * Authors: Aaron Lu <aaron.lu@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/acpi.h>
+#include <linux/backlight.h>
+#include <linux/thermal.h>
+#include <acpi/video.h>
+
+#define INT3406_BRIGHTNESS_LIMITS_CHANGED 0x80
+
+struct int3406_thermal_data {
+ int upper_limit;
+ int upper_limit_index;
+ int lower_limit;
+ int lower_limit_index;
+ acpi_handle handle;
+ struct acpi_video_device_brightness *br;
+ struct backlight_device *raw_bd;
+ struct thermal_cooling_device *cooling_dev;
+};
+
+static int int3406_thermal_to_raw(int level, struct int3406_thermal_data *d)
+{
+ int max_level = d->br->levels[d->br->count - 1];
+ int raw_max = d->raw_bd->props.max_brightness;
+
+ return level * raw_max / max_level;
+}
+
+static int int3406_thermal_to_acpi(int level, struct int3406_thermal_data *d)
+{
+ int raw_max = d->raw_bd->props.max_brightness;
+ int max_level = d->br->levels[d->br->count - 1];
+
+ return level * max_level / raw_max;
+}
+
+static int
+int3406_thermal_get_max_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long *state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int index = d->lower_limit_index ? d->lower_limit_index : 2;
+
+ *state = d->br->count - 1 - index;
+ return 0;
+}
+
+static int
+int3406_thermal_set_cur_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int level, raw_level;
+
+ if (state > d->br->count - 3)
+ return -EINVAL;
+
+ state = d->br->count - 1 - state;
+ level = d->br->levels[state];
+
+ if ((d->upper_limit && level > d->upper_limit) ||
+ (d->lower_limit && level < d->lower_limit))
+ return -EINVAL;
+
+ raw_level = int3406_thermal_to_raw(level, d);
+ return backlight_device_set_brightness(d->raw_bd, raw_level);
+}
+
+static int
+int3406_thermal_get_cur_state(struct thermal_cooling_device *cooling_dev,
+ unsigned long *state)
+{
+ struct int3406_thermal_data *d = cooling_dev->devdata;
+ int raw_level, level, i;
+ int *levels = d->br->levels;
+
+ raw_level = d->raw_bd->props.brightness;
+ level = int3406_thermal_to_acpi(raw_level, d);
+
+ /*
+ * There is no 1:1 mapping between the firmware interface level with the
+ * raw interface level, we will have to find one that is close enough.
+ */
+ for (i = 2; i < d->br->count; i++) {
+ if (level < levels[i]) {
+ if (i = 2)
+ break;
+ if ((level - levels[i - 1]) < (levels[i] - level))
+ i--;
+ break;
+ }
+ }
+
+ *state = d->br->count - 1 - i;
+ return 0;
+}
+
+static const struct thermal_cooling_device_ops video_cooling_ops = {
+ .get_max_state = int3406_thermal_get_max_state,
+ .get_cur_state = int3406_thermal_get_cur_state,
+ .set_cur_state = int3406_thermal_set_cur_state,
+};
+
+static int int3406_thermal_get_index(int *array, int nr, int value)
+{
+ int i;
+
+ for (i = 0; i < nr; i++) {
+ if (array[i] = value)
+ break;
+ }
+ return i = nr ? -ENOENT : i;
+}
+
+static void int3406_thermal_get_limit(struct int3406_thermal_data *d)
+{
+ acpi_status status;
+ unsigned long long lower_limit, upper_limit;
+ int index;
+
+ status = acpi_evaluate_integer(d->handle, "DDDL", NULL, &lower_limit);
+ if (ACPI_SUCCESS(status)) {
+ index = int3406_thermal_get_index(d->br->levels, d->br->count,
+ lower_limit);
+ if (index > 0) {
+ d->lower_limit = (int)lower_limit;
+ d->lower_limit_index = index;
+ }
+ }
+
+ status = acpi_evaluate_integer(d->handle, "DDPC", NULL, &upper_limit);
+ if (ACPI_SUCCESS(status)) {
+ index = int3406_thermal_get_index(d->br->levels, d->br->count,
+ upper_limit);
+ if (index > 0) {
+ d->upper_limit = (int)upper_limit;
+ d->upper_limit_index = index;
+ }
+ }
+}
+
+static void int3406_notify(acpi_handle handle, u32 event, void *data)
+{
+ if (event = INT3406_BRIGHTNESS_LIMITS_CHANGED)
+ int3406_thermal_get_limit(data);
+}
+
+static int int3406_thermal_probe(struct platform_device *pdev)
+{
+ struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+ struct int3406_thermal_data *d;
+ struct backlight_device *bd;
+ int ret;
+
+ if (!ACPI_HANDLE(&pdev->dev))
+ return -ENODEV;
+
+ d = devm_kzalloc(&pdev->dev, sizeof(*d), GFP_KERNEL);
+ if (!d)
+ return -ENOMEM;
+ d->handle = ACPI_HANDLE(&pdev->dev);
+
+ bd = backlight_device_get_by_type(BACKLIGHT_RAW);
+ if (!bd)
+ return -ENODEV;
+ d->raw_bd = bd;
+
+ ret = acpi_video_get_levels(ACPI_COMPANION(&pdev->dev), &d->br);
+ if (ret)
+ return ret;
+
+ int3406_thermal_get_limit(d);
+
+ d->cooling_dev = thermal_cooling_device_register(acpi_device_bid(adev),
+ d, &video_cooling_ops);
+ if (IS_ERR(d->cooling_dev))
+ goto err;
+
+ ret = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
+ int3406_notify, d);
+ if (ret)
+ goto err_cdev;
+
+ platform_set_drvdata(pdev, d);
+
+ return 0;
+
+err_cdev:
+ thermal_cooling_device_unregister(d->cooling_dev);
+err:
+ kfree(d->br);
+ return -ENODEV;
+}
+
+static int int3406_thermal_remove(struct platform_device *pdev)
+{
+ struct int3406_thermal_data *d = platform_get_drvdata(pdev);
+
+ thermal_cooling_device_unregister(d->cooling_dev);
+ kfree(d->br);
+ return 0;
+}
+
+static const struct acpi_device_id int3406_thermal_match[] = {
+ {"INT3406", 0},
+ {}
+};
+
+MODULE_DEVICE_TABLE(acpi, int3406_thermal_match);
+
+static struct platform_driver int3406_thermal_driver = {
+ .probe = int3406_thermal_probe,
+ .remove = int3406_thermal_remove,
+ .driver = {
+ .name = "int3406 thermal",
+ .owner = THIS_MODULE,
+ .acpi_match_table = int3406_thermal_match,
+ },
+};
+
+module_platform_driver(int3406_thermal_driver);
+
+MODULE_DESCRIPTION("INT3406 Thermal driver");
+MODULE_LICENSE("GPL v2");
--
2.5.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/4] Support INT3406 Display thermal device
2016-05-09 7:49 ` Zhang, Rui
@ 2016-05-09 12:23 ` Rafael J. Wysocki
0 siblings, 0 replies; 15+ messages in thread
From: Rafael J. Wysocki @ 2016-05-09 12:23 UTC (permalink / raw)
To: Zhang, Rui
Cc: Lu, Aaron, jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-acpi@vger.kernel.org,
linux-pm@vger.kernel.org, rjw@rjwysocki.net, rafael@kernel.org
On Mon, May 9, 2016 at 9:49 AM, Zhang, Rui <rui.zhang@intel.com> wrote:
> On Fri, 2016-05-06 at 14:45 +0800, Aaron Lu wrote:
>> On 05/05/2016 05:47 AM, Rafael J. Wysocki wrote:
>> > On Thursday, April 28, 2016 09:48:30 AM Aaron Lu wrote:
>> >> On 04/28/2016 03:38 AM, Rafael J. Wysocki wrote:
>> >>> On Wed, Apr 27, 2016 at 2:45 PM, Aaron Lu <aaron.lu@intel.com> wrote:
>> >>>> v3:
>> >>>> Split patch 3/3 in v2 into 2 patches: one makes changes to acpi_video
>> >>>> and one adds the int3406 driver as suggested by Rafael. There should
>> >>>> be no functionality change compared to v2.
>> >>>>
>> >>>> v2:
>> >>>> The display thermal device represents the LED/LCD display panel
>> >>>> that may or may not include touch support. The main function of
>> >>>> the display thermal device is to allow control of the display
>> >>>> brightness in order to address a thermal condition or to reduce
>> >>>> power consumed by display device.
>> >>>>
>> >>>> Due to the way this thermal device changes brightness level is said
>> >>>> to be deprecated so we are using the raw interface to do the actual
>> >>>> backlight change. This requires the backlight core support so two
>> >>>> new APIs are added and exported in patch 1/3. With this, the previous
>> >>>> API backlight_device_registered can be removed and this is done in
>> >>>> patch 2/3. Patch 3/3 adds the new int3406 thermal driver.
>> >>>>
>> >>>> The 1st version is here:
>> >>>> http://thread.gmane.org/gmane.linux.acpi.devel/72619
>> >>>>
>> >>>> This whole series should go through the thermal tree if applied.
>> >>>>
>> >>>> Aaron Lu (3):
>> >>>> video / backlight: add two APIs for drivers to use
>> >>>> video / backlight: remove the backlight_device_registered API
>> >>>> Thermal: add INT3406 thermal driver
>> >>>>
>> >>>> drivers/acpi/acpi_video.c | 83 ++++----
>> >>>> drivers/acpi/video_detect.c | 2 +-
>> >>>> drivers/thermal/Kconfig | 28 +--
>> >>>> drivers/thermal/int340x_thermal/Kconfig | 42 ++++
>> >>>> drivers/thermal/int340x_thermal/Makefile | 1 +
>> >>>> drivers/thermal/int340x_thermal/int3406_thermal.c | 236 ++++++++++++++++++++++
>> >>>> drivers/video/backlight/backlight.c | 39 ++--
>> >>>> include/acpi/video.h | 20 ++
>> >>>> include/linux/backlight.h | 3 +-
>> >>>> 9 files changed, 374 insertions(+), 80 deletions(-)
>> >>>> create mode 100644 drivers/thermal/int340x_thermal/Kconfig
>> >>>> create mode 100644 drivers/thermal/int340x_thermal/int3406_thermal.c
>> >>>
>> >>> The first three patches in this series look OK to me, so
>> >>>
>> >>> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>> >>>
>> >>> for the [1-3/4].
>> >>>
>> >>> That said it may be better if those three go in via ACPI. I can put
>> >>> them into a separate branch for Rui to pull from.
>> >>>
>> >>> Please let me know what you think.
>> >>
>> >> I have no problem with that.
>> >
>> > OK
>> >
>> > [1-3/4] have been queued up for 4.7 in my tree. Please let me know if you
>> > want me to expose the branch containing them.
>>
>> Thanks a lot!
>>
>> Rui,
>>
>> Do you need a branch so that you can pull and merge 4/4 on top of that?
>>
> Rafael, can you please take patch 4/4 as well?
> It should not conflict with my other thermal material.
I can do that, but can you please ACK it for me?
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 update 4/4] Thermal: add INT3406 thermal driver
2016-05-09 7:54 ` [PATCH v3 update " Aaron Lu
@ 2016-05-10 8:08 ` Zhang, Rui
2016-05-13 22:05 ` Rafael J. Wysocki
0 siblings, 1 reply; 15+ messages in thread
From: Zhang, Rui @ 2016-05-10 8:08 UTC (permalink / raw)
To: Lu, Aaron
Cc: jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-pm@vger.kernel.org, rjw@rjwysocki.net,
linux-acpi@vger.kernel.org
T24gTW9uLCAyMDE2LTA1LTA5IGF0IDE1OjU0ICswODAwLCBBYXJvbiBMdSB3cm90ZToNCj4gSU5U
MzQwNiBBQ1BJIGRldmljZSBvYmplY3QgcmVzZW1ibGVzIGFuIEFDUEkgdmlkZW8gb3V0cHV0IGRl
dmljZSwgYnV0IGl0cw0KPiBfQkNNIGlzIHNhaWQgdG8gYmUgZGVwcmVjYXRlZCBhbmQgc2hvdWxk
IG5vdCBiZSB1c2VkLiBTbyB3ZSB3aWxsIG1ha2UNCj4gdXNlIG9mIHRoZSByYXcgaW50ZXJmYWNl
IHRvIGRvIHRoZSBhY3R1YWwgY29vbGluZy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IEFhcm9uIEx1
IDxhYXJvbi5sdUBpbnRlbC5jb20+DQoNCkFja2VkLWJ5OiBaaGFuZyBSdWkgPHJ1aS56aGFuZ0Bp
bnRlbC5jb20+DQo+IC0tLQ0KPiB1cGRhdGU6IGNoYW5nZSBjb3B5cmlnaHQgdG8gMjAxNiBhbmQg
bGljZW5zZSB0byBHUEwgdjIgYXMgc3VnZ2VzdGVkIGJ5IFJ1aS4NCj4gDQo+ICBkcml2ZXJzL3Ro
ZXJtYWwvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI4ICstLQ0KPiAgZHJp
dmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9LY29uZmlnICAgICAgICAgICB8ICA0MiArKysr
DQo+ICBkcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL01ha2VmaWxlICAgICAgICAgIHwg
ICAxICsNCj4gIGRyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvaW50MzQwNl90aGVybWFs
LmMgfCAyMzYgKysrKysrKysrKysrKysrKysrKysrKw0KPiAgNCBmaWxlcyBjaGFuZ2VkLCAyODIg
aW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0pDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp
dmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9LY29uZmlnDQo+ICBjcmVhdGUgbW9kZSAxMDA2
NDQgZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYw0KPiAN
Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9LY29uZmlnIGIvZHJpdmVycy90aGVybWFs
L0tjb25maWcNCj4gaW5kZXggYzM3ZWVkYzM1YTI0Li5jYjFiYTcwY2VhYTcgMTAwNjQ0DQo+IC0t
LSBhL2RyaXZlcnMvdGhlcm1hbC9LY29uZmlnDQo+ICsrKyBiL2RyaXZlcnMvdGhlcm1hbC9LY29u
ZmlnDQo+IEBAIC0zMzgsMzEgKzMzOCw5IEBAIGNvbmZpZyBJTlRFTF9RVUFSS19EVFNfVEhFUk1B
TA0KPiAgCSAgaG90ICYgY3JpdGljYWwuIFRoZSBjcml0aWNhbCB0cmlwIHBvaW50IGRlZmF1bHQg
dmFsdWUgaXMgc2V0IGJ5DQo+ICAJICB1bmRlcmx5aW5nIEJJT1MvRmlybXdhcmUuDQo+ICANCj4g
LWNvbmZpZyBJTlQzNDBYX1RIRVJNQUwNCj4gLQl0cmlzdGF0ZSAiQUNQSSBJTlQzNDBYIHRoZXJt
YWwgZHJpdmVycyINCj4gLQlkZXBlbmRzIG9uIFg4NiAmJiBBQ1BJDQo+IC0Jc2VsZWN0IFRIRVJN
QUxfR09WX1VTRVJfU1BBQ0UNCj4gLQlzZWxlY3QgQUNQSV9USEVSTUFMX1JFTA0KPiAtCXNlbGVj
dCBBQ1BJX0ZBTg0KPiAtCXNlbGVjdCBJTlRFTF9TT0NfRFRTX0lPU0ZfQ09SRQ0KPiAtCXNlbGVj
dCBUSEVSTUFMX1dSSVRBQkxFX1RSSVBTDQo+IC0JaGVscA0KPiAtCSAgTmV3ZXIgbGFwdG9wcyBh
bmQgdGFibGV0cyB0aGF0IHVzZSBBQ1BJIG1heSBoYXZlIHRoZXJtYWwgc2Vuc29ycyBhbmQNCj4g
LQkgIG90aGVyIGRldmljZXMgd2l0aCB0aGVybWFsIGNvbnRyb2wgY2FwYWJpbGl0aWVzIG91dHNp
ZGUgdGhlIGNvcmUNCj4gLQkgIENQVS9TT0MsIGZvciB0aGVybWFsIHNhZmV0eSByZWFzb25zLg0K
PiAtCSAgVGhleSBhcmUgZXhwb3NlZCBmb3IgdGhlIE9TIHRvIHVzZSB2aWEgdGhlIElOVDM0MDAg
QUNQSSBkZXZpY2Ugb2JqZWN0DQo+IC0JICBhcyB0aGUgbWFzdGVyLCBhbmQgSU5UMzQwMX5JTlQz
NDBCIEFDUEkgZGV2aWNlIG9iamVjdHMgYXMgdGhlIHNsYXZlcy4NCj4gLQkgIEVuYWJsZSB0aGlz
IHRvIGV4cG9zZSB0aGUgdGVtcGVyYXR1cmUgaW5mb3JtYXRpb24gYW5kIGNvb2xpbmcgYWJpbGl0
eQ0KPiAtCSAgZnJvbSB0aGVzZSBvYmplY3RzIHRvIHVzZXJzcGFjZSB2aWEgdGhlIG5vcm1hbCB0
aGVybWFsIGZyYW1ld29yay4NCj4gLQkgIFRoaXMgbWVhbnMgdGhhdCBhIHdpZGUgcmFuZ2Ugb2Yg
YXBwbGljYXRpb25zIGFuZCBHVUkgd2lkZ2V0cyBjYW4gc2hvdw0KPiAtCSAgdGhlIGluZm9ybWF0
aW9uIHRvIHRoZSB1c2VyIG9yIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciBtYWtpbmcNCj4gLQkg
IGRlY2lzaW9ucy4gRm9yIGV4YW1wbGUsIHRoZSBJbnRlbCBUaGVybWFsIERhZW1vbiBjYW4gdXNl
IHRoaXMNCj4gLQkgIGluZm9ybWF0aW9uIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBoaXMg
bGFwdG9wIHRvIHJ1biB3aXRob3V0DQo+IC0JICB0dXJuaW5nIG9uIHRoZSBmYW5zLg0KPiAtDQo+
IC1jb25maWcgQUNQSV9USEVSTUFMX1JFTA0KPiAtCXRyaXN0YXRlDQo+IC0JZGVwZW5kcyBvbiBB
Q1BJDQo+ICttZW51ICJBQ1BJIElOVDM0MFggdGhlcm1hbCBkcml2ZXJzIg0KPiArc291cmNlIGRy
aXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvS2NvbmZpZw0KPiArZW5kbWVudQ0KPiAgDQo+
ICBjb25maWcgSU5URUxfUENIX1RIRVJNQUwNCj4gIAl0cmlzdGF0ZSAiSW50ZWwgUENIIFRoZXJt
YWwgUmVwb3J0aW5nIERyaXZlciINCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9pbnQz
NDB4X3RoZXJtYWwvS2NvbmZpZyBiL2RyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvS2Nv
bmZpZw0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwMDAwMDAuLjA1ODJi
ZDEyYTIzOQ0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2RyaXZlcnMvdGhlcm1hbC9pbnQzNDB4
X3RoZXJtYWwvS2NvbmZpZw0KPiBAQCAtMCwwICsxLDQyIEBADQo+ICsjDQo+ICsjIEFDUEkgSU5U
MzQweCB0aGVybWFsIGRyaXZlcnMgY29uZmlndXJhdGlvbg0KPiArIw0KPiArDQo+ICtjb25maWcg
SU5UMzQwWF9USEVSTUFMDQo+ICsJdHJpc3RhdGUgIkFDUEkgSU5UMzQwWCB0aGVybWFsIGRyaXZl
cnMiDQo+ICsJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQ0KPiArCXNlbGVjdCBUSEVSTUFMX0dPVl9V
U0VSX1NQQUNFDQo+ICsJc2VsZWN0IEFDUElfVEhFUk1BTF9SRUwNCj4gKwlzZWxlY3QgQUNQSV9G
QU4NCj4gKwlzZWxlY3QgSU5URUxfU09DX0RUU19JT1NGX0NPUkUNCj4gKwloZWxwDQo+ICsJICBO
ZXdlciBsYXB0b3BzIGFuZCB0YWJsZXRzIHRoYXQgdXNlIEFDUEkgbWF5IGhhdmUgdGhlcm1hbCBz
ZW5zb3JzIGFuZA0KPiArCSAgb3RoZXIgZGV2aWNlcyB3aXRoIHRoZXJtYWwgY29udHJvbCBjYXBh
YmlsaXRpZXMgb3V0c2lkZSB0aGUgY29yZQ0KPiArCSAgQ1BVL1NPQywgZm9yIHRoZXJtYWwgc2Fm
ZXR5IHJlYXNvbnMuDQo+ICsJICBUaGV5IGFyZSBleHBvc2VkIGZvciB0aGUgT1MgdG8gdXNlIHZp
YSB0aGUgSU5UMzQwMCBBQ1BJIGRldmljZSBvYmplY3QNCj4gKwkgIGFzIHRoZSBtYXN0ZXIsIGFu
ZCBJTlQzNDAxfklOVDM0MEIgQUNQSSBkZXZpY2Ugb2JqZWN0cyBhcyB0aGUgc2xhdmVzLg0KPiAr
CSAgRW5hYmxlIHRoaXMgdG8gZXhwb3NlIHRoZSB0ZW1wZXJhdHVyZSBpbmZvcm1hdGlvbiBhbmQg
Y29vbGluZyBhYmlsaXR5DQo+ICsJICBmcm9tIHRoZXNlIG9iamVjdHMgdG8gdXNlcnNwYWNlIHZp
YSB0aGUgbm9ybWFsIHRoZXJtYWwgZnJhbWV3b3JrLg0KPiArCSAgVGhpcyBtZWFucyB0aGF0IGEg
d2lkZSByYW5nZSBvZiBhcHBsaWNhdGlvbnMgYW5kIEdVSSB3aWRnZXRzIGNhbiBzaG93DQo+ICsJ
ICB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgb3IgdXNlIHRoaXMgaW5mb3JtYXRpb24gZm9y
IG1ha2luZw0KPiArCSAgZGVjaXNpb25zLiBGb3IgZXhhbXBsZSwgdGhlIEludGVsIFRoZXJtYWwg
RGFlbW9uIGNhbiB1c2UgdGhpcw0KPiArCSAgaW5mb3JtYXRpb24gdG8gYWxsb3cgdGhlIHVzZXIg
dG8gc2VsZWN0IGhpcyBsYXB0b3AgdG8gcnVuIHdpdGhvdXQNCj4gKwkgIHR1cm5pbmcgb24gdGhl
IGZhbnMuDQo+ICsNCj4gK2NvbmZpZyBBQ1BJX1RIRVJNQUxfUkVMDQo+ICsJdHJpc3RhdGUNCj4g
KwlkZXBlbmRzIG9uIEFDUEkNCj4gKw0KPiAraWYgSU5UMzQwWF9USEVSTUFMDQo+ICsNCj4gK2Nv
bmZpZyBJTlQzNDA2X1RIRVJNQUwNCj4gKwl0cmlzdGF0ZSAiQUNQSSBJTlQzNDA2IGRpc3BsYXkg
dGhlcm1hbCBkcml2ZXIiDQo+ICsJZGVwZW5kcyBvbiBBQ1BJX1ZJREVPDQo+ICsJaGVscA0KPiAr
CSAgVGhlIGRpc3BsYXkgdGhlcm1hbCBkZXZpY2UgcmVwcmVzZW50cyB0aGUgTEVEL0xDRCBkaXNw
bGF5IHBhbmVsDQo+ICsJICB0aGF0IG1heSBvciBtYXkgbm90IGluY2x1ZGUgdG91Y2ggc3VwcG9y
dC4gVGhlIG1haW4gZnVuY3Rpb24gb2YNCj4gKwkgIHRoZSBkaXNwbGF5IHRoZXJtYWwgZGV2aWNl
IGlzIHRvIGFsbG93IGNvbnRyb2wgb2YgdGhlIGRpc3BsYXkNCj4gKwkgIGJyaWdodG5lc3MgaW4g
b3JkZXIgdG8gYWRkcmVzcyBhIHRoZXJtYWwgY29uZGl0aW9uIG9yIHRvIHJlZHVjZQ0KPiArCSAg
cG93ZXIgY29uc3VtZWQgYnkgZGlzcGxheSBkZXZpY2UuDQo+ICsNCj4gK2VuZGlmDQo+IGRpZmYg
LS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL01ha2VmaWxlIGIvZHJpdmVy
cy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9NYWtlZmlsZQ0KPiBpbmRleCBiYTc3YTM0ZjY1OWYu
LmRmMGRmMDU1ZTdmZiAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhl
cm1hbC9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL01h
a2VmaWxlDQo+IEBAIC0zLDQgKzMsNSBAQCBvYmotJChDT05GSUdfSU5UMzQwWF9USEVSTUFMKQkr
PSBpbnQzNDB4X3RoZXJtYWxfem9uZS5vDQo+ICBvYmotJChDT05GSUdfSU5UMzQwWF9USEVSTUFM
KQkrPSBpbnQzNDAyX3RoZXJtYWwubw0KPiAgb2JqLSQoQ09ORklHX0lOVDM0MFhfVEhFUk1BTCkJ
Kz0gaW50MzQwM190aGVybWFsLm8NCj4gIG9iai0kKENPTkZJR19JTlQzNDBYX1RIRVJNQUwpCSs9
IHByb2Nlc3Nvcl90aGVybWFsX2RldmljZS5vDQo+ICtvYmotJChDT05GSUdfSU5UMzQwNl9USEVS
TUFMKQkrPSBpbnQzNDA2X3RoZXJtYWwubw0KPiAgb2JqLSQoQ09ORklHX0FDUElfVEhFUk1BTF9S
RUwpCSs9IGFjcGlfdGhlcm1hbF9yZWwubw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFs
L2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9pbnQz
NDB4X3RoZXJtYWwvaW50MzQwNl90aGVybWFsLmMNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4g
aW5kZXggMDAwMDAwMDAwMDAwLi4xM2Q0MzFjYmQyOWUNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysg
Yi9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0MDZfdGhlcm1hbC5jDQo+IEBA
IC0wLDAgKzEsMjM2IEBADQo+ICsvKg0KPiArICogSU5UMzQwNiB0aGVybWFsIGRyaXZlciBmb3Ig
ZGlzcGxheSBwYXJ0aWNpcGFudCBkZXZpY2UNCj4gKyAqDQo+ICsgKiBDb3B5cmlnaHQgKEMpIDIw
MTYsIEludGVsIENvcnBvcmF0aW9uDQo+ICsgKiBBdXRob3JzOiBBYXJvbiBMdSA8YWFyb24ubHVA
aW50ZWwuY29tPg0KPiArICoNCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQo+ICsgKiBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcw0KPiAr
ICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQo+ICsgKg0KPiAr
ICovDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gKyNpbmNsdWRlIDxsaW51
eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+DQo+ICsjaW5j
bHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+DQo+ICsjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPg0K
PiArI2luY2x1ZGUgPGFjcGkvdmlkZW8uaD4NCj4gKw0KPiArI2RlZmluZSBJTlQzNDA2X0JSSUdI
VE5FU1NfTElNSVRTX0NIQU5HRUQJMHg4MA0KPiArDQo+ICtzdHJ1Y3QgaW50MzQwNl90aGVybWFs
X2RhdGEgew0KPiArCWludCB1cHBlcl9saW1pdDsNCj4gKwlpbnQgdXBwZXJfbGltaXRfaW5kZXg7
DQo+ICsJaW50IGxvd2VyX2xpbWl0Ow0KPiArCWludCBsb3dlcl9saW1pdF9pbmRleDsNCj4gKwlh
Y3BpX2hhbmRsZSBoYW5kbGU7DQo+ICsJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5l
c3MgKmJyOw0KPiArCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpyYXdfYmQ7DQo+ICsJc3RydWN0
IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNvb2xpbmdfZGV2Ow0KPiArfTsNCj4gKw0KPiArc3Rh
dGljIGludCBpbnQzNDA2X3RoZXJtYWxfdG9fcmF3KGludCBsZXZlbCwgc3RydWN0IGludDM0MDZf
dGhlcm1hbF9kYXRhICpkKQ0KPiArew0KPiArCWludCBtYXhfbGV2ZWwgPSBkLT5ici0+bGV2ZWxz
W2QtPmJyLT5jb3VudCAtIDFdOw0KPiArCWludCByYXdfbWF4ID0gZC0+cmF3X2JkLT5wcm9wcy5t
YXhfYnJpZ2h0bmVzczsNCj4gKw0KPiArCXJldHVybiBsZXZlbCAqIHJhd19tYXggLyBtYXhfbGV2
ZWw7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgaW50MzQwNl90aGVybWFsX3RvX2FjcGkoaW50
IGxldmVsLCBzdHJ1Y3QgaW50MzQwNl90aGVybWFsX2RhdGEgKmQpDQo+ICt7DQo+ICsJaW50IHJh
d19tYXggPSBkLT5yYXdfYmQtPnByb3BzLm1heF9icmlnaHRuZXNzOw0KPiArCWludCBtYXhfbGV2
ZWwgPSBkLT5ici0+bGV2ZWxzW2QtPmJyLT5jb3VudCAtIDFdOw0KPiArDQo+ICsJcmV0dXJuIGxl
dmVsICogbWF4X2xldmVsIC8gcmF3X21heDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludA0KPiAr
aW50MzQwNl90aGVybWFsX2dldF9tYXhfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZp
Y2UgKmNvb2xpbmdfZGV2LA0KPiArCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhdGUpDQo+ICt7
DQo+ICsJc3RydWN0IGludDM0MDZfdGhlcm1hbF9kYXRhICpkID0gY29vbGluZ19kZXYtPmRldmRh
dGE7DQo+ICsJaW50IGluZGV4ID0gZC0+bG93ZXJfbGltaXRfaW5kZXggPyBkLT5sb3dlcl9saW1p
dF9pbmRleCA6IDI7DQo+ICsNCj4gKwkqc3RhdGUgPSBkLT5ici0+Y291bnQgLSAxIC0gaW5kZXg7
DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQNCj4gK2ludDM0MDZfdGhl
cm1hbF9zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjb29saW5n
X2RldiwNCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhdGUpDQo+ICt7DQo+ICsJc3RydWN0
IGludDM0MDZfdGhlcm1hbF9kYXRhICpkID0gY29vbGluZ19kZXYtPmRldmRhdGE7DQo+ICsJaW50
IGxldmVsLCByYXdfbGV2ZWw7DQo+ICsNCj4gKwlpZiAoc3RhdGUgPiBkLT5ici0+Y291bnQgLSAz
KQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCXN0YXRlID0gZC0+YnItPmNvdW50IC0g
MSAtIHN0YXRlOw0KPiArCWxldmVsID0gZC0+YnItPmxldmVsc1tzdGF0ZV07DQo+ICsNCj4gKwlp
ZiAoKGQtPnVwcGVyX2xpbWl0ICYmIGxldmVsID4gZC0+dXBwZXJfbGltaXQpIHx8DQo+ICsJICAg
IChkLT5sb3dlcl9saW1pdCAmJiBsZXZlbCA8IGQtPmxvd2VyX2xpbWl0KSkNCj4gKwkJcmV0dXJu
IC1FSU5WQUw7DQo+ICsNCj4gKwlyYXdfbGV2ZWwgPSBpbnQzNDA2X3RoZXJtYWxfdG9fcmF3KGxl
dmVsLCBkKTsNCj4gKwlyZXR1cm4gYmFja2xpZ2h0X2RldmljZV9zZXRfYnJpZ2h0bmVzcyhkLT5y
YXdfYmQsIHJhd19sZXZlbCk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQNCj4gK2ludDM0MDZf
dGhlcm1hbF9nZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjb29s
aW5nX2RldiwNCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YXRlKQ0KPiArew0KPiArCXN0
cnVjdCBpbnQzNDA2X3RoZXJtYWxfZGF0YSAqZCA9IGNvb2xpbmdfZGV2LT5kZXZkYXRhOw0KPiAr
CWludCByYXdfbGV2ZWwsIGxldmVsLCBpOw0KPiArCWludCAqbGV2ZWxzID0gZC0+YnItPmxldmVs
czsNCj4gKw0KPiArCXJhd19sZXZlbCA9IGQtPnJhd19iZC0+cHJvcHMuYnJpZ2h0bmVzczsNCj4g
KwlsZXZlbCA9IGludDM0MDZfdGhlcm1hbF90b19hY3BpKHJhd19sZXZlbCwgZCk7DQo+ICsNCj4g
KwkvKg0KPiArCSAqIFRoZXJlIGlzIG5vIDE6MSBtYXBwaW5nIGJldHdlZW4gdGhlIGZpcm13YXJl
IGludGVyZmFjZSBsZXZlbCB3aXRoIHRoZQ0KPiArCSAqIHJhdyBpbnRlcmZhY2UgbGV2ZWwsIHdl
IHdpbGwgaGF2ZSB0byBmaW5kIG9uZSB0aGF0IGlzIGNsb3NlIGVub3VnaC4NCj4gKwkgKi8NCj4g
Kwlmb3IgKGkgPSAyOyBpIDwgZC0+YnItPmNvdW50OyBpKyspIHsNCj4gKwkJaWYgKGxldmVsIDwg
bGV2ZWxzW2ldKSB7DQo+ICsJCQlpZiAoaSA9PSAyKQ0KPiArCQkJCWJyZWFrOw0KPiArCQkJaWYg
KChsZXZlbCAtIGxldmVsc1tpIC0gMV0pIDwgKGxldmVsc1tpXSAtIGxldmVsKSkNCj4gKwkJCQlp
LS07DQo+ICsJCQlicmVhazsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCSpzdGF0ZSA9IGQtPmJy
LT5jb3VudCAtIDEgLSBpOw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29u
c3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHZpZGVvX2Nvb2xpbmdfb3BzID0g
ew0KPiArCS5nZXRfbWF4X3N0YXRlID0gaW50MzQwNl90aGVybWFsX2dldF9tYXhfc3RhdGUsDQo+
ICsJLmdldF9jdXJfc3RhdGUgPSBpbnQzNDA2X3RoZXJtYWxfZ2V0X2N1cl9zdGF0ZSwNCj4gKwku
c2V0X2N1cl9zdGF0ZSA9IGludDM0MDZfdGhlcm1hbF9zZXRfY3VyX3N0YXRlLA0KPiArfTsNCj4g
Kw0KPiArc3RhdGljIGludCBpbnQzNDA2X3RoZXJtYWxfZ2V0X2luZGV4KGludCAqYXJyYXksIGlu
dCBuciwgaW50IHZhbHVlKQ0KPiArew0KPiArCWludCBpOw0KPiArDQo+ICsJZm9yIChpID0gMDsg
aSA8IG5yOyBpKyspIHsNCj4gKwkJaWYgKGFycmF5W2ldID09IHZhbHVlKQ0KPiArCQkJYnJlYWs7
DQo+ICsJfQ0KPiArCXJldHVybiBpID09IG5yID8gLUVOT0VOVCA6IGk7DQo+ICt9DQo+ICsNCj4g
K3N0YXRpYyB2b2lkIGludDM0MDZfdGhlcm1hbF9nZXRfbGltaXQoc3RydWN0IGludDM0MDZfdGhl
cm1hbF9kYXRhICpkKQ0KPiArew0KPiArCWFjcGlfc3RhdHVzIHN0YXR1czsNCj4gKwl1bnNpZ25l
ZCBsb25nIGxvbmcgbG93ZXJfbGltaXQsIHVwcGVyX2xpbWl0Ow0KPiArCWludCBpbmRleDsNCj4g
Kw0KPiArCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkLT5oYW5kbGUsICJERERMIiwg
TlVMTCwgJmxvd2VyX2xpbWl0KTsNCj4gKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsNCj4g
KwkJaW5kZXggPSBpbnQzNDA2X3RoZXJtYWxfZ2V0X2luZGV4KGQtPmJyLT5sZXZlbHMsIGQtPmJy
LT5jb3VudCwNCj4gKwkJCQkJCSAgbG93ZXJfbGltaXQpOw0KPiArCQlpZiAoaW5kZXggPiAwKSB7
DQo+ICsJCQlkLT5sb3dlcl9saW1pdCA9IChpbnQpbG93ZXJfbGltaXQ7DQo+ICsJCQlkLT5sb3dl
cl9saW1pdF9pbmRleCA9IGluZGV4Ow0KPiArCQl9DQo+ICsJfQ0KPiArDQo+ICsJc3RhdHVzID0g
YWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGQtPmhhbmRsZSwgIkREUEMiLCBOVUxMLCAmdXBwZXJfbGlt
aXQpOw0KPiArCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgew0KPiArCQlpbmRleCA9IGludDM0
MDZfdGhlcm1hbF9nZXRfaW5kZXgoZC0+YnItPmxldmVscywgZC0+YnItPmNvdW50LA0KPiArCQkJ
CQkJICB1cHBlcl9saW1pdCk7DQo+ICsJCWlmIChpbmRleCA+IDApIHsNCj4gKwkJCWQtPnVwcGVy
X2xpbWl0ID0gKGludCl1cHBlcl9saW1pdDsNCj4gKwkJCWQtPnVwcGVyX2xpbWl0X2luZGV4ID0g
aW5kZXg7DQo+ICsJCX0NCj4gKwl9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lkIGludDM0MDZf
bm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQ0KPiArew0K
PiArCWlmIChldmVudCA9PSBJTlQzNDA2X0JSSUdIVE5FU1NfTElNSVRTX0NIQU5HRUQpDQo+ICsJ
CWludDM0MDZfdGhlcm1hbF9nZXRfbGltaXQoZGF0YSk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp
bnQgaW50MzQwNl90aGVybWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+
ICt7DQo+ICsJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oJnBkZXYt
PmRldik7DQo+ICsJc3RydWN0IGludDM0MDZfdGhlcm1hbF9kYXRhICpkOw0KPiArCXN0cnVjdCBi
YWNrbGlnaHRfZGV2aWNlICpiZDsNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJaWYgKCFBQ1BJX0hB
TkRMRSgmcGRldi0+ZGV2KSkNCj4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ICsNCj4gKwlkID0gZGV2
bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZCksIEdGUF9LRVJORUwpOw0KPiArCWlmICgh
ZCkNCj4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ICsJZC0+aGFuZGxlID0gQUNQSV9IQU5ETEUoJnBk
ZXYtPmRldik7DQo+ICsNCj4gKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfZ2V0X2J5X3R5cGUoQkFD
S0xJR0hUX1JBVyk7DQo+ICsJaWYgKCFiZCkNCj4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ICsJZC0+
cmF3X2JkID0gYmQ7DQo+ICsNCj4gKwlyZXQgPSBhY3BpX3ZpZGVvX2dldF9sZXZlbHMoQUNQSV9D
T01QQU5JT04oJnBkZXYtPmRldiksICZkLT5icik7DQo+ICsJaWYgKHJldCkNCj4gKwkJcmV0dXJu
IHJldDsNCj4gKw0KPiArCWludDM0MDZfdGhlcm1hbF9nZXRfbGltaXQoZCk7DQo+ICsNCj4gKwlk
LT5jb29saW5nX2RldiA9IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoYWNwaV9kZXZp
Y2VfYmlkKGFkZXYpLA0KPiArCQkJCQkJCSBkLCAmdmlkZW9fY29vbGluZ19vcHMpOw0KPiArCWlm
IChJU19FUlIoZC0+Y29vbGluZ19kZXYpKQ0KPiArCQlnb3RvIGVycjsNCj4gKw0KPiArCXJldCA9
IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihhZGV2LT5oYW5kbGUsIEFDUElfREVWSUNFX05P
VElGWSwNCj4gKwkJCQkJICBpbnQzNDA2X25vdGlmeSwgZCk7DQo+ICsJaWYgKHJldCkNCj4gKwkJ
Z290byBlcnJfY2RldjsNCj4gKw0KPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGQpOw0K
PiArDQo+ICsJcmV0dXJuIDA7DQo+ICsNCj4gK2Vycl9jZGV2Og0KPiArCXRoZXJtYWxfY29vbGlu
Z19kZXZpY2VfdW5yZWdpc3RlcihkLT5jb29saW5nX2Rldik7DQo+ICtlcnI6DQo+ICsJa2ZyZWUo
ZC0+YnIpOw0KPiArCXJldHVybiAtRU5PREVWOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGlu
dDM0MDZfdGhlcm1hbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gK3sN
Cj4gKwlzdHJ1Y3QgaW50MzQwNl90aGVybWFsX2RhdGEgKmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0
YShwZGV2KTsNCj4gKw0KPiArCXRoZXJtYWxfY29vbGluZ19kZXZpY2VfdW5yZWdpc3RlcihkLT5j
b29saW5nX2Rldik7DQo+ICsJa2ZyZWUoZC0+YnIpOw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGludDM0MDZfdGhlcm1hbF9t
YXRjaFtdID0gew0KPiArCXsiSU5UMzQwNiIsIDB9LA0KPiArCXt9DQo+ICt9Ow0KPiArDQo+ICtN
T0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGludDM0MDZfdGhlcm1hbF9tYXRjaCk7DQo+ICsNCj4g
K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGludDM0MDZfdGhlcm1hbF9kcml2ZXIgPSB7
DQo+ICsJLnByb2JlID0gaW50MzQwNl90aGVybWFsX3Byb2JlLA0KPiArCS5yZW1vdmUgPSBpbnQz
NDA2X3RoZXJtYWxfcmVtb3ZlLA0KPiArCS5kcml2ZXIgPSB7DQo+ICsJCSAgIC5uYW1lID0gImlu
dDM0MDYgdGhlcm1hbCIsDQo+ICsJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLA0KPiArCQkgICAu
YWNwaV9tYXRjaF90YWJsZSA9IGludDM0MDZfdGhlcm1hbF9tYXRjaCwNCj4gKwkJICAgfSwNCj4g
K307DQo+ICsNCj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaW50MzQwNl90aGVybWFsX2RyaXZl
cik7DQo+ICsNCj4gK01PRFVMRV9ERVNDUklQVElPTigiSU5UMzQwNiBUaGVybWFsIGRyaXZlciIp
Ow0KPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOw0KDQo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 update 4/4] Thermal: add INT3406 thermal driver
2016-05-10 8:08 ` Zhang, Rui
@ 2016-05-13 22:05 ` Rafael J. Wysocki
0 siblings, 0 replies; 15+ messages in thread
From: Rafael J. Wysocki @ 2016-05-13 22:05 UTC (permalink / raw)
To: Zhang, Rui, Lu, Aaron
Cc: jingoohan1@gmail.com, linux-fbdev@vger.kernel.org,
Pandruvada, Srinivas, linux-pm@vger.kernel.org,
linux-acpi@vger.kernel.org
On Tuesday, May 10, 2016 08:08:52 AM Zhang, Rui wrote:
> On Mon, 2016-05-09 at 15:54 +0800, Aaron Lu wrote:
> > INT3406 ACPI device object resembles an ACPI video output device, but its
> > _BCM is said to be deprecated and should not be used. So we will make
> > use of the raw interface to do the actual cooling.
> >
> > Signed-off-by: Aaron Lu <aaron.lu@intel.com>
>
> Acked-by: Zhang Rui <rui.zhang@intel.com>
Applied, thanks!
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2016-05-13 22:05 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-27 12:45 [PATCH v3 0/4] Support INT3406 Display thermal device Aaron Lu
2016-04-27 12:45 ` [PATCH v3 1/4] video / backlight: add two APIs for drivers to use Aaron Lu
2016-04-27 12:45 ` [PATCH v3 2/4] video / backlight: remove the backlight_device_registered API Aaron Lu
2016-04-27 12:45 ` [PATCH v3 3/4] ACPI/video: export acpi_video_get_levels Aaron Lu
2016-04-27 12:45 ` [PATCH v3 4/4] Thermal: add INT3406 thermal driver Aaron Lu
2016-05-09 7:47 ` Zhang, Rui
2016-05-09 7:54 ` [PATCH v3 update " Aaron Lu
2016-05-10 8:08 ` Zhang, Rui
2016-05-13 22:05 ` Rafael J. Wysocki
2016-04-27 19:38 ` [PATCH v3 0/4] Support INT3406 Display thermal device Rafael J. Wysocki
2016-04-28 1:48 ` Aaron Lu
2016-05-04 21:47 ` Rafael J. Wysocki
2016-05-06 6:45 ` Aaron Lu
2016-05-09 7:49 ` Zhang, Rui
2016-05-09 12:23 ` Rafael J. Wysocki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).