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