Commit b79985ca authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Eduardo Valentin

thermal: exynos: add ->tmu_read method

Add ->tmu_read method to struct exynos_tmu_data and use it
in exynos_tmu_control().  Then add ->tmu_read implementations
for Exynos4210, Exynos4412+ and Exynos5440.  Finally remove
no longer needed reg->tmu_cur_temp abstractions.

There should be no functional changes caused by this patch.

Cc: Amit Daniel Kachhap <amit.daniel@samsung.com>
Cc: Lukasz Majewski <l.majewski@samsung.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Cc: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Tested-by: default avatarLukasz Majewski <l.majewski@samsung.com>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 37f9034f
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
* @reg_conf: pointer to structure to register with core thermal. * @reg_conf: pointer to structure to register with core thermal.
* @tmu_initialize: SoC specific TMU initialization method * @tmu_initialize: SoC specific TMU initialization method
* @tmu_control: SoC specific TMU control method * @tmu_control: SoC specific TMU control method
* @tmu_read: SoC specific TMU temperature read method
*/ */
struct exynos_tmu_data { struct exynos_tmu_data {
int id; int id;
...@@ -70,6 +71,7 @@ struct exynos_tmu_data { ...@@ -70,6 +71,7 @@ struct exynos_tmu_data {
struct thermal_sensor_conf *reg_conf; struct thermal_sensor_conf *reg_conf;
int (*tmu_initialize)(struct platform_device *pdev); int (*tmu_initialize)(struct platform_device *pdev);
void (*tmu_control)(struct platform_device *pdev, bool on); void (*tmu_control)(struct platform_device *pdev, bool on);
int (*tmu_read)(struct exynos_tmu_data *data);
}; };
/* /*
...@@ -422,29 +424,17 @@ static void exynos5440_tmu_control(struct platform_device *pdev, bool on) ...@@ -422,29 +424,17 @@ static void exynos5440_tmu_control(struct platform_device *pdev, bool on)
static int exynos_tmu_read(struct exynos_tmu_data *data) static int exynos_tmu_read(struct exynos_tmu_data *data)
{ {
struct exynos_tmu_platform_data *pdata = data->pdata; int ret;
const struct exynos_tmu_registers *reg = pdata->registers;
u8 temp_code;
int temp;
mutex_lock(&data->lock); mutex_lock(&data->lock);
clk_enable(data->clk); clk_enable(data->clk);
ret = data->tmu_read(data);
temp_code = readb(data->base + reg->tmu_cur_temp); if (ret >= 0)
ret = code_to_temp(data, ret);
if (data->soc == SOC_ARCH_EXYNOS4210)
/* temp_code should range between 75 and 175 */
if (temp_code < 75 || temp_code > 175) {
temp = -ENODATA;
goto out;
}
temp = code_to_temp(data, temp_code);
out:
clk_disable(data->clk); clk_disable(data->clk);
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return temp; return ret;
} }
#ifdef CONFIG_THERMAL_EMULATION #ifdef CONFIG_THERMAL_EMULATION
...@@ -494,6 +484,24 @@ static int exynos_tmu_set_emulation(void *drv_data, unsigned long temp) ...@@ -494,6 +484,24 @@ static int exynos_tmu_set_emulation(void *drv_data, unsigned long temp)
{ return -EINVAL; } { return -EINVAL; }
#endif/*CONFIG_THERMAL_EMULATION*/ #endif/*CONFIG_THERMAL_EMULATION*/
static int exynos4210_tmu_read(struct exynos_tmu_data *data)
{
int ret = readb(data->base + EXYNOS_TMU_REG_CURRENT_TEMP);
/* "temp_code" should range between 75 and 175 */
return (ret < 75 || ret > 175) ? -ENODATA : ret;
}
static int exynos4412_tmu_read(struct exynos_tmu_data *data)
{
return readb(data->base + EXYNOS_TMU_REG_CURRENT_TEMP);
}
static int exynos5440_tmu_read(struct exynos_tmu_data *data)
{
return readb(data->base + EXYNOS5440_TMU_S0_7_TEMP);
}
static void exynos_tmu_work(struct work_struct *work) static void exynos_tmu_work(struct work_struct *work)
{ {
struct exynos_tmu_data *data = container_of(work, struct exynos_tmu_data *data = container_of(work,
...@@ -718,6 +726,7 @@ static int exynos_tmu_probe(struct platform_device *pdev) ...@@ -718,6 +726,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)
case SOC_ARCH_EXYNOS4210: case SOC_ARCH_EXYNOS4210:
data->tmu_initialize = exynos4210_tmu_initialize; data->tmu_initialize = exynos4210_tmu_initialize;
data->tmu_control = exynos4210_tmu_control; data->tmu_control = exynos4210_tmu_control;
data->tmu_read = exynos4210_tmu_read;
break; break;
case SOC_ARCH_EXYNOS3250: case SOC_ARCH_EXYNOS3250:
case SOC_ARCH_EXYNOS4412: case SOC_ARCH_EXYNOS4412:
...@@ -727,10 +736,12 @@ static int exynos_tmu_probe(struct platform_device *pdev) ...@@ -727,10 +736,12 @@ static int exynos_tmu_probe(struct platform_device *pdev)
case SOC_ARCH_EXYNOS5420_TRIMINFO: case SOC_ARCH_EXYNOS5420_TRIMINFO:
data->tmu_initialize = exynos4412_tmu_initialize; data->tmu_initialize = exynos4412_tmu_initialize;
data->tmu_control = exynos4210_tmu_control; data->tmu_control = exynos4210_tmu_control;
data->tmu_read = exynos4412_tmu_read;
break; break;
case SOC_ARCH_EXYNOS5440: case SOC_ARCH_EXYNOS5440:
data->tmu_initialize = exynos5440_tmu_initialize; data->tmu_initialize = exynos5440_tmu_initialize;
data->tmu_control = exynos5440_tmu_control; data->tmu_control = exynos5440_tmu_control;
data->tmu_read = exynos5440_tmu_read;
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
......
...@@ -70,13 +70,11 @@ enum soc_type { ...@@ -70,13 +70,11 @@ enum soc_type {
/** /**
* struct exynos_tmu_register - register descriptors to access registers. * struct exynos_tmu_register - register descriptors to access registers.
* The register validity may vary slightly across different exynos SOC's. * The register validity may vary slightly across different exynos SOC's.
* @tmu_cur_temp: register containing the current temperature of the TMU.
* @tmu_intstat: Register containing the interrupt status values. * @tmu_intstat: Register containing the interrupt status values.
* @tmu_intclear: Register for clearing the raised interrupt status. * @tmu_intclear: Register for clearing the raised interrupt status.
* @emul_con: TMU emulation controller register. * @emul_con: TMU emulation controller register.
*/ */
struct exynos_tmu_registers { struct exynos_tmu_registers {
u32 tmu_cur_temp;
u32 tmu_intstat; u32 tmu_intstat;
u32 tmu_intclear; u32 tmu_intclear;
u32 emul_con; u32 emul_con;
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#if defined(CONFIG_CPU_EXYNOS4210) #if defined(CONFIG_CPU_EXYNOS4210)
static const struct exynos_tmu_registers exynos4210_tmu_registers = { static const struct exynos_tmu_registers exynos4210_tmu_registers = {
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT, .tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
}; };
...@@ -74,7 +73,6 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = { ...@@ -74,7 +73,6 @@ struct exynos_tmu_init_data const exynos4210_default_tmu_data = {
#if defined(CONFIG_SOC_EXYNOS3250) #if defined(CONFIG_SOC_EXYNOS3250)
static const struct exynos_tmu_registers exynos3250_tmu_registers = { static const struct exynos_tmu_registers exynos3250_tmu_registers = {
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT, .tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
.emul_con = EXYNOS_EMUL_CON, .emul_con = EXYNOS_EMUL_CON,
...@@ -135,7 +133,6 @@ struct exynos_tmu_init_data const exynos3250_default_tmu_data = { ...@@ -135,7 +133,6 @@ struct exynos_tmu_init_data const exynos3250_default_tmu_data = {
#if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250) #if defined(CONFIG_SOC_EXYNOS4412) || defined(CONFIG_SOC_EXYNOS5250)
static const struct exynos_tmu_registers exynos4412_tmu_registers = { static const struct exynos_tmu_registers exynos4412_tmu_registers = {
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT, .tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
.emul_con = EXYNOS_EMUL_CON, .emul_con = EXYNOS_EMUL_CON,
...@@ -208,7 +205,6 @@ struct exynos_tmu_init_data const exynos5250_default_tmu_data = { ...@@ -208,7 +205,6 @@ struct exynos_tmu_init_data const exynos5250_default_tmu_data = {
#if defined(CONFIG_SOC_EXYNOS5260) #if defined(CONFIG_SOC_EXYNOS5260)
static const struct exynos_tmu_registers exynos5260_tmu_registers = { static const struct exynos_tmu_registers exynos5260_tmu_registers = {
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
.tmu_intstat = EXYNOS5260_TMU_REG_INTSTAT, .tmu_intstat = EXYNOS5260_TMU_REG_INTSTAT,
.tmu_intclear = EXYNOS5260_TMU_REG_INTCLEAR, .tmu_intclear = EXYNOS5260_TMU_REG_INTCLEAR,
.emul_con = EXYNOS5260_EMUL_CON, .emul_con = EXYNOS5260_EMUL_CON,
...@@ -271,7 +267,6 @@ struct exynos_tmu_init_data const exynos5260_default_tmu_data = { ...@@ -271,7 +267,6 @@ struct exynos_tmu_init_data const exynos5260_default_tmu_data = {
#if defined(CONFIG_SOC_EXYNOS5420) #if defined(CONFIG_SOC_EXYNOS5420)
static const struct exynos_tmu_registers exynos5420_tmu_registers = { static const struct exynos_tmu_registers exynos5420_tmu_registers = {
.tmu_cur_temp = EXYNOS_TMU_REG_CURRENT_TEMP,
.tmu_intstat = EXYNOS_TMU_REG_INTSTAT, .tmu_intstat = EXYNOS_TMU_REG_INTSTAT,
.tmu_intclear = EXYNOS_TMU_REG_INTCLEAR, .tmu_intclear = EXYNOS_TMU_REG_INTCLEAR,
.emul_con = EXYNOS_EMUL_CON, .emul_con = EXYNOS_EMUL_CON,
...@@ -340,7 +335,6 @@ struct exynos_tmu_init_data const exynos5420_default_tmu_data = { ...@@ -340,7 +335,6 @@ struct exynos_tmu_init_data const exynos5420_default_tmu_data = {
#if defined(CONFIG_SOC_EXYNOS5440) #if defined(CONFIG_SOC_EXYNOS5440)
static const struct exynos_tmu_registers exynos5440_tmu_registers = { static const struct exynos_tmu_registers exynos5440_tmu_registers = {
.tmu_cur_temp = EXYNOS5440_TMU_S0_7_TEMP,
.tmu_intstat = EXYNOS5440_TMU_S0_7_IRQ, .tmu_intstat = EXYNOS5440_TMU_S0_7_IRQ,
.tmu_intclear = EXYNOS5440_TMU_S0_7_IRQ, .tmu_intclear = EXYNOS5440_TMU_S0_7_IRQ,
.emul_con = EXYNOS5440_TMU_S0_7_DEBUG, .emul_con = EXYNOS5440_TMU_S0_7_DEBUG,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment