2 * TI Bandgap temperature sensor driver
4 * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/
5 * Author: J Keerthy <j-keerthy@ti.com>
6 * Author: Moiz Sonasath <m-sonasath@ti.com>
7 * Couple of fixes, DT and MFD adaptation:
8 * Eduardo Valentin <eduardo.valentin@ti.com>
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * version 2 as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 #include <linux/module.h>
27 #include <linux/export.h>
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/interrupt.h>
31 #include <linux/clk.h>
32 #include <linux/gpio.h>
33 #include <linux/platform_device.h>
34 #include <linux/err.h>
35 #include <linux/types.h>
36 #include <linux/spinlock.h>
37 #include <linux/reboot.h>
38 #include <linux/of_device.h>
39 #include <linux/of_platform.h>
40 #include <linux/of_irq.h>
41 #include <linux/of_gpio.h>
44 #include "ti-bandgap.h"
46 static int ti_bandgap_force_single_read(struct ti_bandgap
*bgp
, int id
);
48 /*** Helper functions to access registers and their bitfields ***/
51 * ti_bandgap_readl() - simple read helper function
52 * @bgp: pointer to ti_bandgap structure
53 * @reg: desired register (offset) to be read
55 * Helper function to read bandgap registers. It uses the io remapped area.
56 * Return: the register value.
58 static u32
ti_bandgap_readl(struct ti_bandgap
*bgp
, u32 reg
)
60 return readl(bgp
->base
+ reg
);
64 * ti_bandgap_writel() - simple write helper function
65 * @bgp: pointer to ti_bandgap structure
66 * @val: desired register value to be written
67 * @reg: desired register (offset) to be written
69 * Helper function to write bandgap registers. It uses the io remapped area.
71 static void ti_bandgap_writel(struct ti_bandgap
*bgp
, u32 val
, u32 reg
)
73 writel(val
, bgp
->base
+ reg
);
77 * DOC: macro to update bits.
79 * RMW_BITS() - used to read, modify and update bandgap bitfields.
80 * The value passed will be shifted.
82 #define RMW_BITS(bgp, id, reg, mask, val) \
84 struct temp_sensor_registers *t; \
87 t = bgp->conf->sensors[(id)].registers; \
88 r = ti_bandgap_readl(bgp, t->reg); \
90 r |= (val) << __ffs(t->mask); \
91 ti_bandgap_writel(bgp, r, t->reg); \
94 /*** Basic helper functions ***/
97 * ti_bandgap_power() - controls the power state of a bandgap device
98 * @bgp: pointer to ti_bandgap structure
99 * @on: desired power state (1 - on, 0 - off)
101 * Used to power on/off a bandgap device instance. Only used on those
102 * that features tempsoff bit.
104 * Return: 0 on success, -ENOTSUPP if tempsoff is not supported.
106 static int ti_bandgap_power(struct ti_bandgap
*bgp
, bool on
)
110 if (!TI_BANDGAP_HAS(bgp
, POWER_SWITCH
))
113 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++)
115 RMW_BITS(bgp
, i
, temp_sensor_ctrl
, bgap_tempsoff_mask
, !on
);
120 * ti_errata814_bandgap_read_temp() - helper function to read dra7 sensor temperature
121 * @bgp: pointer to ti_bandgap structure
122 * @reg: desired register (offset) to be read
124 * Function to read dra7 bandgap sensor temperature. This is done separately
125 * so as to workaround the errata "Bandgap Temperature read Dtemp can be
126 * corrupted" - Errata ID: i814".
127 * Read accesses to registers listed below can be corrupted due to incorrect
128 * resynchronization between clock domains.
129 * Read access to registers below can be corrupted :
130 * CTRL_CORE_DTEMP_MPU/GPU/CORE/DSPEVE/IVA_n (n = 0 to 4)
131 * CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA_n
133 * Return: the register value.
135 static u32
ti_errata814_bandgap_read_temp(struct ti_bandgap
*bgp
, u32 reg
)
139 val1
= ti_bandgap_readl(bgp
, reg
);
140 val2
= ti_bandgap_readl(bgp
, reg
);
142 /* If both times we read the same value then that is right */
146 /* if val1 and val2 are different read it third time */
147 return ti_bandgap_readl(bgp
, reg
);
151 * ti_bandgap_read_temp() - helper function to read sensor temperature
152 * @bgp: pointer to ti_bandgap structure
153 * @id: bandgap sensor id
155 * Function to concentrate the steps to read sensor temperature register.
156 * This function is desired because, depending on bandgap device version,
157 * it might be needed to freeze the bandgap state machine, before fetching
158 * the register value.
160 * Return: temperature in ADC values.
162 static u32
ti_bandgap_read_temp(struct ti_bandgap
*bgp
, int id
)
164 struct temp_sensor_registers
*tsr
;
167 tsr
= bgp
->conf
->sensors
[id
].registers
;
168 reg
= tsr
->temp_sensor_ctrl
;
170 if (TI_BANDGAP_HAS(bgp
, FREEZE_BIT
)) {
171 RMW_BITS(bgp
, id
, bgap_mask_ctrl
, mask_freeze_mask
, 1);
173 * In case we cannot read from cur_dtemp / dtemp_0,
174 * then we read from the last valid temp read
176 reg
= tsr
->ctrl_dtemp_1
;
179 /* read temperature */
180 if (TI_BANDGAP_HAS(bgp
, ERRATA_814
))
181 temp
= ti_errata814_bandgap_read_temp(bgp
, reg
);
183 temp
= ti_bandgap_readl(bgp
, reg
);
185 temp
&= tsr
->bgap_dtemp_mask
;
187 if (TI_BANDGAP_HAS(bgp
, FREEZE_BIT
))
188 RMW_BITS(bgp
, id
, bgap_mask_ctrl
, mask_freeze_mask
, 0);
193 /*** IRQ handlers ***/
196 * ti_bandgap_talert_irq_handler() - handles Temperature alert IRQs
198 * @data: private data (struct ti_bandgap *)
200 * This is the Talert handler. Use it only if bandgap device features
201 * HAS(TALERT). This handler goes over all sensors and checks their
202 * conditions and acts accordingly. In case there are events pending,
203 * it will reset the event mask to wait for the opposite event (next event).
204 * Every time there is a new event, it will be reported to thermal layer.
206 * Return: IRQ_HANDLED
208 static irqreturn_t
ti_bandgap_talert_irq_handler(int irq
, void *data
)
210 struct ti_bandgap
*bgp
= data
;
211 struct temp_sensor_registers
*tsr
;
212 u32 t_hot
= 0, t_cold
= 0, ctrl
;
215 spin_lock(&bgp
->lock
);
216 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
217 tsr
= bgp
->conf
->sensors
[i
].registers
;
218 ctrl
= ti_bandgap_readl(bgp
, tsr
->bgap_status
);
220 /* Read the status of t_hot */
221 t_hot
= ctrl
& tsr
->status_hot_mask
;
223 /* Read the status of t_cold */
224 t_cold
= ctrl
& tsr
->status_cold_mask
;
226 if (!t_cold
&& !t_hot
)
229 ctrl
= ti_bandgap_readl(bgp
, tsr
->bgap_mask_ctrl
);
231 * One TALERT interrupt: Two sources
232 * If the interrupt is due to t_hot then mask t_hot and
233 * and unmask t_cold else mask t_cold and unmask t_hot
236 ctrl
&= ~tsr
->mask_hot_mask
;
237 ctrl
|= tsr
->mask_cold_mask
;
239 ctrl
&= ~tsr
->mask_cold_mask
;
240 ctrl
|= tsr
->mask_hot_mask
;
243 ti_bandgap_writel(bgp
, ctrl
, tsr
->bgap_mask_ctrl
);
246 "%s: IRQ from %s sensor: hotevent %d coldevent %d\n",
247 __func__
, bgp
->conf
->sensors
[i
].domain
,
250 /* report temperature to whom may concern */
251 if (bgp
->conf
->report_temperature
)
252 bgp
->conf
->report_temperature(bgp
, i
);
254 spin_unlock(&bgp
->lock
);
260 * ti_bandgap_tshut_irq_handler() - handles Temperature shutdown signal
262 * @data: private data (unused)
264 * This is the Tshut handler. Use it only if bandgap device features
265 * HAS(TSHUT). If any sensor fires the Tshut signal, we simply shutdown
268 * Return: IRQ_HANDLED
270 static irqreturn_t
ti_bandgap_tshut_irq_handler(int irq
, void *data
)
272 pr_emerg("%s: TSHUT temperature reached. Needs shut down...\n",
275 orderly_poweroff(true);
280 /*** Helper functions which manipulate conversion ADC <-> mi Celsius ***/
283 * ti_bandgap_adc_to_mcelsius() - converts an ADC value to mCelsius scale
284 * @bgp: struct ti_bandgap pointer
285 * @adc_val: value in ADC representation
286 * @t: address where to write the resulting temperature in mCelsius
288 * Simple conversion from ADC representation to mCelsius. In case the ADC value
289 * is out of the ADC conv table range, it returns -ERANGE, 0 on success.
290 * The conversion table is indexed by the ADC values.
292 * Return: 0 if conversion was successful, else -ERANGE in case the @adc_val
293 * argument is out of the ADC conv table range.
296 int ti_bandgap_adc_to_mcelsius(struct ti_bandgap
*bgp
, int adc_val
, int *t
)
298 const struct ti_bandgap_data
*conf
= bgp
->conf
;
300 /* look up for temperature in the table and return the temperature */
301 if (adc_val
< conf
->adc_start_val
|| adc_val
> conf
->adc_end_val
)
304 *t
= bgp
->conf
->conv_table
[adc_val
- conf
->adc_start_val
];
309 * ti_bandgap_mcelsius_to_adc() - converts a mCelsius value to ADC scale
310 * @bgp: struct ti_bandgap pointer
311 * @temp: value in mCelsius
312 * @adc: address where to write the resulting temperature in ADC representation
314 * Simple conversion from mCelsius to ADC values. In case the temp value
315 * is out of the ADC conv table range, it returns -ERANGE, 0 on success.
316 * The conversion table is indexed by the ADC values.
318 * Return: 0 if conversion was successful, else -ERANGE in case the @temp
319 * argument is out of the ADC conv table range.
322 int ti_bandgap_mcelsius_to_adc(struct ti_bandgap
*bgp
, long temp
, int *adc
)
324 const struct ti_bandgap_data
*conf
= bgp
->conf
;
325 const int *conv_table
= bgp
->conf
->conv_table
;
329 high
= conf
->adc_end_val
- conf
->adc_start_val
;
330 mid
= (high
+ low
) / 2;
332 if (temp
< conv_table
[low
] || temp
> conv_table
[high
])
336 if (temp
< conv_table
[mid
])
340 mid
= (low
+ high
) / 2;
343 *adc
= conf
->adc_start_val
+ low
;
348 * ti_bandgap_add_hyst() - add hysteresis (in mCelsius) to an ADC value
349 * @bgp: struct ti_bandgap pointer
350 * @adc_val: temperature value in ADC representation
351 * @hyst_val: hysteresis value in mCelsius
352 * @sum: address where to write the resulting temperature (in ADC scale)
354 * Adds an hysteresis value (in mCelsius) to a ADC temperature value.
356 * Return: 0 on success, -ERANGE otherwise.
359 int ti_bandgap_add_hyst(struct ti_bandgap
*bgp
, int adc_val
, int hyst_val
,
365 * Need to add in the mcelsius domain, so we have a temperature
366 * the conv_table range
368 ret
= ti_bandgap_adc_to_mcelsius(bgp
, adc_val
, &temp
);
374 ret
= ti_bandgap_mcelsius_to_adc(bgp
, temp
, sum
);
378 /*** Helper functions handling device Alert/Shutdown signals ***/
381 * ti_bandgap_unmask_interrupts() - unmasks the events of thot & tcold
382 * @bgp: struct ti_bandgap pointer
383 * @id: bandgap sensor id
384 * @t_hot: hot temperature value to trigger alert signal
385 * @t_cold: cold temperature value to trigger alert signal
387 * Checks the requested t_hot and t_cold values and configures the IRQ event
388 * masks accordingly. Call this function only if bandgap features HAS(TALERT).
390 static void ti_bandgap_unmask_interrupts(struct ti_bandgap
*bgp
, int id
,
391 u32 t_hot
, u32 t_cold
)
393 struct temp_sensor_registers
*tsr
;
396 /* Read the current on die temperature */
397 temp
= ti_bandgap_read_temp(bgp
, id
);
399 tsr
= bgp
->conf
->sensors
[id
].registers
;
400 reg_val
= ti_bandgap_readl(bgp
, tsr
->bgap_mask_ctrl
);
403 reg_val
|= tsr
->mask_hot_mask
;
405 reg_val
&= ~tsr
->mask_hot_mask
;
408 reg_val
|= tsr
->mask_cold_mask
;
410 reg_val
&= ~tsr
->mask_cold_mask
;
411 ti_bandgap_writel(bgp
, reg_val
, tsr
->bgap_mask_ctrl
);
415 * ti_bandgap_update_alert_threshold() - sequence to update thresholds
416 * @bgp: struct ti_bandgap pointer
417 * @id: bandgap sensor id
418 * @val: value (ADC) of a new threshold
419 * @hot: desired threshold to be updated. true if threshold hot, false if
422 * It will program the required thresholds (hot and cold) for TALERT signal.
423 * This function can be used to update t_hot or t_cold, depending on @hot value.
424 * It checks the resulting t_hot and t_cold values, based on the new passed @val
425 * and configures the thresholds so that t_hot is always greater than t_cold.
426 * Call this function only if bandgap features HAS(TALERT).
428 * Return: 0 if no error, else corresponding error
430 static int ti_bandgap_update_alert_threshold(struct ti_bandgap
*bgp
, int id
,
433 struct temp_sensor_data
*ts_data
= bgp
->conf
->sensors
[id
].ts_data
;
434 struct temp_sensor_registers
*tsr
;
435 u32 thresh_val
, reg_val
, t_hot
, t_cold
, ctrl
;
438 tsr
= bgp
->conf
->sensors
[id
].registers
;
440 /* obtain the current value */
441 thresh_val
= ti_bandgap_readl(bgp
, tsr
->bgap_threshold
);
442 t_cold
= (thresh_val
& tsr
->threshold_tcold_mask
) >>
443 __ffs(tsr
->threshold_tcold_mask
);
444 t_hot
= (thresh_val
& tsr
->threshold_thot_mask
) >>
445 __ffs(tsr
->threshold_thot_mask
);
451 if (t_cold
> t_hot
) {
453 err
= ti_bandgap_add_hyst(bgp
, t_hot
,
457 err
= ti_bandgap_add_hyst(bgp
, t_cold
,
462 /* write the new threshold values */
463 reg_val
= thresh_val
&
464 ~(tsr
->threshold_thot_mask
| tsr
->threshold_tcold_mask
);
465 reg_val
|= (t_hot
<< __ffs(tsr
->threshold_thot_mask
)) |
466 (t_cold
<< __ffs(tsr
->threshold_tcold_mask
));
470 * Spurious Thermal Alert: Talert can happen randomly while the device
471 * remains under the temperature limit defined for this event to trig.
472 * This spurious event is caused by a incorrect re-synchronization
473 * between clock domains. The comparison between configured threshold
474 * and current temperature value can happen while the value is
475 * transitioning (metastable), thus causing inappropriate event
476 * generation. No spurious event occurs as long as the threshold value
477 * stays unchanged. Spurious event can be generated while a thermal
478 * alert threshold is modified in
479 * CONTROL_BANDGAP_THRESHOLD_MPU/GPU/CORE/DSPEVE/IVA_n.
482 if (TI_BANDGAP_HAS(bgp
, ERRATA_813
)) {
483 /* Mask t_hot and t_cold events at the IP Level */
484 ctrl
= ti_bandgap_readl(bgp
, tsr
->bgap_mask_ctrl
);
487 ctrl
&= ~tsr
->mask_hot_mask
;
489 ctrl
&= ~tsr
->mask_cold_mask
;
491 ti_bandgap_writel(bgp
, ctrl
, tsr
->bgap_mask_ctrl
);
494 /* Write the threshold value */
495 ti_bandgap_writel(bgp
, reg_val
, tsr
->bgap_threshold
);
497 if (TI_BANDGAP_HAS(bgp
, ERRATA_813
)) {
498 /* Unmask t_hot and t_cold events at the IP Level */
499 ctrl
= ti_bandgap_readl(bgp
, tsr
->bgap_mask_ctrl
);
501 ctrl
|= tsr
->mask_hot_mask
;
503 ctrl
|= tsr
->mask_cold_mask
;
505 ti_bandgap_writel(bgp
, ctrl
, tsr
->bgap_mask_ctrl
);
509 dev_err(bgp
->dev
, "failed to reprogram thot threshold\n");
514 ti_bandgap_unmask_interrupts(bgp
, id
, t_hot
, t_cold
);
520 * ti_bandgap_validate() - helper to check the sanity of a struct ti_bandgap
521 * @bgp: struct ti_bandgap pointer
522 * @id: bandgap sensor id
524 * Checks if the bandgap pointer is valid and if the sensor id is also
527 * Return: 0 if no errors, -EINVAL for invalid @bgp pointer or -ERANGE if
528 * @id cannot index @bgp sensors.
530 static inline int ti_bandgap_validate(struct ti_bandgap
*bgp
, int id
)
532 if (!bgp
|| IS_ERR(bgp
)) {
533 pr_err("%s: invalid bandgap pointer\n", __func__
);
537 if ((id
< 0) || (id
>= bgp
->conf
->sensor_count
)) {
538 dev_err(bgp
->dev
, "%s: sensor id out of range (%d)\n",
547 * _ti_bandgap_write_threshold() - helper to update TALERT t_cold or t_hot
548 * @bgp: struct ti_bandgap pointer
549 * @id: bandgap sensor id
550 * @val: value (mCelsius) of a new threshold
551 * @hot: desired threshold to be updated. true if threshold hot, false if
554 * It will update the required thresholds (hot and cold) for TALERT signal.
555 * This function can be used to update t_hot or t_cold, depending on @hot value.
556 * Validates the mCelsius range and update the requested threshold.
557 * Call this function only if bandgap features HAS(TALERT).
559 * Return: 0 if no error, else corresponding error value.
561 static int _ti_bandgap_write_threshold(struct ti_bandgap
*bgp
, int id
, int val
,
564 struct temp_sensor_data
*ts_data
;
565 struct temp_sensor_registers
*tsr
;
569 ret
= ti_bandgap_validate(bgp
, id
);
573 if (!TI_BANDGAP_HAS(bgp
, TALERT
))
576 ts_data
= bgp
->conf
->sensors
[id
].ts_data
;
577 tsr
= bgp
->conf
->sensors
[id
].registers
;
579 if (val
< ts_data
->min_temp
+ ts_data
->hyst_val
)
582 if (val
> ts_data
->max_temp
+ ts_data
->hyst_val
)
589 ret
= ti_bandgap_mcelsius_to_adc(bgp
, val
, &adc_val
);
593 spin_lock(&bgp
->lock
);
594 ret
= ti_bandgap_update_alert_threshold(bgp
, id
, adc_val
, hot
);
595 spin_unlock(&bgp
->lock
);
600 * _ti_bandgap_read_threshold() - helper to read TALERT t_cold or t_hot
601 * @bgp: struct ti_bandgap pointer
602 * @id: bandgap sensor id
603 * @val: value (mCelsius) of a threshold
604 * @hot: desired threshold to be read. true if threshold hot, false if
607 * It will fetch the required thresholds (hot and cold) for TALERT signal.
608 * This function can be used to read t_hot or t_cold, depending on @hot value.
609 * Call this function only if bandgap features HAS(TALERT).
611 * Return: 0 if no error, -ENOTSUPP if it has no TALERT support, or the
612 * corresponding error value if some operation fails.
614 static int _ti_bandgap_read_threshold(struct ti_bandgap
*bgp
, int id
,
617 struct temp_sensor_registers
*tsr
;
621 ret
= ti_bandgap_validate(bgp
, id
);
625 if (!TI_BANDGAP_HAS(bgp
, TALERT
)) {
630 tsr
= bgp
->conf
->sensors
[id
].registers
;
632 mask
= tsr
->threshold_thot_mask
;
634 mask
= tsr
->threshold_tcold_mask
;
636 temp
= ti_bandgap_readl(bgp
, tsr
->bgap_threshold
);
637 temp
= (temp
& mask
) >> __ffs(mask
);
638 ret
= ti_bandgap_adc_to_mcelsius(bgp
, temp
, &temp
);
640 dev_err(bgp
->dev
, "failed to read thot\n");
651 /*** Exposed APIs ***/
654 * ti_bandgap_read_thot() - reads sensor current thot
655 * @bgp: pointer to bandgap instance
657 * @thot: resulting current thot value
659 * Return: 0 on success or the proper error code
661 int ti_bandgap_read_thot(struct ti_bandgap
*bgp
, int id
, int *thot
)
663 return _ti_bandgap_read_threshold(bgp
, id
, thot
, true);
667 * ti_bandgap_write_thot() - sets sensor current thot
668 * @bgp: pointer to bandgap instance
670 * @val: desired thot value
672 * Return: 0 on success or the proper error code
674 int ti_bandgap_write_thot(struct ti_bandgap
*bgp
, int id
, int val
)
676 return _ti_bandgap_write_threshold(bgp
, id
, val
, true);
680 * ti_bandgap_read_tcold() - reads sensor current tcold
681 * @bgp: pointer to bandgap instance
683 * @tcold: resulting current tcold value
685 * Return: 0 on success or the proper error code
687 int ti_bandgap_read_tcold(struct ti_bandgap
*bgp
, int id
, int *tcold
)
689 return _ti_bandgap_read_threshold(bgp
, id
, tcold
, false);
693 * ti_bandgap_write_tcold() - sets the sensor tcold
694 * @bgp: pointer to bandgap instance
696 * @val: desired tcold value
698 * Return: 0 on success or the proper error code
700 int ti_bandgap_write_tcold(struct ti_bandgap
*bgp
, int id
, int val
)
702 return _ti_bandgap_write_threshold(bgp
, id
, val
, false);
706 * ti_bandgap_read_counter() - read the sensor counter
707 * @bgp: pointer to bandgap instance
709 * @interval: resulting update interval in miliseconds
711 static void ti_bandgap_read_counter(struct ti_bandgap
*bgp
, int id
,
714 struct temp_sensor_registers
*tsr
;
717 tsr
= bgp
->conf
->sensors
[id
].registers
;
718 time
= ti_bandgap_readl(bgp
, tsr
->bgap_counter
);
719 time
= (time
& tsr
->counter_mask
) >>
720 __ffs(tsr
->counter_mask
);
721 time
= time
* 1000 / bgp
->clk_rate
;
726 * ti_bandgap_read_counter_delay() - read the sensor counter delay
727 * @bgp: pointer to bandgap instance
729 * @interval: resulting update interval in miliseconds
731 static void ti_bandgap_read_counter_delay(struct ti_bandgap
*bgp
, int id
,
734 struct temp_sensor_registers
*tsr
;
737 tsr
= bgp
->conf
->sensors
[id
].registers
;
739 reg_val
= ti_bandgap_readl(bgp
, tsr
->bgap_mask_ctrl
);
740 reg_val
= (reg_val
& tsr
->mask_counter_delay_mask
) >>
741 __ffs(tsr
->mask_counter_delay_mask
);
762 dev_warn(bgp
->dev
, "Wrong counter delay value read from register %X",
768 * ti_bandgap_read_update_interval() - read the sensor update interval
769 * @bgp: pointer to bandgap instance
771 * @interval: resulting update interval in miliseconds
773 * Return: 0 on success or the proper error code
775 int ti_bandgap_read_update_interval(struct ti_bandgap
*bgp
, int id
,
780 ret
= ti_bandgap_validate(bgp
, id
);
784 if (!TI_BANDGAP_HAS(bgp
, COUNTER
) &&
785 !TI_BANDGAP_HAS(bgp
, COUNTER_DELAY
)) {
790 if (TI_BANDGAP_HAS(bgp
, COUNTER
)) {
791 ti_bandgap_read_counter(bgp
, id
, interval
);
795 ti_bandgap_read_counter_delay(bgp
, id
, interval
);
801 * ti_bandgap_write_counter_delay() - set the counter_delay
802 * @bgp: pointer to bandgap instance
804 * @interval: desired update interval in miliseconds
806 * Return: 0 on success or the proper error code
808 static int ti_bandgap_write_counter_delay(struct ti_bandgap
*bgp
, int id
,
814 case 0: /* Immediate conversion */
817 case 1: /* Conversion after ever 1ms */
820 case 10: /* Conversion after ever 10ms */
823 case 100: /* Conversion after ever 100ms */
826 case 250: /* Conversion after ever 250ms */
829 case 500: /* Conversion after ever 500ms */
833 dev_warn(bgp
->dev
, "Delay %d ms is not supported\n", interval
);
837 spin_lock(&bgp
->lock
);
838 RMW_BITS(bgp
, id
, bgap_mask_ctrl
, mask_counter_delay_mask
, rval
);
839 spin_unlock(&bgp
->lock
);
845 * ti_bandgap_write_counter() - set the bandgap sensor counter
846 * @bgp: pointer to bandgap instance
848 * @interval: desired update interval in miliseconds
850 static void ti_bandgap_write_counter(struct ti_bandgap
*bgp
, int id
,
853 interval
= interval
* bgp
->clk_rate
/ 1000;
854 spin_lock(&bgp
->lock
);
855 RMW_BITS(bgp
, id
, bgap_counter
, counter_mask
, interval
);
856 spin_unlock(&bgp
->lock
);
860 * ti_bandgap_write_update_interval() - set the update interval
861 * @bgp: pointer to bandgap instance
863 * @interval: desired update interval in miliseconds
865 * Return: 0 on success or the proper error code
867 int ti_bandgap_write_update_interval(struct ti_bandgap
*bgp
,
868 int id
, u32 interval
)
870 int ret
= ti_bandgap_validate(bgp
, id
);
874 if (!TI_BANDGAP_HAS(bgp
, COUNTER
) &&
875 !TI_BANDGAP_HAS(bgp
, COUNTER_DELAY
)) {
880 if (TI_BANDGAP_HAS(bgp
, COUNTER
)) {
881 ti_bandgap_write_counter(bgp
, id
, interval
);
885 ret
= ti_bandgap_write_counter_delay(bgp
, id
, interval
);
891 * ti_bandgap_read_temperature() - report current temperature
892 * @bgp: pointer to bandgap instance
894 * @temperature: resulting temperature
896 * Return: 0 on success or the proper error code
898 int ti_bandgap_read_temperature(struct ti_bandgap
*bgp
, int id
,
904 ret
= ti_bandgap_validate(bgp
, id
);
908 if (!TI_BANDGAP_HAS(bgp
, MODE_CONFIG
)) {
909 ret
= ti_bandgap_force_single_read(bgp
, id
);
914 spin_lock(&bgp
->lock
);
915 temp
= ti_bandgap_read_temp(bgp
, id
);
916 spin_unlock(&bgp
->lock
);
918 ret
= ti_bandgap_adc_to_mcelsius(bgp
, temp
, &temp
);
928 * ti_bandgap_set_sensor_data() - helper function to store thermal
929 * framework related data.
930 * @bgp: pointer to bandgap instance
932 * @data: thermal framework related data to be stored
934 * Return: 0 on success or the proper error code
936 int ti_bandgap_set_sensor_data(struct ti_bandgap
*bgp
, int id
, void *data
)
938 int ret
= ti_bandgap_validate(bgp
, id
);
942 bgp
->regval
[id
].data
= data
;
948 * ti_bandgap_get_sensor_data() - helper function to get thermal
949 * framework related data.
950 * @bgp: pointer to bandgap instance
953 * Return: data stored by set function with sensor id on success or NULL
955 void *ti_bandgap_get_sensor_data(struct ti_bandgap
*bgp
, int id
)
957 int ret
= ti_bandgap_validate(bgp
, id
);
961 return bgp
->regval
[id
].data
;
964 /*** Helper functions used during device initialization ***/
967 * ti_bandgap_force_single_read() - executes 1 single ADC conversion
968 * @bgp: pointer to struct ti_bandgap
969 * @id: sensor id which it is desired to read 1 temperature
971 * Used to initialize the conversion state machine and set it to a valid
972 * state. Called during device initialization and context restore events.
977 ti_bandgap_force_single_read(struct ti_bandgap
*bgp
, int id
)
980 struct temp_sensor_registers
*tsr
;
982 /* Select single conversion mode */
983 if (TI_BANDGAP_HAS(bgp
, MODE_CONFIG
))
984 RMW_BITS(bgp
, id
, bgap_mode_ctrl
, mode_ctrl_mask
, 0);
986 /* Start of Conversion = 1 */
987 RMW_BITS(bgp
, id
, temp_sensor_ctrl
, bgap_soc_mask
, 1);
989 /* Wait for EOCZ going up */
990 tsr
= bgp
->conf
->sensors
[id
].registers
;
993 if (ti_bandgap_readl(bgp
, tsr
->temp_sensor_ctrl
) &
998 /* Start of Conversion = 0 */
999 RMW_BITS(bgp
, id
, temp_sensor_ctrl
, bgap_soc_mask
, 0);
1001 /* Wait for EOCZ going down */
1004 if (!(ti_bandgap_readl(bgp
, tsr
->temp_sensor_ctrl
) &
1005 tsr
->bgap_eocz_mask
))
1013 * ti_bandgap_set_continuous_mode() - One time enabling of continuous mode
1014 * @bgp: pointer to struct ti_bandgap
1016 * Call this function only if HAS(MODE_CONFIG) is set. As this driver may
1017 * be used for junction temperature monitoring, it is desirable that the
1018 * sensors are operational all the time, so that alerts are generated
1023 static int ti_bandgap_set_continuous_mode(struct ti_bandgap
*bgp
)
1027 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1028 /* Perform a single read just before enabling continuous */
1029 ti_bandgap_force_single_read(bgp
, i
);
1030 RMW_BITS(bgp
, i
, bgap_mode_ctrl
, mode_ctrl_mask
, 1);
1037 * ti_bandgap_get_trend() - To fetch the temperature trend of a sensor
1038 * @bgp: pointer to struct ti_bandgap
1039 * @id: id of the individual sensor
1040 * @trend: Pointer to trend.
1042 * This function needs to be called to fetch the temperature trend of a
1043 * Particular sensor. The function computes the difference in temperature
1044 * w.r.t time. For the bandgaps with built in history buffer the temperatures
1045 * are read from the buffer and for those without the Buffer -ENOTSUPP is
1048 * Return: 0 if no error, else return corresponding error. If no
1049 * error then the trend value is passed on to trend parameter
1051 int ti_bandgap_get_trend(struct ti_bandgap
*bgp
, int id
, int *trend
)
1053 struct temp_sensor_registers
*tsr
;
1054 u32 temp1
, temp2
, reg1
, reg2
;
1055 int t1
, t2
, interval
, ret
= 0;
1057 ret
= ti_bandgap_validate(bgp
, id
);
1061 if (!TI_BANDGAP_HAS(bgp
, HISTORY_BUFFER
) ||
1062 !TI_BANDGAP_HAS(bgp
, FREEZE_BIT
)) {
1067 spin_lock(&bgp
->lock
);
1069 tsr
= bgp
->conf
->sensors
[id
].registers
;
1071 /* Freeze and read the last 2 valid readings */
1072 RMW_BITS(bgp
, id
, bgap_mask_ctrl
, mask_freeze_mask
, 1);
1073 reg1
= tsr
->ctrl_dtemp_1
;
1074 reg2
= tsr
->ctrl_dtemp_2
;
1076 /* read temperature from history buffer */
1077 temp1
= ti_bandgap_readl(bgp
, reg1
);
1078 temp1
&= tsr
->bgap_dtemp_mask
;
1080 temp2
= ti_bandgap_readl(bgp
, reg2
);
1081 temp2
&= tsr
->bgap_dtemp_mask
;
1083 /* Convert from adc values to mCelsius temperature */
1084 ret
= ti_bandgap_adc_to_mcelsius(bgp
, temp1
, &t1
);
1088 ret
= ti_bandgap_adc_to_mcelsius(bgp
, temp2
, &t2
);
1092 /* Fetch the update interval */
1093 ret
= ti_bandgap_read_update_interval(bgp
, id
, &interval
);
1097 /* Set the interval to 1 ms if bandgap counter delay is not set */
1101 *trend
= (t1
- t2
) / interval
;
1103 dev_dbg(bgp
->dev
, "The temperatures are t1 = %d and t2 = %d and trend =%d\n",
1107 RMW_BITS(bgp
, id
, bgap_mask_ctrl
, mask_freeze_mask
, 0);
1108 spin_unlock(&bgp
->lock
);
1114 * ti_bandgap_tshut_init() - setup and initialize tshut handling
1115 * @bgp: pointer to struct ti_bandgap
1116 * @pdev: pointer to device struct platform_device
1118 * Call this function only in case the bandgap features HAS(TSHUT).
1119 * In this case, the driver needs to handle the TSHUT signal as an IRQ.
1120 * The IRQ is wired as a GPIO, and for this purpose, it is required
1121 * to specify which GPIO line is used. TSHUT IRQ is fired anytime
1122 * one of the bandgap sensors violates the TSHUT high/hot threshold.
1123 * And in that case, the system must go off.
1125 * Return: 0 if no error, else error status
1127 static int ti_bandgap_tshut_init(struct ti_bandgap
*bgp
,
1128 struct platform_device
*pdev
)
1130 int gpio_nr
= bgp
->tshut_gpio
;
1133 /* Request for gpio_86 line */
1134 status
= gpio_request(gpio_nr
, "tshut");
1136 dev_err(bgp
->dev
, "Could not request for TSHUT GPIO:%i\n", 86);
1139 status
= gpio_direction_input(gpio_nr
);
1141 dev_err(bgp
->dev
, "Cannot set input TSHUT GPIO %d\n", gpio_nr
);
1145 status
= request_irq(gpio_to_irq(gpio_nr
), ti_bandgap_tshut_irq_handler
,
1146 IRQF_TRIGGER_RISING
, "tshut", NULL
);
1149 dev_err(bgp
->dev
, "request irq failed for TSHUT");
1156 * ti_bandgap_alert_init() - setup and initialize talert handling
1157 * @bgp: pointer to struct ti_bandgap
1158 * @pdev: pointer to device struct platform_device
1160 * Call this function only in case the bandgap features HAS(TALERT).
1161 * In this case, the driver needs to handle the TALERT signals as an IRQs.
1162 * TALERT is a normal IRQ and it is fired any time thresholds (hot or cold)
1163 * are violated. In these situation, the driver must reprogram the thresholds,
1164 * accordingly to specified policy.
1166 * Return: 0 if no error, else return corresponding error.
1168 static int ti_bandgap_talert_init(struct ti_bandgap
*bgp
,
1169 struct platform_device
*pdev
)
1173 bgp
->irq
= platform_get_irq(pdev
, 0);
1175 dev_err(&pdev
->dev
, "get_irq failed\n");
1178 ret
= request_threaded_irq(bgp
->irq
, NULL
,
1179 ti_bandgap_talert_irq_handler
,
1180 IRQF_TRIGGER_HIGH
| IRQF_ONESHOT
,
1183 dev_err(&pdev
->dev
, "Request threaded irq failed.\n");
1190 static const struct of_device_id of_ti_bandgap_match
[];
1192 * ti_bandgap_build() - parse DT and setup a struct ti_bandgap
1193 * @pdev: pointer to device struct platform_device
1195 * Used to read the device tree properties accordingly to the bandgap
1196 * matching version. Based on bandgap version and its capabilities it
1197 * will build a struct ti_bandgap out of the required DT entries.
1199 * Return: valid bandgap structure if successful, else returns ERR_PTR
1200 * return value must be verified with IS_ERR.
1202 static struct ti_bandgap
*ti_bandgap_build(struct platform_device
*pdev
)
1204 struct device_node
*node
= pdev
->dev
.of_node
;
1205 const struct of_device_id
*of_id
;
1206 struct ti_bandgap
*bgp
;
1207 struct resource
*res
;
1210 /* just for the sake */
1212 dev_err(&pdev
->dev
, "no platform information available\n");
1213 return ERR_PTR(-EINVAL
);
1216 bgp
= devm_kzalloc(&pdev
->dev
, sizeof(*bgp
), GFP_KERNEL
);
1218 return ERR_PTR(-ENOMEM
);
1220 of_id
= of_match_device(of_ti_bandgap_match
, &pdev
->dev
);
1222 bgp
->conf
= of_id
->data
;
1224 /* register shadow for context save and restore */
1225 bgp
->regval
= devm_kcalloc(&pdev
->dev
, bgp
->conf
->sensor_count
,
1226 sizeof(*bgp
->regval
), GFP_KERNEL
);
1228 return ERR_PTR(-ENOMEM
);
1232 void __iomem
*chunk
;
1234 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, i
);
1237 chunk
= devm_ioremap_resource(&pdev
->dev
, res
);
1241 return ERR_CAST(chunk
);
1246 if (TI_BANDGAP_HAS(bgp
, TSHUT
)) {
1247 bgp
->tshut_gpio
= of_get_gpio(node
, 0);
1248 if (!gpio_is_valid(bgp
->tshut_gpio
)) {
1249 dev_err(&pdev
->dev
, "invalid gpio for tshut (%d)\n",
1251 return ERR_PTR(-EINVAL
);
1258 /*** Device driver call backs ***/
1261 int ti_bandgap_probe(struct platform_device
*pdev
)
1263 struct ti_bandgap
*bgp
;
1264 int clk_rate
, ret
, i
;
1266 bgp
= ti_bandgap_build(pdev
);
1268 dev_err(&pdev
->dev
, "failed to fetch platform data\n");
1269 return PTR_ERR(bgp
);
1271 bgp
->dev
= &pdev
->dev
;
1273 if (TI_BANDGAP_HAS(bgp
, UNRELIABLE
))
1274 dev_warn(&pdev
->dev
,
1275 "This OMAP thermal sensor is unreliable. You've been warned\n");
1277 if (TI_BANDGAP_HAS(bgp
, TSHUT
)) {
1278 ret
= ti_bandgap_tshut_init(bgp
, pdev
);
1281 "failed to initialize system tshut IRQ\n");
1286 bgp
->fclock
= clk_get(NULL
, bgp
->conf
->fclock_name
);
1287 if (IS_ERR(bgp
->fclock
)) {
1288 dev_err(&pdev
->dev
, "failed to request fclock reference\n");
1289 ret
= PTR_ERR(bgp
->fclock
);
1293 bgp
->div_clk
= clk_get(NULL
, bgp
->conf
->div_ck_name
);
1294 if (IS_ERR(bgp
->div_clk
)) {
1295 dev_err(&pdev
->dev
, "failed to request div_ts_ck clock ref\n");
1296 ret
= PTR_ERR(bgp
->div_clk
);
1300 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1301 struct temp_sensor_registers
*tsr
;
1304 tsr
= bgp
->conf
->sensors
[i
].registers
;
1306 * check if the efuse has a non-zero value if not
1307 * it is an untrimmed sample and the temperatures
1308 * may not be accurate
1310 val
= ti_bandgap_readl(bgp
, tsr
->bgap_efuse
);
1312 dev_info(&pdev
->dev
,
1313 "Non-trimmed BGAP, Temp not accurate\n");
1316 clk_rate
= clk_round_rate(bgp
->div_clk
,
1317 bgp
->conf
->sensors
[0].ts_data
->max_freq
);
1318 if (clk_rate
< bgp
->conf
->sensors
[0].ts_data
->min_freq
||
1321 dev_err(&pdev
->dev
, "wrong clock rate (%d)\n", clk_rate
);
1325 ret
= clk_set_rate(bgp
->div_clk
, clk_rate
);
1327 dev_err(&pdev
->dev
, "Cannot re-set clock rate. Continuing\n");
1329 bgp
->clk_rate
= clk_rate
;
1330 if (TI_BANDGAP_HAS(bgp
, CLK_CTRL
))
1331 clk_prepare_enable(bgp
->fclock
);
1334 spin_lock_init(&bgp
->lock
);
1335 bgp
->dev
= &pdev
->dev
;
1336 platform_set_drvdata(pdev
, bgp
);
1338 ti_bandgap_power(bgp
, true);
1340 /* Set default counter to 1 for now */
1341 if (TI_BANDGAP_HAS(bgp
, COUNTER
))
1342 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++)
1343 RMW_BITS(bgp
, i
, bgap_counter
, counter_mask
, 1);
1345 /* Set default thresholds for alert and shutdown */
1346 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1347 struct temp_sensor_data
*ts_data
;
1349 ts_data
= bgp
->conf
->sensors
[i
].ts_data
;
1351 if (TI_BANDGAP_HAS(bgp
, TALERT
)) {
1352 /* Set initial Talert thresholds */
1353 RMW_BITS(bgp
, i
, bgap_threshold
,
1354 threshold_tcold_mask
, ts_data
->t_cold
);
1355 RMW_BITS(bgp
, i
, bgap_threshold
,
1356 threshold_thot_mask
, ts_data
->t_hot
);
1357 /* Enable the alert events */
1358 RMW_BITS(bgp
, i
, bgap_mask_ctrl
, mask_hot_mask
, 1);
1359 RMW_BITS(bgp
, i
, bgap_mask_ctrl
, mask_cold_mask
, 1);
1362 if (TI_BANDGAP_HAS(bgp
, TSHUT_CONFIG
)) {
1363 /* Set initial Tshut thresholds */
1364 RMW_BITS(bgp
, i
, tshut_threshold
,
1365 tshut_hot_mask
, ts_data
->tshut_hot
);
1366 RMW_BITS(bgp
, i
, tshut_threshold
,
1367 tshut_cold_mask
, ts_data
->tshut_cold
);
1371 if (TI_BANDGAP_HAS(bgp
, MODE_CONFIG
))
1372 ti_bandgap_set_continuous_mode(bgp
);
1374 /* Set .250 seconds time as default counter */
1375 if (TI_BANDGAP_HAS(bgp
, COUNTER
))
1376 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++)
1377 RMW_BITS(bgp
, i
, bgap_counter
, counter_mask
,
1380 /* Every thing is good? Then expose the sensors */
1381 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1384 if (bgp
->conf
->sensors
[i
].register_cooling
) {
1385 ret
= bgp
->conf
->sensors
[i
].register_cooling(bgp
, i
);
1387 goto remove_sensors
;
1390 if (bgp
->conf
->expose_sensor
) {
1391 domain
= bgp
->conf
->sensors
[i
].domain
;
1392 ret
= bgp
->conf
->expose_sensor(bgp
, i
, domain
);
1394 goto remove_last_cooling
;
1399 * Enable the Interrupts once everything is set. Otherwise irq handler
1400 * might be called as soon as it is enabled where as rest of framework
1401 * is still getting initialised.
1403 if (TI_BANDGAP_HAS(bgp
, TALERT
)) {
1404 ret
= ti_bandgap_talert_init(bgp
, pdev
);
1406 dev_err(&pdev
->dev
, "failed to initialize Talert IRQ\n");
1407 i
= bgp
->conf
->sensor_count
;
1414 remove_last_cooling
:
1415 if (bgp
->conf
->sensors
[i
].unregister_cooling
)
1416 bgp
->conf
->sensors
[i
].unregister_cooling(bgp
, i
);
1418 for (i
--; i
>= 0; i
--) {
1419 if (bgp
->conf
->sensors
[i
].unregister_cooling
)
1420 bgp
->conf
->sensors
[i
].unregister_cooling(bgp
, i
);
1421 if (bgp
->conf
->remove_sensor
)
1422 bgp
->conf
->remove_sensor(bgp
, i
);
1424 ti_bandgap_power(bgp
, false);
1426 if (TI_BANDGAP_HAS(bgp
, CLK_CTRL
))
1427 clk_disable_unprepare(bgp
->fclock
);
1429 clk_put(bgp
->div_clk
);
1431 clk_put(bgp
->fclock
);
1433 if (TI_BANDGAP_HAS(bgp
, TSHUT
)) {
1434 free_irq(gpio_to_irq(bgp
->tshut_gpio
), NULL
);
1435 gpio_free(bgp
->tshut_gpio
);
1442 int ti_bandgap_remove(struct platform_device
*pdev
)
1444 struct ti_bandgap
*bgp
= platform_get_drvdata(pdev
);
1447 /* First thing is to remove sensor interfaces */
1448 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1449 if (bgp
->conf
->sensors
[i
].unregister_cooling
)
1450 bgp
->conf
->sensors
[i
].unregister_cooling(bgp
, i
);
1452 if (bgp
->conf
->remove_sensor
)
1453 bgp
->conf
->remove_sensor(bgp
, i
);
1456 ti_bandgap_power(bgp
, false);
1458 if (TI_BANDGAP_HAS(bgp
, CLK_CTRL
))
1459 clk_disable_unprepare(bgp
->fclock
);
1460 clk_put(bgp
->fclock
);
1461 clk_put(bgp
->div_clk
);
1463 if (TI_BANDGAP_HAS(bgp
, TALERT
))
1464 free_irq(bgp
->irq
, bgp
);
1466 if (TI_BANDGAP_HAS(bgp
, TSHUT
)) {
1467 free_irq(gpio_to_irq(bgp
->tshut_gpio
), NULL
);
1468 gpio_free(bgp
->tshut_gpio
);
1474 #ifdef CONFIG_PM_SLEEP
1475 static int ti_bandgap_save_ctxt(struct ti_bandgap
*bgp
)
1479 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1480 struct temp_sensor_registers
*tsr
;
1481 struct temp_sensor_regval
*rval
;
1483 rval
= &bgp
->regval
[i
];
1484 tsr
= bgp
->conf
->sensors
[i
].registers
;
1486 if (TI_BANDGAP_HAS(bgp
, MODE_CONFIG
))
1487 rval
->bg_mode_ctrl
= ti_bandgap_readl(bgp
,
1488 tsr
->bgap_mode_ctrl
);
1489 if (TI_BANDGAP_HAS(bgp
, COUNTER
))
1490 rval
->bg_counter
= ti_bandgap_readl(bgp
,
1492 if (TI_BANDGAP_HAS(bgp
, TALERT
)) {
1493 rval
->bg_threshold
= ti_bandgap_readl(bgp
,
1494 tsr
->bgap_threshold
);
1495 rval
->bg_ctrl
= ti_bandgap_readl(bgp
,
1496 tsr
->bgap_mask_ctrl
);
1499 if (TI_BANDGAP_HAS(bgp
, TSHUT_CONFIG
))
1500 rval
->tshut_threshold
= ti_bandgap_readl(bgp
,
1501 tsr
->tshut_threshold
);
1507 static int ti_bandgap_restore_ctxt(struct ti_bandgap
*bgp
)
1511 for (i
= 0; i
< bgp
->conf
->sensor_count
; i
++) {
1512 struct temp_sensor_registers
*tsr
;
1513 struct temp_sensor_regval
*rval
;
1516 rval
= &bgp
->regval
[i
];
1517 tsr
= bgp
->conf
->sensors
[i
].registers
;
1519 if (TI_BANDGAP_HAS(bgp
, COUNTER
))
1520 val
= ti_bandgap_readl(bgp
, tsr
->bgap_counter
);
1522 if (TI_BANDGAP_HAS(bgp
, TSHUT_CONFIG
))
1523 ti_bandgap_writel(bgp
, rval
->tshut_threshold
,
1524 tsr
->tshut_threshold
);
1525 /* Force immediate temperature measurement and update
1526 * of the DTEMP field
1528 ti_bandgap_force_single_read(bgp
, i
);
1530 if (TI_BANDGAP_HAS(bgp
, COUNTER
))
1531 ti_bandgap_writel(bgp
, rval
->bg_counter
,
1533 if (TI_BANDGAP_HAS(bgp
, MODE_CONFIG
))
1534 ti_bandgap_writel(bgp
, rval
->bg_mode_ctrl
,
1535 tsr
->bgap_mode_ctrl
);
1536 if (TI_BANDGAP_HAS(bgp
, TALERT
)) {
1537 ti_bandgap_writel(bgp
, rval
->bg_threshold
,
1538 tsr
->bgap_threshold
);
1539 ti_bandgap_writel(bgp
, rval
->bg_ctrl
,
1540 tsr
->bgap_mask_ctrl
);
1547 static int ti_bandgap_suspend(struct device
*dev
)
1549 struct ti_bandgap
*bgp
= dev_get_drvdata(dev
);
1552 err
= ti_bandgap_save_ctxt(bgp
);
1553 ti_bandgap_power(bgp
, false);
1555 if (TI_BANDGAP_HAS(bgp
, CLK_CTRL
))
1556 clk_disable_unprepare(bgp
->fclock
);
1561 static int ti_bandgap_resume(struct device
*dev
)
1563 struct ti_bandgap
*bgp
= dev_get_drvdata(dev
);
1565 if (TI_BANDGAP_HAS(bgp
, CLK_CTRL
))
1566 clk_prepare_enable(bgp
->fclock
);
1568 ti_bandgap_power(bgp
, true);
1570 return ti_bandgap_restore_ctxt(bgp
);
1572 static SIMPLE_DEV_PM_OPS(ti_bandgap_dev_pm_ops
, ti_bandgap_suspend
,
1575 #define DEV_PM_OPS (&ti_bandgap_dev_pm_ops)
1577 #define DEV_PM_OPS NULL
1580 static const struct of_device_id of_ti_bandgap_match
[] = {
1581 #ifdef CONFIG_OMAP3_THERMAL
1583 .compatible
= "ti,omap34xx-bandgap",
1584 .data
= (void *)&omap34xx_data
,
1587 .compatible
= "ti,omap36xx-bandgap",
1588 .data
= (void *)&omap36xx_data
,
1591 #ifdef CONFIG_OMAP4_THERMAL
1593 .compatible
= "ti,omap4430-bandgap",
1594 .data
= (void *)&omap4430_data
,
1597 .compatible
= "ti,omap4460-bandgap",
1598 .data
= (void *)&omap4460_data
,
1601 .compatible
= "ti,omap4470-bandgap",
1602 .data
= (void *)&omap4470_data
,
1605 #ifdef CONFIG_OMAP5_THERMAL
1607 .compatible
= "ti,omap5430-bandgap",
1608 .data
= (void *)&omap5430_data
,
1611 #ifdef CONFIG_DRA752_THERMAL
1613 .compatible
= "ti,dra752-bandgap",
1614 .data
= (void *)&dra752_data
,
1620 MODULE_DEVICE_TABLE(of
, of_ti_bandgap_match
);
1622 static struct platform_driver ti_bandgap_sensor_driver
= {
1623 .probe
= ti_bandgap_probe
,
1624 .remove
= ti_bandgap_remove
,
1626 .name
= "ti-soc-thermal",
1628 .of_match_table
= of_ti_bandgap_match
,
1632 module_platform_driver(ti_bandgap_sensor_driver
);
1634 MODULE_DESCRIPTION("OMAP4+ bandgap temperature sensor driver");
1635 MODULE_LICENSE("GPL v2");
1636 MODULE_ALIAS("platform:ti-soc-thermal");
1637 MODULE_AUTHOR("Texas Instrument Inc.");