uboot/drivers/thermal/ti-bandgap.c
<<
>>
Prefs
   1/*
   2 * TI Bandgap temperature sensor driver
   3 *
   4 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation version 2.
   9 *
  10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  11 * kind, whether express or implied; without even the implied warranty
  12 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * Taken from Linux v4.9 (drivers/thermal/ti-soc-thermal/ti-bandgap.c)
  16 * and ported to uboot.
  17 *
  18 */
  19
  20#include <asm/io.h>
  21#include <dm.h>
  22#include <thermal.h>
  23
  24#define CTRL_CORE_TEMP_SENSOR_MPU       0
  25#define DRA752_ADC_START_VALUE          540
  26
  27struct ti_bandgap {
  28        ulong                   base;
  29        uint                    adc_val;
  30};
  31
  32/*
  33 * DRA752 : Temperature values in milli degree celsius
  34 * ADC code values from 540 to 945
  35 */
  36static int dra752_adc_to_temp[] = {
  37        /* Index 540 - 549 */
  38        -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200,
  39        -37800,
  40        /* Index 550 - 559 */
  41        -37400, -37000, -36600, -36200, -35800, -35300, -34700, -34200, -33800,
  42        -33400,
  43        /* Index 560 - 569 */
  44        -33000, -32600, -32200, -31800, -31400, -31000, -30600, -30200, -29800,
  45        -29400,
  46        /* Index 570 - 579 */
  47        -29000, -28600, -28200, -27700, -27100, -26600, -26200, -25800, -25400,
  48        -25000,
  49        /* Index 580 - 589 */
  50        -24600, -24200, -23800, -23400, -23000, -22600, -22200, -21800, -21400,
  51        -21000,
  52        /* Index 590 - 599 */
  53        -20500, -19900, -19400, -19000, -18600, -18200, -17800, -17400, -17000,
  54        -16600,
  55        /* Index 600 - 609 */
  56        -16200, -15800, -15400, -15000, -14600, -14200, -13800, -13400, -13000,
  57        -12500,
  58        /* Index 610 - 619 */
  59        -11900, -11400, -11000, -10600, -10200, -9800, -9400, -9000, -8600,
  60        -8200,
  61        /* Index 620 - 629 */
  62        -7800, -7400, -7000, -6600, -6200, -5800, -5400, -5000, -4500,
  63        -3900,
  64        /* Index 630 - 639 */
  65        -3400, -3000, -2600, -2200, -1800, -1400, -1000, -600, -200,
  66        200,
  67        /* Index 640 - 649 */
  68        600, 1000, 1400, 1800, 2200, 2600, 3000, 3400, 3900,
  69        4500,
  70        /* Index 650 - 659 */
  71        5000, 5400, 5800, 6200, 6600, 7000, 7400, 7800, 8200,
  72        8600,
  73        /* Index 660 - 669 */
  74        9000, 9400, 9800, 10200, 10600, 11000, 11400, 11800, 12200,
  75        12700,
  76        /* Index 670 - 679 */
  77        13300, 13800, 14200, 14600, 15000, 15400, 15800, 16200, 16600,
  78        17000,
  79        /* Index 680 - 689 */
  80        17400, 17800, 18200, 18600, 19000, 19400, 19800, 20200, 20600,
  81        21000,
  82        /* Index 690 - 699 */
  83        21400, 21900, 22500, 23000, 23400, 23800, 24200, 24600, 25000,
  84        25400,
  85        /* Index 700 - 709 */
  86        25800, 26200, 26600, 27000, 27400, 27800, 28200, 28600, 29000,
  87        29400,
  88        /* Index 710 - 719 */
  89        29800, 30200, 30600, 31000, 31400, 31900, 32500, 33000, 33400,
  90        33800,
  91        /* Index 720 - 729 */
  92        34200, 34600, 35000, 35400, 35800, 36200, 36600, 37000, 37400,
  93        37800,
  94        /* Index 730 - 739 */
  95        38200, 38600, 39000, 39400, 39800, 40200, 40600, 41000, 41400,
  96        41800,
  97        /* Index 740 - 749 */
  98        42200, 42600, 43100, 43700, 44200, 44600, 45000, 45400, 45800,
  99        46200,
 100        /* Index 750 - 759 */
 101        46600, 47000, 47400, 47800, 48200, 48600, 49000, 49400, 49800,
 102        50200,
 103        /* Index 760 - 769 */
 104        50600, 51000, 51400, 51800, 52200, 52600, 53000, 53400, 53800,
 105        54200,
 106        /* Index 770 - 779 */
 107        54600, 55000, 55400, 55900, 56500, 57000, 57400, 57800, 58200,
 108        58600,
 109        /* Index 780 - 789 */
 110        59000, 59400, 59800, 60200, 60600, 61000, 61400, 61800, 62200,
 111        62600,
 112        /* Index 790 - 799 */
 113        63000, 63400, 63800, 64200, 64600, 65000, 65400, 65800, 66200,
 114        66600,
 115        /* Index 800 - 809 */
 116        67000, 67400, 67800, 68200, 68600, 69000, 69400, 69800, 70200,
 117        70600,
 118        /* Index 810 - 819 */
 119        71000, 71500, 72100, 72600, 73000, 73400, 73800, 74200, 74600,
 120        75000,
 121        /* Index 820 - 829 */
 122        75400, 75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600,
 123        79000,
 124        /* Index 830 - 839 */
 125        79400, 79800, 80200, 80600, 81000, 81400, 81800, 82200, 82600,
 126        83000,
 127        /* Index 840 - 849 */
 128        83400, 83800, 84200, 84600, 85000, 85400, 85800, 86200, 86600,
 129        87000,
 130        /* Index 850 - 859 */
 131        87400, 87800, 88200, 88600, 89000, 89400, 89800, 90200, 90600,
 132        91000,
 133        /* Index 860 - 869 */
 134        91400, 91800, 92200, 92600, 93000, 93400, 93800, 94200, 94600,
 135        95000,
 136        /* Index 870 - 879 */
 137        95400, 95800, 96200, 96600, 97000, 97500, 98100, 98600, 99000,
 138        99400,
 139        /* Index 880 - 889 */
 140        99800, 100200, 100600, 101000, 101400, 101800, 102200, 102600, 103000,
 141        103400,
 142        /* Index 890 - 899 */
 143        103800, 104200, 104600, 105000, 105400, 105800, 106200, 106600, 107000,
 144        107400,
 145        /* Index 900 - 909 */
 146        107800, 108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000,
 147        111400,
 148        /* Index 910 - 919 */
 149        111800, 112200, 112600, 113000, 113400, 113800, 114200, 114600, 115000,
 150        115400,
 151        /* Index 920 - 929 */
 152        115800, 116200, 116600, 117000, 117400, 117800, 118200, 118600, 119000,
 153        119400,
 154        /* Index 930 - 939 */
 155        119800, 120200, 120600, 121000, 121400, 121800, 122200, 122600, 123000,
 156        123400,
 157        /* Index 940 - 945 */
 158        123800, 124200, 124600, 124900, 125000, 125000,
 159};
 160
 161static int ti_bandgap_get_temp(struct udevice *dev,  int *temp)
 162{
 163        struct ti_bandgap *bgp = dev_get_priv(dev);
 164
 165        bgp->adc_val = 0x3ff & readl(bgp->base + CTRL_CORE_TEMP_SENSOR_MPU);
 166        *temp = dra752_adc_to_temp[bgp->adc_val - DRA752_ADC_START_VALUE];
 167
 168        return 0;
 169}
 170
 171static struct dm_thermal_ops ti_thermal_ops = {
 172        .get_temp       = ti_bandgap_get_temp,
 173};
 174
 175static int ti_bandgap_probe(struct udevice *dev)
 176{
 177        struct ti_bandgap *bgp = dev_get_priv(dev);
 178
 179        bgp->base = devfdt_get_addr_index(dev, 1);
 180
 181        return 0;
 182}
 183
 184static const struct udevice_id of_ti_bandgap_match[] = {
 185        {
 186                .compatible = "ti,dra752-bandgap",
 187        },
 188        {},
 189};
 190
 191U_BOOT_DRIVER(ti_bandgap_thermal) = {
 192        .name   = "ti_bandgap_thermal",
 193        .id     = UCLASS_THERMAL,
 194        .ops    = &ti_thermal_ops,
 195        .probe  = ti_bandgap_probe,
 196        .of_match = of_ti_bandgap_match,
 197        .priv_auto      = sizeof(struct ti_bandgap),
 198};
 199