/*
* ( 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>
# include <linux/bug.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 " ,
" "
) ;