diff options
Diffstat (limited to 'patches.tizen/0966-thermal-exynos-Make-the-zone-handling-use-trip-infor.patch')
-rw-r--r-- | patches.tizen/0966-thermal-exynos-Make-the-zone-handling-use-trip-infor.patch | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/patches.tizen/0966-thermal-exynos-Make-the-zone-handling-use-trip-infor.patch b/patches.tizen/0966-thermal-exynos-Make-the-zone-handling-use-trip-infor.patch new file mode 100644 index 00000000000..a9159f0cc2f --- /dev/null +++ b/patches.tizen/0966-thermal-exynos-Make-the-zone-handling-use-trip-infor.patch @@ -0,0 +1,167 @@ +From 786884168c167d68a698cafe0bb220cba8f73824 Mon Sep 17 00:00:00 2001 +From: Amit Daniel Kachhap <amit.daniel@samsung.com> +Date: Mon, 24 Jun 2013 16:20:37 +0530 +Subject: [PATCH 0966/1302] thermal: exynos: Make the zone handling use trip + information + +This code simplifies the zone handling to use the trip information passed +by the TMU driver and not the hardcoded macros. This also helps in adding +more zone support. + +Acked-by: Kukjin Kim <kgene.kim@samsung.com> +Acked-by: Jonghwa Lee <jonghwa3.lee@samsung.com> +Signed-off-by: Amit Daniel Kachhap <amit.daniel@samsung.com> +Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com> +Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com> +--- + drivers/thermal/samsung/exynos_thermal_common.c | 67 ++++++++++++++++--------- + drivers/thermal/samsung/exynos_thermal_common.h | 3 +- + drivers/thermal/samsung/exynos_tmu.c | 5 +- + 3 files changed, 47 insertions(+), 28 deletions(-) + +diff --git a/drivers/thermal/samsung/exynos_thermal_common.c b/drivers/thermal/samsung/exynos_thermal_common.c +index 99318e5..af0ae77 100644 +--- a/drivers/thermal/samsung/exynos_thermal_common.c ++++ b/drivers/thermal/samsung/exynos_thermal_common.c +@@ -79,17 +79,24 @@ static int exynos_set_mode(struct thermal_zone_device *thermal, + static int exynos_get_trip_type(struct thermal_zone_device *thermal, int trip, + enum thermal_trip_type *type) + { +- switch (GET_ZONE(trip)) { +- case MONITOR_ZONE: +- case WARN_ZONE: +- *type = THERMAL_TRIP_ACTIVE; +- break; +- case PANIC_ZONE: ++ struct exynos_thermal_zone *th_zone = thermal->devdata; ++ int max_trip = th_zone->sensor_conf->trip_data.trip_count; ++ int trip_type; ++ ++ if (trip < 0 || trip >= max_trip) ++ return -EINVAL; ++ ++ trip_type = th_zone->sensor_conf->trip_data.trip_type[trip]; ++ ++ if (trip_type == SW_TRIP) + *type = THERMAL_TRIP_CRITICAL; +- break; +- default: ++ else if (trip_type == THROTTLE_ACTIVE) ++ *type = THERMAL_TRIP_ACTIVE; ++ else if (trip_type == THROTTLE_PASSIVE) ++ *type = THERMAL_TRIP_PASSIVE; ++ else + return -EINVAL; +- } ++ + return 0; + } + +@@ -98,8 +105,9 @@ static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip, + unsigned long *temp) + { + struct exynos_thermal_zone *th_zone = thermal->devdata; ++ int max_trip = th_zone->sensor_conf->trip_data.trip_count; + +- if (trip < GET_TRIP(MONITOR_ZONE) || trip > GET_TRIP(PANIC_ZONE)) ++ if (trip < 0 || trip >= max_trip) + return -EINVAL; + + *temp = th_zone->sensor_conf->trip_data.trip_val[trip]; +@@ -113,10 +121,10 @@ static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip, + static int exynos_get_crit_temp(struct thermal_zone_device *thermal, + unsigned long *temp) + { +- int ret; +- /* Panic zone */ +- ret = exynos_get_trip_temp(thermal, GET_TRIP(PANIC_ZONE), temp); +- return ret; ++ struct exynos_thermal_zone *th_zone = thermal->devdata; ++ int max_trip = th_zone->sensor_conf->trip_data.trip_count; ++ /* Get the temp of highest trip*/ ++ return exynos_get_trip_temp(thermal, max_trip - 1, temp); + } + + /* Bind callback functions for thermal zone */ +@@ -348,19 +356,28 @@ int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf) + return -ENOMEM; + + th_zone->sensor_conf = sensor_conf; +- cpumask_set_cpu(0, &mask_val); +- th_zone->cool_dev[0] = cpufreq_cooling_register(&mask_val); +- if (IS_ERR(th_zone->cool_dev[0])) { +- pr_err("Failed to register cpufreq cooling device\n"); +- ret = -EINVAL; +- goto err_unregister; ++ /* ++ * TODO: 1) Handle multiple cooling devices in a thermal zone ++ * 2) Add a flag/name in cooling info to map to specific ++ * sensor ++ */ ++ if (sensor_conf->cooling_data.freq_clip_count > 0) { ++ cpumask_set_cpu(0, &mask_val); ++ th_zone->cool_dev[th_zone->cool_dev_size] = ++ cpufreq_cooling_register(&mask_val); ++ if (IS_ERR(th_zone->cool_dev[th_zone->cool_dev_size])) { ++ pr_err("Failed to register cpufreq cooling device\n"); ++ ret = -EINVAL; ++ goto err_unregister; ++ } ++ th_zone->cool_dev_size++; + } +- th_zone->cool_dev_size++; + +- th_zone->therm_dev = thermal_zone_device_register(sensor_conf->name, +- EXYNOS_ZONE_COUNT, 0, th_zone, &exynos_dev_ops, NULL, 0, +- sensor_conf->trip_data.trigger_falling ? +- 0 : IDLE_INTERVAL); ++ th_zone->therm_dev = thermal_zone_device_register( ++ sensor_conf->name, sensor_conf->trip_data.trip_count, ++ 0, th_zone, &exynos_dev_ops, NULL, 0, ++ sensor_conf->trip_data.trigger_falling ? 0 : ++ IDLE_INTERVAL); + + if (IS_ERR(th_zone->therm_dev)) { + pr_err("Failed to register thermal zone device\n"); +diff --git a/drivers/thermal/samsung/exynos_thermal_common.h b/drivers/thermal/samsung/exynos_thermal_common.h +index 6ca3096..bfcf69e 100644 +--- a/drivers/thermal/samsung/exynos_thermal_common.h ++++ b/drivers/thermal/samsung/exynos_thermal_common.h +@@ -42,8 +42,6 @@ + #define GET_ZONE(trip) (trip + 2) + #define GET_TRIP(zone) (zone - 2) + +-#define EXYNOS_ZONE_COUNT 3 +- + enum trigger_type { + THROTTLE_ACTIVE = 1, + THROTTLE_PASSIVE, +@@ -69,6 +67,7 @@ struct freq_clip_table { + + struct thermal_trip_point_conf { + int trip_val[MAX_TRIP_COUNT]; ++ int trip_type[MAX_TRIP_COUNT]; + int trip_count; + unsigned char trigger_falling; + }; +diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c +index 40e0cfd..acbd295 100644 +--- a/drivers/thermal/samsung/exynos_tmu.c ++++ b/drivers/thermal/samsung/exynos_tmu.c +@@ -509,9 +509,12 @@ static int exynos_tmu_probe(struct platform_device *pdev) + pdata->trigger_enable[1] + pdata->trigger_enable[2]+ + pdata->trigger_enable[3]; + +- for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++) ++ for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++) { + exynos_sensor_conf.trip_data.trip_val[i] = + pdata->threshold + pdata->trigger_levels[i]; ++ exynos_sensor_conf.trip_data.trip_type[i] = ++ pdata->trigger_type[i]; ++ } + + exynos_sensor_conf.trip_data.trigger_falling = pdata->threshold_falling; + +-- +1.8.3.2 + |