From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nikolay Dimitrov Date: Mon, 18 May 2015 01:34:31 +0300 Subject: [U-Boot] [PATCH v2 4/4] thermal: imx_thermal: use CPU temperature grade for trip points In-Reply-To: <1431580312-24880-5-git-send-email-tharvey@gateworks.com> References: <1431580312-24880-1-git-send-email-tharvey@gateworks.com> <1431580312-24880-5-git-send-email-tharvey@gateworks.com> Message-ID: <55591777.7040300@mail.bg> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 05/14/2015 08:11 AM, Tim Harvey wrote: > Replace the hard-coded values for min/max/passive with values derived from > the CPU temperature grade. > > Signed-off-by: Tim Harvey > --- > drivers/thermal/imx_thermal.c | 29 +++++++++++++++++++---------- > 1 file changed, 19 insertions(+), 10 deletions(-) > > diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c > index 0bd9cfd..b5dab63 100644 > --- a/drivers/thermal/imx_thermal.c > +++ b/drivers/thermal/imx_thermal.c > @@ -12,15 +12,13 @@ > #include > #include > #include > +#include > #include > #include > #include > #include > #include > > -#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, > }; > Tested-by: Nikolay Dimitrov Regards, Nikolay