[PATCH v2] thermal: add imx thermal driver support
Shawn Guo
shawn.guo at linaro.org
Wed Jun 19 22:47:51 EDT 2013
On Wed, Jun 19, 2013 at 10:03:06AM -0400, Eduardo Valentin wrote:
> >>> @@ -0,0 +1,14 @@
> >>> +* Temperature Monitor (TEMPMON) on Freescale i.MX SoCs
> >>
> >> Any hw documentation reference?
> >>
> > http://cache.freescale.com/files/32bit/doc/ref_manual/IMX6DQRM.pdf?fpsp=1&WT_TYPE=Reference%20Manuals&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation
> >
>
> OK. Tks.
>
> Some ppl like to put hw doc reference on your driver documentation. But
> for me is your call. I believe it is good to ask the kernel doc guys too.
>
I'm not a fan of doing that, because I can not tell that the link will
be still valid there in 5 years or so.
> >>> +
> >>> +Required properties:
> >>> +- compatible : "fsl,imx6q-thermal"
> >>> +- fsl,tempmon : phandle pointer to TEMPMON control registers
> >>> +- fsl,tempmon-data : phandle pointer to TEMPMON calibration data
> >>
> >> what exactly is calibration data?
> >>
> > The temperature calibration values are fused individually for each part
> > in the product testing process. It consists of a pair of hardware
> > monitor values at 25 C and a high temperature which is specified by
> > calibration data itself, which will be used by software to translate
> > hardware counter values to Celsius. The detailed description can be
> > found in hardware reference manual.
>
> That was what I expected. But it is not that clear what you meant by
> "thermal cal data" your DT documenation. Maybe you need to describe how
> to enter a fsl,tempmon-data.
>
Ok, I will try to come up with something better.
<snip>
> >>> +#define IMX_POLLING_DELAY 5000 /* millisecond */
> >>> +#define IMX_PASSIVE_DELAY 3000
> >>
> >> What is your maximum delta between CPU frequencies? Sure this polling
> >> intervals can hold your maximum power burst?
> >>
> > I have to admit I'm not sure how to determine the optimal intervals
> > here. I initially have both intervals be 1000 ms, but I'm not sure if
> > it's necessary. I need some help on that. The frequency table on the
> > target consists of 396, 792, 996 and 1200 in MHz.
>
> Here you can do simple calculation on your maximum delta Celsius over
> delta time. Then check it against your maximum delta power (power at
> 1.2GHz - power at 396MHz) with respect to your power vs. temp. curve.
> That will give you a rough expectation on what you need to be sampling.
> But you probably need help from some guy doing thermal modeling and
> simulation on your chip.
>
Ok, thanks for the input. I just consulted the Freescale thermal
expert. Though I did not get the modeling and simulation data, I was
told that one 1~2 seconds should be safer. So I'm going to change the
definitions as below.
#define IMX_POLLING_DELAY 2000 /* millisecond */
#define IMX_PASSIVE_DELAY 1000
> >
> >>> +
> >>> +struct imx_thermal_data {
> >>> + struct thermal_zone_device *tz;
> >>> + struct thermal_cooling_device *cdev;
> >>> + enum thermal_device_mode mode;
> >>> + struct regmap *tempmon;
> >>> + bool meas_suspended;
> >>> + int c1, c2; /* See forumla in imx_get_sensor_data() */
> >>> +};
> >>> +
> >>> +static int imx_get_temp(struct thermal_zone_device *tz, unsigned long *temp)
> >>> +{
> >>> + struct imx_thermal_data *data = tz->devdata;
> >>> + struct regmap *map = data->tempmon;
> >>> + static unsigned long last_temp;
> >>> + unsigned int n_meas;
> >>> + u32 val;
> >>> +
> >>> + /*
> >>> + * Every time we measure the temperature, we will power on the
> >>> + * temperature sensor, enable measurements, take a reading,
> >>> + * disable measurements, power off the temperature sensor.
> >>> + */
> >>
> >> Are these sensors used on any hw failsafe mechanism?
> >>
> > No, I do not think so.
>
> OK. Then safe to turn it off right? Another good reason to have a fine
> tuned sampling rate.
>
Yes.
> >
> >>> + regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN);
> >>> + regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP);
> >>> +
> >>> + /*
> >>> + * According to the temp sensor designers, it may require up to ~17us
> >>> + * to complete a measurement. But this timing isn't checked on every
> >>> + * part nor is it specified in the datasheet, so sleeping at least 1ms
> >>> + * should provide plenty of time. Sleeping longer than 1ms is ok so no
> >>> + * need for usleep_range.
> >>> + */
> >>> + msleep(1);
> >>
> >> I know 1ms is usually too short time slice when talking about thermal
> >> monitoring on nowadays processors even, but 17us to 1ms sounds like an
> >> overkill.. Sure you are not hiding other issues?
> >>
> > At least none I'm ware of. I will update the comment and simply use
> > usleep_range in the next post to prove that I'm not hiding other
> > issues :)
>
> OK. It just looks strange that here you need 1ms, but after suspend you
> can afford waiting only 50us. Anything special about the suspend path?
>
Nothing special I think. I'm changing the 1ms here to ~50 us.
<snip>
> >>> + map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "fsl,tempmon");
> >>
> >> Is this MMIO? Sure you want to do regmapped access to something so
> >> simple as io mem r/w?
> >>
> > Yes, MMIO. But it's embedded in some kind of system controller block,
> > call anatop on imx6q, which contains miscellaneous registers for various
> > function blocks. We do not want to have various device drivers iomap
> > the same space multiple times. syscon API which uses regmap was created
> > exactly for such cases, so we use it here.
>
> Then again, I was more on the overhead imposed by regmap. For buses like
> i2c I understand its usage, but MMIO starts to be a stretch.
>
The syscon regmap interface is widely used on Freescale platforms
as well as others to access register bits embedded in this sort of
system controllers. I do not think there is much overhead since it's
just a wrapper of MMIO accessors, and besides we do not have the
register access on hot path anyway in the driver.
Shawn
More information about the linux-arm-kernel
mailing list