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

The patch series add 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
Akshay Saraswat (5): EXYNOS5: FDT: Add TMU device node values EXYNOS5: TMU: Add driver for Thermal Management Unit EXYNOS5: Power down API for Thermal Management Unit GEN: Add a poll function to monitor events EXYNOS5: TMU: Add TMU status polling
Alim Akhtar (1): GEN: TMU: Add u-boot command to read current temp
Hatim Ali (2): EXYNOS5: Config: Enable support for Exynos TMU driver EXYNOS5: Config: Enable tmu command
README | 7 + arch/arm/cpu/armv7/exynos/power.c | 11 + arch/arm/dts/exynos5250.dtsi | 5 + arch/arm/include/asm/arch-exynos/exynos-tmu.h | 82 +++++++ arch/arm/include/asm/arch-exynos/power.h | 4 + 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 | 296 +++++++++++++++++++++++++ include/common.h | 8 + include/configs/exynos5250-dt.h | 7 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 17 files changed, 564 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

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
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)

On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
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

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
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..ad9e394 --- /dev/null +++ b/arch/arm/include/asm/arch-exynos/exynos-tmu.h @@ -0,0 +1,82 @@ +/* + * 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; +}; + +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 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..ee596d5 --- /dev/null +++ b/drivers/power/exynos-tmu.c @@ -0,0 +1,296 @@ +/* + * 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 <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; +}

On Tue, Nov 6, 2012 at 2:18 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

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
diff --git a/arch/arm/cpu/armv7/exynos/power.c b/arch/arm/cpu/armv7/exynos/power.c index d4bce6d..a6d8827 100644 --- a/arch/arm/cpu/armv7/exynos/power.c +++ b/arch/arm/cpu/armv7/exynos/power.c @@ -95,3 +95,14 @@ void set_dp_phy_ctrl(unsigned int enable) if (cpu_is_exynos5()) exynos5_dp_phy_control(enable); } + +/* This function never returns */ +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..7d798ba 100644 --- a/arch/arm/include/asm/arch-exynos/power.h +++ b/arch/arm/include/asm/arch-exynos/power.h @@ -863,5 +863,9 @@ 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 */ +void power_shutdown(void);
#endif

Hi Hatim,
On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
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
diff --git a/arch/arm/cpu/armv7/exynos/power.c b/arch/arm/cpu/armv7/exynos/power.c index d4bce6d..a6d8827 100644 --- a/arch/arm/cpu/armv7/exynos/power.c +++ b/arch/arm/cpu/armv7/exynos/power.c @@ -95,3 +95,14 @@ void set_dp_phy_ctrl(unsigned int enable) if (cpu_is_exynos5()) exynos5_dp_phy_control(enable); }
+/* This function never returns */ +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..7d798ba 100644 --- a/arch/arm/include/asm/arch-exynos/power.h +++ b/arch/arm/include/asm/arch-exynos/power.h @@ -863,5 +863,9 @@ 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 */
Probably should document what it does do. Also you could add __attribute__ ((noreturn)) perhaps?
+void power_shutdown(void);
#endif
1.7.2.3
Regards, Simon

From: Akshay Saraswat akshay.s@samsung.com
Add a generic polling function to continuously monitor events and trigger actions corresponding to them.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com
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..cba2e3b 100644 --- a/include/common.h +++ b/include/common.h @@ -782,6 +782,14 @@ 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 to poll for some events, + * In this case this will be called form console_tstc() to monitor + * temperatur of the SOC + */ +void board_poll_devices(void); + +/* * STDIO based functions (can always be used) */ /* serial stuff */

Hi,
On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
From: Akshay Saraswat akshay.s@samsung.com
Add a generic polling function to continuously monitor events and trigger actions corresponding to them.
Signed-off-by: Akshay Saraswat akshay.s@samsung.com
For mainline I think the GEN tag should be removed.
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..cba2e3b 100644 --- a/include/common.h +++ b/include/common.h @@ -782,6 +782,14 @@ 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 to poll for some events,
- In this case this will be called form console_tstc() to monitor
typo: form
- temperatur of the SOC
- */
+void board_poll_devices(void);
+/*
- STDIO based functions (can always be used)
*/ /* serial stuff */ -- 1.7.2.3
Regards, Simon

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
diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c index ac7346d..19eb2e0 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 <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: + debug("syetm is in normal temperature state\n"); + 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

Hi Hatim,
On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
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
diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c index ac7346d..19eb2e0 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 <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:
debug("syetm is in normal temperature state\n");
typo: syetm
This probably doesn't add much - I suggest punting this line since otherwise if you enable DEBUG in this file it will flood the console.
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
1.7.2.3
Regards, Simon

Enables TMU driver support for exynos5250
Signed-off-by: Akshay Saraswat akshay.s@samsung.com
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

On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
Enables TMU driver support for exynos5250
Signed-off-by: Akshay Saraswat akshay.s@samsung.com
Acked-by: Simon Glass sjg@chromium.org

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
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..db0a714 --- /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 <asm/arch/exynos-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 unknow state, temp is invalid\n"); + else + printf("Current Temp: %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 Tue, Nov 6, 2012 at 2:18 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
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..db0a714 --- /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 <asm/arch/exynos-tmu.h>
This throws up a problem - you are including an exynos header file in a generic file.
I suggest you create a new header include/tmu.h and put just the definition of tmu_monitor() into it. Then you can include this file here instead of the exynos one. Other SOCs can then implement the same API.
+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 unknow state, temp is invalid\n");
typo: unknow
else
printf("Current Temp: %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"
Please make this line and the two printf()s above more consistent - perhaps something like this
printf("TMU is in unknown state, temperature is invalid\n"); printf("Current temperature: %u degrees Celsius\n", cur_temp); "curtemp - show current CPU temperature in degrees Celsius\n"
+);
1.7.2.3
Regards, Simon

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
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

On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
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
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
1.7.2.3

Hi Hatim,
On Tue, Nov 6, 2012 at 2:18 AM, Hatim Ali hatim.rv@samsung.com wrote:
The patch series add 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
Akshay Saraswat (5): EXYNOS5: FDT: Add TMU device node values EXYNOS5: TMU: Add driver for Thermal Management Unit EXYNOS5: Power down API for Thermal Management Unit GEN: Add a poll function to monitor events EXYNOS5: TMU: Add TMU status polling
Alim Akhtar (1): GEN: TMU: Add u-boot command to read current temp
Hatim Ali (2): EXYNOS5: Config: Enable support for Exynos TMU driver EXYNOS5: Config: Enable tmu command
This series generally looks good to me. I have a few comments which I will attach to individual patches.
Regards, Simon
README | 7 + arch/arm/cpu/armv7/exynos/power.c | 11 + arch/arm/dts/exynos5250.dtsi | 5 + arch/arm/include/asm/arch-exynos/exynos-tmu.h | 82 +++++++ arch/arm/include/asm/arch-exynos/power.h | 4 + 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 | 296 +++++++++++++++++++++++++ include/common.h | 8 + include/configs/exynos5250-dt.h | 7 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 17 files changed, 564 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
-- 1.7.2.3
participants (2)
-
Hatim Ali
-
Simon Glass