]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/hwmon/ds1722.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / drivers / hwmon / ds1722.c
CommitLineData
7a8e9bed
WD
1
2#include <common.h>
8907b8db
GR
3#include <asm/ic/ssi.h>
4#include <ds1722.h>
58b74b05 5
7a8e9bed
WD
6static void ds1722_select(int dev)
7{
8 ssi_set_interface(4096, 0, 0, 0);
9 ssi_chip_select(0);
10 udelay(1);
11 ssi_chip_select(dev);
12 udelay(1);
13}
14
15
16u8 ds1722_read(int dev, int addr)
17{
18 u8 res;
8bde7f77 19
7a8e9bed 20 ds1722_select(dev);
8bde7f77
WD
21
22 ssi_tx_byte(addr);
23 res = ssi_rx_byte();
24
7a8e9bed 25 ssi_chip_select(0);
8bde7f77 26
7a8e9bed
WD
27 return res;
28}
29
30void ds1722_write(int dev, int addr, u8 data)
31{
32 ds1722_select(dev);
8bde7f77
WD
33
34 ssi_tx_byte(0x80|addr);
35 ssi_tx_byte(data);
36
7a8e9bed
WD
37 ssi_chip_select(0);
38}
39
40
41u16 ds1722_temp(int dev, int resolution)
42{
43 static int useconds[] = {
8bde7f77 44 75000, 150000, 300000, 600000, 1200000
7a8e9bed
WD
45 };
46 char temp;
47 u16 res;
8bde7f77
WD
48
49
7a8e9bed
WD
50 /* set up the desired resulotion ... */
51 ds1722_write(dev, 0, 0xe0 | (resolution << 1));
8bde7f77 52
7a8e9bed 53 /* wait while the chip measures the tremperature */
8bde7f77
WD
54 udelay(useconds[resolution]);
55
7a8e9bed 56 res = (temp = ds1722_read(dev, 2)) << 8;
8bde7f77
WD
57
58 if (temp < 0) {
7a8e9bed
WD
59 temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f;
60 } else {
61 temp = (ds1722_read(dev, 1) >> 4);
62 }
8bde7f77 63
7a8e9bed
WD
64 switch (temp) {
65 case 0:
66 /* .0000 */
67 break;
68 case 1:
69 /* .0625 */
70 res |=1;
71 break;
72 case 2:
73 /* .1250 */
74 res |=1;
75 break;
76 case 3:
77 /* .1875 */
78 res |=2;
79 break;
80 case 4:
81 /* .2500 */
82 res |=3;
83 break;
84 case 5:
85 /* .3125 */
86 res |=3;
87 break;
88 case 6:
89 /* .3750 */
90 res |=4;
91 break;
92 case 7:
93 /* .4375 */
94 res |=4;
95 break;
96 case 8:
97 /* .5000 */
98 res |=5;
99 break;
100 case 9:
101 /* .5625 */
102 res |=6;
103 break;
104 case 10:
105 /* .6250 */
106 res |=6;
107 break;
108 case 11:
109 /* .6875 */
110 res |=7;
111 break;
112 case 12:
113 /* .7500 */
114 res |=8;
115 break;
116 case 13:
117 /* .8125 */
118 res |=8;
119 break;
120 case 14:
121 /* .8750 */
122 res |=9;
123 break;
124 case 15:
125 /* .9375 */
126 res |=9;
127 break;
128 }
129 return res;
8bde7f77 130
7a8e9bed
WD
131}
132
133int ds1722_probe(int dev)
134{
135 u16 temp = ds1722_temp(dev, DS1722_RESOLUTION_12BIT);
136 printf("%d.%d deg C\n\n", (char)(temp >> 8), temp & 0xff);
137 return 0;
138}