]>
Commit | Line | Data |
---|---|---|
3863585b WD |
1 | /* |
2 | * (C) Copyright 2001 | |
3 | * Erik Theisen, Wave 7 Optics, [email protected] | |
4 | * | |
3765b3e7 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
3863585b WD |
6 | */ |
7 | ||
8 | #include <common.h> | |
9 | #include <config.h> | |
10 | #include <command.h> | |
3863585b | 11 | |
3863585b | 12 | #include <dtt.h> |
0dc018ec | 13 | #include <i2c.h> |
bc5478b2 | 14 | #include <tmu.h> |
3863585b | 15 | |
bc5478b2 | 16 | #if defined CONFIG_DTT_SENSORS |
780f13a9 HS |
17 | static unsigned long sensor_initialized; |
18 | ||
b88e7b3c DE |
19 | static void _initialize_dtt(void) |
20 | { | |
21 | int i; | |
22 | unsigned char sensors[] = CONFIG_DTT_SENSORS; | |
23 | ||
24 | for (i = 0; i < sizeof(sensors); i++) { | |
25 | if ((sensor_initialized & (1 << i)) == 0) { | |
26 | if (dtt_init_one(sensors[i]) != 0) { | |
27 | printf("DTT%d: Failed init!\n", i); | |
28 | continue; | |
29 | } | |
30 | sensor_initialized |= (1 << i); | |
31 | } | |
32 | } | |
33 | } | |
34 | ||
35 | void dtt_init(void) | |
36 | { | |
37 | int old_bus; | |
38 | ||
39 | /* switch to correct I2C bus */ | |
40 | old_bus = I2C_GET_BUS(); | |
41 | I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); | |
42 | ||
43 | _initialize_dtt(); | |
44 | ||
45 | /* switch back to original I2C bus */ | |
46 | I2C_SET_BUS(old_bus); | |
47 | } | |
bc5478b2 | 48 | #endif |
b88e7b3c | 49 | |
bc5478b2 | 50 | int dtt_i2c(void) |
3863585b | 51 | { |
bc5478b2 | 52 | #if defined CONFIG_DTT_SENSORS |
3863585b WD |
53 | int i; |
54 | unsigned char sensors[] = CONFIG_DTT_SENSORS; | |
0dc018ec SR |
55 | int old_bus; |
56 | ||
780f13a9 HS |
57 | /* Force a compilation error, if there are more then 32 sensors */ |
58 | BUILD_BUG_ON(sizeof(sensors) > 32); | |
0dc018ec | 59 | /* switch to correct I2C bus */ |
3f4978c7 HS |
60 | #ifdef CONFIG_SYS_I2C |
61 | old_bus = i2c_get_bus_num(); | |
62 | i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM); | |
63 | #else | |
0dc018ec | 64 | old_bus = I2C_GET_BUS(); |
6d0f6bcf | 65 | I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); |
3f4978c7 | 66 | #endif |
3863585b | 67 | |
b88e7b3c DE |
68 | _initialize_dtt(); |
69 | ||
3863585b WD |
70 | /* |
71 | * Loop through sensors, read | |
72 | * temperature, and output it. | |
73 | */ | |
b88e7b3c | 74 | for (i = 0; i < sizeof(sensors); i++) |
780f13a9 | 75 | printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i])); |
0dc018ec SR |
76 | |
77 | /* switch back to original I2C bus */ | |
3f4978c7 HS |
78 | #ifdef CONFIG_SYS_I2C |
79 | i2c_set_bus_num(old_bus); | |
80 | #else | |
0dc018ec | 81 | I2C_SET_BUS(old_bus); |
3f4978c7 | 82 | #endif |
bc5478b2 | 83 | #endif |
3863585b WD |
84 | |
85 | return 0; | |
bc5478b2 AS |
86 | } |
87 | ||
88 | int dtt_tmu(void) | |
89 | { | |
90 | #if defined CONFIG_TMU_CMD_DTT | |
91 | int cur_temp; | |
92 | ||
93 | /* Sense and return latest thermal info */ | |
94 | if (tmu_monitor(&cur_temp) == TMU_STATUS_INIT) { | |
95 | puts("TMU is in unknown state, temperature is invalid\n"); | |
96 | return -1; | |
97 | } | |
98 | printf("Current temperature: %u degrees Celsius\n", cur_temp); | |
99 | #endif | |
100 | return 0; | |
101 | } | |
102 | ||
103 | int do_dtt(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | |
104 | { | |
105 | int err = 0; | |
106 | ||
107 | err |= dtt_i2c(); | |
108 | err |= dtt_tmu(); | |
109 | ||
110 | return err; | |
3863585b WD |
111 | } /* do_dtt() */ |
112 | ||
8bde7f77 WD |
113 | /***************************************************/ |
114 | ||
0d498393 WD |
115 | U_BOOT_CMD( |
116 | dtt, 1, 1, do_dtt, | |
a89c33db WD |
117 | "Read temperature from Digital Thermometer and Thermostat", |
118 | "" | |
8bde7f77 | 119 | ); |