uboot/drivers/hwmon/adm1021.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2003
   3 * Murray Jensen, CSIRO-MIT, Murray.Jensen@csiro.au
   4 *
   5 * based on dtt/lm75.c which is ...
   6 *
   7 * (C) Copyright 2001
   8 * Bill Hunter,  Wave 7 Optics, williamhunter@mediaone.net
   9 *
  10 * SPDX-License-Identifier:     GPL-2.0+
  11 */
  12
  13/*
  14 * Analog Devices's ADM1021
  15 * "Low Cost Microprocessor System Temperature Monitor"
  16 */
  17
  18#include <common.h>
  19
  20#include <i2c.h>
  21#include <dtt.h>
  22
  23#define DTT_READ_LOC_VALUE      0x00
  24#define DTT_READ_REM_VALUE      0x01
  25#define DTT_READ_STATUS         0x02
  26#define DTT_READ_CONFIG         0x03
  27#define DTT_READ_CONVRATE       0x04
  28#define DTT_READ_LOC_HIGHLIM    0x05
  29#define DTT_READ_LOC_LOWLIM     0x06
  30#define DTT_READ_REM_HIGHLIM    0x07
  31#define DTT_READ_REM_LOWLIM     0x08
  32#define DTT_READ_DEVID          0xfe
  33
  34#define DTT_WRITE_CONFIG        0x09
  35#define DTT_WRITE_CONVRATE      0x0a
  36#define DTT_WRITE_LOC_HIGHLIM   0x0b
  37#define DTT_WRITE_LOC_LOWLIM    0x0c
  38#define DTT_WRITE_REM_HIGHLIM   0x0d
  39#define DTT_WRITE_REM_LOWLIM    0x0e
  40#define DTT_WRITE_ONESHOT       0x0f
  41
  42#define DTT_STATUS_BUSY         0x80    /* 1=ADC Converting */
  43#define DTT_STATUS_LHIGH        0x40    /* 1=Local High Temp Limit Tripped */
  44#define DTT_STATUS_LLOW         0x20    /* 1=Local Low Temp Limit Tripped */
  45#define DTT_STATUS_RHIGH        0x10    /* 1=Remote High Temp Limit Tripped */
  46#define DTT_STATUS_RLOW         0x08    /* 1=Remote Low Temp Limit Tripped */
  47#define DTT_STATUS_OPEN         0x04    /* 1=Remote Sensor Open-Circuit */
  48
  49#define DTT_CONFIG_ALERT_MASKED 0x80    /* 0=ALERT Enabled, 1=ALERT Masked */
  50#define DTT_CONFIG_STANDBY      0x40    /* 0=Run, 1=Standby */
  51
  52#define DTT_ADM1021_DEVID       0x41
  53
  54typedef
  55        struct {
  56                uint i2c_addr:7;        /* 7bit i2c chip address */
  57                uint conv_rate:3;       /* conversion rate */
  58                uint enable_alert:1;    /* enable alert output pin */
  59                uint enable_local:1;    /* enable internal temp sensor */
  60                uint max_local:8;       /* internal temp maximum */
  61                uint min_local:8;       /* internal temp minimum */
  62                uint enable_remote:1;   /* enable remote temp sensor */
  63                uint max_remote:8;      /* remote temp maximum */
  64                uint min_remote:8;      /* remote temp minimum */
  65        }
  66dtt_cfg_t;
  67
  68dtt_cfg_t dttcfg[] = CONFIG_SYS_DTT_ADM1021;
  69
  70int
  71dtt_read (int sensor, int reg)
  72{
  73        dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
  74        uchar data;
  75
  76        if (i2c_read(dcp->i2c_addr, reg, 1, &data, 1) != 0)
  77                return -1;
  78
  79        return (int)data;
  80} /* dtt_read() */
  81
  82int
  83dtt_write (int sensor, int reg, int val)
  84{
  85        dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
  86        uchar data;
  87
  88        data = (uchar)(val & 0xff);
  89
  90        if (i2c_write(dcp->i2c_addr, reg, 1, &data, 1) != 0)
  91                return 1;
  92
  93        return 0;
  94} /* dtt_write() */
  95
  96int
  97dtt_init_one(int sensor)
  98{
  99        dtt_cfg_t *dcp = &dttcfg[sensor >> 1];
 100        int reg, val;
 101
 102        if (((sensor & 1) == 0 ? dcp->enable_local : dcp->enable_remote) == 0)
 103                return 1;       /* sensor is disabled (or rather ignored) */
 104
 105        /*
 106         * Setup High Limit register
 107         */
 108        if ((sensor & 1) == 0) {
 109                reg = DTT_WRITE_LOC_HIGHLIM;
 110                val = dcp->max_local;
 111        }
 112        else {
 113                reg = DTT_WRITE_REM_HIGHLIM;
 114                val = dcp->max_remote;
 115        }
 116        if (dtt_write (sensor, reg, val) != 0)
 117                return 1;
 118
 119        /*
 120         * Setup Low Limit register
 121         */
 122        if ((sensor & 1) == 0) {
 123                reg = DTT_WRITE_LOC_LOWLIM;
 124                val = dcp->min_local;
 125        }
 126        else {
 127                reg = DTT_WRITE_REM_LOWLIM;
 128                val = dcp->min_remote;
 129        }
 130        if (dtt_write (sensor, reg, val) != 0)
 131                return 1;
 132
 133        /* shouldn't hurt if the rest gets done twice */
 134
 135        /*
 136         * Setup Conversion Rate register
 137         */
 138        if (dtt_write (sensor, DTT_WRITE_CONVRATE, dcp->conv_rate) != 0)
 139                return 1;
 140
 141        /*
 142         * Setup configuraton register
 143         */
 144        val = 0;                                /* running */
 145        if (dcp->enable_alert == 0)
 146                val |= DTT_CONFIG_ALERT_MASKED; /* mask ALERT pin */
 147        if (dtt_write (sensor, DTT_WRITE_CONFIG, val) != 0)
 148                return 1;
 149
 150        return 0;
 151} /* dtt_init_one() */
 152
 153int
 154dtt_get_temp (int sensor)
 155{
 156        signed char val;
 157
 158        if ((sensor & 1) == 0)
 159                val = dtt_read(sensor, DTT_READ_LOC_VALUE);
 160        else
 161                val = dtt_read(sensor, DTT_READ_REM_VALUE);
 162
 163        return (int) val;
 164} /* dtt_get_temp() */
 165