Commit 9176ae86 authored by Srinivas Pandruvada's avatar Srinivas Pandruvada Committed by Zhang Rui

thermal: int340x: New Interface to read trip and notify

Separated the code for reading trip points from int340x_thermal_zone_add to
a standalone function int340x_thermal_read_trips. This standlone
interface to read is exported so that int340x drivers can re-read trips
on ACPI notification for trip point change.
Also the appropriate notification events are sent by int340x driver based
on the acpi event using int340x_thermal_zone_device_update().
Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
parent 998d924b
...@@ -35,7 +35,8 @@ static void int3402_notify(acpi_handle handle, u32 event, void *data) ...@@ -35,7 +35,8 @@ static void int3402_notify(acpi_handle handle, u32 event, void *data)
case INT3402_PERF_CHANGED_EVENT: case INT3402_PERF_CHANGED_EVENT:
break; break;
case INT3402_THERMAL_EVENT: case INT3402_THERMAL_EVENT:
int340x_thermal_zone_device_update(priv->int340x_zone); int340x_thermal_zone_device_update(priv->int340x_zone,
THERMAL_TRIP_VIOLATED);
break; break;
default: default:
break; break;
......
...@@ -72,7 +72,8 @@ static void int3403_notify(acpi_handle handle, ...@@ -72,7 +72,8 @@ static void int3403_notify(acpi_handle handle,
case INT3403_PERF_CHANGED_EVENT: case INT3403_PERF_CHANGED_EVENT:
break; break;
case INT3403_THERMAL_EVENT: case INT3403_THERMAL_EVENT:
int340x_thermal_zone_device_update(obj->int340x_zone); int340x_thermal_zone_device_update(obj->int340x_zone,
THERMAL_TRIP_VIOLATED);
break; break;
default: default:
dev_err(&priv->pdev->dev, "Unsupported event [0x%x]\n", event); dev_err(&priv->pdev->dev, "Unsupported event [0x%x]\n", event);
......
...@@ -177,6 +177,42 @@ static int int340x_thermal_get_trip_config(acpi_handle handle, char *name, ...@@ -177,6 +177,42 @@ static int int340x_thermal_get_trip_config(acpi_handle handle, char *name,
return 0; return 0;
} }
int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone)
{
int trip_cnt = int34x_zone->aux_trip_nr;
int i;
int34x_zone->crt_trip_id = -1;
if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_CRT",
&int34x_zone->crt_temp))
int34x_zone->crt_trip_id = trip_cnt++;
int34x_zone->hot_trip_id = -1;
if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_HOT",
&int34x_zone->hot_temp))
int34x_zone->hot_trip_id = trip_cnt++;
int34x_zone->psv_trip_id = -1;
if (!int340x_thermal_get_trip_config(int34x_zone->adev->handle, "_PSV",
&int34x_zone->psv_temp))
int34x_zone->psv_trip_id = trip_cnt++;
for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) {
char name[5] = { '_', 'A', 'C', '0' + i, '\0' };
if (int340x_thermal_get_trip_config(int34x_zone->adev->handle,
name,
&int34x_zone->act_trips[i].temp))
break;
int34x_zone->act_trips[i].id = trip_cnt++;
int34x_zone->act_trips[i].valid = true;
}
return trip_cnt;
}
EXPORT_SYMBOL_GPL(int340x_thermal_read_trips);
static struct thermal_zone_params int340x_thermal_params = { static struct thermal_zone_params int340x_thermal_params = {
.governor_name = "user_space", .governor_name = "user_space",
.no_hwmon = true, .no_hwmon = true,
...@@ -188,7 +224,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, ...@@ -188,7 +224,7 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
struct int34x_thermal_zone *int34x_thermal_zone; struct int34x_thermal_zone *int34x_thermal_zone;
acpi_status status; acpi_status status;
unsigned long long trip_cnt; unsigned long long trip_cnt;
int trip_mask = 0, i; int trip_mask = 0;
int ret; int ret;
int34x_thermal_zone = kzalloc(sizeof(*int34x_thermal_zone), int34x_thermal_zone = kzalloc(sizeof(*int34x_thermal_zone),
...@@ -214,28 +250,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, ...@@ -214,28 +250,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev,
int34x_thermal_zone->aux_trip_nr = trip_cnt; int34x_thermal_zone->aux_trip_nr = trip_cnt;
} }
int34x_thermal_zone->crt_trip_id = -1; trip_cnt = int340x_thermal_read_trips(int34x_thermal_zone);
if (!int340x_thermal_get_trip_config(adev->handle, "_CRT",
&int34x_thermal_zone->crt_temp))
int34x_thermal_zone->crt_trip_id = trip_cnt++;
int34x_thermal_zone->hot_trip_id = -1;
if (!int340x_thermal_get_trip_config(adev->handle, "_HOT",
&int34x_thermal_zone->hot_temp))
int34x_thermal_zone->hot_trip_id = trip_cnt++;
int34x_thermal_zone->psv_trip_id = -1;
if (!int340x_thermal_get_trip_config(adev->handle, "_PSV",
&int34x_thermal_zone->psv_temp))
int34x_thermal_zone->psv_trip_id = trip_cnt++;
for (i = 0; i < INT340X_THERMAL_MAX_ACT_TRIP_COUNT; i++) {
char name[5] = { '_', 'A', 'C', '0' + i, '\0' };
if (int340x_thermal_get_trip_config(adev->handle, name,
&int34x_thermal_zone->act_trips[i].temp))
break;
int34x_thermal_zone->act_trips[i].id = trip_cnt++;
int34x_thermal_zone->act_trips[i].valid = true;
}
int34x_thermal_zone->lpat_table = acpi_lpat_get_conversion_table( int34x_thermal_zone->lpat_table = acpi_lpat_get_conversion_table(
adev->handle); adev->handle);
......
...@@ -46,6 +46,7 @@ struct int34x_thermal_zone { ...@@ -46,6 +46,7 @@ struct int34x_thermal_zone {
struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *, struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *,
struct thermal_zone_device_ops *override_ops); struct thermal_zone_device_ops *override_ops);
void int340x_thermal_zone_remove(struct int34x_thermal_zone *); void int340x_thermal_zone_remove(struct int34x_thermal_zone *);
int int340x_thermal_read_trips(struct int34x_thermal_zone *int34x_zone);
static inline void int340x_thermal_zone_set_priv_data( static inline void int340x_thermal_zone_set_priv_data(
struct int34x_thermal_zone *tzone, void *priv_data) struct int34x_thermal_zone *tzone, void *priv_data)
...@@ -60,9 +61,10 @@ static inline void *int340x_thermal_zone_get_priv_data( ...@@ -60,9 +61,10 @@ static inline void *int340x_thermal_zone_get_priv_data(
} }
static inline void int340x_thermal_zone_device_update( static inline void int340x_thermal_zone_device_update(
struct int34x_thermal_zone *tzone) struct int34x_thermal_zone *tzone,
enum thermal_notify_event event)
{ {
thermal_zone_device_update(tzone->zone, THERMAL_EVENT_UNSPECIFIED); thermal_zone_device_update(tzone->zone, event);
} }
#endif #endif
...@@ -258,7 +258,8 @@ static void proc_thermal_notify(acpi_handle handle, u32 event, void *data) ...@@ -258,7 +258,8 @@ static void proc_thermal_notify(acpi_handle handle, u32 event, void *data)
switch (event) { switch (event) {
case PROC_POWER_CAPABILITY_CHANGED: case PROC_POWER_CAPABILITY_CHANGED:
proc_thermal_read_ppcc(proc_priv); proc_thermal_read_ppcc(proc_priv);
int340x_thermal_zone_device_update(proc_priv->int340x_zone); int340x_thermal_zone_device_update(proc_priv->int340x_zone,
THERMAL_DEVICE_POWER_CAPABILITY_CHANGED);
break; break;
default: default:
dev_err(proc_priv->dev, "Unsupported event [0x%x]\n", event); dev_err(proc_priv->dev, "Unsupported event [0x%x]\n", event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment