Commit c48cbba6 authored by Amit Daniel Kachhap's avatar Amit Daniel Kachhap Committed by Zhang Rui

hwmon: exynos4: move thermal sensor driver to driver/thermal directory

This movement is needed because the hwmon entries and corresponding sysfs
interface is a duplicate of utilities already provided by
driver/thermal/thermal_sys.c.  The goal is to place it in thermal folder
and add necessary functions to use the in-kernel thermal interfaces.
Signed-off-by: default avatarAmit Daniel Kachhap <amit.kachhap@linaro.org>
Acked-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
Cc: SangWook Ju <sw.ju@samsung.com>
Cc: Durgadoss <durgadoss.r@intel.com>
Cc: Len Brown <lenb@kernel.org>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: Kyungmin Park <kmpark@infradead.org>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarAmit Daniel Kachhap <amit.daniel@samsung.com>
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
parent 02361418
...@@ -46,36 +46,7 @@ The threshold levels are defined as follows: ...@@ -46,36 +46,7 @@ The threshold levels are defined as follows:
The threshold and each trigger_level are set The threshold and each trigger_level are set
through the corresponding registers. through the corresponding registers.
When an interrupt occurs, this driver notify user space of When an interrupt occurs, this driver notify kernel thermal framework
one of four threshold levels for the interrupt with the function exynos4_report_trigger.
through kobject_uevent_env and sysfs_notify functions.
Although an interrupt condition for level_0 can be set, Although an interrupt condition for level_0 can be set,
it is not notified to user space through sysfs_notify function. it can be used to synchronize the cooling action.
Sysfs Interface
---------------
name name of the temperature sensor
RO
temp1_input temperature
RO
temp1_max temperature for level_1 interrupt
RO
temp1_crit temperature for level_2 interrupt
RO
temp1_emergency temperature for level_3 interrupt
RO
temp1_max_alarm alarm for level_1 interrupt
RO
temp1_crit_alarm
alarm for level_2 interrupt
RO
temp1_emergency_alarm
alarm for level_3 interrupt
RO
...@@ -324,16 +324,6 @@ config SENSORS_DA9052_ADC ...@@ -324,16 +324,6 @@ config SENSORS_DA9052_ADC
This driver can also be built as module. If so, the module This driver can also be built as module. If so, the module
will be called da9052-hwmon. will be called da9052-hwmon.
config SENSORS_EXYNOS4_TMU
tristate "Temperature sensor on Samsung EXYNOS4"
depends on ARCH_EXYNOS4
help
If you say yes here you get support for TMU (Thermal Management
Unit) on SAMSUNG EXYNOS4 series of SoC.
This driver can also be built as a module. If so, the module
will be called exynos4-tmu.
config SENSORS_I5K_AMB config SENSORS_I5K_AMB
tristate "FB-DIMM AMB temperature sensor on Intel 5000 series chipsets" tristate "FB-DIMM AMB temperature sensor on Intel 5000 series chipsets"
depends on PCI && EXPERIMENTAL depends on PCI && EXPERIMENTAL
......
...@@ -49,7 +49,6 @@ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o ...@@ -49,7 +49,6 @@ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
obj-$(CONFIG_SENSORS_EMC1403) += emc1403.o obj-$(CONFIG_SENSORS_EMC1403) += emc1403.o
obj-$(CONFIG_SENSORS_EMC2103) += emc2103.o obj-$(CONFIG_SENSORS_EMC2103) += emc2103.o
obj-$(CONFIG_SENSORS_EMC6W201) += emc6w201.o obj-$(CONFIG_SENSORS_EMC6W201) += emc6w201.o
obj-$(CONFIG_SENSORS_EXYNOS4_TMU) += exynos4_tmu.o
obj-$(CONFIG_SENSORS_F71805F) += f71805f.o obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
obj-$(CONFIG_SENSORS_F71882FG) += f71882fg.o obj-$(CONFIG_SENSORS_F71882FG) += f71882fg.o
obj-$(CONFIG_SENSORS_F75375S) += f75375s.o obj-$(CONFIG_SENSORS_F75375S) += f75375s.o
......
...@@ -46,3 +46,10 @@ config RCAR_THERMAL ...@@ -46,3 +46,10 @@ config RCAR_THERMAL
help help
Enable this to plug the R-Car thermal sensor driver into the Linux Enable this to plug the R-Car thermal sensor driver into the Linux
thermal framework thermal framework
config EXYNOS_THERMAL
tristate "Temperature sensor on Samsung EXYNOS"
depends on ARCH_EXYNOS4 && THERMAL
help
If you say yes here you get support for TMU (Thermal Managment
Unit) on SAMSUNG EXYNOS series of SoC.
...@@ -6,3 +6,4 @@ obj-$(CONFIG_THERMAL) += thermal_sys.o ...@@ -6,3 +6,4 @@ obj-$(CONFIG_THERMAL) += thermal_sys.o
obj-$(CONFIG_CPU_THERMAL) += cpu_cooling.o obj-$(CONFIG_CPU_THERMAL) += cpu_cooling.o
obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o
obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o
obj-$(CONFIG_EXYNOS_THERMAL) += exynos_thermal.o
/* /*
* exynos4_tmu.c - Samsung EXYNOS4 TMU (Thermal Management Unit) * exynos_thermal.c - Samsung EXYNOS TMU (Thermal Management Unit)
* *
* Copyright (C) 2011 Samsung Electronics * Copyright (C) 2011 Samsung Electronics
* Donggeun Kim <dg77.kim@samsung.com> * Donggeun Kim <dg77.kim@samsung.com>
* Amit Daniel Kachhap <amit.kachhap@linaro.org>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -33,10 +34,7 @@ ...@@ -33,10 +34,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/hwmon.h> #include <linux/platform_data/exynos_thermal.h>
#include <linux/hwmon-sysfs.h>
#include <linux/platform_data/exynos4_tmu.h>
#define EXYNOS4_TMU_REG_TRIMINFO 0x0 #define EXYNOS4_TMU_REG_TRIMINFO 0x0
#define EXYNOS4_TMU_REG_CONTROL 0x20 #define EXYNOS4_TMU_REG_CONTROL 0x20
...@@ -70,7 +68,6 @@ ...@@ -70,7 +68,6 @@
struct exynos4_tmu_data { struct exynos4_tmu_data {
struct exynos4_tmu_platform_data *pdata; struct exynos4_tmu_platform_data *pdata;
struct device *hwmon_dev;
struct resource *mem; struct resource *mem;
void __iomem *base; void __iomem *base;
int irq; int irq;
...@@ -246,8 +243,6 @@ static void exynos4_tmu_work(struct work_struct *work) ...@@ -246,8 +243,6 @@ static void exynos4_tmu_work(struct work_struct *work)
writel(EXYNOS4_TMU_INTCLEAR_VAL, data->base + EXYNOS4_TMU_REG_INTCLEAR); writel(EXYNOS4_TMU_INTCLEAR_VAL, data->base + EXYNOS4_TMU_REG_INTCLEAR);
kobject_uevent(&data->hwmon_dev->kobj, KOBJ_CHANGE);
enable_irq(data->irq); enable_irq(data->irq);
clk_disable(data->clk); clk_disable(data->clk);
...@@ -264,87 +259,6 @@ static irqreturn_t exynos4_tmu_irq(int irq, void *id) ...@@ -264,87 +259,6 @@ static irqreturn_t exynos4_tmu_irq(int irq, void *id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static ssize_t exynos4_tmu_show_name(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "exynos4-tmu\n");
}
static ssize_t exynos4_tmu_show_temp(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct exynos4_tmu_data *data = dev_get_drvdata(dev);
int ret;
ret = exynos4_tmu_read(data);
if (ret < 0)
return ret;
/* convert from degree Celsius to millidegree Celsius */
return sprintf(buf, "%d\n", ret * 1000);
}
static ssize_t exynos4_tmu_show_alarm(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct exynos4_tmu_data *data = dev_get_drvdata(dev);
struct exynos4_tmu_platform_data *pdata = data->pdata;
int temp;
unsigned int trigger_level;
temp = exynos4_tmu_read(data);
if (temp < 0)
return temp;
trigger_level = pdata->threshold + pdata->trigger_levels[attr->index];
return sprintf(buf, "%d\n", !!(temp > trigger_level));
}
static ssize_t exynos4_tmu_show_level(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct exynos4_tmu_data *data = dev_get_drvdata(dev);
struct exynos4_tmu_platform_data *pdata = data->pdata;
unsigned int temp = pdata->threshold +
pdata->trigger_levels[attr->index];
return sprintf(buf, "%u\n", temp * 1000);
}
static DEVICE_ATTR(name, S_IRUGO, exynos4_tmu_show_name, NULL);
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, exynos4_tmu_show_temp, NULL, 0);
static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO,
exynos4_tmu_show_alarm, NULL, 1);
static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO,
exynos4_tmu_show_alarm, NULL, 2);
static SENSOR_DEVICE_ATTR(temp1_emergency_alarm, S_IRUGO,
exynos4_tmu_show_alarm, NULL, 3);
static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, exynos4_tmu_show_level, NULL, 1);
static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, exynos4_tmu_show_level, NULL, 2);
static SENSOR_DEVICE_ATTR(temp1_emergency, S_IRUGO,
exynos4_tmu_show_level, NULL, 3);
static struct attribute *exynos4_tmu_attributes[] = {
&dev_attr_name.attr,
&sensor_dev_attr_temp1_input.dev_attr.attr,
&sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
&sensor_dev_attr_temp1_emergency_alarm.dev_attr.attr,
&sensor_dev_attr_temp1_max.dev_attr.attr,
&sensor_dev_attr_temp1_crit.dev_attr.attr,
&sensor_dev_attr_temp1_emergency.dev_attr.attr,
NULL,
};
static const struct attribute_group exynos4_tmu_attr_group = {
.attrs = exynos4_tmu_attributes,
};
static int __devinit exynos4_tmu_probe(struct platform_device *pdev) static int __devinit exynos4_tmu_probe(struct platform_device *pdev)
{ {
struct exynos4_tmu_data *data; struct exynos4_tmu_data *data;
...@@ -418,25 +332,9 @@ static int __devinit exynos4_tmu_probe(struct platform_device *pdev) ...@@ -418,25 +332,9 @@ static int __devinit exynos4_tmu_probe(struct platform_device *pdev)
goto err_clk; goto err_clk;
} }
ret = sysfs_create_group(&pdev->dev.kobj, &exynos4_tmu_attr_group);
if (ret) {
dev_err(&pdev->dev, "Failed to create sysfs group\n");
goto err_clk;
}
data->hwmon_dev = hwmon_device_register(&pdev->dev);
if (IS_ERR(data->hwmon_dev)) {
ret = PTR_ERR(data->hwmon_dev);
dev_err(&pdev->dev, "Failed to register hwmon device\n");
goto err_create_group;
}
exynos4_tmu_control(pdev, true); exynos4_tmu_control(pdev, true);
return 0; return 0;
err_create_group:
sysfs_remove_group(&pdev->dev.kobj, &exynos4_tmu_attr_group);
err_clk: err_clk:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
clk_put(data->clk); clk_put(data->clk);
...@@ -458,9 +356,6 @@ static int __devexit exynos4_tmu_remove(struct platform_device *pdev) ...@@ -458,9 +356,6 @@ static int __devexit exynos4_tmu_remove(struct platform_device *pdev)
exynos4_tmu_control(pdev, false); exynos4_tmu_control(pdev, false);
hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&pdev->dev.kobj, &exynos4_tmu_attr_group);
clk_put(data->clk); clk_put(data->clk);
free_irq(data->irq, data); free_irq(data->irq, data);
...@@ -495,7 +390,7 @@ static int exynos4_tmu_resume(struct device *dev) ...@@ -495,7 +390,7 @@ static int exynos4_tmu_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(exynos4_tmu_pm, static SIMPLE_DEV_PM_OPS(exynos4_tmu_pm,
exynos4_tmu_suspend, exynos4_tmu_resume); exynos4_tmu_suspend, exynos4_tmu_resume);
#define EXYNOS4_TMU_PM &exynos4_tmu_pm #define EXYNOS4_TMU_PM (&exynos4_tmu_pm)
#else #else
#define EXYNOS4_TMU_PM NULL #define EXYNOS4_TMU_PM NULL
#endif #endif
......
/* /*
* exynos4_tmu.h - Samsung EXYNOS4 TMU (Thermal Management Unit) * exynos_thermal.h - Samsung EXYNOS4 TMU (Thermal Management Unit)
* *
* Copyright (C) 2011 Samsung Electronics * Copyright (C) 2011 Samsung Electronics
* Donggeun Kim <dg77.kim@samsung.com> * Donggeun Kim <dg77.kim@samsung.com>
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef _LINUX_EXYNOS4_TMU_H #ifndef _LINUX_EXYNOS_THERMAL_H
#define _LINUX_EXYNOS4_TMU_H #define _LINUX_EXYNOS_THERMAL_H
enum calibration_type { enum calibration_type {
TYPE_ONE_POINT_TRIMMING, TYPE_ONE_POINT_TRIMMING,
...@@ -80,4 +80,4 @@ struct exynos4_tmu_platform_data { ...@@ -80,4 +80,4 @@ struct exynos4_tmu_platform_data {
enum calibration_type cal_type; enum calibration_type cal_type;
}; };
#endif /* _LINUX_EXYNOS4_TMU_H */ #endif /* _LINUX_EXYNOS_THERMAL_H */
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