diff options
Diffstat (limited to 'drivers/staging/omap-thermal')
-rw-r--r-- | drivers/staging/omap-thermal/Kconfig | 46 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/Makefile | 5 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/TODO | 28 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap-bandgap.c | 1174 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap-bandgap.h | 432 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap-thermal-common.c | 338 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap-thermal.h | 108 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap4-thermal.c | 259 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap5-thermal.c | 297 | ||||
-rw-r--r-- | drivers/staging/omap-thermal/omap_bandgap.txt | 30 |
10 files changed, 0 insertions, 2717 deletions
diff --git a/drivers/staging/omap-thermal/Kconfig b/drivers/staging/omap-thermal/Kconfig deleted file mode 100644 index 30cbc3bc8dfa..000000000000 --- a/drivers/staging/omap-thermal/Kconfig +++ /dev/null @@ -1,46 +0,0 @@ -config OMAP_BANDGAP - tristate "Texas Instruments OMAP4+ temperature sensor driver" - depends on THERMAL - depends on ARCH_OMAP4 || SOC_OMAP5 - help - If you say yes here you get support for the Texas Instruments - OMAP4460+ on die bandgap temperature sensor support. The register - set is part of system control module. - - This includes alert interrupts generation and also the TSHUT - support. - -config OMAP_THERMAL - bool "Texas Instruments OMAP4+ thermal framework support" - depends on OMAP_BANDGAP - depends on CPU_THERMAL - help - If you say yes here you want to get support for generic thermal - framework for the Texas Instruments OMAP4460+ on die bandgap - temperature sensor. - -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: - - OMAP4430 - - OMAP4460 - - OMAP4470 - - This includes alert interrupts generation and also the TSHUT - support. - -config OMAP5_THERMAL - bool "Texas Instruments OMAP5 thermal support" - depends on OMAP_BANDGAP - depends on SOC_OMAP5 - help - If you say yes here you get thermal support for the Texas Instruments - OMAP5 SoC family. The current chip supported are: - - OMAP5430 - - This includes alert interrupts generation and also the TSHUT - support. diff --git a/drivers/staging/omap-thermal/Makefile b/drivers/staging/omap-thermal/Makefile deleted file mode 100644 index 091c4d20b14d..000000000000 --- a/drivers/staging/omap-thermal/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -obj-$(CONFIG_OMAP_BANDGAP) += omap-thermal.o -omap-thermal-y := omap-bandgap.o -omap-thermal-$(CONFIG_OMAP_THERMAL) += omap-thermal-common.o -omap-thermal-$(CONFIG_OMAP4_THERMAL) += omap4-thermal.o -omap-thermal-$(CONFIG_OMAP5_THERMAL) += omap5-thermal.o diff --git a/drivers/staging/omap-thermal/TODO b/drivers/staging/omap-thermal/TODO deleted file mode 100644 index 9e23cc4d551b..000000000000 --- a/drivers/staging/omap-thermal/TODO +++ /dev/null @@ -1,28 +0,0 @@ -List of TODOs (by Eduardo Valentin) - -on omap-bandgap.c: -- Rework locking -- Improve driver code by adding usage of regmap-mmio -- Test every exposed API to userland -- Add support to hwmon -- Review and revisit all API exposed -- Revisit PM support -- Revisit data structures and simplify them -- Once SCM-core api settles, update this driver accordingly - -on omap-thermal-common.c/omap-thermal.h: -- Revisit extrapolation constants for O4/O5 -- Revisit need for locking -- Revisit trips and its definitions -- Revisit trending - -on omap5-thermal.c -- Add support for GPU cooling - -generally: -- write Kconfig dependencies so that omap variants are covered -- make checkpatch.pl and sparse happy -- make sure this code works on OMAP4430, OMAP4460 and OMAP5430 -- update documentation - -Copy patches to Eduardo Valentin <eduardo.valentin@ti.com> diff --git a/drivers/staging/omap-thermal/omap-bandgap.c b/drivers/staging/omap-thermal/omap-bandgap.c deleted file mode 100644 index dcc1448dbf8e..000000000000 --- a/drivers/staging/omap-thermal/omap-bandgap.c +++ /dev/null @@ -1,1174 +0,0 @@ -/* - * OMAP4 Bandgap temperature sensor driver - * - * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ - * Author: J Keerthy <j-keerthy@ti.com> - * Author: Moiz Sonasath <m-sonasath@ti.com> - * Couple of fixes, DT and MFD adaptation: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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. - * - * 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., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#include <linux/module.h> -#include <linux/export.h> -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/interrupt.h> -#include <linux/clk.h> -#include <linux/gpio.h> -#include <linux/platform_device.h> -#include <linux/err.h> -#include <linux/types.h> -#include <linux/mutex.h> -#include <linux/reboot.h> -#include <linux/of_device.h> -#include <linux/of_platform.h> -#include <linux/of_irq.h> -#include <linux/io.h> - -#include "omap-bandgap.h" - -static u32 omap_bandgap_readl(struct omap_bandgap *bg_ptr, u32 reg) -{ - return readl(bg_ptr->base + reg); -} - -static void omap_bandgap_writel(struct omap_bandgap *bg_ptr, u32 val, u32 reg) -{ - writel(val, bg_ptr->base + reg); -} - -static int omap_bandgap_power(struct omap_bandgap *bg_ptr, bool on) -{ - struct temp_sensor_registers *tsr; - int i; - u32 ctrl; - - if (!OMAP_BANDGAP_HAS(bg_ptr, POWER_SWITCH)) - return 0; - - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - tsr = bg_ptr->conf->sensors[i].registers; - ctrl = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - ctrl &= ~tsr->bgap_tempsoff_mask; - /* active on 0 */ - ctrl |= !on << __ffs(tsr->bgap_tempsoff_mask); - - /* write BGAP_TEMPSOFF should be reset to 0 */ - omap_bandgap_writel(bg_ptr, ctrl, tsr->temp_sensor_ctrl); - } - - return 0; -} - -/* This is the Talert handler. Call it only if HAS(TALERT) is set */ -static irqreturn_t talert_irq_handler(int irq, void *data) -{ - struct omap_bandgap *bg_ptr = data; - struct temp_sensor_registers *tsr; - u32 t_hot = 0, t_cold = 0, temp, ctrl; - int i; - - bg_ptr = data; - /* Read the status of t_hot */ - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - tsr = bg_ptr->conf->sensors[i].registers; - t_hot = omap_bandgap_readl(bg_ptr, tsr->bgap_status); - t_hot &= tsr->status_hot_mask; - - /* Read the status of t_cold */ - t_cold = omap_bandgap_readl(bg_ptr, tsr->bgap_status); - t_cold &= tsr->status_cold_mask; - - if (!t_cold && !t_hot) - continue; - - ctrl = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl); - /* - * One TALERT interrupt: Two sources - * If the interrupt is due to t_hot then mask t_hot and - * and unmask t_cold else mask t_cold and unmask t_hot - */ - if (t_hot) { - ctrl &= ~tsr->mask_hot_mask; - ctrl |= tsr->mask_cold_mask; - } else if (t_cold) { - ctrl &= ~tsr->mask_cold_mask; - ctrl |= tsr->mask_hot_mask; - } - - omap_bandgap_writel(bg_ptr, ctrl, tsr->bgap_mask_ctrl); - - dev_dbg(bg_ptr->dev, - "%s: IRQ from %s sensor: hotevent %d coldevent %d\n", - __func__, bg_ptr->conf->sensors[i].domain, - t_hot, t_cold); - - /* read temperature */ - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= tsr->bgap_dtemp_mask; - - /* report temperature to whom may concern */ - if (bg_ptr->conf->report_temperature) - bg_ptr->conf->report_temperature(bg_ptr, i); - } - - return IRQ_HANDLED; -} - -/* This is the Tshut handler. Call it only if HAS(TSHUT) is set */ -static irqreturn_t omap_bandgap_tshut_irq_handler(int irq, void *data) -{ - orderly_poweroff(true); - - return IRQ_HANDLED; -} - -static -int adc_to_temp_conversion(struct omap_bandgap *bg_ptr, int id, int adc_val, - int *t) -{ - struct temp_sensor_data *ts_data = bg_ptr->conf->sensors[id].ts_data; - - /* look up for temperature in the table and return the temperature */ - if (adc_val < ts_data->adc_start_val || adc_val > ts_data->adc_end_val) - return -ERANGE; - - *t = bg_ptr->conv_table[adc_val - ts_data->adc_start_val]; - - return 0; -} - -static int temp_to_adc_conversion(long temp, struct omap_bandgap *bg_ptr, int i, - int *adc) -{ - struct temp_sensor_data *ts_data = bg_ptr->conf->sensors[i].ts_data; - int high, low, mid; - - low = 0; - high = ts_data->adc_end_val - ts_data->adc_start_val; - mid = (high + low) / 2; - - if (temp < bg_ptr->conv_table[low] || temp > bg_ptr->conv_table[high]) - return -EINVAL; - - while (low < high) { - if (temp < bg_ptr->conv_table[mid]) - high = mid - 1; - else - low = mid + 1; - mid = (low + high) / 2; - } - - *adc = ts_data->adc_start_val + low; - - return 0; -} - -/* Talert masks. Call it only if HAS(TALERT) is set */ -static int temp_sensor_unmask_interrupts(struct omap_bandgap *bg_ptr, int id, - u32 t_hot, u32 t_cold) -{ - struct temp_sensor_registers *tsr; - u32 temp, reg_val; - - /* Read the current on die temperature */ - tsr = bg_ptr->conf->sensors[id].registers; - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= tsr->bgap_dtemp_mask; - - reg_val = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl); - if (temp < t_hot) - reg_val |= tsr->mask_hot_mask; - else - reg_val &= ~tsr->mask_hot_mask; - - if (t_cold < temp) - reg_val |= tsr->mask_cold_mask; - else - reg_val &= ~tsr->mask_cold_mask; - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_mask_ctrl); - - return 0; -} - -static -int add_hyst(int adc_val, int hyst_val, struct omap_bandgap *bg_ptr, int i, - u32 *sum) -{ - int temp, ret; - - ret = adc_to_temp_conversion(bg_ptr, i, adc_val, &temp); - if (ret < 0) - return ret; - - temp += hyst_val; - - return temp_to_adc_conversion(temp, bg_ptr, i, sum); -} - -/* Talert Thot threshold. Call it only if HAS(TALERT) is set */ -static -int temp_sensor_configure_thot(struct omap_bandgap *bg_ptr, int id, int t_hot) -{ - struct temp_sensor_data *ts_data = bg_ptr->conf->sensors[id].ts_data; - struct temp_sensor_registers *tsr; - u32 thresh_val, reg_val; - int cold, err = 0; - - tsr = bg_ptr->conf->sensors[id].registers; - - /* obtain the T cold value */ - thresh_val = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - cold = (thresh_val & tsr->threshold_tcold_mask) >> - __ffs(tsr->threshold_tcold_mask); - if (t_hot <= cold) { - /* change the t_cold to t_hot - 5000 millidegrees */ - err |= add_hyst(t_hot, -ts_data->hyst_val, bg_ptr, id, &cold); - /* write the new t_cold value */ - reg_val = thresh_val & (~tsr->threshold_tcold_mask); - reg_val |= cold << __ffs(tsr->threshold_tcold_mask); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - thresh_val = reg_val; - } - - /* write the new t_hot value */ - reg_val = thresh_val & ~tsr->threshold_thot_mask; - reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - if (err) { - dev_err(bg_ptr->dev, "failed to reprogram thot threshold\n"); - return -EIO; - } - - return temp_sensor_unmask_interrupts(bg_ptr, id, t_hot, cold); -} - -/* Talert Thot and Tcold thresholds. Call it only if HAS(TALERT) is set */ -static -int temp_sensor_init_talert_thresholds(struct omap_bandgap *bg_ptr, int id, - int t_hot, int t_cold) -{ - struct temp_sensor_registers *tsr; - u32 reg_val, thresh_val; - - tsr = bg_ptr->conf->sensors[id].registers; - thresh_val = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - - /* write the new t_cold value */ - reg_val = thresh_val & ~tsr->threshold_tcold_mask; - reg_val |= (t_cold << __ffs(tsr->threshold_tcold_mask)); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - - thresh_val = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - - /* write the new t_hot value */ - reg_val = thresh_val & ~tsr->threshold_thot_mask; - reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - - reg_val = omap_bandgap_readl(bg_ptr, tsr->bgap_mask_ctrl); - reg_val |= tsr->mask_hot_mask; - reg_val |= tsr->mask_cold_mask; - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_mask_ctrl); - - return 0; -} - -/* Talert Tcold threshold. Call it only if HAS(TALERT) is set */ -static -int temp_sensor_configure_tcold(struct omap_bandgap *bg_ptr, int id, - int t_cold) -{ - struct temp_sensor_data *ts_data = bg_ptr->conf->sensors[id].ts_data; - struct temp_sensor_registers *tsr; - u32 thresh_val, reg_val; - int hot, err = 0; - - tsr = bg_ptr->conf->sensors[id].registers; - /* obtain the T cold value */ - thresh_val = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - hot = (thresh_val & tsr->threshold_thot_mask) >> - __ffs(tsr->threshold_thot_mask); - - if (t_cold >= hot) { - /* change the t_hot to t_cold + 5000 millidegrees */ - err |= add_hyst(t_cold, ts_data->hyst_val, bg_ptr, id, &hot); - /* write the new t_hot value */ - reg_val = thresh_val & (~tsr->threshold_thot_mask); - reg_val |= hot << __ffs(tsr->threshold_thot_mask); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - thresh_val = reg_val; - } - - /* write the new t_cold value */ - reg_val = thresh_val & ~tsr->threshold_tcold_mask; - reg_val |= (t_cold << __ffs(tsr->threshold_tcold_mask)); - omap_bandgap_writel(bg_ptr, reg_val, tsr->bgap_threshold); - if (err) { - dev_err(bg_ptr->dev, "failed to reprogram tcold threshold\n"); - return -EIO; - } - - return temp_sensor_unmask_interrupts(bg_ptr, id, hot, t_cold); -} - -/* This is Tshut Thot config. Call it only if HAS(TSHUT_CONFIG) is set */ -static int temp_sensor_configure_tshut_hot(struct omap_bandgap *bg_ptr, - int id, int tshut_hot) -{ - struct temp_sensor_registers *tsr; - u32 reg_val; - - tsr = bg_ptr->conf->sensors[id].registers; - reg_val = omap_bandgap_readl(bg_ptr, tsr->tshut_threshold); - reg_val &= ~tsr->tshut_hot_mask; - reg_val |= tshut_hot << __ffs(tsr->tshut_hot_mask); - omap_bandgap_writel(bg_ptr, reg_val, tsr->tshut_threshold); - - return 0; -} - -/* This is Tshut Tcold config. Call it only if HAS(TSHUT_CONFIG) is set */ -static int temp_sensor_configure_tshut_cold(struct omap_bandgap *bg_ptr, - int id, int tshut_cold) -{ - struct temp_sensor_registers *tsr; - u32 reg_val; - - tsr = bg_ptr->conf->sensors[id].registers; - reg_val = omap_bandgap_readl(bg_ptr, tsr->tshut_threshold); - reg_val &= ~tsr->tshut_cold_mask; - reg_val |= tshut_cold << __ffs(tsr->tshut_cold_mask); - omap_bandgap_writel(bg_ptr, reg_val, tsr->tshut_threshold); - - return 0; -} - -/* This is counter config. Call it only if HAS(COUNTER) is set */ -static int configure_temp_sensor_counter(struct omap_bandgap *bg_ptr, int id, - u32 counter) -{ - struct temp_sensor_registers *tsr; - u32 val; - - tsr = bg_ptr->conf->sensors[id].registers; - val = omap_bandgap_readl(bg_ptr, tsr->bgap_counter); - val &= ~tsr->counter_mask; - val |= counter << __ffs(tsr->counter_mask); - omap_bandgap_writel(bg_ptr, val, tsr->bgap_counter); - - return 0; -} - -#define bandgap_is_valid(b) \ - (!IS_ERR_OR_NULL(b)) -#define bandgap_is_valid_sensor_id(b, i) \ - ((i) >= 0 && (i) < (b)->conf->sensor_count) -static inline int omap_bandgap_validate(struct omap_bandgap *bg_ptr, int id) -{ - if (!bandgap_is_valid(bg_ptr)) { - pr_err("%s: invalid bandgap pointer\n", __func__); - return -EINVAL; - } - - if (!bandgap_is_valid_sensor_id(bg_ptr, id)) { - dev_err(bg_ptr->dev, "%s: sensor id out of range (%d)\n", - __func__, id); - return -ERANGE; - } - - return 0; -} - -/* Exposed APIs */ -/** - * omap_bandgap_read_thot() - reads sensor current thot - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @thot - resulting current thot value - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_read_thot(struct omap_bandgap *bg_ptr, int id, - int *thot) -{ - struct temp_sensor_registers *tsr; - u32 temp; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - return -ENOTSUPP; - - tsr = bg_ptr->conf->sensors[id].registers; - temp = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - temp = (temp & tsr->threshold_thot_mask) >> - __ffs(tsr->threshold_thot_mask); - ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); - if (ret) { - dev_err(bg_ptr->dev, "failed to read thot\n"); - return -EIO; - } - - *thot = temp; - - return 0; -} - -/** - * omap_bandgap_write_thot() - sets sensor current thot - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @val - desired thot value - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_write_thot(struct omap_bandgap *bg_ptr, int id, int val) -{ - struct temp_sensor_data *ts_data; - struct temp_sensor_registers *tsr; - u32 t_hot; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - return -ENOTSUPP; - - ts_data = bg_ptr->conf->sensors[id].ts_data; - tsr = bg_ptr->conf->sensors[id].registers; - - if (val < ts_data->min_temp + ts_data->hyst_val) - return -EINVAL; - ret = temp_to_adc_conversion(val, bg_ptr, id, &t_hot); - if (ret < 0) - return ret; - - mutex_lock(&bg_ptr->bg_mutex); - temp_sensor_configure_thot(bg_ptr, id, t_hot); - mutex_unlock(&bg_ptr->bg_mutex); - - return 0; -} - -/** - * omap_bandgap_read_tcold() - reads sensor current tcold - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @tcold - resulting current tcold value - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_read_tcold(struct omap_bandgap *bg_ptr, int id, - int *tcold) -{ - struct temp_sensor_registers *tsr; - u32 temp; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - return -ENOTSUPP; - - tsr = bg_ptr->conf->sensors[id].registers; - temp = omap_bandgap_readl(bg_ptr, tsr->bgap_threshold); - temp = (temp & tsr->threshold_tcold_mask) - >> __ffs(tsr->threshold_tcold_mask); - ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); - if (ret) - return -EIO; - - *tcold = temp; - - return 0; -} - -/** - * omap_bandgap_write_tcold() - sets the sensor tcold - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @val - desired tcold value - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_write_tcold(struct omap_bandgap *bg_ptr, int id, int val) -{ - struct temp_sensor_data *ts_data; - struct temp_sensor_registers *tsr; - u32 t_cold; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - return -ENOTSUPP; - - ts_data = bg_ptr->conf->sensors[id].ts_data; - tsr = bg_ptr->conf->sensors[id].registers; - if (val > ts_data->max_temp + ts_data->hyst_val) - return -EINVAL; - - ret = temp_to_adc_conversion(val, bg_ptr, id, &t_cold); - if (ret < 0) - return ret; - - mutex_lock(&bg_ptr->bg_mutex); - temp_sensor_configure_tcold(bg_ptr, id, t_cold); - mutex_unlock(&bg_ptr->bg_mutex); - - return 0; -} - -/** - * omap_bandgap_read_update_interval() - read the sensor update interval - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @interval - resulting update interval in miliseconds - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_read_update_interval(struct omap_bandgap *bg_ptr, int id, - int *interval) -{ - struct temp_sensor_registers *tsr; - u32 time; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - return -ENOTSUPP; - - tsr = bg_ptr->conf->sensors[id].registers; - time = omap_bandgap_readl(bg_ptr, tsr->bgap_counter); - time = (time & tsr->counter_mask) >> __ffs(tsr->counter_mask); - time = time * 1000 / bg_ptr->clk_rate; - - *interval = time; - - return 0; -} - -/** - * omap_bandgap_write_update_interval() - set the update interval - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @interval - desired update interval in miliseconds - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr, - int id, u32 interval) -{ - int ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - if (!OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - return -ENOTSUPP; - - interval = interval * bg_ptr->clk_rate / 1000; - mutex_lock(&bg_ptr->bg_mutex); - configure_temp_sensor_counter(bg_ptr, id, interval); - mutex_unlock(&bg_ptr->bg_mutex); - - return 0; -} - -/** - * omap_bandgap_read_temperature() - report current temperature - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @temperature - resulting temperature - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id, - int *temperature) -{ - struct temp_sensor_registers *tsr; - u32 temp; - int ret; - - ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - tsr = bg_ptr->conf->sensors[id].registers; - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= tsr->bgap_dtemp_mask; - - ret |= adc_to_temp_conversion(bg_ptr, id, temp, &temp); - if (ret) - return -EIO; - - *temperature = temp; - - return 0; -} - -/** - * omap_bandgap_set_sensor_data() - helper function to store thermal - * framework related data. - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * @data - thermal framework related data to be stored - * - * returns 0 on success or the proper error code - */ -int omap_bandgap_set_sensor_data(struct omap_bandgap *bg_ptr, int id, - void *data) -{ - int ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ret; - - bg_ptr->conf->sensors[id].data = data; - - return 0; -} - -/** - * omap_bandgap_get_sensor_data() - helper function to get thermal - * framework related data. - * @bg_ptr - pointer to bandgap instance - * @id - sensor id - * - * returns data stored by set function with sensor id on success or NULL - */ -void *omap_bandgap_get_sensor_data(struct omap_bandgap *bg_ptr, int id) -{ - int ret = omap_bandgap_validate(bg_ptr, id); - if (ret) - return ERR_PTR(ret); - - return bg_ptr->conf->sensors[id].data; -} - -static int -omap_bandgap_force_single_read(struct omap_bandgap *bg_ptr, int id) -{ - struct temp_sensor_registers *tsr; - u32 temp = 0, counter = 1000; - - tsr = bg_ptr->conf->sensors[id].registers; - /* Select single conversion mode */ - if (OMAP_BANDGAP_HAS(bg_ptr, MODE_CONFIG)) { - temp = omap_bandgap_readl(bg_ptr, tsr->bgap_mode_ctrl); - temp &= ~(1 << __ffs(tsr->mode_ctrl_mask)); - omap_bandgap_writel(bg_ptr, temp, tsr->bgap_mode_ctrl); - } - - /* Start of Conversion = 1 */ - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp |= 1 << __ffs(tsr->bgap_soc_mask); - omap_bandgap_writel(bg_ptr, temp, tsr->temp_sensor_ctrl); - /* Wait until DTEMP is updated */ - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= (tsr->bgap_dtemp_mask); - while ((temp == 0) && --counter) { - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= (tsr->bgap_dtemp_mask); - } - /* Start of Conversion = 0 */ - temp = omap_bandgap_readl(bg_ptr, tsr->temp_sensor_ctrl); - temp &= ~(1 << __ffs(tsr->bgap_soc_mask)); - omap_bandgap_writel(bg_ptr, temp, tsr->temp_sensor_ctrl); - - return 0; -} - -/** - * enable_continuous_mode() - One time enabling of continuous conversion mode - * @bg_ptr - pointer to scm instance - * - * Call this function only if HAS(MODE_CONFIG) is set - */ -static int enable_continuous_mode(struct omap_bandgap *bg_ptr) -{ - struct temp_sensor_registers *tsr; - int i; - u32 val; - - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - /* Perform a single read just before enabling continuous */ - omap_bandgap_force_single_read(bg_ptr, i); - tsr = bg_ptr->conf->sensors[i].registers; - val = omap_bandgap_readl(bg_ptr, tsr->bgap_mode_ctrl); - val |= 1 << __ffs(tsr->mode_ctrl_mask); - omap_bandgap_writel(bg_ptr, val, tsr->bgap_mode_ctrl); - } - - return 0; -} - -static int omap_bandgap_tshut_init(struct omap_bandgap *bg_ptr, - struct platform_device *pdev) -{ - int gpio_nr = bg_ptr->tshut_gpio; - int status; - - /* Request for gpio_86 line */ - status = gpio_request(gpio_nr, "tshut"); - if (status < 0) { - dev_err(bg_ptr->dev, - "Could not request for TSHUT GPIO:%i\n", 86); - return status; - } - status = gpio_direction_input(gpio_nr); - if (status) { - dev_err(bg_ptr->dev, - "Cannot set input TSHUT GPIO %d\n", gpio_nr); - return status; - } - - status = request_irq(gpio_to_irq(gpio_nr), - omap_bandgap_tshut_irq_handler, - IRQF_TRIGGER_RISING, "tshut", - NULL); - if (status) { - gpio_free(gpio_nr); - dev_err(bg_ptr->dev, "request irq failed for TSHUT"); - } - - return 0; -} - -/* Initialization of Talert. Call it only if HAS(TALERT) is set */ -static int omap_bandgap_talert_init(struct omap_bandgap *bg_ptr, - struct platform_device *pdev) -{ - int ret; - - bg_ptr->irq = platform_get_irq(pdev, 0); - if (bg_ptr->irq < 0) { - dev_err(&pdev->dev, "get_irq failed\n"); - return bg_ptr->irq; - } - ret = request_threaded_irq(bg_ptr->irq, NULL, - talert_irq_handler, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "talert", bg_ptr); - if (ret) { - dev_err(&pdev->dev, "Request threaded irq failed.\n"); - return ret; - } - - return 0; -} - -static const struct of_device_id of_omap_bandgap_match[]; -static struct omap_bandgap *omap_bandgap_build(struct platform_device *pdev) -{ - struct device_node *node = pdev->dev.of_node; - const struct of_device_id *of_id; - struct omap_bandgap *bg_ptr; - struct resource *res; - u32 prop; - int i; - - /* just for the sake */ - if (!node) { - dev_err(&pdev->dev, "no platform information available\n"); - return ERR_PTR(-EINVAL); - } - - bg_ptr = devm_kzalloc(&pdev->dev, sizeof(struct omap_bandgap), - GFP_KERNEL); - if (!bg_ptr) { - dev_err(&pdev->dev, "Unable to allocate mem for driver ref\n"); - return ERR_PTR(-ENOMEM); - } - - of_id = of_match_device(of_omap_bandgap_match, &pdev->dev); - if (of_id) - bg_ptr->conf = of_id->data; - - i = 0; - do { - void __iomem *chunk; - - res = platform_get_resource(pdev, IORESOURCE_MEM, i); - if (!res) - break; - chunk = devm_ioremap_resource(&pdev->dev, res); - if (i == 0) - bg_ptr->base = chunk; - if (IS_ERR(chunk)) - return ERR_CAST(chunk); - - i++; - } while (res); - - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT)) { - if (of_property_read_u32(node, "ti,tshut-gpio", &prop) < 0) { - dev_err(&pdev->dev, "missing tshut gpio in device tree\n"); - return ERR_PTR(-EINVAL); - } - bg_ptr->tshut_gpio = prop; - if (!gpio_is_valid(bg_ptr->tshut_gpio)) { - dev_err(&pdev->dev, "invalid gpio for tshut (%d)\n", - bg_ptr->tshut_gpio); - return ERR_PTR(-EINVAL); - } - } - - return bg_ptr; -} - -static -int omap_bandgap_probe(struct platform_device *pdev) -{ - struct omap_bandgap *bg_ptr; - int clk_rate, ret = 0, i; - - bg_ptr = omap_bandgap_build(pdev); - if (IS_ERR_OR_NULL(bg_ptr)) { - dev_err(&pdev->dev, "failed to fetch platform data\n"); - return PTR_ERR(bg_ptr); - } - bg_ptr->dev = &pdev->dev; - - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT)) { - ret = omap_bandgap_tshut_init(bg_ptr, pdev); - if (ret) { - dev_err(&pdev->dev, - "failed to initialize system tshut IRQ\n"); - return ret; - } - } - - bg_ptr->fclock = clk_get(NULL, bg_ptr->conf->fclock_name); - ret = IS_ERR_OR_NULL(bg_ptr->fclock); - if (ret) { - dev_err(&pdev->dev, "failed to request fclock reference\n"); - goto free_irqs; - } - - bg_ptr->div_clk = clk_get(NULL, bg_ptr->conf->div_ck_name); - ret = IS_ERR_OR_NULL(bg_ptr->div_clk); - if (ret) { - dev_err(&pdev->dev, - "failed to request div_ts_ck clock ref\n"); - goto free_irqs; - } - - bg_ptr->conv_table = bg_ptr->conf->conv_table; - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - struct temp_sensor_registers *tsr; - u32 val; - - tsr = bg_ptr->conf->sensors[i].registers; - /* - * check if the efuse has a non-zero value if not - * it is an untrimmed sample and the temperatures - * may not be accurate - */ - val = omap_bandgap_readl(bg_ptr, tsr->bgap_efuse); - if (ret || !val) - dev_info(&pdev->dev, - "Non-trimmed BGAP, Temp not accurate\n"); - } - - clk_rate = clk_round_rate(bg_ptr->div_clk, - bg_ptr->conf->sensors[0].ts_data->max_freq); - if (clk_rate < bg_ptr->conf->sensors[0].ts_data->min_freq || - clk_rate == 0xffffffff) { - ret = -ENODEV; - dev_err(&pdev->dev, "wrong clock rate (%d)\n", clk_rate); - goto put_clks; - } - - ret = clk_set_rate(bg_ptr->div_clk, clk_rate); - if (ret) - dev_err(&pdev->dev, "Cannot re-set clock rate. Continuing\n"); - - bg_ptr->clk_rate = clk_rate; - clk_enable(bg_ptr->fclock); - - mutex_init(&bg_ptr->bg_mutex); - bg_ptr->dev = &pdev->dev; - platform_set_drvdata(pdev, bg_ptr); - - omap_bandgap_power(bg_ptr, true); - - /* Set default counter to 1 for now */ - if (OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - for (i = 0; i < bg_ptr->conf->sensor_count; i++) - configure_temp_sensor_counter(bg_ptr, i, 1); - - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - struct temp_sensor_data *ts_data; - - ts_data = bg_ptr->conf->sensors[i].ts_data; - - if (OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - temp_sensor_init_talert_thresholds(bg_ptr, i, - ts_data->t_hot, - ts_data->t_cold); - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT_CONFIG)) { - temp_sensor_configure_tshut_hot(bg_ptr, i, - ts_data->tshut_hot); - temp_sensor_configure_tshut_cold(bg_ptr, i, - ts_data->tshut_cold); - } - } - - if (OMAP_BANDGAP_HAS(bg_ptr, MODE_CONFIG)) - enable_continuous_mode(bg_ptr); - - /* Set .250 seconds time as default counter */ - if (OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - for (i = 0; i < bg_ptr->conf->sensor_count; i++) - configure_temp_sensor_counter(bg_ptr, i, - bg_ptr->clk_rate / 4); - - /* Every thing is good? Then expose the sensors */ - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - char *domain; - - if (bg_ptr->conf->sensors[i].register_cooling) - bg_ptr->conf->sensors[i].register_cooling(bg_ptr, i); - - domain = bg_ptr->conf->sensors[i].domain; - if (bg_ptr->conf->expose_sensor) - bg_ptr->conf->expose_sensor(bg_ptr, i, domain); - } - - /* - * Enable the Interrupts once everything is set. Otherwise irq handler - * might be called as soon as it is enabled where as rest of framework - * is still getting initialised. - */ - if (OMAP_BANDGAP_HAS(bg_ptr, TALERT)) { - ret = omap_bandgap_talert_init(bg_ptr, pdev); - if (ret) { - dev_err(&pdev->dev, "failed to initialize Talert IRQ\n"); - i = bg_ptr->conf->sensor_count; - goto disable_clk; - } - } - - return 0; - -disable_clk: - clk_disable(bg_ptr->fclock); -put_clks: - clk_put(bg_ptr->fclock); - clk_put(bg_ptr->div_clk); -free_irqs: - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT)) { - free_irq(gpio_to_irq(bg_ptr->tshut_gpio), NULL); - gpio_free(bg_ptr->tshut_gpio); - } - - return ret; -} - -static -int omap_bandgap_remove(struct platform_device *pdev) -{ - struct omap_bandgap *bg_ptr = platform_get_drvdata(pdev); - int i; - - /* First thing is to remove sensor interfaces */ - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - if (bg_ptr->conf->sensors[i].register_cooling) - bg_ptr->conf->sensors[i].unregister_cooling(bg_ptr, i); - - if (bg_ptr->conf->remove_sensor) - bg_ptr->conf->remove_sensor(bg_ptr, i); - } - - omap_bandgap_power(bg_ptr, false); - - clk_disable(bg_ptr->fclock); - clk_put(bg_ptr->fclock); - clk_put(bg_ptr->div_clk); - - if (OMAP_BANDGAP_HAS(bg_ptr, TALERT)) - free_irq(bg_ptr->irq, bg_ptr); - - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT)) { - free_irq(gpio_to_irq(bg_ptr->tshut_gpio), NULL); - gpio_free(bg_ptr->tshut_gpio); - } - - return 0; -} - -#ifdef CONFIG_PM -static int omap_bandgap_save_ctxt(struct omap_bandgap *bg_ptr) -{ - int i; - - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - struct temp_sensor_registers *tsr; - struct temp_sensor_regval *rval; - - rval = &bg_ptr->conf->sensors[i].regval; - tsr = bg_ptr->conf->sensors[i].registers; - - if (OMAP_BANDGAP_HAS(bg_ptr, MODE_CONFIG)) - rval->bg_mode_ctrl = omap_bandgap_readl(bg_ptr, - tsr->bgap_mode_ctrl); - if (OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - rval->bg_counter = omap_bandgap_readl(bg_ptr, - tsr->bgap_counter); - if (OMAP_BANDGAP_HAS(bg_ptr, TALERT)) { - rval->bg_threshold = omap_bandgap_readl(bg_ptr, - tsr->bgap_threshold); - rval->bg_ctrl = omap_bandgap_readl(bg_ptr, - tsr->bgap_mask_ctrl); - } - - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT_CONFIG)) - rval->tshut_threshold = omap_bandgap_readl(bg_ptr, - tsr->tshut_threshold); - } - - return 0; -} - -static int omap_bandgap_restore_ctxt(struct omap_bandgap *bg_ptr) -{ - int i; - - for (i = 0; i < bg_ptr->conf->sensor_count; i++) { - struct temp_sensor_registers *tsr; - struct temp_sensor_regval *rval; - u32 val = 0; - - rval = &bg_ptr->conf->sensors[i].regval; - tsr = bg_ptr->conf->sensors[i].registers; - - if (OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - val = omap_bandgap_readl(bg_ptr, tsr->bgap_counter); - - if (OMAP_BANDGAP_HAS(bg_ptr, TSHUT_CONFIG)) - omap_bandgap_writel(bg_ptr, - rval->tshut_threshold, - tsr->tshut_threshold); - /* Force immediate temperature measurement and update - * of the DTEMP field - */ - omap_bandgap_force_single_read(bg_ptr, i); - - if (OMAP_BANDGAP_HAS(bg_ptr, COUNTER)) - omap_bandgap_writel(bg_ptr, rval->bg_counter, - tsr->bgap_counter); - if (OMAP_BANDGAP_HAS(bg_ptr, MODE_CONFIG)) - omap_bandgap_writel(bg_ptr, rval->bg_mode_ctrl, - tsr->bgap_mode_ctrl); - if (OMAP_BANDGAP_HAS(bg_ptr, TALERT)) { - omap_bandgap_writel(bg_ptr, - rval->bg_threshold, - tsr->bgap_threshold); - omap_bandgap_writel(bg_ptr, rval->bg_ctrl, - tsr->bgap_mask_ctrl); - } - } - - return 0; -} - -static int omap_bandgap_suspend(struct device *dev) -{ - struct omap_bandgap *bg_ptr = dev_get_drvdata(dev); - int err; - - err = omap_bandgap_save_ctxt(bg_ptr); - omap_bandgap_power(bg_ptr, false); - clk_disable(bg_ptr->fclock); - - return err; -} - -static int omap_bandgap_resume(struct device *dev) -{ - struct omap_bandgap *bg_ptr = dev_get_drvdata(dev); - - clk_enable(bg_ptr->fclock); - omap_bandgap_power(bg_ptr, true); - - return omap_bandgap_restore_ctxt(bg_ptr); -} -static const struct dev_pm_ops omap_bandgap_dev_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(omap_bandgap_suspend, - omap_bandgap_resume) -}; - -#define DEV_PM_OPS (&omap_bandgap_dev_pm_ops) -#else -#define DEV_PM_OPS NULL -#endif - -static const struct of_device_id of_omap_bandgap_match[] = { -#ifdef CONFIG_OMAP4_THERMAL - { - .compatible = "ti,omap4430-bandgap", - .data = (void *)&omap4430_data, - }, - { - .compatible = "ti,omap4460-bandgap", - .data = (void *)&omap4460_data, - }, - { - .compatible = "ti,omap4470-bandgap", - .data = (void *)&omap4470_data, - }, -#endif -#ifdef CONFIG_OMAP5_THERMAL - { - .compatible = "ti,omap5430-bandgap", - .data = (void *)&omap5430_data, - }, -#endif - /* Sentinel */ - { }, -}; -MODULE_DEVICE_TABLE(of, of_omap_bandgap_match); - -static struct platform_driver omap_bandgap_sensor_driver = { - .probe = omap_bandgap_probe, - .remove = omap_bandgap_remove, - .driver = { - .name = "omap-bandgap", - .pm = DEV_PM_OPS, - .of_match_table = of_omap_bandgap_match, - }, -}; - -module_platform_driver(omap_bandgap_sensor_driver); - -MODULE_DESCRIPTION("OMAP4+ bandgap temperature sensor driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:omap-bandgap"); -MODULE_AUTHOR("Texas Instrument Inc."); diff --git a/drivers/staging/omap-thermal/omap-bandgap.h b/drivers/staging/omap-thermal/omap-bandgap.h deleted file mode 100644 index 2bb14bd7c6d9..000000000000 --- a/drivers/staging/omap-thermal/omap-bandgap.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - * OMAP4 Bandgap temperature sensor driver - * - * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ - * Contact: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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. - * - * 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., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ -#ifndef __OMAP_BANDGAP_H -#define __OMAP_BANDGAP_H - -#include <linux/mutex.h> -#include <linux/types.h> -#include <linux/err.h> - -/* TEMP_SENSOR OMAP4430 */ -#define OMAP4430_BGAP_TSHUT_SHIFT 11 -#define OMAP4430_BGAP_TSHUT_MASK (1 << 11) - -/* TEMP_SENSOR OMAP4430 */ -#define OMAP4430_BGAP_TEMPSOFF_SHIFT 12 -#define OMAP4430_BGAP_TEMPSOFF_MASK (1 << 12) -#define OMAP4430_SINGLE_MODE_SHIFT 10 -#define OMAP4430_SINGLE_MODE_MASK (1 << 10) -#define OMAP4430_BGAP_TEMP_SENSOR_SOC_SHIFT 9 -#define OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK (1 << 9) -#define OMAP4430_BGAP_TEMP_SENSOR_EOCZ_SHIFT 8 -#define OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK (1 << 8) -#define OMAP4430_BGAP_TEMP_SENSOR_DTEMP_SHIFT 0 -#define OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK (0xff << 0) - -#define OMAP4430_ADC_START_VALUE 0 -#define OMAP4430_ADC_END_VALUE 127 -#define OMAP4430_MAX_FREQ 32768 -#define OMAP4430_MIN_FREQ 32768 -#define OMAP4430_MIN_TEMP -40000 -#define OMAP4430_MAX_TEMP 125000 -#define OMAP4430_HYST_VAL 5000 - -/* TEMP_SENSOR OMAP4460 */ -#define OMAP4460_BGAP_TEMPSOFF_SHIFT 13 -#define OMAP4460_BGAP_TEMPSOFF_MASK (1 << 13) -#define OMAP4460_BGAP_TEMP_SENSOR_SOC_SHIFT 11 -#define OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK (1 << 11) -#define OMAP4460_BGAP_TEMP_SENSOR_EOCZ_SHIFT 10 -#define OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK (1 << 10) -#define OMAP4460_BGAP_TEMP_SENSOR_DTEMP_SHIFT 0 -#define OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK (0x3ff << 0) - -/* BANDGAP_CTRL */ -#define OMAP4460_SINGLE_MODE_SHIFT 31 -#define OMAP4460_SINGLE_MODE_MASK (1 << 31) -#define OMAP4460_MASK_HOT_SHIFT 1 -#define OMAP4460_MASK_HOT_MASK (1 << 1) -#define OMAP4460_MASK_COLD_SHIFT 0 -#define OMAP4460_MASK_COLD_MASK (1 << 0) - -/* BANDGAP_COUNTER */ -#define OMAP4460_COUNTER_SHIFT 0 -#define OMAP4460_COUNTER_MASK (0xffffff << 0) - -/* BANDGAP_THRESHOLD */ -#define OMAP4460_T_HOT_SHIFT 16 -#define OMAP4460_T_HOT_MASK (0x3ff << 16) -#define OMAP4460_T_COLD_SHIFT 0 -#define OMAP4460_T_COLD_MASK (0x3ff << 0) - -/* TSHUT_THRESHOLD */ -#define OMAP4460_TSHUT_HOT_SHIFT 16 -#define OMAP4460_TSHUT_HOT_MASK (0x3ff << 16) -#define OMAP4460_TSHUT_COLD_SHIFT 0 -#define OMAP4460_TSHUT_COLD_MASK (0x3ff << 0) - -/* BANDGAP_STATUS */ -#define OMAP4460_CLEAN_STOP_SHIFT 3 -#define OMAP4460_CLEAN_STOP_MASK (1 << 3) -#define OMAP4460_BGAP_ALERT_SHIFT 2 -#define OMAP4460_BGAP_ALERT_MASK (1 << 2) -#define OMAP4460_HOT_FLAG_SHIFT 1 -#define OMAP4460_HOT_FLAG_MASK (1 << 1) -#define OMAP4460_COLD_FLAG_SHIFT 0 -#define OMAP4460_COLD_FLAG_MASK (1 << 0) - -/* TEMP_SENSOR OMAP5430 */ -#define OMAP5430_BGAP_TEMP_SENSOR_SOC_SHIFT 12 -#define OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK (1 << 12) -#define OMAP5430_BGAP_TEMPSOFF_SHIFT 11 -#define OMAP5430_BGAP_TEMPSOFF_MASK (1 << 11) -#define OMAP5430_BGAP_TEMP_SENSOR_EOCZ_SHIFT 10 -#define OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK (1 << 10) -#define OMAP5430_BGAP_TEMP_SENSOR_DTEMP_SHIFT 0 -#define OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK (0x3ff << 0) - -/* BANDGAP_CTRL */ -#define OMAP5430_MASK_HOT_CORE_SHIFT 5 -#define OMAP5430_MASK_HOT_CORE_MASK (1 << 5) -#define OMAP5430_MASK_COLD_CORE_SHIFT 4 -#define OMAP5430_MASK_COLD_CORE_MASK (1 << 4) -#define OMAP5430_MASK_HOT_MM_SHIFT 3 -#define OMAP5430_MASK_HOT_MM_MASK (1 << 3) -#define OMAP5430_MASK_COLD_MM_SHIFT 2 -#define OMAP5430_MASK_COLD_MM_MASK (1 << 2) -#define OMAP5430_MASK_HOT_MPU_SHIFT 1 -#define OMAP5430_MASK_HOT_MPU_MASK (1 << 1) -#define OMAP5430_MASK_COLD_MPU_SHIFT 0 -#define OMAP5430_MASK_COLD_MPU_MASK (1 << 0) - -/* BANDGAP_COUNTER */ -#define OMAP5430_REPEAT_MODE_SHIFT 31 -#define OMAP5430_REPEAT_MODE_MASK (1 << 31) -#define OMAP5430_COUNTER_SHIFT 0 -#define OMAP5430_COUNTER_MASK (0xffffff << 0) - -/* BANDGAP_THRESHOLD */ -#define OMAP5430_T_HOT_SHIFT 16 -#define OMAP5430_T_HOT_MASK (0x3ff << 16) -#define OMAP5430_T_COLD_SHIFT 0 -#define OMAP5430_T_COLD_MASK (0x3ff << 0) - -/* TSHUT_THRESHOLD */ -#define OMAP5430_TSHUT_HOT_SHIFT 16 -#define OMAP5430_TSHUT_HOT_MASK (0x3ff << 16) -#define OMAP5430_TSHUT_COLD_SHIFT 0 -#define OMAP5430_TSHUT_COLD_MASK (0x3ff << 0) - -/* BANDGAP_STATUS */ -#define OMAP5430_BGAP_ALERT_SHIFT 31 -#define OMAP5430_BGAP_ALERT_MASK (1 << 31) -#define OMAP5430_HOT_CORE_FLAG_SHIFT 5 -#define OMAP5430_HOT_CORE_FLAG_MASK (1 << 5) -#define OMAP5430_COLD_CORE_FLAG_SHIFT 4 -#define OMAP5430_COLD_CORE_FLAG_MASK (1 << 4) -#define OMAP5430_HOT_MM_FLAG_SHIFT 3 -#define OMAP5430_HOT_MM_FLAG_MASK (1 << 3) -#define OMAP5430_COLD_MM_FLAG_SHIFT 2 -#define OMAP5430_COLD_MM_FLAG_MASK (1 << 2) -#define OMAP5430_HOT_MPU_FLAG_SHIFT 1 -#define OMAP5430_HOT_MPU_FLAG_MASK (1 << 1) -#define OMAP5430_COLD_MPU_FLAG_SHIFT 0 -#define OMAP5430_COLD_MPU_FLAG_MASK (1 << 0) - -/* Offsets from the base of temperature sensor registers */ - -/* 4430 - All goes relative to OPP_BGAP */ -#define OMAP4430_FUSE_OPP_BGAP 0x0 -#define OMAP4430_TEMP_SENSOR_CTRL_OFFSET 0xCC - -/* 4460 - All goes relative to OPP_BGAP */ -#define OMAP4460_FUSE_OPP_BGAP 0x0 -#define OMAP4460_TEMP_SENSOR_CTRL_OFFSET 0xCC -#define OMAP4460_BGAP_CTRL_OFFSET 0x118 -#define OMAP4460_BGAP_COUNTER_OFFSET 0x11C -#define OMAP4460_BGAP_THRESHOLD_OFFSET 0x120 -#define OMAP4460_BGAP_TSHUT_OFFSET 0x124 -#define OMAP4460_BGAP_STATUS_OFFSET 0x128 - -/* 5430 - All goes relative to OPP_BGAP_GPU */ -#define OMAP5430_FUSE_OPP_BGAP_GPU 0x0 -#define OMAP5430_TEMP_SENSOR_GPU_OFFSET 0x150 -#define OMAP5430_BGAP_COUNTER_GPU_OFFSET 0x1C0 -#define OMAP5430_BGAP_THRESHOLD_GPU_OFFSET 0x1A8 -#define OMAP5430_BGAP_TSHUT_GPU_OFFSET 0x1B4 - -#define OMAP5430_FUSE_OPP_BGAP_MPU 0x4 -#define OMAP5430_TEMP_SENSOR_MPU_OFFSET 0x14C -#define OMAP5430_BGAP_CTRL_OFFSET 0x1A0 -#define OMAP5430_BGAP_COUNTER_MPU_OFFSET 0x1BC -#define OMAP5430_BGAP_THRESHOLD_MPU_OFFSET 0x1A4 -#define OMAP5430_BGAP_TSHUT_MPU_OFFSET 0x1B0 -#define OMAP5430_BGAP_STATUS_OFFSET 0x1C8 - -#define OMAP5430_FUSE_OPP_BGAP_CORE 0x8 -#define OMAP5430_TEMP_SENSOR_CORE_OFFSET 0x154 -#define OMAP5430_BGAP_COUNTER_CORE_OFFSET 0x1C4 -#define OMAP5430_BGAP_THRESHOLD_CORE_OFFSET 0x1AC -#define OMAP5430_BGAP_TSHUT_CORE_OFFSET 0x1B8 - -#define OMAP4460_TSHUT_HOT 900 /* 122 deg C */ -#define OMAP4460_TSHUT_COLD 895 /* 100 deg C */ -#define OMAP4460_T_HOT 800 /* 73 deg C */ -#define OMAP4460_T_COLD 795 /* 71 deg C */ -#define OMAP4460_MAX_FREQ 1500000 -#define OMAP4460_MIN_FREQ 1000000 -#define OMAP4460_MIN_TEMP -40000 -#define OMAP4460_MAX_TEMP 123000 -#define OMAP4460_HYST_VAL 5000 -#define OMAP4460_ADC_START_VALUE 530 -#define OMAP4460_ADC_END_VALUE 932 - -#define OMAP5430_MPU_TSHUT_HOT 915 -#define OMAP5430_MPU_TSHUT_COLD 900 -#define OMAP5430_MPU_T_HOT 800 -#define OMAP5430_MPU_T_COLD 795 -#define OMAP5430_MPU_MAX_FREQ 1500000 -#define OMAP5430_MPU_MIN_FREQ 1000000 -#define OMAP5430_MPU_MIN_TEMP -40000 -#define OMAP5430_MPU_MAX_TEMP 125000 -#define OMAP5430_MPU_HYST_VAL 5000 -#define OMAP5430_ADC_START_VALUE 532 -#define OMAP5430_ADC_END_VALUE 934 - - -#define OMAP5430_GPU_TSHUT_HOT 915 -#define OMAP5430_GPU_TSHUT_COLD 900 -#define OMAP5430_GPU_T_HOT 800 -#define OMAP5430_GPU_T_COLD 795 -#define OMAP5430_GPU_MAX_FREQ 1500000 -#define OMAP5430_GPU_MIN_FREQ 1000000 -#define OMAP5430_GPU_MIN_TEMP -40000 -#define OMAP5430_GPU_MAX_TEMP 125000 -#define OMAP5430_GPU_HYST_VAL 5000 - -#define OMAP5430_CORE_TSHUT_HOT 915 -#define OMAP5430_CORE_TSHUT_COLD 900 -#define OMAP5430_CORE_T_HOT 800 -#define OMAP5430_CORE_T_COLD 795 -#define OMAP5430_CORE_MAX_FREQ 1500000 -#define OMAP5430_CORE_MIN_FREQ 1000000 -#define OMAP5430_CORE_MIN_TEMP -40000 -#define OMAP5430_CORE_MAX_TEMP 125000 -#define OMAP5430_CORE_HYST_VAL 5000 - -/** - * The register offsets and bit fields might change across - * OMAP versions hence populating them in this structure. - */ - -struct temp_sensor_registers { - u32 temp_sensor_ctrl; - u32 bgap_tempsoff_mask; - u32 bgap_soc_mask; - u32 bgap_eocz_mask; - u32 bgap_dtemp_mask; - - u32 bgap_mask_ctrl; - u32 mask_hot_mask; - u32 mask_cold_mask; - - u32 bgap_mode_ctrl; - u32 mode_ctrl_mask; - - u32 bgap_counter; - u32 counter_mask; - - u32 bgap_threshold; - u32 threshold_thot_mask; - u32 threshold_tcold_mask; - - u32 tshut_threshold; - u32 tshut_hot_mask; - u32 tshut_cold_mask; - - u32 bgap_status; - u32 status_clean_stop_mask; - u32 status_bgap_alert_mask; - u32 status_hot_mask; - u32 status_cold_mask; - - u32 bgap_efuse; -}; - -/** - * The thresholds and limits for temperature sensors. - */ -struct temp_sensor_data { - u32 tshut_hot; - u32 tshut_cold; - u32 t_hot; - u32 t_cold; - u32 min_freq; - u32 max_freq; - int max_temp; - int min_temp; - int hyst_val; - u32 adc_start_val; - u32 adc_end_val; - u32 update_int1; - u32 update_int2; -}; - -struct omap_bandgap_data; - -/** - * struct omap_bandgap - bandgap device structure - * @dev: device pointer - * @conf: platform data with sensor data - * @fclock: pointer to functional clock of temperature sensor - * @div_clk: pointer to parent clock of temperature sensor fclk - * @conv_table: Pointer to adc to temperature conversion table - * @bg_mutex: Mutex for sysfs, irq and PM - * @irq: MPU Irq number for thermal alert - * @tshut_gpio: GPIO where Tshut signal is routed - * @clk_rate: Holds current clock rate - */ -struct omap_bandgap { - struct device *dev; - void __iomem *base; - struct omap_bandgap_data *conf; - struct clk *fclock; - struct clk *div_clk; - const int *conv_table; - struct mutex bg_mutex; /* Mutex for irq and PM */ - int irq; - int tshut_gpio; - u32 clk_rate; -}; - -/** - * struct temp_sensor_regval - temperature sensor register values - * @bg_mode_ctrl: temp sensor control register value - * @bg_ctrl: bandgap ctrl register value - * @bg_counter: bandgap counter value - * @bg_threshold: bandgap threshold register value - * @tshut_threshold: bandgap tshut register value - */ -struct temp_sensor_regval { - u32 bg_mode_ctrl; - u32 bg_ctrl; - u32 bg_counter; - u32 bg_threshold; - u32 tshut_threshold; -}; - -/** - * struct omap_temp_sensor - bandgap temperature sensor platform data - * @ts_data: pointer to struct with thresholds, limits of temperature sensor - * @registers: pointer to the list of register offsets and bitfields - * @regval: temperature sensor register values - * @domain: the name of the domain where the sensor is located - * @cooling_data: description on how the zone should be cooled off. - * @slope: sensor gradient slope info for hotspot extrapolation - * @const: sensor gradient const info for hotspot extrapolation - * @slope_pcb: sensor gradient slope info for hotspot extrapolation - * with no external influence - * @const_pcb: sensor gradient const info for hotspot extrapolation - * with no external influence - * @data: private data - * @register_cooling: function to describe how this sensor is going to be cooled - * @unregister_cooling: function to release cooling data - */ -struct omap_temp_sensor { - struct temp_sensor_data *ts_data; - struct temp_sensor_registers *registers; - struct temp_sensor_regval regval; - char *domain; - /* for hotspot extrapolation */ - const int slope; - const int constant; - const int slope_pcb; - const int constant_pcb; - void *data; - int (*register_cooling)(struct omap_bandgap *bg_ptr, int id); - int (*unregister_cooling)(struct omap_bandgap *bg_ptr, int id); -}; - -/** - * struct omap_bandgap_data - bandgap platform data structure - * @features: a bitwise flag set to describe the device features - * @conv_table: Pointer to adc to temperature conversion table - * @fclock_name: clock name of the functional clock - * @div_ck_nme: clock name of the clock divisor - * @sensor_count: count of temperature sensor device in scm - * @sensors: array of sensors present in this bandgap instance - * @expose_sensor: callback to export sensor to thermal API - */ -struct omap_bandgap_data { -#define OMAP_BANDGAP_FEATURE_TSHUT (1 << 0) -#define OMAP_BANDGAP_FEATURE_TSHUT_CONFIG (1 << 1) -#define OMAP_BANDGAP_FEATURE_TALERT (1 << 2) -#define OMAP_BANDGAP_FEATURE_MODE_CONFIG (1 << 3) -#define OMAP_BANDGAP_FEATURE_COUNTER (1 << 4) -#define OMAP_BANDGAP_FEATURE_POWER_SWITCH (1 << 5) -#define OMAP_BANDGAP_HAS(b, f) \ - ((b)->conf->features & OMAP_BANDGAP_FEATURE_ ## f) - unsigned int features; - const int *conv_table; - char *fclock_name; - char *div_ck_name; - int sensor_count; - int (*report_temperature)(struct omap_bandgap *bg_ptr, int id); - int (*expose_sensor)(struct omap_bandgap *bg_ptr, int id, char *domain); - int (*remove_sensor)(struct omap_bandgap *bg_ptr, int id); - - /* this needs to be at the end */ - struct omap_temp_sensor sensors[]; -}; - -int omap_bandgap_read_thot(struct omap_bandgap *bg_ptr, int id, int *thot); -int omap_bandgap_write_thot(struct omap_bandgap *bg_ptr, int id, int val); -int omap_bandgap_read_tcold(struct omap_bandgap *bg_ptr, int id, int *tcold); -int omap_bandgap_write_tcold(struct omap_bandgap *bg_ptr, int id, int val); -int omap_bandgap_read_update_interval(struct omap_bandgap *bg_ptr, int id, - int *interval); -int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr, int id, - u32 interval); -int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id, - int *temperature); -int omap_bandgap_set_sensor_data(struct omap_bandgap *bg_ptr, int id, - void *data); -void *omap_bandgap_get_sensor_data(struct omap_bandgap *bg_ptr, int id); - -#ifdef CONFIG_OMAP4_THERMAL -extern const struct omap_bandgap_data omap4430_data; -extern const struct omap_bandgap_data omap4460_data; -extern const struct omap_bandgap_data omap4470_data; -#else -#define omap4430_data NULL -#define omap4460_data NULL -#define omap4470_data NULL -#endif - -#ifdef CONFIG_OMAP5_THERMAL -extern const struct omap_bandgap_data omap5430_data; -#else -#define omap5430_data NULL -#endif - -#endif diff --git a/drivers/staging/omap-thermal/omap-thermal-common.c b/drivers/staging/omap-thermal/omap-thermal-common.c deleted file mode 100644 index 79a55aaae5a3..000000000000 --- a/drivers/staging/omap-thermal/omap-thermal-common.c +++ /dev/null @@ -1,338 +0,0 @@ -/* - * OMAP thermal driver interface - * - * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ - * Contact: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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. - * - * 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., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#include <linux/device.h> -#include <linux/err.h> -#include <linux/mutex.h> -#include <linux/gfp.h> -#include <linux/kernel.h> -#include <linux/workqueue.h> -#include <linux/thermal.h> -#include <linux/cpufreq.h> -#include <linux/cpumask.h> -#include <linux/cpu_cooling.h> - -#include "omap-thermal.h" -#include "omap-bandgap.h" - -/* common data structures */ -struct omap_thermal_data { - struct thermal_zone_device *omap_thermal; - struct thermal_cooling_device *cool_dev; - struct omap_bandgap *bg_ptr; - enum thermal_device_mode mode; - struct work_struct thermal_wq; - int sensor_id; -}; - -static void omap_thermal_work(struct work_struct *work) -{ - struct omap_thermal_data *data = container_of(work, - struct omap_thermal_data, thermal_wq); - - thermal_zone_device_update(data->omap_thermal); - - dev_dbg(&data->omap_thermal->device, "updated thermal zone %s\n", - data->omap_thermal->type); -} - -/** - * omap_thermal_hotspot_temperature - returns sensor extrapolated temperature - * @t: omap sensor temperature - * @s: omap sensor slope value - * @c: omap sensor const value - */ -static inline int omap_thermal_hotspot_temperature(int t, int s, int c) -{ - int delta = t * s / 1000 + c; - - if (delta < 0) - delta = 0; - - return t + delta; -} - -/* thermal zone ops */ -/* Get temperature callback function for thermal zone*/ -static inline int omap_thermal_get_temp(struct thermal_zone_device *thermal, - unsigned long *temp) -{ - struct omap_thermal_data *data = thermal->devdata; - struct omap_bandgap *bg_ptr; - struct omap_temp_sensor *s; - int ret, tmp, pcb_temp, slope, constant; - - if (!data) - return 0; - - bg_ptr = data->bg_ptr; - s = &bg_ptr->conf->sensors[data->sensor_id]; - - ret = omap_bandgap_read_temperature(bg_ptr, data->sensor_id, &tmp); - if (ret) - return ret; - - pcb_temp = 0; - /* TODO: Introduce pcb temperature lookup */ - /* In case pcb zone is available, use the extrapolation rule with it */ - if (pcb_temp) { - tmp -= pcb_temp; - slope = s->slope_pcb; - constant = s->constant_pcb; - } else { - slope = s->slope; - constant = s->constant; - } - *temp = omap_thermal_hotspot_temperature(tmp, slope, constant); - - return ret; -} - -/* Bind callback functions for thermal zone */ -static int omap_thermal_bind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) -{ - struct omap_thermal_data *data = thermal->devdata; - int id; - - if (IS_ERR_OR_NULL(data)) - return -ENODEV; - - /* check if this is the cooling device we registered */ - if (data->cool_dev != cdev) - return 0; - - id = data->sensor_id; - - /* TODO: bind with min and max states */ - /* Simple thing, two trips, one passive another critical */ - return thermal_zone_bind_cooling_device(thermal, 0, cdev, - THERMAL_NO_LIMIT, - THERMAL_NO_LIMIT); -} - -/* Unbind callback functions for thermal zone */ -static int omap_thermal_unbind(struct thermal_zone_device *thermal, - struct thermal_cooling_device *cdev) -{ - struct omap_thermal_data *data = thermal->devdata; - - if (IS_ERR_OR_NULL(data)) - return -ENODEV; - - /* check if this is the cooling device we registered */ - if (data->cool_dev != cdev) - return 0; - - /* Simple thing, two trips, one passive another critical */ - return thermal_zone_unbind_cooling_device(thermal, 0, cdev); -} - -/* Get mode callback functions for thermal zone */ -static int omap_thermal_get_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode *mode) -{ - struct omap_thermal_data *data = thermal->devdata; - - if (data) - *mode = data->mode; - - return 0; -} - -/* Set mode callback functions for thermal zone */ -static int omap_thermal_set_mode(struct thermal_zone_device *thermal, - enum thermal_device_mode mode) -{ - struct omap_thermal_data *data = thermal->devdata; - - if (!data->omap_thermal) { - dev_notice(&thermal->device, "thermal zone not registered\n"); - return 0; - } - - mutex_lock(&data->omap_thermal->lock); - - if (mode == THERMAL_DEVICE_ENABLED) - data->omap_thermal->polling_delay = FAST_TEMP_MONITORING_RATE; - else - data->omap_thermal->polling_delay = 0; - - mutex_unlock(&data->omap_thermal->lock); - - data->mode = mode; - thermal_zone_device_update(data->omap_thermal); - dev_dbg(&thermal->device, "thermal polling set for duration=%d msec\n", - data->omap_thermal->polling_delay); - - return 0; -} - -/* Get trip type callback functions for thermal zone */ -static int omap_thermal_get_trip_type(struct thermal_zone_device *thermal, - int trip, enum thermal_trip_type *type) -{ - if (!omap_thermal_is_valid_trip(trip)) - return -EINVAL; - - if (trip + 1 == OMAP_TRIP_NUMBER) - *type = THERMAL_TRIP_CRITICAL; - else - *type = THERMAL_TRIP_PASSIVE; - - return 0; -} - -/* Get trip temperature callback functions for thermal zone */ -static int omap_thermal_get_trip_temp(struct thermal_zone_device *thermal, - int trip, unsigned long *temp) -{ - if (!omap_thermal_is_valid_trip(trip)) - return -EINVAL; - - *temp = omap_thermal_get_trip_value(trip); - - return 0; -} - -/* Get critical temperature callback functions for thermal zone */ -static int omap_thermal_get_crit_temp(struct thermal_zone_device *thermal, - unsigned long *temp) -{ - /* shutdown zone */ - return omap_thermal_get_trip_temp(thermal, OMAP_TRIP_NUMBER - 1, temp); -} - -static struct thermal_zone_device_ops omap_thermal_ops = { - .get_temp = omap_thermal_get_temp, - /* TODO: add .get_trend */ - .bind = omap_thermal_bind, - .unbind = omap_thermal_unbind, - .get_mode = omap_thermal_get_mode, - .set_mode = omap_thermal_set_mode, - .get_trip_type = omap_thermal_get_trip_type, - .get_trip_temp = omap_thermal_get_trip_temp, - .get_crit_temp = omap_thermal_get_crit_temp, -}; - -static struct omap_thermal_data -*omap_thermal_build_data(struct omap_bandgap *bg_ptr, int id) -{ - struct omap_thermal_data *data; - - data = devm_kzalloc(bg_ptr->dev, sizeof(*data), GFP_KERNEL); - if (!data) { - dev_err(bg_ptr->dev, "kzalloc fail\n"); - return NULL; - } - data->sensor_id = id; - data->bg_ptr = bg_ptr; - data->mode = THERMAL_DEVICE_ENABLED; - INIT_WORK(&data->thermal_wq, omap_thermal_work); - - return data; -} - -int omap_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id, - char *domain) -{ - struct omap_thermal_data *data; - - data = omap_bandgap_get_sensor_data(bg_ptr, id); - - if (IS_ERR(data)) - data = omap_thermal_build_data(bg_ptr, id); - - if (!data) - return -EINVAL; - - /* TODO: remove TC1 TC2 */ - /* Create thermal zone */ - data->omap_thermal = thermal_zone_device_register(domain, - OMAP_TRIP_NUMBER, 0, data, &omap_thermal_ops, - NULL, FAST_TEMP_MONITORING_RATE, - FAST_TEMP_MONITORING_RATE); - if (IS_ERR_OR_NULL(data->omap_thermal)) { - dev_err(bg_ptr->dev, "thermal zone device is NULL\n"); - return PTR_ERR(data->omap_thermal); - } - data->omap_thermal->polling_delay = FAST_TEMP_MONITORING_RATE; - omap_bandgap_set_sensor_data(bg_ptr, id, data); - - return 0; -} - -int omap_thermal_remove_sensor(struct omap_bandgap *bg_ptr, int id) -{ - struct omap_thermal_data *data; - - data = omap_bandgap_get_sensor_data(bg_ptr, id); - - thermal_zone_device_unregister(data->omap_thermal); - - return 0; -} - -int omap_thermal_report_sensor_temperature(struct omap_bandgap *bg_ptr, int id) -{ - struct omap_thermal_data *data; - - data = omap_bandgap_get_sensor_data(bg_ptr, id); - - schedule_work(&data->thermal_wq); - - return 0; -} - -int omap_thermal_register_cpu_cooling(struct omap_bandgap *bg_ptr, int id) -{ - struct omap_thermal_data *data; - - data = omap_bandgap_get_sensor_data(bg_ptr, id); - if (IS_ERR(data)) - data = omap_thermal_build_data(bg_ptr, id); - - if (!data) - return -EINVAL; - - /* Register cooling device */ - data->cool_dev = cpufreq_cooling_register(cpu_present_mask); - if (IS_ERR_OR_NULL(data->cool_dev)) { - dev_err(bg_ptr->dev, - "Failed to register cpufreq cooling device\n"); - return PTR_ERR(data->cool_dev); - } - omap_bandgap_set_sensor_data(bg_ptr, id, data); - - return 0; -} - -int omap_thermal_unregister_cpu_cooling(struct omap_bandgap *bg_ptr, int id) -{ - struct omap_thermal_data *data; - - data = omap_bandgap_get_sensor_data(bg_ptr, id); - cpufreq_cooling_unregister(data->cool_dev); - - return 0; -} diff --git a/drivers/staging/omap-thermal/omap-thermal.h b/drivers/staging/omap-thermal/omap-thermal.h deleted file mode 100644 index 0dd2184b9663..000000000000 --- a/drivers/staging/omap-thermal/omap-thermal.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * OMAP thermal definitions - * - * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ - * Contact: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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. - * - * 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., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ -#ifndef __OMAP_THERMAL_H -#define __OMAP_THERMAL_H - -#include "omap-bandgap.h" - -/* sensors gradient and offsets */ -#define OMAP_GRADIENT_SLOPE_4460 348 -#define OMAP_GRADIENT_CONST_4460 -9301 -#define OMAP_GRADIENT_SLOPE_4470 308 -#define OMAP_GRADIENT_CONST_4470 -7896 - -#define OMAP_GRADIENT_SLOPE_5430_CPU 196 -#define OMAP_GRADIENT_CONST_5430_CPU -6822 -#define OMAP_GRADIENT_SLOPE_5430_GPU 64 -#define OMAP_GRADIENT_CONST_5430_GPU 978 - -/* PCB sensor calculation constants */ -#define OMAP_GRADIENT_SLOPE_W_PCB_4460 1142 -#define OMAP_GRADIENT_CONST_W_PCB_4460 -393 -#define OMAP_GRADIENT_SLOPE_W_PCB_4470 1063 -#define OMAP_GRADIENT_CONST_W_PCB_4470 -477 - -#define OMAP_GRADIENT_SLOPE_W_PCB_5430_CPU 469 -#define OMAP_GRADIENT_CONST_W_PCB_5430_CPU -1272 -#define OMAP_GRADIENT_SLOPE_W_PCB_5430_GPU 378 -#define OMAP_GRADIENT_CONST_W_PCB_5430_GPU 154 - -/* trip points of interest in milicelsius (at hotspot level) */ -#define OMAP_TRIP_COLD 100000 -#define OMAP_TRIP_HOT 110000 -#define OMAP_TRIP_SHUTDOWN 125000 -#define OMAP_TRIP_NUMBER 2 -#define OMAP_TRIP_STEP \ - ((OMAP_TRIP_SHUTDOWN - OMAP_TRIP_HOT) / (OMAP_TRIP_NUMBER - 1)) - -/* Update rates */ -#define FAST_TEMP_MONITORING_RATE 250 - -/* helper macros */ -/** - * omap_thermal_get_trip_value - returns trip temperature based on index - * @i: trip index - */ -#define omap_thermal_get_trip_value(i) \ - (OMAP_TRIP_HOT + ((i) * OMAP_TRIP_STEP)) - -/** - * omap_thermal_is_valid_trip - check for trip index - * @i: trip index - */ -#define omap_thermal_is_valid_trip(trip) \ - ((trip) >= 0 && (trip) < OMAP_TRIP_NUMBER) - -#ifdef CONFIG_OMAP_THERMAL -int omap_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id, - char *domain); -int omap_thermal_remove_sensor(struct omap_bandgap *bg_ptr, int id); -int omap_thermal_register_cpu_cooling(struct omap_bandgap *bg_ptr, int id); -int omap_thermal_unregister_cpu_cooling(struct omap_bandgap *bg_ptr, int id); -#else -static inline -int omap_thermal_expose_sensor(struct omap_bandgap *bg_ptr, int id, - char *domain) -{ - return 0; -} - -static inline -int omap_thermal_remove_sensor(struct omap_bandgap *bg_ptr, int id) -{ - return 0; -} - -static inline -int omap_thermal_register_cpu_cooling(struct omap_bandgap *bg_ptr, int id) -{ - return 0; -} - -static inline -int omap_thermal_unregister_cpu_cooling(struct omap_bandgap *bg_ptr, int id) -{ - return 0; -} -#endif -#endif diff --git a/drivers/staging/omap-thermal/omap4-thermal.c b/drivers/staging/omap-thermal/omap4-thermal.c deleted file mode 100644 index 04c02b6c0077..000000000000 --- a/drivers/staging/omap-thermal/omap4-thermal.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * OMAP4 thermal driver. - * - * Copyright (C) 2011-2012 Texas Instruments Inc. - * Contact: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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 "omap-thermal.h" -#include "omap-bandgap.h" - -/* - * OMAP4430 has one instance of thermal sensor for MPU - * need to describe the individual bit fields - */ -static struct temp_sensor_registers -omap4430_mpu_temp_sensor_registers = { - .temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET, - .bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK, - .bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK, - .bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK, - .bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK, - - .bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET, - .mode_ctrl_mask = OMAP4430_SINGLE_MODE_MASK, - - .bgap_efuse = OMAP4430_FUSE_OPP_BGAP, -}; - -/* Thresholds and limits for OMAP4430 MPU temperature sensor */ -static struct temp_sensor_data omap4430_mpu_temp_sensor_data = { - .min_freq = OMAP4430_MIN_FREQ, - .max_freq = OMAP4430_MAX_FREQ, - .max_temp = OMAP4430_MAX_TEMP, - .min_temp = OMAP4430_MIN_TEMP, - .hyst_val = OMAP4430_HYST_VAL, - .adc_start_val = OMAP4430_ADC_START_VALUE, - .adc_end_val = OMAP4430_ADC_END_VALUE, -}; - -/* - * Temperature values in milli degree celsius - * ADC code values from 530 to 923 - */ -static const int -omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = { - -38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000, -22000, - -20000, -18000, -17000, -15000, -13000, -12000, -10000, -8000, -6000, - -5000, -3000, -1000, 0, 2000, 3000, 5000, 6000, 8000, 10000, 12000, - 13000, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28000, 30000, - 32000, 33000, 35000, 37000, 38000, 40000, 42000, 43000, 45000, 47000, - 48000, 50000, 52000, 53000, 55000, 57000, 58000, 60000, 62000, 64000, - 66000, 68000, 70000, 71000, 73000, 75000, 77000, 78000, 80000, 82000, - 83000, 85000, 87000, 88000, 90000, 92000, 93000, 95000, 97000, 98000, - 100000, 102000, 103000, 105000, 107000, 109000, 111000, 113000, 115000, - 117000, 118000, 120000, 122000, 123000, -}; - -/* OMAP4430 data */ -const struct omap_bandgap_data omap4430_data = { - .features = OMAP_BANDGAP_FEATURE_MODE_CONFIG | - OMAP_BANDGAP_FEATURE_POWER_SWITCH, - .fclock_name = "bandgap_fclk", - .div_ck_name = "bandgap_fclk", - .conv_table = omap4430_adc_to_temp, - .expose_sensor = omap_thermal_expose_sensor, - .remove_sensor = omap_thermal_remove_sensor, - .sensors = { - { - .registers = &omap4430_mpu_temp_sensor_registers, - .ts_data = &omap4430_mpu_temp_sensor_data, - .domain = "cpu", - .slope = 0, - .constant = 20000, - .slope_pcb = 0, - .constant_pcb = 20000, - .register_cooling = omap_thermal_register_cpu_cooling, - .unregister_cooling = omap_thermal_unregister_cpu_cooling, - }, - }, - .sensor_count = 1, -}; -/* - * OMAP4460 has one instance of thermal sensor for MPU - * need to describe the individual bit fields - */ -static struct temp_sensor_registers -omap4460_mpu_temp_sensor_registers = { - .temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET, - .bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK, - .bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK, - .bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK, - .bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK, - - .bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET, - .mask_hot_mask = OMAP4460_MASK_HOT_MASK, - .mask_cold_mask = OMAP4460_MASK_COLD_MASK, - - .bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET, - .mode_ctrl_mask = OMAP4460_SINGLE_MODE_MASK, - - .bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET, - .counter_mask = OMAP4460_COUNTER_MASK, - - .bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET, - .threshold_thot_mask = OMAP4460_T_HOT_MASK, - .threshold_tcold_mask = OMAP4460_T_COLD_MASK, - - .tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET, - .tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK, - .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK, - - .bgap_status = OMAP4460_BGAP_STATUS_OFFSET, - .status_clean_stop_mask = OMAP4460_CLEAN_STOP_MASK, - .status_bgap_alert_mask = OMAP4460_BGAP_ALERT_MASK, - .status_hot_mask = OMAP4460_HOT_FLAG_MASK, - .status_cold_mask = OMAP4460_COLD_FLAG_MASK, - - .bgap_efuse = OMAP4460_FUSE_OPP_BGAP, -}; - -/* Thresholds and limits for OMAP4460 MPU temperature sensor */ -static struct temp_sensor_data omap4460_mpu_temp_sensor_data = { - .tshut_hot = OMAP4460_TSHUT_HOT, - .tshut_cold = OMAP4460_TSHUT_COLD, - .t_hot = OMAP4460_T_HOT, - .t_cold = OMAP4460_T_COLD, - .min_freq = OMAP4460_MIN_FREQ, - .max_freq = OMAP4460_MAX_FREQ, - .max_temp = OMAP4460_MAX_TEMP, - .min_temp = OMAP4460_MIN_TEMP, - .hyst_val = OMAP4460_HYST_VAL, - .adc_start_val = OMAP4460_ADC_START_VALUE, - .adc_end_val = OMAP4460_ADC_END_VALUE, - .update_int1 = 1000, - .update_int2 = 2000, -}; - -/* - * Temperature values in milli degree celsius - * ADC code values from 530 to 923 - */ -static const int -omap4460_adc_to_temp[OMAP4460_ADC_END_VALUE - OMAP4460_ADC_START_VALUE + 1] = { - -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200, - -37800, -37300, -36800, -36400, -36000, -35600, -35200, -34800, - -34300, -33800, -33400, -33000, -32600, -32200, -31800, -31300, - -30800, -30400, -30000, -29600, -29200, -28700, -28200, -27800, - -27400, -27000, -26600, -26200, -25700, -25200, -24800, -24400, - -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000, - -20600, -20200, -19700, -19200, -18800, -18400, -18000, -17600, - -17200, -16700, -16200, -15800, -15400, -15000, -14600, -14200, - -13700, -13200, -12800, -12400, -12000, -11600, -11200, -10700, - -10200, -9800, -9400, -9000, -8600, -8200, -7700, -7200, -6800, - -6400, -6000, -5600, -5200, -4800, -4300, -3800, -3400, -3000, - -2600, -2200, -1800, -1300, -800, -400, 0, 400, 800, 1200, 1600, - 2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, 6400, - 6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10600, 11000, - 11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800, - 15300, 15800, 16200, 16600, 17000, 17400, 17800, 18200, 18700, - 19200, 19600, 20000, 20400, 20800, 21200, 21600, 22100, 22600, - 23000, 23400, 23800, 24200, 24600, 25000, 25400, 25900, 26400, - 26800, 27200, 27600, 28000, 28400, 28800, 29300, 29800, 30200, - 30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000, - 34400, 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800, - 38200, 38600, 39000, 39400, 39800, 40200, 40600, 41100, 41600, - 42000, 42400, 42800, 43200, 43600, 44000, 44400, 44800, 45300, - 45800, 46200, 46600, 47000, 47400, 47800, 48200, 48600, 49000, - 49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, 52800, - 53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600, - 57000, 57400, 57800, 58200, 58700, 59200, 59600, 60000, 60400, - 60800, 61200, 61600, 62000, 62400, 62800, 63300, 63800, 64200, - 64600, 65000, 65400, 65800, 66200, 66600, 67000, 67400, 67800, - 68200, 68700, 69200, 69600, 70000, 70400, 70800, 71200, 71600, - 72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400, - 75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000, - 79400, 79800, 80300, 80800, 81200, 81600, 82000, 82400, 82800, - 83200, 83600, 84000, 84400, 84800, 85200, 85600, 86000, 86400, - 86800, 87300, 87800, 88200, 88600, 89000, 89400, 89800, 90200, - 90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, 93800, - 94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600, - 98000, 98400, 98800, 99200, 99600, 100000, 100400, 100800, 101200, - 101600, 102000, 102400, 102800, 103200, 103600, 104000, 104400, - 104800, 105200, 105600, 106100, 106600, 107000, 107400, 107800, - 108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000, - 111400, 111800, 112200, 112600, 113000, 113400, 113800, 114200, - 114600, 115000, 115400, 115800, 116200, 116600, 117000, 117400, - 117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600, - 121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200, - 124600, 124900, 125000, 125000, 125000, 125000 -}; - -/* OMAP4460 data */ -const struct omap_bandgap_data omap4460_data = { - .features = OMAP_BANDGAP_FEATURE_TSHUT | - OMAP_BANDGAP_FEATURE_TSHUT_CONFIG | - OMAP_BANDGAP_FEATURE_TALERT | - OMAP_BANDGAP_FEATURE_MODE_CONFIG | - OMAP_BANDGAP_FEATURE_POWER_SWITCH | - OMAP_BANDGAP_FEATURE_COUNTER, - .fclock_name = "bandgap_ts_fclk", - .div_ck_name = "div_ts_ck", - .conv_table = omap4460_adc_to_temp, - .expose_sensor = omap_thermal_expose_sensor, - .remove_sensor = omap_thermal_remove_sensor, - .sensors = { - { - .registers = &omap4460_mpu_temp_sensor_registers, - .ts_data = &omap4460_mpu_temp_sensor_data, - .domain = "cpu", - .slope = OMAP_GRADIENT_SLOPE_4460, - .constant = OMAP_GRADIENT_CONST_4460, - .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460, - .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460, - .register_cooling = omap_thermal_register_cpu_cooling, - .unregister_cooling = omap_thermal_unregister_cpu_cooling, - }, - }, - .sensor_count = 1, -}; - -/* OMAP4470 data */ -const struct omap_bandgap_data omap4470_data = { - .features = OMAP_BANDGAP_FEATURE_TSHUT | - OMAP_BANDGAP_FEATURE_TSHUT_CONFIG | - OMAP_BANDGAP_FEATURE_TALERT | - OMAP_BANDGAP_FEATURE_MODE_CONFIG | - OMAP_BANDGAP_FEATURE_POWER_SWITCH | - OMAP_BANDGAP_FEATURE_COUNTER, - .fclock_name = "bandgap_ts_fclk", - .div_ck_name = "div_ts_ck", - .conv_table = omap4460_adc_to_temp, - .expose_sensor = omap_thermal_expose_sensor, - .remove_sensor = omap_thermal_remove_sensor, - .sensors = { - { - .registers = &omap4460_mpu_temp_sensor_registers, - .ts_data = &omap4460_mpu_temp_sensor_data, - .domain = "cpu", - .slope = OMAP_GRADIENT_SLOPE_4470, - .constant = OMAP_GRADIENT_CONST_4470, - .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470, - .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470, - .register_cooling = omap_thermal_register_cpu_cooling, - .unregister_cooling = omap_thermal_unregister_cpu_cooling, - }, - }, - .sensor_count = 1, -}; diff --git a/drivers/staging/omap-thermal/omap5-thermal.c b/drivers/staging/omap-thermal/omap5-thermal.c deleted file mode 100644 index 2f3a498dacd1..000000000000 --- a/drivers/staging/omap-thermal/omap5-thermal.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * OMAP5 thermal driver. - * - * Copyright (C) 2011-2012 Texas Instruments Inc. - * Contact: - * Eduardo Valentin <eduardo.valentin@ti.com> - * - * 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 "omap-bandgap.h" -#include "omap-thermal.h" - -/* - * omap5430 has one instance of thermal sensor for MPU - * need to describe the individual bit fields - */ -static struct temp_sensor_registers -omap5430_mpu_temp_sensor_registers = { - .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_MPU_OFFSET, - .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK, - .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK, - .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK, - .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK, - - .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, - .mask_hot_mask = OMAP5430_MASK_HOT_MPU_MASK, - .mask_cold_mask = OMAP5430_MASK_COLD_MPU_MASK, - - .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_MPU_OFFSET, - .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK, - - .bgap_counter = OMAP5430_BGAP_COUNTER_MPU_OFFSET, - .counter_mask = OMAP5430_COUNTER_MASK, - - .bgap_threshold = OMAP5430_BGAP_THRESHOLD_MPU_OFFSET, - .threshold_thot_mask = OMAP5430_T_HOT_MASK, - .threshold_tcold_mask = OMAP5430_T_COLD_MASK, - - .tshut_threshold = OMAP5430_BGAP_TSHUT_MPU_OFFSET, - .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK, - .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, - - .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, - .status_clean_stop_mask = 0x0, - .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, - .status_hot_mask = OMAP5430_HOT_MPU_FLAG_MASK, - .status_cold_mask = OMAP5430_COLD_MPU_FLAG_MASK, - - .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_MPU, -}; - -/* - * omap5430 has one instance of thermal sensor for GPU - * need to describe the individual bit fields - */ -static struct temp_sensor_registers -omap5430_gpu_temp_sensor_registers = { - .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_GPU_OFFSET, - .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK, - .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK, - .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK, - .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK, - - .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, - .mask_hot_mask = OMAP5430_MASK_HOT_MM_MASK, - .mask_cold_mask = OMAP5430_MASK_COLD_MM_MASK, - - .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_GPU_OFFSET, - .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK, - - .bgap_counter = OMAP5430_BGAP_COUNTER_GPU_OFFSET, - .counter_mask = OMAP5430_COUNTER_MASK, - - .bgap_threshold = OMAP5430_BGAP_THRESHOLD_GPU_OFFSET, - .threshold_thot_mask = OMAP5430_T_HOT_MASK, - .threshold_tcold_mask = OMAP5430_T_COLD_MASK, - - .tshut_threshold = OMAP5430_BGAP_TSHUT_GPU_OFFSET, - .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK, - .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, - - .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, - .status_clean_stop_mask = 0x0, - .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, - .status_hot_mask = OMAP5430_HOT_MM_FLAG_MASK, - .status_cold_mask = OMAP5430_COLD_MM_FLAG_MASK, - - .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_GPU, -}; - -/* - * omap5430 has one instance of thermal sensor for CORE - * need to describe the individual bit fields - */ -static struct temp_sensor_registers -omap5430_core_temp_sensor_registers = { - .temp_sensor_ctrl = OMAP5430_TEMP_SENSOR_CORE_OFFSET, - .bgap_tempsoff_mask = OMAP5430_BGAP_TEMPSOFF_MASK, - .bgap_soc_mask = OMAP5430_BGAP_TEMP_SENSOR_SOC_MASK, - .bgap_eocz_mask = OMAP5430_BGAP_TEMP_SENSOR_EOCZ_MASK, - .bgap_dtemp_mask = OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK, - - .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, - .mask_hot_mask = OMAP5430_MASK_HOT_CORE_MASK, - .mask_cold_mask = OMAP5430_MASK_COLD_CORE_MASK, - - .bgap_mode_ctrl = OMAP5430_BGAP_COUNTER_CORE_OFFSET, - .mode_ctrl_mask = OMAP5430_REPEAT_MODE_MASK, - - .bgap_counter = OMAP5430_BGAP_COUNTER_CORE_OFFSET, - .counter_mask = OMAP5430_COUNTER_MASK, - - .bgap_threshold = OMAP5430_BGAP_THRESHOLD_CORE_OFFSET, - .threshold_thot_mask = OMAP5430_T_HOT_MASK, - .threshold_tcold_mask = OMAP5430_T_COLD_MASK, - - .tshut_threshold = OMAP5430_BGAP_TSHUT_CORE_OFFSET, - .tshut_hot_mask = OMAP5430_TSHUT_HOT_MASK, - .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, - - .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, - .status_clean_stop_mask = 0x0, - .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, - .status_hot_mask = OMAP5430_HOT_CORE_FLAG_MASK, - .status_cold_mask = OMAP5430_COLD_CORE_FLAG_MASK, - - .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_CORE, -}; - -/* Thresholds and limits for OMAP5430 MPU temperature sensor */ -static struct temp_sensor_data omap5430_mpu_temp_sensor_data = { - .tshut_hot = OMAP5430_MPU_TSHUT_HOT, - .tshut_cold = OMAP5430_MPU_TSHUT_COLD, - .t_hot = OMAP5430_MPU_T_HOT, - .t_cold = OMAP5430_MPU_T_COLD, - .min_freq = OMAP5430_MPU_MIN_FREQ, - .max_freq = OMAP5430_MPU_MAX_FREQ, - .max_temp = OMAP5430_MPU_MAX_TEMP, - .min_temp = OMAP5430_MPU_MIN_TEMP, - .hyst_val = OMAP5430_MPU_HYST_VAL, - .adc_start_val = OMAP5430_ADC_START_VALUE, - .adc_end_val = OMAP5430_ADC_END_VALUE, - .update_int1 = 1000, - .update_int2 = 2000, -}; - -/* Thresholds and limits for OMAP5430 GPU temperature sensor */ -static struct temp_sensor_data omap5430_gpu_temp_sensor_data = { - .tshut_hot = OMAP5430_GPU_TSHUT_HOT, - .tshut_cold = OMAP5430_GPU_TSHUT_COLD, - .t_hot = OMAP5430_GPU_T_HOT, - .t_cold = OMAP5430_GPU_T_COLD, - .min_freq = OMAP5430_GPU_MIN_FREQ, - .max_freq = OMAP5430_GPU_MAX_FREQ, - .max_temp = OMAP5430_GPU_MAX_TEMP, - .min_temp = OMAP5430_GPU_MIN_TEMP, - .hyst_val = OMAP5430_GPU_HYST_VAL, - .adc_start_val = OMAP5430_ADC_START_VALUE, - .adc_end_val = OMAP5430_ADC_END_VALUE, - .update_int1 = 1000, - .update_int2 = 2000, -}; - -/* Thresholds and limits for OMAP5430 CORE temperature sensor */ -static struct temp_sensor_data omap5430_core_temp_sensor_data = { - .tshut_hot = OMAP5430_CORE_TSHUT_HOT, - .tshut_cold = OMAP5430_CORE_TSHUT_COLD, - .t_hot = OMAP5430_CORE_T_HOT, - .t_cold = OMAP5430_CORE_T_COLD, - .min_freq = OMAP5430_CORE_MIN_FREQ, - .max_freq = OMAP5430_CORE_MAX_FREQ, - .max_temp = OMAP5430_CORE_MAX_TEMP, - .min_temp = OMAP5430_CORE_MIN_TEMP, - .hyst_val = OMAP5430_CORE_HYST_VAL, - .adc_start_val = OMAP5430_ADC_START_VALUE, - .adc_end_val = OMAP5430_ADC_END_VALUE, - .update_int1 = 1000, - .update_int2 = 2000, -}; - -static const int -omap5430_adc_to_temp[OMAP5430_ADC_END_VALUE - OMAP5430_ADC_START_VALUE + 1] = { - -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, - -38200, -37800, -37300, -36800, - -36400, -36000, -35600, -35200, -34800, -34300, -33800, -33400, -33000, - -32600, - -32200, -31800, -31300, -30800, -30400, -30000, -29600, -29200, -28700, - -28200, -27800, -27400, -27000, -26600, -26200, -25700, -25200, -24800, - -24400, -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000, - -20600, -20200, -19700, -19200, -9300, -18400, -18000, -17600, -17200, - -16700, -16200, -15800, -15400, -15000, -14600, -14200, -13700, -13200, - -12800, -12400, -12000, -11600, -11200, -10700, -10200, -9800, -9400, - -9000, - -8600, -8200, -7700, -7200, -6800, -6400, -6000, -5600, -5200, -4800, - -4300, - -3800, -3400, -3000, -2600, -2200, -1800, -1300, -800, -400, 0, 400, - 800, - 1200, 1600, 2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, - 6400, 6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10800, - 11100, - 11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800, 15300, - 15800, - 16200, 16600, 17000, 17400, 17800, 18200, 18700, 19200, 19600, 20000, - 20400, - 20800, 21200, 21600, 22100, 22600, 23000, 23400, 23800, 24200, 24600, - 25000, - 25400, 25900, 26400, 26800, 27200, 27600, 28000, 28400, 28800, 29300, - 29800, - 30200, 30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000, - 34400, - 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800, 38200, 38600, - 39000, - 39400, 39800, 40200, 40600, 41100, 41600, 42000, 42400, 42800, 43200, - 43600, - 44000, 44400, 44800, 45300, 45800, 46200, 46600, 47000, 47400, 47800, - 48200, - 48600, 49000, 49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, - 52800, - 53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600, 57000, - 57400, - 57800, 58200, 58700, 59200, 59600, 60000, 60400, 60800, 61200, 61600, - 62000, - 62400, 62800, 63300, 63800, 64200, 64600, 65000, 65400, 65800, 66200, - 66600, - 67000, 67400, 67800, 68200, 68700, 69200, 69600, 70000, 70400, 70800, - 71200, - 71600, 72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400, - 75800, - 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000, 79400, 79800, - 80300, - 80800, 81200, 81600, 82000, 82400, 82800, 83200, 83600, 84000, 84400, - 84800, - 85200, 85600, 86000, 86400, 86800, 87300, 87800, 88200, 88600, 89000, - 89400, - 89800, 90200, 90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, - 93800, - 94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600, 98000, - 98400, - 98800, 99200, 99600, 100000, 100400, 100800, 101200, 101600, 102000, - 102400, - 102800, 103200, 103600, 104000, 104400, 104800, 105200, 105600, 106100, - 106600, 107000, 107400, 107800, 108200, 108600, 109000, 109400, 109800, - 110200, 110600, 111000, 111400, 111800, 112200, 112600, 113000, 113400, - 113800, 114200, 114600, 115000, 115400, 115800, 116200, 116600, 117000, - 117400, 117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600, - 121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200, - 124600, 124900, 125000, 125000, 125000, 125000, -}; - -const struct omap_bandgap_data omap5430_data = { - .features = OMAP_BANDGAP_FEATURE_TSHUT_CONFIG | - OMAP_BANDGAP_FEATURE_TALERT | - OMAP_BANDGAP_FEATURE_MODE_CONFIG | - OMAP_BANDGAP_FEATURE_COUNTER, - .fclock_name = "ts_clk_div_ck", - .div_ck_name = "ts_clk_div_ck", - .conv_table = omap5430_adc_to_temp, - .expose_sensor = omap_thermal_expose_sensor, - .remove_sensor = omap_thermal_remove_sensor, - .sensors = { - { - .registers = &omap5430_mpu_temp_sensor_registers, - .ts_data = &omap5430_mpu_temp_sensor_data, - .domain = "cpu", - .register_cooling = omap_thermal_register_cpu_cooling, - .unregister_cooling = omap_thermal_unregister_cpu_cooling, - .slope = OMAP_GRADIENT_SLOPE_5430_CPU, - .constant = OMAP_GRADIENT_CONST_5430_CPU, - .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_5430_CPU, - .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_5430_CPU, - }, - { - .registers = &omap5430_gpu_temp_sensor_registers, - .ts_data = &omap5430_gpu_temp_sensor_data, - .domain = "gpu", - .slope = OMAP_GRADIENT_SLOPE_5430_GPU, - .constant = OMAP_GRADIENT_CONST_5430_GPU, - .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_5430_GPU, - .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_5430_GPU, - }, - { - .registers = &omap5430_core_temp_sensor_registers, - .ts_data = &omap5430_core_temp_sensor_data, - .domain = "core", - }, - }, - .sensor_count = 3, -}; diff --git a/drivers/staging/omap-thermal/omap_bandgap.txt b/drivers/staging/omap-thermal/omap_bandgap.txt deleted file mode 100644 index 6008a1452fde..000000000000 --- a/drivers/staging/omap-thermal/omap_bandgap.txt +++ /dev/null @@ -1,30 +0,0 @@ -* Texas Instrument OMAP SCM bandgap bindings - -In the System Control Module, OMAP supplies a voltage reference -and a temperature sensor feature that are gathered in the band -gap voltage and temperature sensor (VBGAPTS) module. The band -gap provides current and voltage reference for its internal -circuits and other analog IP blocks. The analog-to-digital -converter (ADC) produces an output value that is proportional -to the silicon temperature. - -Required properties: -- compatible : Should be: - - "ti,omap4460-control-bandgap" : for OMAP4460 bandgap - - "ti,omap5430-control-bandgap" : for OMAP5430 bandgap -- interrupts : this entry should indicate which interrupt line -the talert signal is routed to; -Specific: -- ti,tshut-gpio : this entry should be used to inform which GPIO -line the tshut signal is routed to; - -Example: - -bandgap { - reg = <0x4a002260 0x4 - 0x4a00232C 0x4 - 0x4a002378 0x18>; - compatible = "ti,omap4460-control-bandgap"; - interrupts = <0 126 4>; /* talert */ - ti,tshut-gpio = <86>; -}; |