[U-Boot] [PATCH 0/8 v2] Add TMU support for Exynos5250 based SMDK5250

This patch series adds support for TMU driver using device tree for Exynos5250 based SMDK5250 board. This patch series is dependent on the patch series "Add DT based ethernet driver for SMDK5250" by Hatim Ali
Changes since v1: - Created new generic header file include/tmu.h - Removed GEN tag from subject in 2 patches - Changed description comments for couple of functions - Added "Acked-by" to all the patches
Akshay Saraswat (6): EXYNOS5: FDT: Add TMU device node values EXYNOS5: TMU: Add driver for Thermal Management Unit EXYNOS5: Power down API for Thermal Management Unit Add a poll function to monitor events EXYNOS5: TMU: Add TMU status polling EXYNOS5: Config: Enable support for Exynos TMU driver
Alim Akhtar (2): TMU: Add u-boot command to read current temp EXYNOS5: Config: Enable tmu command
README | 7 + arch/arm/cpu/armv7/exynos/power.c | 15 ++ arch/arm/dts/exynos5250.dtsi | 5 + arch/arm/include/asm/arch-exynos/exynos-tmu.h | 58 +++++ arch/arm/include/asm/arch-exynos/power.h | 8 + board/samsung/dts/exynos5250-smdk5250.dts | 13 + board/samsung/smdk5250/smdk5250.c | 36 +++ common/Makefile | 1 + common/cmd_tmu.c | 51 +++++ common/console.c | 5 + doc/device-tree-bindings/exynos/tmu.txt | 35 +++ drivers/power/Makefile | 1 + drivers/power/exynos-tmu.c | 297 +++++++++++++++++++++++++ include/common.h | 6 + include/configs/exynos5250-dt.h | 7 + include/fdtdec.h | 1 + include/tmu.h | 46 ++++ lib/fdtdec.c | 1 + 18 files changed, 593 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-exynos/exynos-tmu.h create mode 100644 common/cmd_tmu.c create mode 100644 doc/device-tree-bindings/exynos/tmu.txt create mode 100644 drivers/power/exynos-tmu.c create mode 100644 include/tmu.h

From: Akshay Saraswat akshay.s@samsung.com
Fdt entry for Exynos TMU driver specific pre-defined values used for calibration of current temperature and defining threshold values.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Added Acked-by: Simon Glass
arch/arm/dts/exynos5250.dtsi | 5 ++++ board/samsung/dts/exynos5250-smdk5250.dts | 13 ++++++++++ doc/device-tree-bindings/exynos/tmu.txt | 35 +++++++++++++++++++++++++++++ include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 5 files changed, 55 insertions(+), 0 deletions(-) create mode 100644 doc/device-tree-bindings/exynos/tmu.txt
diff --git a/arch/arm/dts/exynos5250.dtsi b/arch/arm/dts/exynos5250.dtsi index fa4d498..db22db6 100644 --- a/arch/arm/dts/exynos5250.dtsi +++ b/arch/arm/dts/exynos5250.dtsi @@ -28,4 +28,9 @@ #address-cells = <1>; #size-cells = <0>; }; + + tmu@10060000 { + compatible = "samsung,exynos-tmu"; + reg = <0x10060000 0xffff>; + }; }; diff --git a/board/samsung/dts/exynos5250-smdk5250.dts b/board/samsung/dts/exynos5250-smdk5250.dts index b6fbb67..2d3ecca 100644 --- a/board/samsung/dts/exynos5250-smdk5250.dts +++ b/board/samsung/dts/exynos5250-smdk5250.dts @@ -26,4 +26,17 @@ phy-mode = "mii"; }; }; + + tmu@10060000 { + samsung,mux = <6>; + samsung,min-temp = <25>; + samsung,max-temp = <125>; + samsung,start-warning = <95>; + samsung,start-tripping = <105>; + samsung,efuse-min-value = <40>; + samsung,efuse-value = <55>; + samsung,efuse-max-value = <100>; + samsung,slope = <268470274>; + samsung,dc-value = <25>; + }; }; diff --git a/doc/device-tree-bindings/exynos/tmu.txt b/doc/device-tree-bindings/exynos/tmu.txt new file mode 100644 index 0000000..99e7164 --- /dev/null +++ b/doc/device-tree-bindings/exynos/tmu.txt @@ -0,0 +1,35 @@ +Exynos Thermal management Unit + +The device node for TMU that is a part of Exynos5250 +SOC is as described in the document "Open Firmware Recommended +Practic : Universal Serial Bus" with the following modifications +and additions: + +Required properties : + - compatible : Should be "samsung,exynos-tmu" for TMU + - samsung,mux : mux Address for the TMU to enable TMU core: + - samsung,min-temp : Minimum temperature, default is 25: + - samsung,max-temp : Maximum temperature, defalut set to 125: + - samsung,start-warning : temp at which TMU start giving warning: + - samsung,start-tripping : temp at which system will trip and shutdown: + - samsung,efuse-min-value : SOC efuse min value: + - samsung,efuse-value : SOC actual efuse value: + - samsung,efuse-max-value : SoC max efuse value: + - samsung,slope : Gain of amplifier, default is 268470274: + - samsung,dc-value : DC value of TMU, default is 25: + +Example: + +tmu@10060000 { + compatible = "samsung,exynos-tmu" + samsung,mux = <6>; + samsung,min-temp = <25>; + samsung,max-temp = <125>; + samsung,start-warning = <95>; + samsung,start-tripping = <105>; + samsung,efuse-min-value = <40>; + samsung,efuse-value = <55>; + samsung,efuse-max-value = <100>; + samsung,slope = <268470274>; + samsung,dc-value = <25>; +}; diff --git a/include/fdtdec.h b/include/fdtdec.h index 8f79f8a..180dfff 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -68,6 +68,7 @@ enum fdt_compat_id { COMPAT_NVIDIA_TEGRA20_NAND, /* Tegra2 NAND controller */ COMPAT_SMSC_LAN9215, /* SMSC 10/100 Ethernet LAN9215 */ COMPAT_SAMSUNG_EXYNOS5_SROMC, /* Exynos5 SROMC */ + COMPAT_SAMSUNG_EXYNOS_TMU, /* Exynos TMU */
COMPAT_COUNT, }; diff --git a/lib/fdtdec.c b/lib/fdtdec.c index d8103fd..8e5ed21 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -45,6 +45,7 @@ static const char * const compat_names[COMPAT_COUNT] = { COMPAT(NVIDIA_TEGRA20_NAND, "nvidia,tegra20-nand"), COMPAT(SMSC_LAN9215, "smsc,lan9215"), COMPAT(SAMSUNG_EXYNOS5_SROMC, "samsung,exynos-sromc"), + COMPAT(SAMSUNG_EXYNOS_TMU, "samsung,exynos-tmu"), };
const char *fdtdec_get_compatible(enum fdt_compat_id id)

From: Akshay Saraswat akshay.s@samsung.com
Adding Exynos Thermal Management Unit driver to monitor SOC temperature and take actions corresponding to states of TMU. System will shutdown if tripping temperature is reached.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Added new generic header file include/tmu.h - Added Acked-by: Simon Glass
arch/arm/include/asm/arch-exynos/exynos-tmu.h | 58 +++++ drivers/power/Makefile | 1 + drivers/power/exynos-tmu.c | 297 +++++++++++++++++++++++++ include/tmu.h | 46 ++++ 4 files changed, 402 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-exynos/exynos-tmu.h create mode 100644 drivers/power/exynos-tmu.c create mode 100644 include/tmu.h
diff --git a/arch/arm/include/asm/arch-exynos/exynos-tmu.h b/arch/arm/include/asm/arch-exynos/exynos-tmu.h new file mode 100644 index 0000000..adfaf0d --- /dev/null +++ b/arch/arm/include/asm/arch-exynos/exynos-tmu.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * Akshay Saraswat akshay.s@samsung.com + * + * EXYNOS - Thermal Management Unit + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_ARCH_THERMAL_H +#define __ASM_ARCH_THERMAL_H + +struct tmu_reg { + unsigned triminfo; + unsigned rsvd1; + unsigned rsvd2; + unsigned rsvd3; + unsigned rsvd4; + unsigned triminfo_control; + unsigned rsvd5; + unsigned rsvd6; + unsigned tmu_control; + unsigned rsvd7; + unsigned tmu_status; + unsigned sampling_internal; + unsigned counter_value0; + unsigned counter_value1; + unsigned rsvd8; + unsigned rsvd9; + unsigned current_temp; + unsigned rsvd10; + unsigned rsvd11; + unsigned rsvd12; + unsigned threshold_temp_rise; + unsigned threshold_temp_fall; + unsigned rsvd13; + unsigned rsvd14; + unsigned past_temp3_0; + unsigned past_temp7_4; + unsigned past_temp11_8; + unsigned past_temp15_12; + unsigned inten; + unsigned intstat; + unsigned intclear; + unsigned rsvd15; + unsigned emul_con; +}; +#endif /* __ASM_ARCH_THERMAL_H */ diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 6bf388c..192a7cb 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile @@ -30,6 +30,7 @@ COBJS-$(CONFIG_TPS6586X_POWER) += tps6586x.o COBJS-$(CONFIG_TWL4030_POWER) += twl4030.o COBJS-$(CONFIG_TWL6030_POWER) += twl6030.o COBJS-$(CONFIG_TWL6035_POWER) += twl6035.o +COBJS-$(CONFIG_EXYNOS_TMU) += exynos-tmu.o
COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/drivers/power/exynos-tmu.c b/drivers/power/exynos-tmu.c new file mode 100644 index 0000000..ce71408 --- /dev/null +++ b/drivers/power/exynos-tmu.c @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * Akshay Saraswat akshay.s@samsung.com + * + * EXYNOS - Thermal Management Unit + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <errno.h> +#include <fdtdec.h> +#include <tmu.h> +#include <asm/arch/exynos-tmu.h> + +#define TRIMINFO_RELOAD 1 +#define CORE_EN 1 + +#define INTEN_RISE0 1 +#define INTEN_RISE1 (1 << 4) +#define INTEN_RISE2 (1 << 8) +#define INTEN_FALL0 (1 << 16) +#define INTEN_FALL1 (1 << 20) +#define INTEN_FALL2 (1 << 24) + +#define TRIM_INFO_MASK 0xff + +#define INTCLEAR_RISE0 1 +#define INTCLEAR_RISE1 (1 << 4) +#define INTCLEAR_RISE2 (1 << 8) +#define INTCLEAR_FALL0 (1 << 16) +#define INTCLEAR_FALL1 (1 << 20) +#define INTCLEAR_FALL2 (1 << 24) +#define INTCLEARALL (INTCLEAR_RISE0 | INTCLEAR_RISE1 | \ + INTCLEAR_RISE2 | INTCLEAR_FALL0 | \ + INTCLEAR_FALL1 | INTCLEAR_FALL2) + +/* Tmeperature threshold values for various thermal events */ +struct temperature_params { + /* minimum value in temperature code range */ + unsigned int min_val; + /* maximum value in temperature code range */ + unsigned int max_val; + /* temperature threshold to start warning */ + unsigned int start_warning; + /* temperature threshold CPU tripping */ + unsigned int start_tripping; +}; + +/* Pre-defined values and thresholds for calibration of current temperature */ +struct tmu_data { + /* pre-defined temperature thresholds */ + struct temperature_params ts; + /* pre-defined efuse range minimum value */ + unsigned int efuse_min_value; + /* pre-defined efuse value for temperature calibration */ + unsigned int efuse_value; + /* pre-defined efuse range maximum value */ + unsigned int efuse_max_value; + /* current temperature sensing slope */ + unsigned int slope; +}; + +/* TMU device specific details and status */ +struct tmu_info { + /* base Address for the TMU */ + unsigned tmu_base; + /* mux Address for the TMU */ + int tmu_mux; + /* pre-defined values for calibration and thresholds */ + struct tmu_data data; + /* value required for triminfo_25 calibration */ + unsigned int te1; + /* value required for triminfo_85 calibration */ + unsigned int te2; + /* TMU DC value for threshold calculation */ + int dc_value; + /* enum value indicating status of the TMU */ + int tmu_state; +}; + +/* Global struct tmu_info variable to store init values */ +static struct tmu_info gbl_info; + +/* + * After reading temperature code from register, compensating + * its value and calculating celsius temperatue, + * get current temperatue. + * + * @return current temperature of the chip as sensed by TMU + */ +int get_cur_temp(struct tmu_info *info) +{ + int cur_temp; + struct tmu_reg *reg = (struct tmu_reg *)info->tmu_base; + + /* Temperature code range between min 25 and max 125 */ + cur_temp = readl(®->current_temp) & 0xff; + + /* Calibrate current temperature */ + if (cur_temp) + cur_temp = cur_temp - info->te1 + info->dc_value; + + return cur_temp; +} + +/* + * Monitors status of the TMU device and exynos temperature + * + * @param temp pointer to the current temperature value + * @return enum tmu_status_t value, code indicating event to execute + */ +enum tmu_status_t tmu_monitor(int *temp) +{ + if (gbl_info.tmu_state == TMU_STATUS_INIT) + return -1; + + int cur_temp; + struct tmu_data *data = &gbl_info.data; + + /* Read current temperature of the SOC */ + cur_temp = get_cur_temp(&gbl_info); + *temp = cur_temp; + + /* Temperature code lies between min 25 and max 125 */ + if (cur_temp >= data->ts.start_tripping && + cur_temp <= data->ts.max_val) + return TMU_STATUS_TRIPPED; + else if (cur_temp >= data->ts.start_warning) + return TMU_STATUS_WARNING; + else if (cur_temp < data->ts.start_warning && + cur_temp >= data->ts.min_val) + return TMU_STATUS_NORMAL; + /* Temperature code does not lie between min 25 and max 125 */ + else { + gbl_info.tmu_state = TMU_STATUS_INIT; + debug("EXYNOS_TMU: Thermal reading failed\n"); + return -1; + } + return 0; +} + +/* + * Get TMU specific pre-defined values from FDT + * + * @param info pointer to the tmu_info struct + * @param blob FDT blob + * @return int value, 0 for success + */ +int get_tmu_fdt_values(struct tmu_info *info, const void *blob) +{ + int node; + int error = 0; + + /* Get the node from FDT for TMU */ + node = fdtdec_next_compatible(blob, 0, + COMPAT_SAMSUNG_EXYNOS_TMU); + if (node < 0) { + debug("EXYNOS_TMU: No node for tmu in device tree\n"); + return -1; + } + + /* + * Get the pre-defined TMU specific values from FDT. + * All of these are expected to be correct otherwise + * miscalculation of register values in tmu_setup_parameters + * may result in misleading current temperature. + */ + info->tmu_base = fdtdec_get_addr(blob, node, "reg"); + if (info->tmu_base == FDT_ADDR_T_NONE) { + debug("%s: Missing tmu-base\n", __func__); + return -1; + } + info->tmu_mux = fdtdec_get_int(blob, + node, "samsung,mux", -1); + error |= info->tmu_mux; + info->data.ts.min_val = fdtdec_get_int(blob, + node, "samsung,min-temp", -1); + error |= info->data.ts.min_val; + info->data.ts.max_val = fdtdec_get_int(blob, + node, "samsung,max-temp", -1); + error |= info->data.ts.max_val; + info->data.ts.start_warning = fdtdec_get_int(blob, + node, "samsung,start-warning", -1); + error |= info->data.ts.start_warning; + info->data.ts.start_tripping = fdtdec_get_int(blob, + node, "samsung,start-tripping", -1); + error |= info->data.ts.start_tripping; + info->data.efuse_min_value = fdtdec_get_int(blob, + node, "samsung,efuse-min-value", -1); + error |= info->data.efuse_min_value; + info->data.efuse_value = fdtdec_get_int(blob, + node, "samsung,efuse-value", -1); + error |= info->data.efuse_value; + info->data.efuse_max_value = fdtdec_get_int(blob, + node, "samsung,efuse-max-value", -1); + error |= info->data.efuse_max_value; + info->data.slope = fdtdec_get_int(blob, + node, "samsung,slope", -1); + error |= info->data.slope; + info->dc_value = fdtdec_get_int(blob, + node, "samsung,dc-value", -1); + error |= info->dc_value; + + if (error == -1) { + debug("fail to get tmu node properties\n"); + return -1; + } + + return 0; +} + +/* + * Calibrate and calculate threshold values and + * enable interrupt levels + * + * @param info pointer to the tmu_info struct + */ +void tmu_setup_parameters(struct tmu_info *info) +{ + unsigned int te_temp, con; + unsigned int warning_temp, trip_temp; + unsigned int cooling_temp; + unsigned int rising_value; + struct tmu_data *data = &info->data; + struct tmu_reg *reg = (struct tmu_reg *)info->tmu_base; + + /* Must reload for using efuse value at EXYNOS */ + writel(TRIMINFO_RELOAD, ®->triminfo_control); + + /* Get the compensation parameter */ + te_temp = readl(®->triminfo); + info->te1 = te_temp & TRIM_INFO_MASK; + info->te2 = ((te_temp >> 8) & TRIM_INFO_MASK); + + if ((data->efuse_min_value > info->te1) || + (info->te1 > data->efuse_max_value) + || (info->te2 != 0)) + info->te1 = data->efuse_value; + + /* Get RISING & FALLING Threshold value */ + warning_temp = data->ts.start_warning + + info->te1 - info->dc_value; + trip_temp = data->ts.start_tripping + + info->te1 - info->dc_value; + cooling_temp = 0; + + rising_value = ((warning_temp << 8) | (trip_temp << 16)); + + /* Set interrupt level */ + writel(rising_value, ®->threshold_temp_rise); + writel(cooling_temp, ®->threshold_temp_fall); + + /* + * Need to init all regsiter setting after getting parameter info + * [28:23] vref [11:8] slope - Tunning parameter + */ + writel(data->slope, ®->tmu_control); + + writel(INTCLEARALL, ®->intclear); + /* TMU core enable */ + con = readl(®->tmu_control); + con |= (info->tmu_mux << 20) | CORE_EN; + + writel(con, ®->tmu_control); + + /* LEV0 LEV1 LEV2 interrupt enable */ + writel(INTEN_RISE0 | INTEN_RISE1 | INTEN_RISE2, ®->inten); +} + +/* + * Initialize TMU device + * + * @param blob FDT blob + * @return int value, 0 for success + */ +int tmu_init(const void *blob) +{ + gbl_info.tmu_state = TMU_STATUS_INIT; + if (get_tmu_fdt_values(&gbl_info, blob) < 0) + return -1; + + tmu_setup_parameters(&gbl_info); + gbl_info.tmu_state = TMU_STATUS_NORMAL; + + return 0; +} diff --git a/include/tmu.h b/include/tmu.h new file mode 100644 index 0000000..ba813ce --- /dev/null +++ b/include/tmu.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * Akshay Saraswat akshay.s@samsung.com + * + * Thermal Management Unit + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef _THERMAL_H +#define _THERMAL_H + +enum tmu_status_t { + TMU_STATUS_INIT = 0, + TMU_STATUS_NORMAL, + TMU_STATUS_WARNING, + TMU_STATUS_TRIPPED, +}; + +/* + * Monitors status of the TMU device and exynos temperature + * + * @param temp pointer to the current temperature value + * @return enum tmu_status_t value, code indicating event to execute + * and -1 on error + */ +enum tmu_status_t tmu_monitor(int *temp); + +/* + * Initialize TMU device + * + * @param blob FDT blob + * @return int value, 0 for success + */ +int tmu_init(const void *blob); +#endif /* _THERMAL_H_ */

Hi Hatim,
On Wed, Nov 7, 2012 at 5:08 AM, Hatim Ali hatim.rv@samsung.com wrote:
From: Akshay Saraswat akshay.s@samsung.com
Adding Exynos Thermal Management Unit driver to monitor SOC temperature and take actions corresponding to states of TMU. System will shutdown if tripping temperature is reached.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org
Changes since v1: - Added new generic header file include/tmu.h - Added Acked-by: Simon Glass
arch/arm/include/asm/arch-exynos/exynos-tmu.h | 58 +++++ drivers/power/Makefile | 1 + drivers/power/exynos-tmu.c | 297 +++++++++++++++++++++++++ include/tmu.h | 46 ++++ 4 files changed, 402 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-exynos/exynos-tmu.h create mode 100644 drivers/power/exynos-tmu.c create mode 100644 include/tmu.h
diff --git a/arch/arm/include/asm/arch-exynos/exynos-tmu.h b/arch/arm/include/asm/arch-exynos/exynos-tmu.h new file mode 100644 index 0000000..adfaf0d --- /dev/null +++ b/arch/arm/include/asm/arch-exynos/exynos-tmu.h @@ -0,0 +1,58 @@ +/*
- Copyright (c) 2012 Samsung Electronics Co., Ltd.
http://www.samsung.com
- Akshay Saraswat akshay.s@samsung.com
- EXYNOS - Thermal Management Unit
- See file CREDITS for list of people who contributed to this
- project.
- 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.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#ifndef __ASM_ARCH_THERMAL_H +#define __ASM_ARCH_THERMAL_H
Suggest renaming this to ASM_ARCH_TMU_H
+struct tmu_reg {
unsigned triminfo;
unsigned rsvd1;
unsigned rsvd2;
unsigned rsvd3;
unsigned rsvd4;
unsigned triminfo_control;
unsigned rsvd5;
unsigned rsvd6;
unsigned tmu_control;
unsigned rsvd7;
unsigned tmu_status;
unsigned sampling_internal;
unsigned counter_value0;
unsigned counter_value1;
unsigned rsvd8;
unsigned rsvd9;
unsigned current_temp;
unsigned rsvd10;
unsigned rsvd11;
unsigned rsvd12;
unsigned threshold_temp_rise;
unsigned threshold_temp_fall;
unsigned rsvd13;
unsigned rsvd14;
unsigned past_temp3_0;
unsigned past_temp7_4;
unsigned past_temp11_8;
unsigned past_temp15_12;
unsigned inten;
unsigned intstat;
unsigned intclear;
unsigned rsvd15;
unsigned emul_con;
+}; +#endif /* __ASM_ARCH_THERMAL_H */ diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 6bf388c..192a7cb 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile @@ -30,6 +30,7 @@ COBJS-$(CONFIG_TPS6586X_POWER) += tps6586x.o COBJS-$(CONFIG_TWL4030_POWER) += twl4030.o COBJS-$(CONFIG_TWL6030_POWER) += twl6030.o COBJS-$(CONFIG_TWL6035_POWER) += twl6035.o +COBJS-$(CONFIG_EXYNOS_TMU) += exynos-tmu.o
COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/drivers/power/exynos-tmu.c b/drivers/power/exynos-tmu.c new file mode 100644 index 0000000..ce71408 --- /dev/null +++ b/drivers/power/exynos-tmu.c @@ -0,0 +1,297 @@ +/*
- Copyright (c) 2012 Samsung Electronics Co., Ltd.
http://www.samsung.com
- Akshay Saraswat akshay.s@samsung.com
- EXYNOS - Thermal Management Unit
- See file CREDITS for list of people who contributed to this
- project.
- 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.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#include <common.h> +#include <errno.h> +#include <fdtdec.h> +#include <tmu.h> +#include <asm/arch/exynos-tmu.h>
+#define TRIMINFO_RELOAD 1 +#define CORE_EN 1
+#define INTEN_RISE0 1 +#define INTEN_RISE1 (1 << 4) +#define INTEN_RISE2 (1 << 8) +#define INTEN_FALL0 (1 << 16) +#define INTEN_FALL1 (1 << 20) +#define INTEN_FALL2 (1 << 24)
+#define TRIM_INFO_MASK 0xff
+#define INTCLEAR_RISE0 1 +#define INTCLEAR_RISE1 (1 << 4) +#define INTCLEAR_RISE2 (1 << 8) +#define INTCLEAR_FALL0 (1 << 16) +#define INTCLEAR_FALL1 (1 << 20) +#define INTCLEAR_FALL2 (1 << 24) +#define INTCLEARALL (INTCLEAR_RISE0 | INTCLEAR_RISE1 | \
INTCLEAR_RISE2 | INTCLEAR_FALL0 | \
INTCLEAR_FALL1 | INTCLEAR_FALL2)
+/* Tmeperature threshold values for various thermal events */ +struct temperature_params {
/* minimum value in temperature code range */
unsigned int min_val;
/* maximum value in temperature code range */
unsigned int max_val;
/* temperature threshold to start warning */
unsigned int start_warning;
/* temperature threshold CPU tripping */
unsigned int start_tripping;
+};
+/* Pre-defined values and thresholds for calibration of current temperature */ +struct tmu_data {
/* pre-defined temperature thresholds */
struct temperature_params ts;
/* pre-defined efuse range minimum value */
unsigned int efuse_min_value;
/* pre-defined efuse value for temperature calibration */
unsigned int efuse_value;
/* pre-defined efuse range maximum value */
unsigned int efuse_max_value;
/* current temperature sensing slope */
unsigned int slope;
+};
+/* TMU device specific details and status */ +struct tmu_info {
/* base Address for the TMU */
unsigned tmu_base;
/* mux Address for the TMU */
int tmu_mux;
/* pre-defined values for calibration and thresholds */
struct tmu_data data;
/* value required for triminfo_25 calibration */
unsigned int te1;
/* value required for triminfo_85 calibration */
unsigned int te2;
/* TMU DC value for threshold calculation */
int dc_value;
/* enum value indicating status of the TMU */
int tmu_state;
+};
+/* Global struct tmu_info variable to store init values */ +static struct tmu_info gbl_info;
+/*
- After reading temperature code from register, compensating
- its value and calculating celsius temperatue,
- get current temperatue.
- @return current temperature of the chip as sensed by TMU
- */
+int get_cur_temp(struct tmu_info *info) +{
int cur_temp;
struct tmu_reg *reg = (struct tmu_reg *)info->tmu_base;
/* Temperature code range between min 25 and max 125 */
cur_temp = readl(®->current_temp) & 0xff;
/* Calibrate current temperature */
if (cur_temp)
cur_temp = cur_temp - info->te1 + info->dc_value;
return cur_temp;
+}
+/*
- Monitors status of the TMU device and exynos temperature
- @param temp pointer to the current temperature value
- @return enum tmu_status_t value, code indicating event to execute
- */
+enum tmu_status_t tmu_monitor(int *temp) +{
if (gbl_info.tmu_state == TMU_STATUS_INIT)
return -1;
int cur_temp;
struct tmu_data *data = &gbl_info.data;
/* Read current temperature of the SOC */
cur_temp = get_cur_temp(&gbl_info);
*temp = cur_temp;
/* Temperature code lies between min 25 and max 125 */
if (cur_temp >= data->ts.start_tripping &&
cur_temp <= data->ts.max_val)
return TMU_STATUS_TRIPPED;
else if (cur_temp >= data->ts.start_warning)
return TMU_STATUS_WARNING;
else if (cur_temp < data->ts.start_warning &&
cur_temp >= data->ts.min_val)
return TMU_STATUS_NORMAL;
/* Temperature code does not lie between min 25 and max 125 */
else {
gbl_info.tmu_state = TMU_STATUS_INIT;
debug("EXYNOS_TMU: Thermal reading failed\n");
return -1;
}
return 0;
+}
+/*
- Get TMU specific pre-defined values from FDT
- @param info pointer to the tmu_info struct
- @param blob FDT blob
- @return int value, 0 for success
- */
+int get_tmu_fdt_values(struct tmu_info *info, const void *blob) +{
int node;
int error = 0;
/* Get the node from FDT for TMU */
node = fdtdec_next_compatible(blob, 0,
COMPAT_SAMSUNG_EXYNOS_TMU);
if (node < 0) {
debug("EXYNOS_TMU: No node for tmu in device tree\n");
return -1;
}
/*
* Get the pre-defined TMU specific values from FDT.
* All of these are expected to be correct otherwise
* miscalculation of register values in tmu_setup_parameters
* may result in misleading current temperature.
*/
info->tmu_base = fdtdec_get_addr(blob, node, "reg");
if (info->tmu_base == FDT_ADDR_T_NONE) {
debug("%s: Missing tmu-base\n", __func__);
return -1;
}
info->tmu_mux = fdtdec_get_int(blob,
node, "samsung,mux", -1);
error |= info->tmu_mux;
info->data.ts.min_val = fdtdec_get_int(blob,
node, "samsung,min-temp", -1);
error |= info->data.ts.min_val;
info->data.ts.max_val = fdtdec_get_int(blob,
node, "samsung,max-temp", -1);
error |= info->data.ts.max_val;
info->data.ts.start_warning = fdtdec_get_int(blob,
node, "samsung,start-warning", -1);
error |= info->data.ts.start_warning;
info->data.ts.start_tripping = fdtdec_get_int(blob,
node, "samsung,start-tripping", -1);
error |= info->data.ts.start_tripping;
info->data.efuse_min_value = fdtdec_get_int(blob,
node, "samsung,efuse-min-value", -1);
error |= info->data.efuse_min_value;
info->data.efuse_value = fdtdec_get_int(blob,
node, "samsung,efuse-value", -1);
error |= info->data.efuse_value;
info->data.efuse_max_value = fdtdec_get_int(blob,
node, "samsung,efuse-max-value", -1);
error |= info->data.efuse_max_value;
info->data.slope = fdtdec_get_int(blob,
node, "samsung,slope", -1);
error |= info->data.slope;
info->dc_value = fdtdec_get_int(blob,
node, "samsung,dc-value", -1);
error |= info->dc_value;
if (error == -1) {
debug("fail to get tmu node properties\n");
return -1;
}
return 0;
+}
+/*
- Calibrate and calculate threshold values and
- enable interrupt levels
- @param info pointer to the tmu_info struct
- */
+void tmu_setup_parameters(struct tmu_info *info) +{
unsigned int te_temp, con;
unsigned int warning_temp, trip_temp;
unsigned int cooling_temp;
unsigned int rising_value;
struct tmu_data *data = &info->data;
struct tmu_reg *reg = (struct tmu_reg *)info->tmu_base;
/* Must reload for using efuse value at EXYNOS */
writel(TRIMINFO_RELOAD, ®->triminfo_control);
/* Get the compensation parameter */
te_temp = readl(®->triminfo);
info->te1 = te_temp & TRIM_INFO_MASK;
info->te2 = ((te_temp >> 8) & TRIM_INFO_MASK);
if ((data->efuse_min_value > info->te1) ||
(info->te1 > data->efuse_max_value)
|| (info->te2 != 0))
info->te1 = data->efuse_value;
/* Get RISING & FALLING Threshold value */
warning_temp = data->ts.start_warning
+ info->te1 - info->dc_value;
trip_temp = data->ts.start_tripping
+ info->te1 - info->dc_value;
cooling_temp = 0;
rising_value = ((warning_temp << 8) | (trip_temp << 16));
/* Set interrupt level */
writel(rising_value, ®->threshold_temp_rise);
writel(cooling_temp, ®->threshold_temp_fall);
/*
* Need to init all regsiter setting after getting parameter info
* [28:23] vref [11:8] slope - Tunning parameter
*/
writel(data->slope, ®->tmu_control);
writel(INTCLEARALL, ®->intclear);
/* TMU core enable */
con = readl(®->tmu_control);
con |= (info->tmu_mux << 20) | CORE_EN;
writel(con, ®->tmu_control);
/* LEV0 LEV1 LEV2 interrupt enable */
writel(INTEN_RISE0 | INTEN_RISE1 | INTEN_RISE2, ®->inten);
+}
+/*
- Initialize TMU device
- @param blob FDT blob
- @return int value, 0 for success
- */
+int tmu_init(const void *blob) +{
gbl_info.tmu_state = TMU_STATUS_INIT;
if (get_tmu_fdt_values(&gbl_info, blob) < 0)
return -1;
tmu_setup_parameters(&gbl_info);
gbl_info.tmu_state = TMU_STATUS_NORMAL;
return 0;
+} diff --git a/include/tmu.h b/include/tmu.h new file mode 100644 index 0000000..ba813ce --- /dev/null +++ b/include/tmu.h @@ -0,0 +1,46 @@ +/*
- Copyright (c) 2012 Samsung Electronics Co., Ltd.
http://www.samsung.com
- Akshay Saraswat akshay.s@samsung.com
- Thermal Management Unit
- See file CREDITS for list of people who contributed to this
- project.
- 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.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#ifndef _THERMAL_H +#define _THERMAL_H
The guard here should be _TMU_H I think.
+enum tmu_status_t {
TMU_STATUS_INIT = 0,
TMU_STATUS_NORMAL,
TMU_STATUS_WARNING,
TMU_STATUS_TRIPPED,
+};
+/*
- Monitors status of the TMU device and exynos temperature
- @param temp pointer to the current temperature value
- @return enum tmu_status_t value, code indicating event to execute
and -1 on error
- */
+enum tmu_status_t tmu_monitor(int *temp);
+/*
- Initialize TMU device
- @param blob FDT blob
- @return int value, 0 for success
- */
+int tmu_init(const void *blob);
+#endif /* _THERMAL_H_ */
1.7.2.3
Regards, Simon

From: Akshay Saraswat akshay.s@samsung.com
Adding API in power for system shutdown when tripping value is reached in Exynos Thermal Management Unit.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Changed description comment for power_shutdown function - Added Acked-by: Simon Glass
arch/arm/cpu/armv7/exynos/power.c | 15 +++++++++++++++ arch/arm/include/asm/arch-exynos/power.h | 8 ++++++++ 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/armv7/exynos/power.c b/arch/arm/cpu/armv7/exynos/power.c index d4bce6d..725c2d3 100644 --- a/arch/arm/cpu/armv7/exynos/power.c +++ b/arch/arm/cpu/armv7/exynos/power.c @@ -95,3 +95,18 @@ void set_dp_phy_ctrl(unsigned int enable) if (cpu_is_exynos5()) exynos5_dp_phy_control(enable); } + +/* + * This function never returns. + * When called this function makes system hang and PAD driving value high + * which in turn makes system power down in case of cold reboot. + */ +void power_shutdown(void) +{ + struct exynos5_power *power = + (struct exynos5_power *)samsung_get_base_power(); + + clrbits_le32(&power->ps_hold_control, POWER_PS_HOLD_CONTROL_DATA_HIGH); + + hang(); +} diff --git a/arch/arm/include/asm/arch-exynos/power.h b/arch/arm/include/asm/arch-exynos/power.h index d2fdb59..f069a0b 100644 --- a/arch/arm/include/asm/arch-exynos/power.h +++ b/arch/arm/include/asm/arch-exynos/power.h @@ -863,5 +863,13 @@ void set_usbhost_phy_ctrl(unsigned int enable); void set_dp_phy_ctrl(unsigned int enable);
#define EXYNOS_DP_PHY_ENABLE (1 << 0) +#define POWER_PS_HOLD_CONTROL_DATA_HIGH (1 << 8) + +/* + * This function never returns. + * When called this function makes system hang and PAD driving value high + * which in turn makes system power down in case of cold reboot. + */ +void power_shutdown(void) __attribute__ ((noreturn));
#endif

From: Akshay Saraswat akshay.s@samsung.com
Adding a generic polling function to continuously monitor events and trigger actions corresponding to them.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Removed GEN tag from subject - Changed description comment for board_poll_devices function - Added Acked-by: Simon Glass
README | 7 +++++++ common/console.c | 5 +++++ include/common.h | 6 ++++++ 3 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/README b/README index 2572add..72b3b67 100644 --- a/README +++ b/README @@ -2814,6 +2814,13 @@ Configuration Settings: the application (usually a Linux kernel) when it is booted
+- CONFIG_BOARD_POLL + There are various scenarios in which parallel-thread like + polling is required to monitor status of variety of devices. + For such situations CONFIG_BOARD_POLL shall be enabled + and funtion call board_poll_devices() from console_tstc() + will then poll for the device status as defined inside function. + - CONFIG_SYS_BAUDRATE_TABLE: List of legal baudrate settings for this board.
diff --git a/common/console.c b/common/console.c index 1177f7d..d320b9b 100644 --- a/common/console.c +++ b/common/console.c @@ -117,6 +117,11 @@ static int console_tstc(int file) int i, ret; struct stdio_dev *dev;
+#if defined CONFIG_BOARD_POLL + /* Generic polling function */ + board_poll_devices(); +#endif + disable_ctrlc(1); for (i = 0; i < cd_count[file]; i++) { dev = console_devices[file][i]; diff --git a/include/common.h b/include/common.h index b23e90b..70a348d 100644 --- a/include/common.h +++ b/include/common.h @@ -782,6 +782,12 @@ void clear_ctrlc (void); /* clear the Control-C condition */ int disable_ctrlc (int); /* 1 to disable, 0 to enable Control-C detect */
/* + * A generic polling function. + * This will be called form console_tstc() to poll for various events. + */ +void board_poll_devices(void); + +/* * STDIO based functions (can always be used) */ /* serial stuff */

From: Akshay Saraswat akshay.s@samsung.com
This adds call to tmu_init() and TMU status polling in board_poll_devices() funtion to monitor temperature change of the SOC.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Removed debug print under TMU_STATUS_NORMAL case - Added Acked-by: Simon Glass
board/samsung/smdk5250/smdk5250.c | 36 ++++++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c index ac7346d..db2457b 100644 --- a/board/samsung/smdk5250/smdk5250.c +++ b/board/samsung/smdk5250/smdk5250.c @@ -32,15 +32,51 @@ #include <asm/arch/pinmux.h> #include <asm/arch/sromc.h> #include <pmic.h> +#include <tmu.h> +#include <asm/arch/exynos-tmu.h> +#include <asm/arch/power.h>
DECLARE_GLOBAL_DATA_PTR;
+/* + * Polling various devices on board for details and status monitoring purposes + */ +void board_poll_devices(void) +{ +#if defined CONFIG_EXYNOS_TMU + int temp; + + switch (tmu_monitor(&temp)) { + case TMU_STATUS_TRIPPED: + puts("EXYNOS_TMU: TRIPPING! Device power going down ...\n"); + power_shutdown(); + break; + case TMU_STATUS_WARNING: + puts("EXYNOS_TMU: WARNING! Temperature very high\n"); + break; + case TMU_STATUS_INIT: + case TMU_STATUS_NORMAL: + break; + default: + debug("Unknown TMU state\n"); + } +#endif +} + int board_init(void) { gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); #if defined(CONFIG_PMIC) pmic_init(); #endif + +#if defined CONFIG_EXYNOS_TMU + if (tmu_init(gd->fdt_blob)) { + debug("%s: Failed to init TMU\n", __func__); + return -1; + } +#endif + #ifdef CONFIG_EXYNOS_SPI spi_init(); #endif

From: Akshay Saraswat akshay.s@samsung.com
Enables TMU driver support for exynos5250
Signed-off-by: Akshay Saraswat akshay.s@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Added Acked-by: Simon Glass
include/configs/exynos5250-dt.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h index 12f555c..2f4315a 100644 --- a/include/configs/exynos5250-dt.h +++ b/include/configs/exynos5250-dt.h @@ -106,6 +106,12 @@ #define CONFIG_BOOTDELAY 3 #define CONFIG_ZERO_BOOTDELAY_CHECK
+/* Generic Device Polling */ +#define CONFIG_BOARD_POLL + +/* Thermal Management Unit */ +#define CONFIG_EXYNOS_TMU + /* USB */ #define CONFIG_CMD_USB #define CONFIG_USB_EHCI

From: Alim Akhtar alim.akhtar@samsung.com
Adds a new u-boot command to read current temprature from tmu driver.
Signed-off-by: Alim Akhtar alim.akhtar@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Include new generic tmu header file - Made printf()s consistent - Added Acked-by: Simon Glass
common/Makefile | 1 + common/cmd_tmu.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 0 deletions(-) create mode 100644 common/cmd_tmu.c
diff --git a/common/Makefile b/common/Makefile index dca2f53..b56ffa2 100644 --- a/common/Makefile +++ b/common/Makefile @@ -159,6 +159,7 @@ COBJS-$(CONFIG_CMD_STRINGS) += cmd_strings.o COBJS-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o COBJS-$(CONFIG_CMD_TIME) += cmd_time.o COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_test.o +COBJS-$(CONFIG_CMD_TMU) += cmd_tmu.o COBJS-$(CONFIG_CMD_TPM) += cmd_tpm.o COBJS-$(CONFIG_CMD_TSI148) += cmd_tsi148.o COBJS-$(CONFIG_CMD_UBI) += cmd_ubi.o diff --git a/common/cmd_tmu.c b/common/cmd_tmu.c new file mode 100644 index 0000000..7fbf845 --- /dev/null +++ b/common/cmd_tmu.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * Alim Akhtar alim.akhtar@samsung.com + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <tmu.h> + +int do_tmu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int cur_temp; + + if (argc < 2) + return CMD_RET_USAGE; + + if (strcmp(argv[1], "curtemp") == 0) { + if (tmu_monitor(&cur_temp) == -1) + printf("TMU is in unknown state, temperature is invalid \n"); + else + printf("Current temperature: %u degrees Celsius \n", cur_temp); + } else { + return CMD_RET_USAGE; + } + + return 0; +} + +U_BOOT_CMD( + tmu, 2, 1, do_tmu, + "Thermal Management Unit\n", + "curtemp - show current CPU temperature in degrees Celsius\n" +);

Hi Hatim,
On Wed, Nov 7, 2012 at 5:08 AM, Hatim Ali hatim.rv@samsung.com wrote:
From: Alim Akhtar alim.akhtar@samsung.com
Adds a new u-boot command to read current temprature from tmu driver.
Signed-off-by: Alim Akhtar alim.akhtar@samsung.com Acked-by: Simon Glass sjg@chromium.org
Sorry I missed this before, but I think you are supposed to update the README and add to include/command_h.
Regards, Simon
Changes since v1: - Include new generic tmu header file - Made printf()s consistent - Added Acked-by: Simon Glass
common/Makefile | 1 + common/cmd_tmu.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 0 deletions(-) create mode 100644 common/cmd_tmu.c
diff --git a/common/Makefile b/common/Makefile index dca2f53..b56ffa2 100644 --- a/common/Makefile +++ b/common/Makefile @@ -159,6 +159,7 @@ COBJS-$(CONFIG_CMD_STRINGS) += cmd_strings.o COBJS-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o COBJS-$(CONFIG_CMD_TIME) += cmd_time.o COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_test.o +COBJS-$(CONFIG_CMD_TMU) += cmd_tmu.o COBJS-$(CONFIG_CMD_TPM) += cmd_tpm.o COBJS-$(CONFIG_CMD_TSI148) += cmd_tsi148.o COBJS-$(CONFIG_CMD_UBI) += cmd_ubi.o diff --git a/common/cmd_tmu.c b/common/cmd_tmu.c new file mode 100644 index 0000000..7fbf845 --- /dev/null +++ b/common/cmd_tmu.c @@ -0,0 +1,51 @@ +/*
- Copyright (C) 2012 Samsung Electronics
- Alim Akhtar alim.akhtar@samsung.com
- See file CREDITS for list of people who contributed to this
- project.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#include <common.h> +#include <command.h> +#include <tmu.h>
+int do_tmu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{
int cur_temp;
if (argc < 2)
return CMD_RET_USAGE;
if (strcmp(argv[1], "curtemp") == 0) {
if (tmu_monitor(&cur_temp) == -1)
printf("TMU is in unknown state, temperature is invalid \n");
else
printf("Current temperature: %u degrees Celsius \n", cur_temp);
} else {
return CMD_RET_USAGE;
}
return 0;
+}
+U_BOOT_CMD(
tmu, 2, 1, do_tmu,
"Thermal Management Unit\n",
"curtemp - show current CPU temperature in degrees Celsius\n"
+);
1.7.2.3

From: Alim Akhtar alim.akhtar@samsung.com
This enables the tmu command to read the current SOC temperature with the help of TMU
Signed-off-by: Alim Akhtar alim.akhtar@samsung.com Acked-by: Simon Glass sjg@chromium.org --- Changes since v1: - Added Acked-by: Simon Glass
include/configs/exynos5250-dt.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h index 2f4315a..2b9271c 100644 --- a/include/configs/exynos5250-dt.h +++ b/include/configs/exynos5250-dt.h @@ -111,6 +111,7 @@
/* Thermal Management Unit */ #define CONFIG_EXYNOS_TMU +#define CONFIG_CMD_TMU
/* USB */ #define CONFIG_CMD_USB

Hi Hatim,
On Wed, Nov 7, 2012 at 5:08 AM, Hatim Ali hatim.rv@samsung.com wrote:
This patch series adds support for TMU driver using device tree for Exynos5250 based SMDK5250 board. This patch series is dependent on the patch series "Add DT based ethernet driver for SMDK5250" by Hatim Ali
Changes since v1: - Created new generic header file include/tmu.h - Removed GEN tag from subject in 2 patches - Changed description comments for couple of functions - Added "Acked-by" to all the patches
Akshay Saraswat (6): EXYNOS5: FDT: Add TMU device node values EXYNOS5: TMU: Add driver for Thermal Management Unit EXYNOS5: Power down API for Thermal Management Unit Add a poll function to monitor events EXYNOS5: TMU: Add TMU status polling EXYNOS5: Config: Enable support for Exynos TMU driver
Alim Akhtar (2): TMU: Add u-boot command to read current temp EXYNOS5: Config: Enable tmu command
I reviewed this again and apart from two minor comments in two of the patches, it looks good. I replied to those patches separately.
Regards, Simon
README | 7 + arch/arm/cpu/armv7/exynos/power.c | 15 ++ arch/arm/dts/exynos5250.dtsi | 5 + arch/arm/include/asm/arch-exynos/exynos-tmu.h | 58 +++++ arch/arm/include/asm/arch-exynos/power.h | 8 + board/samsung/dts/exynos5250-smdk5250.dts | 13 + board/samsung/smdk5250/smdk5250.c | 36 +++ common/Makefile | 1 + common/cmd_tmu.c | 51 +++++ common/console.c | 5 + doc/device-tree-bindings/exynos/tmu.txt | 35 +++ drivers/power/Makefile | 1 + drivers/power/exynos-tmu.c | 297 +++++++++++++++++++++++++ include/common.h | 6 + include/configs/exynos5250-dt.h | 7 + include/fdtdec.h | 1 + include/tmu.h | 46 ++++ lib/fdtdec.c | 1 + 18 files changed, 593 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/arch-exynos/exynos-tmu.h create mode 100644 common/cmd_tmu.c create mode 100644 doc/device-tree-bindings/exynos/tmu.txt create mode 100644 drivers/power/exynos-tmu.c create mode 100644 include/tmu.h
-- 1.7.2.3
participants (2)
-
Hatim Ali
-
Simon Glass