cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ti-bandgap.c (33842B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * TI Bandgap temperature sensor driver
      4 *
      5 * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/
      6 * Author: J Keerthy <j-keerthy@ti.com>
      7 * Author: Moiz Sonasath <m-sonasath@ti.com>
      8 * Couple of fixes, DT and MFD adaptation:
      9 *   Eduardo Valentin <eduardo.valentin@ti.com>
     10 */
     11
     12#include <linux/clk.h>
     13#include <linux/cpu_pm.h>
     14#include <linux/device.h>
     15#include <linux/err.h>
     16#include <linux/export.h>
     17#include <linux/gpio/consumer.h>
     18#include <linux/init.h>
     19#include <linux/interrupt.h>
     20#include <linux/io.h>
     21#include <linux/iopoll.h>
     22#include <linux/kernel.h>
     23#include <linux/module.h>
     24#include <linux/of.h>
     25#include <linux/of_device.h>
     26#include <linux/of_irq.h>
     27#include <linux/of_platform.h>
     28#include <linux/platform_device.h>
     29#include <linux/pm.h>
     30#include <linux/pm_runtime.h>
     31#include <linux/reboot.h>
     32#include <linux/spinlock.h>
     33#include <linux/sys_soc.h>
     34#include <linux/types.h>
     35
     36#include "ti-bandgap.h"
     37
     38static int ti_bandgap_force_single_read(struct ti_bandgap *bgp, int id);
     39#ifdef CONFIG_PM_SLEEP
     40static int bandgap_omap_cpu_notifier(struct notifier_block *nb,
     41				  unsigned long cmd, void *v);
     42#endif
     43
     44/***   Helper functions to access registers and their bitfields   ***/
     45
     46/**
     47 * ti_bandgap_readl() - simple read helper function
     48 * @bgp: pointer to ti_bandgap structure
     49 * @reg: desired register (offset) to be read
     50 *
     51 * Helper function to read bandgap registers. It uses the io remapped area.
     52 * Return: the register value.
     53 */
     54static u32 ti_bandgap_readl(struct ti_bandgap *bgp, u32 reg)
     55{
     56	return readl(bgp->base + reg);
     57}
     58
     59/**
     60 * ti_bandgap_writel() - simple write helper function
     61 * @bgp: pointer to ti_bandgap structure
     62 * @val: desired register value to be written
     63 * @reg: desired register (offset) to be written
     64 *
     65 * Helper function to write bandgap registers. It uses the io remapped area.
     66 */
     67static void ti_bandgap_writel(struct ti_bandgap *bgp, u32 val, u32 reg)
     68{
     69	writel(val, bgp->base + reg);
     70}
     71
     72/**
     73 * DOC: macro to update bits.
     74 *
     75 * RMW_BITS() - used to read, modify and update bandgap bitfields.
     76 *            The value passed will be shifted.
     77 */
     78#define RMW_BITS(bgp, id, reg, mask, val)			\
     79do {								\
     80	struct temp_sensor_registers *t;			\
     81	u32 r;							\
     82								\
     83	t = bgp->conf->sensors[(id)].registers;		\
     84	r = ti_bandgap_readl(bgp, t->reg);			\
     85	r &= ~t->mask;						\
     86	r |= (val) << __ffs(t->mask);				\
     87	ti_bandgap_writel(bgp, r, t->reg);			\
     88} while (0)
     89
     90/***   Basic helper functions   ***/
     91
     92/**
     93 * ti_bandgap_power() - controls the power state of a bandgap device
     94 * @bgp: pointer to ti_bandgap structure
     95 * @on: desired power state (1 - on, 0 - off)
     96 *
     97 * Used to power on/off a bandgap device instance. Only used on those
     98 * that features tempsoff bit.
     99 *
    100 * Return: 0 on success, -ENOTSUPP if tempsoff is not supported.
    101 */
    102static int ti_bandgap_power(struct ti_bandgap *bgp, bool on)
    103{
    104	int i;
    105
    106	if (!TI_BANDGAP_HAS(bgp, POWER_SWITCH))
    107		return -ENOTSUPP;
    108
    109	for (i = 0; i < bgp->conf->sensor_count; i++)
    110		/* active on 0 */
    111		RMW_BITS(bgp, i, temp_sensor_ctrl, bgap_tempsoff_mask, !on);
    112	return 0;
    113}
    114
    115/**
    116 * ti_errata814_bandgap_read_temp() - helper function to read dra7 sensor temperature
    117 * @bgp: pointer to ti_bandgap structure
    118 * @reg: desired register (offset) to be read
    119 *
    120 * Function to read dra7 bandgap sensor temperature. This is done separately
    121 * so as to workaround the errata "Bandgap Temperature read Dtemp can be
    122 * corrupted" - Errata ID: i814".
    123 * Read accesses to registers listed below can be corrupted due to incorrect
    124 * resynchronization between clock domains.
    125 * Read access to registers below can be corrupted :
    126 * CTRL_CORE_DTEMP_MPU/GPU/CORE/DSPEVE/IVA_n (n = 0 to 4)
    127 * CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA_n
    128 *
    129 * Return: the register value.
    130 */
    131static u32 ti_errata814_bandgap_read_temp(struct ti_bandgap *bgp,  u32 reg)
    132{
    133	u32 val1, val2;
    134
    135	val1 = ti_bandgap_readl(bgp, reg);
    136	val2 = ti_bandgap_readl(bgp, reg);
    137
    138	/* If both times we read the same value then that is right */
    139	if (val1 == val2)
    140		return val1;
    141
    142	/* if val1 and val2 are different read it third time */
    143	return ti_bandgap_readl(bgp, reg);
    144}
    145
    146/**
    147 * ti_bandgap_read_temp() - helper function to read sensor temperature
    148 * @bgp: pointer to ti_bandgap structure
    149 * @id: bandgap sensor id
    150 *
    151 * Function to concentrate the steps to read sensor temperature register.
    152 * This function is desired because, depending on bandgap device version,
    153 * it might be needed to freeze the bandgap state machine, before fetching
    154 * the register value.
    155 *
    156 * Return: temperature in ADC values.
    157 */
    158static u32 ti_bandgap_read_temp(struct ti_bandgap *bgp, int id)
    159{
    160	struct temp_sensor_registers *tsr;
    161	u32 temp, reg;
    162
    163	tsr = bgp->conf->sensors[id].registers;
    164	reg = tsr->temp_sensor_ctrl;
    165
    166	if (TI_BANDGAP_HAS(bgp, FREEZE_BIT)) {
    167		RMW_BITS(bgp, id, bgap_mask_ctrl, mask_freeze_mask, 1);
    168		/*
    169		 * In case we cannot read from cur_dtemp / dtemp_0,
    170		 * then we read from the last valid temp read
    171		 */
    172		reg = tsr->ctrl_dtemp_1;
    173	}
    174
    175	/* read temperature */
    176	if (TI_BANDGAP_HAS(bgp, ERRATA_814))
    177		temp = ti_errata814_bandgap_read_temp(bgp, reg);
    178	else
    179		temp = ti_bandgap_readl(bgp, reg);
    180
    181	temp &= tsr->bgap_dtemp_mask;
    182
    183	if (TI_BANDGAP_HAS(bgp, FREEZE_BIT))
    184		RMW_BITS(bgp, id, bgap_mask_ctrl, mask_freeze_mask, 0);
    185
    186	return temp;
    187}
    188
    189/***   IRQ handlers   ***/
    190
    191/**
    192 * ti_bandgap_talert_irq_handler() - handles Temperature alert IRQs
    193 * @irq: IRQ number
    194 * @data: private data (struct ti_bandgap *)
    195 *
    196 * This is the Talert handler. Use it only if bandgap device features
    197 * HAS(TALERT). This handler goes over all sensors and checks their
    198 * conditions and acts accordingly. In case there are events pending,
    199 * it will reset the event mask to wait for the opposite event (next event).
    200 * Every time there is a new event, it will be reported to thermal layer.
    201 *
    202 * Return: IRQ_HANDLED
    203 */
    204static irqreturn_t ti_bandgap_talert_irq_handler(int irq, void *data)
    205{
    206	struct ti_bandgap *bgp = data;
    207	struct temp_sensor_registers *tsr;
    208	u32 t_hot = 0, t_cold = 0, ctrl;
    209	int i;
    210
    211	spin_lock(&bgp->lock);
    212	for (i = 0; i < bgp->conf->sensor_count; i++) {
    213		tsr = bgp->conf->sensors[i].registers;
    214		ctrl = ti_bandgap_readl(bgp, tsr->bgap_status);
    215
    216		/* Read the status of t_hot */
    217		t_hot = ctrl & tsr->status_hot_mask;
    218
    219		/* Read the status of t_cold */
    220		t_cold = ctrl & tsr->status_cold_mask;
    221
    222		if (!t_cold && !t_hot)
    223			continue;
    224
    225		ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl);
    226		/*
    227		 * One TALERT interrupt: Two sources
    228		 * If the interrupt is due to t_hot then mask t_hot and
    229		 * and unmask t_cold else mask t_cold and unmask t_hot
    230		 */
    231		if (t_hot) {
    232			ctrl &= ~tsr->mask_hot_mask;
    233			ctrl |= tsr->mask_cold_mask;
    234		} else if (t_cold) {
    235			ctrl &= ~tsr->mask_cold_mask;
    236			ctrl |= tsr->mask_hot_mask;
    237		}
    238
    239		ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl);
    240
    241		dev_dbg(bgp->dev,
    242			"%s: IRQ from %s sensor: hotevent %d coldevent %d\n",
    243			__func__, bgp->conf->sensors[i].domain,
    244			t_hot, t_cold);
    245
    246		/* report temperature to whom may concern */
    247		if (bgp->conf->report_temperature)
    248			bgp->conf->report_temperature(bgp, i);
    249	}
    250	spin_unlock(&bgp->lock);
    251
    252	return IRQ_HANDLED;
    253}
    254
    255/**
    256 * ti_bandgap_tshut_irq_handler() - handles Temperature shutdown signal
    257 * @irq: IRQ number
    258 * @data: private data (unused)
    259 *
    260 * This is the Tshut handler. Use it only if bandgap device features
    261 * HAS(TSHUT). If any sensor fires the Tshut signal, we simply shutdown
    262 * the system.
    263 *
    264 * Return: IRQ_HANDLED
    265 */
    266static irqreturn_t ti_bandgap_tshut_irq_handler(int irq, void *data)
    267{
    268	pr_emerg("%s: TSHUT temperature reached. Needs shut down...\n",
    269		 __func__);
    270
    271	orderly_poweroff(true);
    272
    273	return IRQ_HANDLED;
    274}
    275
    276/***   Helper functions which manipulate conversion ADC <-> mi Celsius   ***/
    277
    278/**
    279 * ti_bandgap_adc_to_mcelsius() - converts an ADC value to mCelsius scale
    280 * @bgp: struct ti_bandgap pointer
    281 * @adc_val: value in ADC representation
    282 * @t: address where to write the resulting temperature in mCelsius
    283 *
    284 * Simple conversion from ADC representation to mCelsius. In case the ADC value
    285 * is out of the ADC conv table range, it returns -ERANGE, 0 on success.
    286 * The conversion table is indexed by the ADC values.
    287 *
    288 * Return: 0 if conversion was successful, else -ERANGE in case the @adc_val
    289 * argument is out of the ADC conv table range.
    290 */
    291static
    292int ti_bandgap_adc_to_mcelsius(struct ti_bandgap *bgp, int adc_val, int *t)
    293{
    294	const struct ti_bandgap_data *conf = bgp->conf;
    295
    296	/* look up for temperature in the table and return the temperature */
    297	if (adc_val < conf->adc_start_val || adc_val > conf->adc_end_val)
    298		return -ERANGE;
    299
    300	*t = bgp->conf->conv_table[adc_val - conf->adc_start_val];
    301	return 0;
    302}
    303
    304/**
    305 * ti_bandgap_validate() - helper to check the sanity of a struct ti_bandgap
    306 * @bgp: struct ti_bandgap pointer
    307 * @id: bandgap sensor id
    308 *
    309 * Checks if the bandgap pointer is valid and if the sensor id is also
    310 * applicable.
    311 *
    312 * Return: 0 if no errors, -EINVAL for invalid @bgp pointer or -ERANGE if
    313 * @id cannot index @bgp sensors.
    314 */
    315static inline int ti_bandgap_validate(struct ti_bandgap *bgp, int id)
    316{
    317	if (!bgp || IS_ERR(bgp)) {
    318		pr_err("%s: invalid bandgap pointer\n", __func__);
    319		return -EINVAL;
    320	}
    321
    322	if ((id < 0) || (id >= bgp->conf->sensor_count)) {
    323		dev_err(bgp->dev, "%s: sensor id out of range (%d)\n",
    324			__func__, id);
    325		return -ERANGE;
    326	}
    327
    328	return 0;
    329}
    330
    331/**
    332 * ti_bandgap_read_counter() - read the sensor counter
    333 * @bgp: pointer to bandgap instance
    334 * @id: sensor id
    335 * @interval: resulting update interval in miliseconds
    336 */
    337static void ti_bandgap_read_counter(struct ti_bandgap *bgp, int id,
    338				    int *interval)
    339{
    340	struct temp_sensor_registers *tsr;
    341	int time;
    342
    343	tsr = bgp->conf->sensors[id].registers;
    344	time = ti_bandgap_readl(bgp, tsr->bgap_counter);
    345	time = (time & tsr->counter_mask) >>
    346					__ffs(tsr->counter_mask);
    347	time = time * 1000 / bgp->clk_rate;
    348	*interval = time;
    349}
    350
    351/**
    352 * ti_bandgap_read_counter_delay() - read the sensor counter delay
    353 * @bgp: pointer to bandgap instance
    354 * @id: sensor id
    355 * @interval: resulting update interval in miliseconds
    356 */
    357static void ti_bandgap_read_counter_delay(struct ti_bandgap *bgp, int id,
    358					  int *interval)
    359{
    360	struct temp_sensor_registers *tsr;
    361	int reg_val;
    362
    363	tsr = bgp->conf->sensors[id].registers;
    364
    365	reg_val = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl);
    366	reg_val = (reg_val & tsr->mask_counter_delay_mask) >>
    367				__ffs(tsr->mask_counter_delay_mask);
    368	switch (reg_val) {
    369	case 0:
    370		*interval = 0;
    371		break;
    372	case 1:
    373		*interval = 1;
    374		break;
    375	case 2:
    376		*interval = 10;
    377		break;
    378	case 3:
    379		*interval = 100;
    380		break;
    381	case 4:
    382		*interval = 250;
    383		break;
    384	case 5:
    385		*interval = 500;
    386		break;
    387	default:
    388		dev_warn(bgp->dev, "Wrong counter delay value read from register %X",
    389			 reg_val);
    390	}
    391}
    392
    393/**
    394 * ti_bandgap_read_update_interval() - read the sensor update interval
    395 * @bgp: pointer to bandgap instance
    396 * @id: sensor id
    397 * @interval: resulting update interval in miliseconds
    398 *
    399 * Return: 0 on success or the proper error code
    400 */
    401int ti_bandgap_read_update_interval(struct ti_bandgap *bgp, int id,
    402				    int *interval)
    403{
    404	int ret = 0;
    405
    406	ret = ti_bandgap_validate(bgp, id);
    407	if (ret)
    408		goto exit;
    409
    410	if (!TI_BANDGAP_HAS(bgp, COUNTER) &&
    411	    !TI_BANDGAP_HAS(bgp, COUNTER_DELAY)) {
    412		ret = -ENOTSUPP;
    413		goto exit;
    414	}
    415
    416	if (TI_BANDGAP_HAS(bgp, COUNTER)) {
    417		ti_bandgap_read_counter(bgp, id, interval);
    418		goto exit;
    419	}
    420
    421	ti_bandgap_read_counter_delay(bgp, id, interval);
    422exit:
    423	return ret;
    424}
    425
    426/**
    427 * ti_bandgap_write_counter_delay() - set the counter_delay
    428 * @bgp: pointer to bandgap instance
    429 * @id: sensor id
    430 * @interval: desired update interval in miliseconds
    431 *
    432 * Return: 0 on success or the proper error code
    433 */
    434static int ti_bandgap_write_counter_delay(struct ti_bandgap *bgp, int id,
    435					  u32 interval)
    436{
    437	int rval;
    438
    439	switch (interval) {
    440	case 0: /* Immediate conversion */
    441		rval = 0x0;
    442		break;
    443	case 1: /* Conversion after ever 1ms */
    444		rval = 0x1;
    445		break;
    446	case 10: /* Conversion after ever 10ms */
    447		rval = 0x2;
    448		break;
    449	case 100: /* Conversion after ever 100ms */
    450		rval = 0x3;
    451		break;
    452	case 250: /* Conversion after ever 250ms */
    453		rval = 0x4;
    454		break;
    455	case 500: /* Conversion after ever 500ms */
    456		rval = 0x5;
    457		break;
    458	default:
    459		dev_warn(bgp->dev, "Delay %d ms is not supported\n", interval);
    460		return -EINVAL;
    461	}
    462
    463	spin_lock(&bgp->lock);
    464	RMW_BITS(bgp, id, bgap_mask_ctrl, mask_counter_delay_mask, rval);
    465	spin_unlock(&bgp->lock);
    466
    467	return 0;
    468}
    469
    470/**
    471 * ti_bandgap_write_counter() - set the bandgap sensor counter
    472 * @bgp: pointer to bandgap instance
    473 * @id: sensor id
    474 * @interval: desired update interval in miliseconds
    475 */
    476static void ti_bandgap_write_counter(struct ti_bandgap *bgp, int id,
    477				     u32 interval)
    478{
    479	interval = interval * bgp->clk_rate / 1000;
    480	spin_lock(&bgp->lock);
    481	RMW_BITS(bgp, id, bgap_counter, counter_mask, interval);
    482	spin_unlock(&bgp->lock);
    483}
    484
    485/**
    486 * ti_bandgap_write_update_interval() - set the update interval
    487 * @bgp: pointer to bandgap instance
    488 * @id: sensor id
    489 * @interval: desired update interval in miliseconds
    490 *
    491 * Return: 0 on success or the proper error code
    492 */
    493int ti_bandgap_write_update_interval(struct ti_bandgap *bgp,
    494				     int id, u32 interval)
    495{
    496	int ret = ti_bandgap_validate(bgp, id);
    497	if (ret)
    498		goto exit;
    499
    500	if (!TI_BANDGAP_HAS(bgp, COUNTER) &&
    501	    !TI_BANDGAP_HAS(bgp, COUNTER_DELAY)) {
    502		ret = -ENOTSUPP;
    503		goto exit;
    504	}
    505
    506	if (TI_BANDGAP_HAS(bgp, COUNTER)) {
    507		ti_bandgap_write_counter(bgp, id, interval);
    508		goto exit;
    509	}
    510
    511	ret = ti_bandgap_write_counter_delay(bgp, id, interval);
    512exit:
    513	return ret;
    514}
    515
    516/**
    517 * ti_bandgap_read_temperature() - report current temperature
    518 * @bgp: pointer to bandgap instance
    519 * @id: sensor id
    520 * @temperature: resulting temperature
    521 *
    522 * Return: 0 on success or the proper error code
    523 */
    524int ti_bandgap_read_temperature(struct ti_bandgap *bgp, int id,
    525				int *temperature)
    526{
    527	u32 temp;
    528	int ret;
    529
    530	ret = ti_bandgap_validate(bgp, id);
    531	if (ret)
    532		return ret;
    533
    534	if (!TI_BANDGAP_HAS(bgp, MODE_CONFIG)) {
    535		ret = ti_bandgap_force_single_read(bgp, id);
    536		if (ret)
    537			return ret;
    538	}
    539
    540	spin_lock(&bgp->lock);
    541	temp = ti_bandgap_read_temp(bgp, id);
    542	spin_unlock(&bgp->lock);
    543
    544	ret = ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
    545	if (ret)
    546		return -EIO;
    547
    548	*temperature = temp;
    549
    550	return 0;
    551}
    552
    553/**
    554 * ti_bandgap_set_sensor_data() - helper function to store thermal
    555 * framework related data.
    556 * @bgp: pointer to bandgap instance
    557 * @id: sensor id
    558 * @data: thermal framework related data to be stored
    559 *
    560 * Return: 0 on success or the proper error code
    561 */
    562int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data)
    563{
    564	int ret = ti_bandgap_validate(bgp, id);
    565	if (ret)
    566		return ret;
    567
    568	bgp->regval[id].data = data;
    569
    570	return 0;
    571}
    572
    573/**
    574 * ti_bandgap_get_sensor_data() - helper function to get thermal
    575 * framework related data.
    576 * @bgp: pointer to bandgap instance
    577 * @id: sensor id
    578 *
    579 * Return: data stored by set function with sensor id on success or NULL
    580 */
    581void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id)
    582{
    583	int ret = ti_bandgap_validate(bgp, id);
    584	if (ret)
    585		return ERR_PTR(ret);
    586
    587	return bgp->regval[id].data;
    588}
    589
    590/***   Helper functions used during device initialization   ***/
    591
    592/**
    593 * ti_bandgap_force_single_read() - executes 1 single ADC conversion
    594 * @bgp: pointer to struct ti_bandgap
    595 * @id: sensor id which it is desired to read 1 temperature
    596 *
    597 * Used to initialize the conversion state machine and set it to a valid
    598 * state. Called during device initialization and context restore events.
    599 *
    600 * Return: 0
    601 */
    602static int
    603ti_bandgap_force_single_read(struct ti_bandgap *bgp, int id)
    604{
    605	struct temp_sensor_registers *tsr = bgp->conf->sensors[id].registers;
    606	void __iomem *temp_sensor_ctrl = bgp->base + tsr->temp_sensor_ctrl;
    607	int error;
    608	u32 val;
    609
    610	/* Select continuous or single conversion mode */
    611	if (TI_BANDGAP_HAS(bgp, MODE_CONFIG)) {
    612		if (TI_BANDGAP_HAS(bgp, CONT_MODE_ONLY))
    613			RMW_BITS(bgp, id, bgap_mode_ctrl, mode_ctrl_mask, 1);
    614		else
    615			RMW_BITS(bgp, id, bgap_mode_ctrl, mode_ctrl_mask, 0);
    616	}
    617
    618	/* Set Start of Conversion if available */
    619	if (tsr->bgap_soc_mask) {
    620		RMW_BITS(bgp, id, temp_sensor_ctrl, bgap_soc_mask, 1);
    621
    622		/* Wait for EOCZ going up */
    623		error = readl_poll_timeout_atomic(temp_sensor_ctrl, val,
    624						  val & tsr->bgap_eocz_mask,
    625						  1, 1000);
    626		if (error)
    627			dev_warn(bgp->dev, "eocz timed out waiting high\n");
    628
    629		/* Clear Start of Conversion if available */
    630		RMW_BITS(bgp, id, temp_sensor_ctrl, bgap_soc_mask, 0);
    631	}
    632
    633	/* Wait for EOCZ going down, always needed even if no bgap_soc_mask */
    634	error = readl_poll_timeout_atomic(temp_sensor_ctrl, val,
    635					  !(val & tsr->bgap_eocz_mask),
    636					  1, 1500);
    637	if (error)
    638		dev_warn(bgp->dev, "eocz timed out waiting low\n");
    639
    640	return 0;
    641}
    642
    643/**
    644 * ti_bandgap_set_continuous_mode() - One time enabling of continuous mode
    645 * @bgp: pointer to struct ti_bandgap
    646 *
    647 * Call this function only if HAS(MODE_CONFIG) is set. As this driver may
    648 * be used for junction temperature monitoring, it is desirable that the
    649 * sensors are operational all the time, so that alerts are generated
    650 * properly.
    651 *
    652 * Return: 0
    653 */
    654static int ti_bandgap_set_continuous_mode(struct ti_bandgap *bgp)
    655{
    656	int i;
    657
    658	for (i = 0; i < bgp->conf->sensor_count; i++) {
    659		/* Perform a single read just before enabling continuous */
    660		ti_bandgap_force_single_read(bgp, i);
    661		RMW_BITS(bgp, i, bgap_mode_ctrl, mode_ctrl_mask, 1);
    662	}
    663
    664	return 0;
    665}
    666
    667/**
    668 * ti_bandgap_get_trend() - To fetch the temperature trend of a sensor
    669 * @bgp: pointer to struct ti_bandgap
    670 * @id: id of the individual sensor
    671 * @trend: Pointer to trend.
    672 *
    673 * This function needs to be called to fetch the temperature trend of a
    674 * Particular sensor. The function computes the difference in temperature
    675 * w.r.t time. For the bandgaps with built in history buffer the temperatures
    676 * are read from the buffer and for those without the Buffer -ENOTSUPP is
    677 * returned.
    678 *
    679 * Return: 0 if no error, else return corresponding error. If no
    680 *		error then the trend value is passed on to trend parameter
    681 */
    682int ti_bandgap_get_trend(struct ti_bandgap *bgp, int id, int *trend)
    683{
    684	struct temp_sensor_registers *tsr;
    685	u32 temp1, temp2, reg1, reg2;
    686	int t1, t2, interval, ret = 0;
    687
    688	ret = ti_bandgap_validate(bgp, id);
    689	if (ret)
    690		goto exit;
    691
    692	if (!TI_BANDGAP_HAS(bgp, HISTORY_BUFFER) ||
    693	    !TI_BANDGAP_HAS(bgp, FREEZE_BIT)) {
    694		ret = -ENOTSUPP;
    695		goto exit;
    696	}
    697
    698	spin_lock(&bgp->lock);
    699
    700	tsr = bgp->conf->sensors[id].registers;
    701
    702	/* Freeze and read the last 2 valid readings */
    703	RMW_BITS(bgp, id, bgap_mask_ctrl, mask_freeze_mask, 1);
    704	reg1 = tsr->ctrl_dtemp_1;
    705	reg2 = tsr->ctrl_dtemp_2;
    706
    707	/* read temperature from history buffer */
    708	temp1 = ti_bandgap_readl(bgp, reg1);
    709	temp1 &= tsr->bgap_dtemp_mask;
    710
    711	temp2 = ti_bandgap_readl(bgp, reg2);
    712	temp2 &= tsr->bgap_dtemp_mask;
    713
    714	/* Convert from adc values to mCelsius temperature */
    715	ret = ti_bandgap_adc_to_mcelsius(bgp, temp1, &t1);
    716	if (ret)
    717		goto unfreeze;
    718
    719	ret = ti_bandgap_adc_to_mcelsius(bgp, temp2, &t2);
    720	if (ret)
    721		goto unfreeze;
    722
    723	/* Fetch the update interval */
    724	ret = ti_bandgap_read_update_interval(bgp, id, &interval);
    725	if (ret)
    726		goto unfreeze;
    727
    728	/* Set the interval to 1 ms if bandgap counter delay is not set */
    729	if (interval == 0)
    730		interval = 1;
    731
    732	*trend = (t1 - t2) / interval;
    733
    734	dev_dbg(bgp->dev, "The temperatures are t1 = %d and t2 = %d and trend =%d\n",
    735		t1, t2, *trend);
    736
    737unfreeze:
    738	RMW_BITS(bgp, id, bgap_mask_ctrl, mask_freeze_mask, 0);
    739	spin_unlock(&bgp->lock);
    740exit:
    741	return ret;
    742}
    743
    744/**
    745 * ti_bandgap_tshut_init() - setup and initialize tshut handling
    746 * @bgp: pointer to struct ti_bandgap
    747 * @pdev: pointer to device struct platform_device
    748 *
    749 * Call this function only in case the bandgap features HAS(TSHUT).
    750 * In this case, the driver needs to handle the TSHUT signal as an IRQ.
    751 * The IRQ is wired as a GPIO, and for this purpose, it is required
    752 * to specify which GPIO line is used. TSHUT IRQ is fired anytime
    753 * one of the bandgap sensors violates the TSHUT high/hot threshold.
    754 * And in that case, the system must go off.
    755 *
    756 * Return: 0 if no error, else error status
    757 */
    758static int ti_bandgap_tshut_init(struct ti_bandgap *bgp,
    759				 struct platform_device *pdev)
    760{
    761	int status;
    762
    763	status = request_irq(gpiod_to_irq(bgp->tshut_gpiod),
    764			     ti_bandgap_tshut_irq_handler,
    765			     IRQF_TRIGGER_RISING, "tshut", NULL);
    766	if (status)
    767		dev_err(bgp->dev, "request irq failed for TSHUT");
    768
    769	return 0;
    770}
    771
    772/**
    773 * ti_bandgap_talert_init() - setup and initialize talert handling
    774 * @bgp: pointer to struct ti_bandgap
    775 * @pdev: pointer to device struct platform_device
    776 *
    777 * Call this function only in case the bandgap features HAS(TALERT).
    778 * In this case, the driver needs to handle the TALERT signals as an IRQs.
    779 * TALERT is a normal IRQ and it is fired any time thresholds (hot or cold)
    780 * are violated. In these situation, the driver must reprogram the thresholds,
    781 * accordingly to specified policy.
    782 *
    783 * Return: 0 if no error, else return corresponding error.
    784 */
    785static int ti_bandgap_talert_init(struct ti_bandgap *bgp,
    786				  struct platform_device *pdev)
    787{
    788	int ret;
    789
    790	bgp->irq = platform_get_irq(pdev, 0);
    791	if (bgp->irq < 0)
    792		return bgp->irq;
    793
    794	ret = request_threaded_irq(bgp->irq, NULL,
    795				   ti_bandgap_talert_irq_handler,
    796				   IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
    797				   "talert", bgp);
    798	if (ret) {
    799		dev_err(&pdev->dev, "Request threaded irq failed.\n");
    800		return ret;
    801	}
    802
    803	return 0;
    804}
    805
    806static const struct of_device_id of_ti_bandgap_match[];
    807/**
    808 * ti_bandgap_build() - parse DT and setup a struct ti_bandgap
    809 * @pdev: pointer to device struct platform_device
    810 *
    811 * Used to read the device tree properties accordingly to the bandgap
    812 * matching version. Based on bandgap version and its capabilities it
    813 * will build a struct ti_bandgap out of the required DT entries.
    814 *
    815 * Return: valid bandgap structure if successful, else returns ERR_PTR
    816 * return value must be verified with IS_ERR.
    817 */
    818static struct ti_bandgap *ti_bandgap_build(struct platform_device *pdev)
    819{
    820	struct device_node *node = pdev->dev.of_node;
    821	const struct of_device_id *of_id;
    822	struct ti_bandgap *bgp;
    823	struct resource *res;
    824	int i;
    825
    826	/* just for the sake */
    827	if (!node) {
    828		dev_err(&pdev->dev, "no platform information available\n");
    829		return ERR_PTR(-EINVAL);
    830	}
    831
    832	bgp = devm_kzalloc(&pdev->dev, sizeof(*bgp), GFP_KERNEL);
    833	if (!bgp)
    834		return ERR_PTR(-ENOMEM);
    835
    836	of_id = of_match_device(of_ti_bandgap_match, &pdev->dev);
    837	if (of_id)
    838		bgp->conf = of_id->data;
    839
    840	/* register shadow for context save and restore */
    841	bgp->regval = devm_kcalloc(&pdev->dev, bgp->conf->sensor_count,
    842				   sizeof(*bgp->regval), GFP_KERNEL);
    843	if (!bgp->regval)
    844		return ERR_PTR(-ENOMEM);
    845
    846	i = 0;
    847	do {
    848		void __iomem *chunk;
    849
    850		res = platform_get_resource(pdev, IORESOURCE_MEM, i);
    851		if (!res)
    852			break;
    853		chunk = devm_ioremap_resource(&pdev->dev, res);
    854		if (i == 0)
    855			bgp->base = chunk;
    856		if (IS_ERR(chunk))
    857			return ERR_CAST(chunk);
    858
    859		i++;
    860	} while (res);
    861
    862	if (TI_BANDGAP_HAS(bgp, TSHUT)) {
    863		bgp->tshut_gpiod = devm_gpiod_get(&pdev->dev, NULL, GPIOD_IN);
    864		if (IS_ERR(bgp->tshut_gpiod)) {
    865			dev_err(&pdev->dev, "invalid gpio for tshut\n");
    866			return ERR_CAST(bgp->tshut_gpiod);
    867		}
    868	}
    869
    870	return bgp;
    871}
    872
    873/*
    874 * List of SoCs on which the CPU PM notifier can cause erros on the DTEMP
    875 * readout.
    876 * Enabled notifier on these machines results in erroneous, random values which
    877 * could trigger unexpected thermal shutdown.
    878 */
    879static const struct soc_device_attribute soc_no_cpu_notifier[] = {
    880	{ .machine = "OMAP4430" },
    881	{ /* sentinel */ },
    882};
    883
    884/***   Device driver call backs   ***/
    885
    886static
    887int ti_bandgap_probe(struct platform_device *pdev)
    888{
    889	struct ti_bandgap *bgp;
    890	int clk_rate, ret, i;
    891
    892	bgp = ti_bandgap_build(pdev);
    893	if (IS_ERR(bgp)) {
    894		dev_err(&pdev->dev, "failed to fetch platform data\n");
    895		return PTR_ERR(bgp);
    896	}
    897	bgp->dev = &pdev->dev;
    898
    899	if (TI_BANDGAP_HAS(bgp, UNRELIABLE))
    900		dev_warn(&pdev->dev,
    901			 "This OMAP thermal sensor is unreliable. You've been warned\n");
    902
    903	if (TI_BANDGAP_HAS(bgp, TSHUT)) {
    904		ret = ti_bandgap_tshut_init(bgp, pdev);
    905		if (ret) {
    906			dev_err(&pdev->dev,
    907				"failed to initialize system tshut IRQ\n");
    908			return ret;
    909		}
    910	}
    911
    912	bgp->fclock = clk_get(NULL, bgp->conf->fclock_name);
    913	if (IS_ERR(bgp->fclock)) {
    914		dev_err(&pdev->dev, "failed to request fclock reference\n");
    915		ret = PTR_ERR(bgp->fclock);
    916		goto free_irqs;
    917	}
    918
    919	bgp->div_clk = clk_get(NULL, bgp->conf->div_ck_name);
    920	if (IS_ERR(bgp->div_clk)) {
    921		dev_err(&pdev->dev, "failed to request div_ts_ck clock ref\n");
    922		ret = PTR_ERR(bgp->div_clk);
    923		goto put_fclock;
    924	}
    925
    926	for (i = 0; i < bgp->conf->sensor_count; i++) {
    927		struct temp_sensor_registers *tsr;
    928		u32 val;
    929
    930		tsr = bgp->conf->sensors[i].registers;
    931		/*
    932		 * check if the efuse has a non-zero value if not
    933		 * it is an untrimmed sample and the temperatures
    934		 * may not be accurate
    935		 */
    936		val = ti_bandgap_readl(bgp, tsr->bgap_efuse);
    937		if (!val)
    938			dev_info(&pdev->dev,
    939				 "Non-trimmed BGAP, Temp not accurate\n");
    940	}
    941
    942	clk_rate = clk_round_rate(bgp->div_clk,
    943				  bgp->conf->sensors[0].ts_data->max_freq);
    944	if (clk_rate < bgp->conf->sensors[0].ts_data->min_freq ||
    945	    clk_rate <= 0) {
    946		ret = -ENODEV;
    947		dev_err(&pdev->dev, "wrong clock rate (%d)\n", clk_rate);
    948		goto put_clks;
    949	}
    950
    951	ret = clk_set_rate(bgp->div_clk, clk_rate);
    952	if (ret)
    953		dev_err(&pdev->dev, "Cannot re-set clock rate. Continuing\n");
    954
    955	bgp->clk_rate = clk_rate;
    956	if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
    957		clk_prepare_enable(bgp->fclock);
    958
    959
    960	spin_lock_init(&bgp->lock);
    961	bgp->dev = &pdev->dev;
    962	platform_set_drvdata(pdev, bgp);
    963
    964	ti_bandgap_power(bgp, true);
    965
    966	/* Set default counter to 1 for now */
    967	if (TI_BANDGAP_HAS(bgp, COUNTER))
    968		for (i = 0; i < bgp->conf->sensor_count; i++)
    969			RMW_BITS(bgp, i, bgap_counter, counter_mask, 1);
    970
    971	/* Set default thresholds for alert and shutdown */
    972	for (i = 0; i < bgp->conf->sensor_count; i++) {
    973		struct temp_sensor_data *ts_data;
    974
    975		ts_data = bgp->conf->sensors[i].ts_data;
    976
    977		if (TI_BANDGAP_HAS(bgp, TALERT)) {
    978			/* Set initial Talert thresholds */
    979			RMW_BITS(bgp, i, bgap_threshold,
    980				 threshold_tcold_mask, ts_data->t_cold);
    981			RMW_BITS(bgp, i, bgap_threshold,
    982				 threshold_thot_mask, ts_data->t_hot);
    983			/* Enable the alert events */
    984			RMW_BITS(bgp, i, bgap_mask_ctrl, mask_hot_mask, 1);
    985			RMW_BITS(bgp, i, bgap_mask_ctrl, mask_cold_mask, 1);
    986		}
    987
    988		if (TI_BANDGAP_HAS(bgp, TSHUT_CONFIG)) {
    989			/* Set initial Tshut thresholds */
    990			RMW_BITS(bgp, i, tshut_threshold,
    991				 tshut_hot_mask, ts_data->tshut_hot);
    992			RMW_BITS(bgp, i, tshut_threshold,
    993				 tshut_cold_mask, ts_data->tshut_cold);
    994		}
    995	}
    996
    997	if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
    998		ti_bandgap_set_continuous_mode(bgp);
    999
   1000	/* Set .250 seconds time as default counter */
   1001	if (TI_BANDGAP_HAS(bgp, COUNTER))
   1002		for (i = 0; i < bgp->conf->sensor_count; i++)
   1003			RMW_BITS(bgp, i, bgap_counter, counter_mask,
   1004				 bgp->clk_rate / 4);
   1005
   1006	/* Every thing is good? Then expose the sensors */
   1007	for (i = 0; i < bgp->conf->sensor_count; i++) {
   1008		char *domain;
   1009
   1010		if (bgp->conf->sensors[i].register_cooling) {
   1011			ret = bgp->conf->sensors[i].register_cooling(bgp, i);
   1012			if (ret)
   1013				goto remove_sensors;
   1014		}
   1015
   1016		if (bgp->conf->expose_sensor) {
   1017			domain = bgp->conf->sensors[i].domain;
   1018			ret = bgp->conf->expose_sensor(bgp, i, domain);
   1019			if (ret)
   1020				goto remove_last_cooling;
   1021		}
   1022	}
   1023
   1024	/*
   1025	 * Enable the Interrupts once everything is set. Otherwise irq handler
   1026	 * might be called as soon as it is enabled where as rest of framework
   1027	 * is still getting initialised.
   1028	 */
   1029	if (TI_BANDGAP_HAS(bgp, TALERT)) {
   1030		ret = ti_bandgap_talert_init(bgp, pdev);
   1031		if (ret) {
   1032			dev_err(&pdev->dev, "failed to initialize Talert IRQ\n");
   1033			i = bgp->conf->sensor_count;
   1034			goto disable_clk;
   1035		}
   1036	}
   1037
   1038#ifdef CONFIG_PM_SLEEP
   1039	bgp->nb.notifier_call = bandgap_omap_cpu_notifier;
   1040	if (!soc_device_match(soc_no_cpu_notifier))
   1041		cpu_pm_register_notifier(&bgp->nb);
   1042#endif
   1043
   1044	return 0;
   1045
   1046remove_last_cooling:
   1047	if (bgp->conf->sensors[i].unregister_cooling)
   1048		bgp->conf->sensors[i].unregister_cooling(bgp, i);
   1049remove_sensors:
   1050	for (i--; i >= 0; i--) {
   1051		if (bgp->conf->sensors[i].unregister_cooling)
   1052			bgp->conf->sensors[i].unregister_cooling(bgp, i);
   1053		if (bgp->conf->remove_sensor)
   1054			bgp->conf->remove_sensor(bgp, i);
   1055	}
   1056	ti_bandgap_power(bgp, false);
   1057disable_clk:
   1058	if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1059		clk_disable_unprepare(bgp->fclock);
   1060put_clks:
   1061	clk_put(bgp->div_clk);
   1062put_fclock:
   1063	clk_put(bgp->fclock);
   1064free_irqs:
   1065	if (TI_BANDGAP_HAS(bgp, TSHUT))
   1066		free_irq(gpiod_to_irq(bgp->tshut_gpiod), NULL);
   1067
   1068	return ret;
   1069}
   1070
   1071static
   1072int ti_bandgap_remove(struct platform_device *pdev)
   1073{
   1074	struct ti_bandgap *bgp = platform_get_drvdata(pdev);
   1075	int i;
   1076
   1077	if (!soc_device_match(soc_no_cpu_notifier))
   1078		cpu_pm_unregister_notifier(&bgp->nb);
   1079
   1080	/* Remove sensor interfaces */
   1081	for (i = 0; i < bgp->conf->sensor_count; i++) {
   1082		if (bgp->conf->sensors[i].unregister_cooling)
   1083			bgp->conf->sensors[i].unregister_cooling(bgp, i);
   1084
   1085		if (bgp->conf->remove_sensor)
   1086			bgp->conf->remove_sensor(bgp, i);
   1087	}
   1088
   1089	ti_bandgap_power(bgp, false);
   1090
   1091	if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1092		clk_disable_unprepare(bgp->fclock);
   1093	clk_put(bgp->fclock);
   1094	clk_put(bgp->div_clk);
   1095
   1096	if (TI_BANDGAP_HAS(bgp, TALERT))
   1097		free_irq(bgp->irq, bgp);
   1098
   1099	if (TI_BANDGAP_HAS(bgp, TSHUT))
   1100		free_irq(gpiod_to_irq(bgp->tshut_gpiod), NULL);
   1101
   1102	return 0;
   1103}
   1104
   1105#ifdef CONFIG_PM_SLEEP
   1106static int ti_bandgap_save_ctxt(struct ti_bandgap *bgp)
   1107{
   1108	int i;
   1109
   1110	for (i = 0; i < bgp->conf->sensor_count; i++) {
   1111		struct temp_sensor_registers *tsr;
   1112		struct temp_sensor_regval *rval;
   1113
   1114		rval = &bgp->regval[i];
   1115		tsr = bgp->conf->sensors[i].registers;
   1116
   1117		if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
   1118			rval->bg_mode_ctrl = ti_bandgap_readl(bgp,
   1119							tsr->bgap_mode_ctrl);
   1120		if (TI_BANDGAP_HAS(bgp, COUNTER))
   1121			rval->bg_counter = ti_bandgap_readl(bgp,
   1122							tsr->bgap_counter);
   1123		if (TI_BANDGAP_HAS(bgp, TALERT)) {
   1124			rval->bg_threshold = ti_bandgap_readl(bgp,
   1125							tsr->bgap_threshold);
   1126			rval->bg_ctrl = ti_bandgap_readl(bgp,
   1127						   tsr->bgap_mask_ctrl);
   1128		}
   1129
   1130		if (TI_BANDGAP_HAS(bgp, TSHUT_CONFIG))
   1131			rval->tshut_threshold = ti_bandgap_readl(bgp,
   1132						   tsr->tshut_threshold);
   1133	}
   1134
   1135	return 0;
   1136}
   1137
   1138static int ti_bandgap_restore_ctxt(struct ti_bandgap *bgp)
   1139{
   1140	int i;
   1141
   1142	for (i = 0; i < bgp->conf->sensor_count; i++) {
   1143		struct temp_sensor_registers *tsr;
   1144		struct temp_sensor_regval *rval;
   1145
   1146		rval = &bgp->regval[i];
   1147		tsr = bgp->conf->sensors[i].registers;
   1148
   1149		if (TI_BANDGAP_HAS(bgp, TSHUT_CONFIG))
   1150			ti_bandgap_writel(bgp, rval->tshut_threshold,
   1151					  tsr->tshut_threshold);
   1152		/* Force immediate temperature measurement and update
   1153		 * of the DTEMP field
   1154		 */
   1155		ti_bandgap_force_single_read(bgp, i);
   1156
   1157		if (TI_BANDGAP_HAS(bgp, COUNTER))
   1158			ti_bandgap_writel(bgp, rval->bg_counter,
   1159					  tsr->bgap_counter);
   1160		if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
   1161			ti_bandgap_writel(bgp, rval->bg_mode_ctrl,
   1162					  tsr->bgap_mode_ctrl);
   1163		if (TI_BANDGAP_HAS(bgp, TALERT)) {
   1164			ti_bandgap_writel(bgp, rval->bg_threshold,
   1165					  tsr->bgap_threshold);
   1166			ti_bandgap_writel(bgp, rval->bg_ctrl,
   1167					  tsr->bgap_mask_ctrl);
   1168		}
   1169	}
   1170
   1171	return 0;
   1172}
   1173
   1174static int ti_bandgap_suspend(struct device *dev)
   1175{
   1176	struct ti_bandgap *bgp = dev_get_drvdata(dev);
   1177	int err;
   1178
   1179	err = ti_bandgap_save_ctxt(bgp);
   1180	ti_bandgap_power(bgp, false);
   1181
   1182	if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1183		clk_disable_unprepare(bgp->fclock);
   1184
   1185	bgp->is_suspended = true;
   1186
   1187	return err;
   1188}
   1189
   1190static int bandgap_omap_cpu_notifier(struct notifier_block *nb,
   1191				  unsigned long cmd, void *v)
   1192{
   1193	struct ti_bandgap *bgp;
   1194
   1195	bgp = container_of(nb, struct ti_bandgap, nb);
   1196
   1197	spin_lock(&bgp->lock);
   1198	switch (cmd) {
   1199	case CPU_CLUSTER_PM_ENTER:
   1200		if (bgp->is_suspended)
   1201			break;
   1202		ti_bandgap_save_ctxt(bgp);
   1203		ti_bandgap_power(bgp, false);
   1204		if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1205			clk_disable(bgp->fclock);
   1206		break;
   1207	case CPU_CLUSTER_PM_ENTER_FAILED:
   1208	case CPU_CLUSTER_PM_EXIT:
   1209		if (bgp->is_suspended)
   1210			break;
   1211		if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1212			clk_enable(bgp->fclock);
   1213		ti_bandgap_power(bgp, true);
   1214		ti_bandgap_restore_ctxt(bgp);
   1215		break;
   1216	}
   1217	spin_unlock(&bgp->lock);
   1218
   1219	return NOTIFY_OK;
   1220}
   1221
   1222static int ti_bandgap_resume(struct device *dev)
   1223{
   1224	struct ti_bandgap *bgp = dev_get_drvdata(dev);
   1225
   1226	if (TI_BANDGAP_HAS(bgp, CLK_CTRL))
   1227		clk_prepare_enable(bgp->fclock);
   1228
   1229	ti_bandgap_power(bgp, true);
   1230	bgp->is_suspended = false;
   1231
   1232	return ti_bandgap_restore_ctxt(bgp);
   1233}
   1234static SIMPLE_DEV_PM_OPS(ti_bandgap_dev_pm_ops, ti_bandgap_suspend,
   1235			 ti_bandgap_resume);
   1236
   1237#define DEV_PM_OPS	(&ti_bandgap_dev_pm_ops)
   1238#else
   1239#define DEV_PM_OPS	NULL
   1240#endif
   1241
   1242static const struct of_device_id of_ti_bandgap_match[] = {
   1243#ifdef CONFIG_OMAP3_THERMAL
   1244	{
   1245		.compatible = "ti,omap34xx-bandgap",
   1246		.data = (void *)&omap34xx_data,
   1247	},
   1248	{
   1249		.compatible = "ti,omap36xx-bandgap",
   1250		.data = (void *)&omap36xx_data,
   1251	},
   1252#endif
   1253#ifdef CONFIG_OMAP4_THERMAL
   1254	{
   1255		.compatible = "ti,omap4430-bandgap",
   1256		.data = (void *)&omap4430_data,
   1257	},
   1258	{
   1259		.compatible = "ti,omap4460-bandgap",
   1260		.data = (void *)&omap4460_data,
   1261	},
   1262	{
   1263		.compatible = "ti,omap4470-bandgap",
   1264		.data = (void *)&omap4470_data,
   1265	},
   1266#endif
   1267#ifdef CONFIG_OMAP5_THERMAL
   1268	{
   1269		.compatible = "ti,omap5430-bandgap",
   1270		.data = (void *)&omap5430_data,
   1271	},
   1272#endif
   1273#ifdef CONFIG_DRA752_THERMAL
   1274	{
   1275		.compatible = "ti,dra752-bandgap",
   1276		.data = (void *)&dra752_data,
   1277	},
   1278#endif
   1279	/* Sentinel */
   1280	{ },
   1281};
   1282MODULE_DEVICE_TABLE(of, of_ti_bandgap_match);
   1283
   1284static struct platform_driver ti_bandgap_sensor_driver = {
   1285	.probe = ti_bandgap_probe,
   1286	.remove = ti_bandgap_remove,
   1287	.driver = {
   1288			.name = "ti-soc-thermal",
   1289			.pm = DEV_PM_OPS,
   1290			.of_match_table	= of_ti_bandgap_match,
   1291	},
   1292};
   1293
   1294module_platform_driver(ti_bandgap_sensor_driver);
   1295
   1296MODULE_DESCRIPTION("OMAP4+ bandgap temperature sensor driver");
   1297MODULE_LICENSE("GPL v2");
   1298MODULE_ALIAS("platform:ti-soc-thermal");
   1299MODULE_AUTHOR("Texas Instrument Inc.");