]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/hwmon/lm81.c
spi: davinci: Remove duplicate code to set bus and cs for slave
[people/ms/u-boot.git] / drivers / hwmon / lm81.c
1 /*
2 * (C) Copyright 2006
3 * Heiko Schocher, DENX Software Enginnering <hs@denx.de>
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 * On Semiconductor's LM81 Temperature Sensor
15 */
16
17 #include <common.h>
18 #include <i2c.h>
19 #include <dtt.h>
20
21 /*
22 * Device code
23 */
24 #define DTT_I2C_DEV_CODE 0x2c /* ON Semi's LM81 device */
25 #define DTT_READ_TEMP 0x27
26 #define DTT_CONFIG_TEMP 0x4b
27 #define DTT_TEMP_MAX 0x39
28 #define DTT_TEMP_HYST 0x3a
29 #define DTT_CONFIG 0x40
30
31 int dtt_read(int sensor, int reg)
32 {
33 int dlen = 1;
34 uchar data[2];
35
36 /*
37 * Calculate sensor address and register.
38 */
39 sensor = DTT_I2C_DEV_CODE + (sensor & 0x03); /* calculate address of lm81 */
40
41 /*
42 * Now try to read the register.
43 */
44 if (i2c_read(sensor, reg, 1, data, dlen) != 0)
45 return -1;
46
47 return (int)data[0];
48 } /* dtt_read() */
49
50
51 int dtt_write(int sensor, int reg, int val)
52 {
53 uchar data;
54
55 /*
56 * Calculate sensor address and register.
57 */
58 sensor = DTT_I2C_DEV_CODE + (sensor & 0x03); /* calculate address of lm81 */
59
60 data = (char)(val & 0xff);
61
62 /*
63 * Write value to register.
64 */
65 if (i2c_write(sensor, reg, 1, &data, 1) != 0)
66 return 1;
67
68 return 0;
69 } /* dtt_write() */
70
71 #define DTT_MANU 0x3e
72 #define DTT_REV 0x3f
73 #define DTT_CONFIG 0x40
74 #define DTT_ADR 0x48
75
76 int dtt_init_one(int sensor)
77 {
78 int man;
79 int adr;
80 int rev;
81
82 if (dtt_write (sensor, DTT_CONFIG, 0x01) < 0)
83 return 1;
84 /* The LM81 needs 400ms to get the correct values ... */
85 udelay (400000);
86 man = dtt_read (sensor, DTT_MANU);
87 if (man != 0x01)
88 return 1;
89 adr = dtt_read (sensor, DTT_ADR);
90 if (adr < 0)
91 return 1;
92 rev = dtt_read (sensor, DTT_REV);
93 if (adr < 0)
94 return 1;
95
96 debug ("DTT: Found LM81@%x Rev: %d\n", adr, rev);
97 return 0;
98 } /* dtt_init_one() */
99
100
101 #define TEMP_FROM_REG(temp) \
102 ((temp)<256?((((temp)&0x1fe) >> 1) * 10) + ((temp) & 1) * 5: \
103 ((((temp)&0x1fe) >> 1) -255) * 10 - ((temp) & 1) * 5) \
104
105 int dtt_get_temp(int sensor)
106 {
107 int val = dtt_read (sensor, DTT_READ_TEMP);
108 int tmpcnf = dtt_read (sensor, DTT_CONFIG_TEMP);
109
110 return (TEMP_FROM_REG((val << 1) + ((tmpcnf & 0x80) >> 7))) / 10;
111 } /* dtt_get_temp() */