| /* | |
| * (C) Copyright 2001 | |
| * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com | |
| * | |
| * SPDX-License-Identifier: GPL-2.0+ | |
| */ | |
| #include <common.h> | |
| #include <config.h> | |
| #include <command.h> | |
| #include <dtt.h> | |
| #include <i2c.h> | |
| #include <tmu.h> | |
| #if defined CONFIG_DTT_SENSORS | |
| static unsigned long sensor_initialized; | |
| static void _initialize_dtt(void) | |
| { | |
| int i; | |
| unsigned char sensors[] = CONFIG_DTT_SENSORS; | |
| for (i = 0; i < sizeof(sensors); i++) { | |
| if ((sensor_initialized & (1 << i)) == 0) { | |
| if (dtt_init_one(sensors[i]) != 0) { | |
| printf("DTT%d: Failed init!\n", i); | |
| continue; | |
| } | |
| sensor_initialized |= (1 << i); | |
| } | |
| } | |
| } | |
| void dtt_init(void) | |
| { | |
| int old_bus; | |
| /* switch to correct I2C bus */ | |
| old_bus = I2C_GET_BUS(); | |
| I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); | |
| _initialize_dtt(); | |
| /* switch back to original I2C bus */ | |
| I2C_SET_BUS(old_bus); | |
| } | |
| #endif | |
| int dtt_i2c(void) | |
| { | |
| #if defined CONFIG_DTT_SENSORS | |
| int i; | |
| unsigned char sensors[] = CONFIG_DTT_SENSORS; | |
| int old_bus; | |
| /* Force a compilation error, if there are more then 32 sensors */ | |
| BUILD_BUG_ON(sizeof(sensors) > 32); | |
| /* switch to correct I2C bus */ | |
| #ifdef CONFIG_SYS_I2C | |
| old_bus = i2c_get_bus_num(); | |
| i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM); | |
| #else | |
| old_bus = I2C_GET_BUS(); | |
| I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); | |
| #endif | |
| _initialize_dtt(); | |
| /* | |
| * Loop through sensors, read | |
| * temperature, and output it. | |
| */ | |
| for (i = 0; i < sizeof(sensors); i++) | |
| printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i])); | |
| /* switch back to original I2C bus */ | |
| #ifdef CONFIG_SYS_I2C | |
| i2c_set_bus_num(old_bus); | |
| #else | |
| I2C_SET_BUS(old_bus); | |
| #endif | |
| #endif | |
| return 0; | |
| } | |
| int dtt_tmu(void) | |
| { | |
| #if defined CONFIG_TMU_CMD_DTT | |
| int cur_temp; | |
| /* Sense and return latest thermal info */ | |
| if (tmu_monitor(&cur_temp) == TMU_STATUS_INIT) { | |
| puts("TMU is in unknown state, temperature is invalid\n"); | |
| return -1; | |
| } | |
| printf("Current temperature: %u degrees Celsius\n", cur_temp); | |
| #endif | |
| return 0; | |
| } | |
| int do_dtt(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | |
| { | |
| int err = 0; | |
| err |= dtt_i2c(); | |
| err |= dtt_tmu(); | |
| return err; | |
| } /* do_dtt() */ | |
| /***************************************************/ | |
| U_BOOT_CMD( | |
| dtt, 1, 1, do_dtt, | |
| "Read temperature from Digital Thermometer and Thermostat", | |
| "" | |
| ); |