@ -12,15 +12,13 @@
# include <fuse.h>
# include <asm/io.h>
# include <asm/arch/clock.h>
# include <asm/arch/sys_proto.h>
# include <dm.h>
# include <errno.h>
# include <malloc.h>
# include <thermal.h>
# include <imx_thermal.h>
# define TEMPERATURE_MIN -40
# define TEMPERATURE_HOT 80
# define TEMPERATURE_MAX 125
# define FACTOR0 10000000
# define FACTOR1 15976
# define FACTOR2 4297157
@ -34,14 +32,21 @@
# define MISC0_REFTOP_SELBIASOFF (1 << 3)
# define TEMPSENSE1_MEASURE_FREQ 0xffff
struct thermal_data {
unsigned int fuse ;
int passive ;
int minc ;
int maxc ;
} ;
static int read_cpu_temperature ( struct udevice * dev )
{
int temperature ;
unsigned int reg , n_meas ;
const struct imx_thermal_plat * pdata = dev_get_platdata ( dev ) ;
struct anatop_regs * anatop = ( struct anatop_regs * ) pdata - > regs ;
unsigned int * priv = dev_get_priv ( dev ) ;
u32 fuse = * priv ;
struct thermal_data * priv = dev_get_priv ( dev ) ;
u32 fuse = priv - > fuse ;
int t1 , n1 ;
u32 c1 , c2 ;
u64 temp64 ;
@ -119,11 +124,12 @@ static int read_cpu_temperature(struct udevice *dev)
int imx_thermal_get_temp ( struct udevice * dev , int * temp )
{
struct thermal_data * priv = dev_get_priv ( dev ) ;
int cpu_tmp = 0 ;
cpu_tmp = read_cpu_temperature ( dev ) ;
while ( cpu_tmp > TEMPERATURE_MIN & & cpu_tmp < TEMPERATURE_MAX ) {
if ( cpu_tmp > = TEMPERATURE_HOT ) {
while ( cpu_tmp > priv - > minc & & cpu_tmp < priv - > maxc ) {
if ( cpu_tmp > = priv - > passive ) {
printf ( " CPU Temperature is %d C, too hot to boot, waiting... \n " ,
cpu_tmp ) ;
udelay ( 5000000 ) ;
@ -147,7 +153,7 @@ static int imx_thermal_probe(struct udevice *dev)
unsigned int fuse = ~ 0 ;
const struct imx_thermal_plat * pdata = dev_get_platdata ( dev ) ;
unsigned int * priv = dev_get_priv ( dev ) ;
struct thermal_data * priv = dev_get_priv ( dev ) ;
/* Read Temperature calibration data fuse */
fuse_read ( pdata - > fuse_bank , pdata - > fuse_word , & fuse ) ;
@ -158,7 +164,10 @@ static int imx_thermal_probe(struct udevice *dev)
return - EPERM ;
}
* priv = fuse ;
/* set passive cooling temp to max - 20C */
get_cpu_temp_grade ( & priv - > minc , & priv - > maxc ) ;
priv - > passive = priv - > maxc - 20 ;
priv - > fuse = fuse ;
enable_thermal_clk ( ) ;
@ -170,6 +179,6 @@ U_BOOT_DRIVER(imx_thermal) = {
. id = UCLASS_THERMAL ,
. ops = & imx_thermal_ops ,
. probe = imx_thermal_probe ,
. priv_auto_alloc_size = sizeof ( unsigned int ) ,
. priv_auto_alloc_size = sizeof ( struct thermal_data ) ,
. flags = DM_FLAG_PRE_RELOC ,
} ;