Re: [PATCH V6 13/30] thermal: exynos: Add support for instance based register/unregister
Hi, On 17-06-2013 02:46, Amit Daniel Kachhap wrote: This code modifies the thermal driver to have multiple thermal zone support by replacing the global thermal zone variable with device data member of thermal_zone_device. Acked-by: Kukjin Kim kgene@samsung.com Acked-by: Jonghwa Lee jonghwa3@samsung.com Signed-off-by: Amit Daniel Kachhap amit.dan...@samsung.com Acked-by: Eduardo Valentin eduardo.valen...@ti.com --- drivers/thermal/samsung/exynos_thermal_common.c | 36 ++ drivers/thermal/samsung/exynos_thermal_common.h |9 +++-- drivers/thermal/samsung/exynos_tmu.c| 15 + 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/drivers/thermal/samsung/exynos_thermal_common.c b/drivers/thermal/samsung/exynos_thermal_common.c index dd49c9f..2af1e3b 100644 --- a/drivers/thermal/samsung/exynos_thermal_common.c +++ b/drivers/thermal/samsung/exynos_thermal_common.c @@ -36,12 +36,11 @@ struct exynos_thermal_zone { bool bind; }; -static struct exynos_thermal_zone *th_zone; - /* Get mode callback functions for thermal zone */ static int exynos_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { + struct exynos_thermal_zone *th_zone = thermal-devdata; if (th_zone) *mode = th_zone-mode; return 0; @@ -51,25 +50,26 @@ static int exynos_get_mode(struct thermal_zone_device *thermal, static int exynos_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - if (!th_zone-therm_dev) { + struct exynos_thermal_zone *th_zone = thermal-devdata; + if (!th_zone) { pr_notice(thermal zone not registered\n); return 0; } - mutex_lock(th_zone-therm_dev-lock); + mutex_lock(thermal-lock); if (mode == THERMAL_DEVICE_ENABLED !th_zone-sensor_conf-trip_data.trigger_falling) - th_zone-therm_dev-polling_delay = IDLE_INTERVAL; + thermal-polling_delay = IDLE_INTERVAL; else - th_zone-therm_dev-polling_delay = 0; + thermal-polling_delay = 0; - mutex_unlock(th_zone-therm_dev-lock); + mutex_unlock(thermal-lock); th_zone-mode = mode; - thermal_zone_device_update(th_zone-therm_dev); + thermal_zone_device_update(thermal); pr_info(thermal polling set for duration=%d msec\n, - th_zone-therm_dev-polling_delay); + thermal-polling_delay); return 0; } @@ -96,6 +96,8 @@ static int exynos_get_trip_type(struct thermal_zone_device *thermal, int trip, static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip, unsigned long *temp) { + struct exynos_thermal_zone *th_zone = thermal-devdata; + if (trip GET_TRIP(MONITOR_ZONE) || trip GET_TRIP(PANIC_ZONE)) return -EINVAL; @@ -122,6 +124,7 @@ static int exynos_bind(struct thermal_zone_device *thermal, { int ret = 0, i, tab_size, level; struct freq_clip_table *tab_ptr, *clip_data; + struct exynos_thermal_zone *th_zone = thermal-devdata; struct thermal_sensor_conf *data = th_zone-sensor_conf; tab_ptr = (struct freq_clip_table *)data-cooling_data.freq_data; @@ -168,6 +171,7 @@ static int exynos_unbind(struct thermal_zone_device *thermal, struct thermal_cooling_device *cdev) { int ret = 0, i, tab_size; + struct exynos_thermal_zone *th_zone = thermal-devdata; struct thermal_sensor_conf *data = th_zone-sensor_conf; if (th_zone-bind == false) @@ -210,6 +214,7 @@ static int exynos_unbind(struct thermal_zone_device *thermal, static int exynos_get_temp(struct thermal_zone_device *thermal, unsigned long *temp) { + struct exynos_thermal_zone *th_zone = thermal-devdata; void *data; if (!th_zone-sensor_conf) { @@ -229,6 +234,7 @@ static int exynos_set_emul_temp(struct thermal_zone_device *thermal, { void *data; int ret = -EINVAL; + struct exynos_thermal_zone *th_zone = thermal-devdata; if (!th_zone-sensor_conf) { pr_info(Temperature sensor not initialised\n); @@ -276,11 +282,12 @@ static struct thermal_zone_device_ops const exynos_dev_ops = { * This function may be called from interrupt based temperature sensor * when threshold is changed. */ -void exynos_report_trigger(void) +void exynos_report_trigger(struct thermal_sensor_conf *conf) { unsigned int i; char data[10]; char *envp[] = { data, NULL }; + struct exynos_thermal_zone *th_zone = conf-pzone_data; if (!th_zone || !th_zone-therm_dev) return; @@ -321,6 +328,7 @@ int exynos_register_thermal(struct thermal_sensor_conf
[PATCH V6 13/30] thermal: exynos: Add support for instance based register/unregister
This code modifies the thermal driver to have multiple thermal zone support by replacing the global thermal zone variable with device data member of thermal_zone_device. Acked-by: Kukjin Kim kgene@samsung.com Acked-by: Jonghwa Lee jonghwa3@samsung.com Signed-off-by: Amit Daniel Kachhap amit.dan...@samsung.com --- drivers/thermal/samsung/exynos_thermal_common.c | 36 ++ drivers/thermal/samsung/exynos_thermal_common.h |9 +++-- drivers/thermal/samsung/exynos_tmu.c| 15 + 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/drivers/thermal/samsung/exynos_thermal_common.c b/drivers/thermal/samsung/exynos_thermal_common.c index dd49c9f..2af1e3b 100644 --- a/drivers/thermal/samsung/exynos_thermal_common.c +++ b/drivers/thermal/samsung/exynos_thermal_common.c @@ -36,12 +36,11 @@ struct exynos_thermal_zone { bool bind; }; -static struct exynos_thermal_zone *th_zone; - /* Get mode callback functions for thermal zone */ static int exynos_get_mode(struct thermal_zone_device *thermal, enum thermal_device_mode *mode) { + struct exynos_thermal_zone *th_zone = thermal-devdata; if (th_zone) *mode = th_zone-mode; return 0; @@ -51,25 +50,26 @@ static int exynos_get_mode(struct thermal_zone_device *thermal, static int exynos_set_mode(struct thermal_zone_device *thermal, enum thermal_device_mode mode) { - if (!th_zone-therm_dev) { + struct exynos_thermal_zone *th_zone = thermal-devdata; + if (!th_zone) { pr_notice(thermal zone not registered\n); return 0; } - mutex_lock(th_zone-therm_dev-lock); + mutex_lock(thermal-lock); if (mode == THERMAL_DEVICE_ENABLED !th_zone-sensor_conf-trip_data.trigger_falling) - th_zone-therm_dev-polling_delay = IDLE_INTERVAL; + thermal-polling_delay = IDLE_INTERVAL; else - th_zone-therm_dev-polling_delay = 0; + thermal-polling_delay = 0; - mutex_unlock(th_zone-therm_dev-lock); + mutex_unlock(thermal-lock); th_zone-mode = mode; - thermal_zone_device_update(th_zone-therm_dev); + thermal_zone_device_update(thermal); pr_info(thermal polling set for duration=%d msec\n, - th_zone-therm_dev-polling_delay); + thermal-polling_delay); return 0; } @@ -96,6 +96,8 @@ static int exynos_get_trip_type(struct thermal_zone_device *thermal, int trip, static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip, unsigned long *temp) { + struct exynos_thermal_zone *th_zone = thermal-devdata; + if (trip GET_TRIP(MONITOR_ZONE) || trip GET_TRIP(PANIC_ZONE)) return -EINVAL; @@ -122,6 +124,7 @@ static int exynos_bind(struct thermal_zone_device *thermal, { int ret = 0, i, tab_size, level; struct freq_clip_table *tab_ptr, *clip_data; + struct exynos_thermal_zone *th_zone = thermal-devdata; struct thermal_sensor_conf *data = th_zone-sensor_conf; tab_ptr = (struct freq_clip_table *)data-cooling_data.freq_data; @@ -168,6 +171,7 @@ static int exynos_unbind(struct thermal_zone_device *thermal, struct thermal_cooling_device *cdev) { int ret = 0, i, tab_size; + struct exynos_thermal_zone *th_zone = thermal-devdata; struct thermal_sensor_conf *data = th_zone-sensor_conf; if (th_zone-bind == false) @@ -210,6 +214,7 @@ static int exynos_unbind(struct thermal_zone_device *thermal, static int exynos_get_temp(struct thermal_zone_device *thermal, unsigned long *temp) { + struct exynos_thermal_zone *th_zone = thermal-devdata; void *data; if (!th_zone-sensor_conf) { @@ -229,6 +234,7 @@ static int exynos_set_emul_temp(struct thermal_zone_device *thermal, { void *data; int ret = -EINVAL; + struct exynos_thermal_zone *th_zone = thermal-devdata; if (!th_zone-sensor_conf) { pr_info(Temperature sensor not initialised\n); @@ -276,11 +282,12 @@ static struct thermal_zone_device_ops const exynos_dev_ops = { * This function may be called from interrupt based temperature sensor * when threshold is changed. */ -void exynos_report_trigger(void) +void exynos_report_trigger(struct thermal_sensor_conf *conf) { unsigned int i; char data[10]; char *envp[] = { data, NULL }; + struct exynos_thermal_zone *th_zone = conf-pzone_data; if (!th_zone || !th_zone-therm_dev) return; @@ -321,6 +328,7 @@ int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf) { int ret; struct cpumask mask_val; + struct exynos_thermal_zone *th_zone; if