On Wed, Jun 27, 2012 at 10:05:11PM +0400, Konstantin Baydarov wrote: > omap4: thermal: add basic CPU thermal zone > > This patch exposes OMAP4 thermal sensor as a thermal zone > named "cpu". Only thermal creation is done here. > > TODO: > > - Add cooling bindings > - Add extrapolation rules > > Signed-off-by: Eduardo Valentin <eduardo.valentin@xxxxxx> You change the authorship and don't sign? Anyway, this one has a lot to evolve still. I will send to you an improved version of the BG driver. > --- > drivers/thermal/Kconfig | 12 ++++++ > drivers/thermal/Makefile | 1 + > drivers/thermal/omap-bandgap.c | 1 + > drivers/thermal/omap-bandgap.h | 12 ++++++ > drivers/thermal/omap4-thermal.c | 72 +++++++++++++++++++++++++++++++++++++++ > 5 files changed, 98 insertions(+), 0 deletions(-) > create mode 100644 drivers/thermal/omap4-thermal.c > > diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig > index f9989e8..7d44b5c 100644 > --- a/drivers/thermal/Kconfig > +++ b/drivers/thermal/Kconfig > @@ -38,3 +38,15 @@ config OMAP_BANDGAP > This includes alert interrupts generation and also the TSHUT > support. > > +config OMAP4_THERMAL > + bool "Texas Instruments OMAP4 thermal support" > + depends on OMAP_BANDGAP > + depends on ARCH_OMAP4 > + help > + If you say yes here you get thermal support for the Texas Instruments > + OMAP4 SoC family. The current chip supported are: > + - OMAP4460 > + > + This includes alert interrupts generation and also the TSHUT > + support. > + > diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile > index 5ff1af1..6397678 100644 > --- a/drivers/thermal/Makefile > +++ b/drivers/thermal/Makefile > @@ -6,3 +6,4 @@ obj-$(CONFIG_THERMAL) += thermal_sys.o > obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o > obj-$(CONFIG_OMAP_BANDGAP) += omap-thermal.o > omap-thermal-y := omap-bandgap.o > +omap-thermal-$(CONFIG_OMAP4_THERMAL) += omap4-thermal.o > diff --git a/drivers/thermal/omap-bandgap.c b/drivers/thermal/omap-bandgap.c > index c68fa1a..c80d879 100644 > --- a/drivers/thermal/omap-bandgap.c > +++ b/drivers/thermal/omap-bandgap.c > @@ -1328,6 +1328,7 @@ static const struct omap_bandgap_data omap4460_data = { > .fclock_name = "bandgap_ts_fclk", > .div_ck_name = "div_ts_ck", > .conv_table = omap4460_adc_to_temp, > + .expose_sensor = omap4_thermal_expose_sensor, > .irq = 126, > .sensors = { > { > diff --git a/drivers/thermal/omap-bandgap.h b/drivers/thermal/omap-bandgap.h > index 41f25ff..3f4c192 100644 > --- a/drivers/thermal/omap-bandgap.h > +++ b/drivers/thermal/omap-bandgap.h > @@ -61,4 +61,16 @@ int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr, int id, > int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id, > int *temperature); > > +#ifdef CONFIG_OMAP4_THERMAL > +int omap4_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id, > + char *domain); > +#else > +static inline int omap4_thermal_expose_sensor(struct omap_bandgap *bg_ptr, > + int id, char *domain) > +{ > + return 0; > +} > + > +#endif > + > #endif > diff --git a/drivers/thermal/omap4-thermal.c b/drivers/thermal/omap4-thermal.c > new file mode 100644 > index 0000000..fb11753 > --- /dev/null > +++ b/drivers/thermal/omap4-thermal.c > @@ -0,0 +1,72 @@ > +/* > + * SPEAr thermal driver. > + * > + * Copyright (C) 2011-2012 Texas Instruments Inc. > + * Contact: > + * Eduardo Valentin <eduardo.valentin@xxxxxx> > + * > + * This software is licensed under the terms of the GNU General Public > + * License version 2, as published by the Free Software Foundation, and > + * may be copied, distributed, and modified under those terms. > + * > + * 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. > + * > + */ > + > +#include <linux/device.h> > +#include <linux/err.h> > +#include <linux/io.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/thermal.h> > + > +#include "omap-bandgap.h" > + > +struct omap4_thermal_data { > + struct thermal_zone_device *omap4_thermal; > + struct omap_bandgap *bg_ptr; > + int sensor_id; > +}; > + > +static inline int omap4_thermal_get_temp(struct thermal_zone_device *thermal, > + unsigned long *temp) > +{ > + struct omap4_thermal_data *data = thermal->devdata; > + int ret, tmp; > + > + ret = omap_bandgap_read_temperature(data->bg_ptr, data->sensor_id, > + &tmp); > + if (!ret) > + *temp = tmp; > + > + return ret; > +} > + > +static struct thermal_zone_device_ops omap4_thermal_ops = { > + .get_temp = omap4_thermal_get_temp, > +}; > + > +int omap4_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id, > + char *domain) > +{ > + struct omap4_thermal_data *data; > + > + data = devm_kzalloc(bg_ptr->dev, sizeof(*data), GFP_KERNEL); > + if (!data) { > + dev_err(bg_ptr->dev, "kzalloc fail\n"); > + return -ENOMEM; > + } > + data->sensor_id = id; > + data->bg_ptr = bg_ptr; > + data->omap4_thermal = thermal_zone_device_register(domain, 0, > + data, &omap4_thermal_ops, 0, 0, 0, 0); > + if (IS_ERR(data->omap4_thermal)) { > + dev_err(bg_ptr->dev, "thermal zone device is NULL\n"); > + return PTR_ERR(data->omap4_thermal); > + } > + > + return 0; > +} > -- > 1.7.7.6 > >