Message ID | 1450682876-26725-1-git-send-email-ping.bai@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Eduardo Valentin |
Headers | show |
On Mon, Dec 21, 2015 at 03:27:56PM +0800, Bai Ping wrote: > According to the design team: > > After a thorough accuracy study of the Temp sense circuit,we found that > with our current equation, an average part can read 7 degrees lower than > a known forced temperature. We also found out that the standard variance > was around 2C; which is the tightest distribution that we could create. > We need to change the temp sense equation to center the average > part around the target temperature. > > Old Equation: > > Temp = Troom,cal - slope*(Count measured - Count room fuse) > Where Troom,cal = 25C and Slope = 0.4297157 - (0.0015974 * Count room fuse) > > New Equation: > > Temp = Troom,cal - slope*(Count measured - Count room fuse) +offset > Where Troom,cal = 25C and Slope = 0.4148468 - (0.0015423 * Count room fuse) > Offset = 3.580661 > > Signed-off-by: Bai Ping <ping.bai@nxp.com> > --- > drivers/thermal/imx_thermal.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c > index c5547bd..9fb613e 100644 > --- a/drivers/thermal/imx_thermal.c > +++ b/drivers/thermal/imx_thermal.c > @@ -69,8 +69,9 @@ enum imx_thermal_trip { > #define IMX_PASSIVE_DELAY 1000 > > #define FACTOR0 10000000 > -#define FACTOR1 15976 > -#define FACTOR2 4297157 > +#define FACTOR1 15423 > +#define FACTOR2 4148468 > +#define OFFSET 3580661 > > #define TEMPMON_IMX6Q 1 > #define TEMPMON_IMX6SX 2 > @@ -385,23 +386,26 @@ static int imx_get_sensor_data(struct platform_device *pdev) > * Derived from linear interpolation: > * slope = 0.4297157 - (0.0015976 * 25C fuse) > * slope = (FACTOR2 - FACTOR1 * n1) / FACTOR0 > + * offset = OFFSET / 1000000 > * (Nmeas - n1) / (Tmeas - t1) = slope > * We want to reduce this down to the minimum computation necessary > * for each temperature read. Also, we want Tmeas in millicelsius > * and we don't want to lose precision from integer division. So... > - * Tmeas = (Nmeas - n1) / slope + t1 > - * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 > - * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 > + * Tmeas = (Nmeas - n1) / slope + t1 + offset > + * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 + OFFSET / 1000 > + * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 + OFFSET / 1000 > * Let constant c1 = (-1000 / slope) > - * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 > - * Let constant c2 = n1 *c1 + 1000 * t1 > + * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 + OFFSET / 1000 > + * Let constant c2 = n1 *c1 + 1000 * t1 + OFFSET / 1000 > * milli_Tmeas = c2 - Nmeas * c1 > */ > temp64 = FACTOR0; > temp64 *= 1000; > do_div(temp64, FACTOR1 * n1 - FACTOR2); > data->c1 = temp64; > - data->c2 = n1 * data->c1 + 1000 * t1; > + temp64 = OFFSET; > + do_div(temp64, 1000); > + data->c2 = n1 * data->c1 + 1000 * t1 + temp64; Dear Bai Ping. Can you please get at least on Tested-by response in the mailing list for this patch from one of your co-workers, for example? Meanwhile, a couple of questions: Does this offset work well on all chip distribution? Do we need a different offset for different soc revision ? Is the same offset applicable to IMX6Q and to IMX6SX? I strong recommend you to translate this driver to add of-thermal support. This is more than desirable, specially considering the type of changes you are in a need, such as the one above. This is better described in DT, not in the driver code. > > /* use OTP for thermal grade */ > ret = regmap_read(map, OCOTP_MEM0, &val); > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogRWR1YXJkbyBWYWxlbnRp biBbbWFpbHRvOmVkdWJlenZhbEBnbWFpbC5jb21dDQo+IFNlbnQ6IDIwMTbE6jHUwjHI1SAxOjUx DQo+IFRvOiBQaW5nIEJhaSA8cGluZy5iYWlAbnhwLmNvbT4NCj4gQ2M6IHJ1aS56aGFuZ0BpbnRl bC5jb207IGxpbnV4LXBtQHZnZXIua2VybmVsLm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIXSB0 aGVybWFsOiBpbXg6IHVwZGF0ZSB0aGUgdGVtcGVyYXR1cmUgY2FsaWJyYXRpb24gZGF0YSBmb3IN Cj4gaW14NiBzb2MNCj4gDQo+IE9uIE1vbiwgRGVjIDIxLCAyMDE1IGF0IDAzOjI3OjU2UE0gKzA4 MDAsIEJhaSBQaW5nIHdyb3RlOg0KPiA+IEFjY29yZGluZyB0byB0aGUgZGVzaWduIHRlYW06DQo+ ID4NCj4gPiBBZnRlciBhIHRob3JvdWdoIGFjY3VyYWN5IHN0dWR5IG9mIHRoZSBUZW1wIHNlbnNl IGNpcmN1aXQsd2UgZm91bmQNCj4gPiB0aGF0IHdpdGggb3VyIGN1cnJlbnQgZXF1YXRpb24sIGFu IGF2ZXJhZ2UgcGFydCBjYW4gcmVhZCA3IGRlZ3JlZXMNCj4gPiBsb3dlciB0aGFuIGEga25vd24g Zm9yY2VkIHRlbXBlcmF0dXJlLiBXZSBhbHNvIGZvdW5kIG91dCB0aGF0IHRoZQ0KPiA+IHN0YW5k YXJkIHZhcmlhbmNlIHdhcyBhcm91bmQgMkM7IHdoaWNoIGlzIHRoZSB0aWdodGVzdCBkaXN0cmli dXRpb24gdGhhdCB3ZQ0KPiBjb3VsZCBjcmVhdGUuDQo+ID4gV2UgbmVlZCB0byBjaGFuZ2UgdGhl IHRlbXAgc2Vuc2UgZXF1YXRpb24gdG8gY2VudGVyIHRoZSBhdmVyYWdlIHBhcnQNCj4gPiBhcm91 bmQgdGhlIHRhcmdldCB0ZW1wZXJhdHVyZS4NCj4gPg0KPiA+IE9sZCBFcXVhdGlvbjoNCj4gPg0K PiA+IFRlbXAgPSBUcm9vbSxjYWwgLSBzbG9wZSooQ291bnQgbWVhc3VyZWQgLSBDb3VudCByb29t IGZ1c2UpIFdoZXJlDQo+ID4gVHJvb20sY2FsID0gMjVDIGFuZCBTbG9wZSA9IDAuNDI5NzE1NyAt ICgwLjAwMTU5NzQgKiBDb3VudCByb29tIGZ1c2UpDQo+ID4NCj4gPiBOZXcgRXF1YXRpb246DQo+ ID4NCj4gPiBUZW1wID0gVHJvb20sY2FsIC0gc2xvcGUqKENvdW50IG1lYXN1cmVkIC0gQ291bnQg cm9vbSBmdXNlKSArb2Zmc2V0DQo+ID4gV2hlcmUgVHJvb20sY2FsID0gMjVDIGFuZCBTbG9wZSA9 IDAuNDE0ODQ2OCAtICgwLjAwMTU0MjMgKiBDb3VudCByb29tDQo+ID4gZnVzZSkgT2Zmc2V0ID0g My41ODA2NjENCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6IEJhaSBQaW5nIDxwaW5nLmJhaUBueHAu Y29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYyB8IDIwICsr KysrKysrKysrKy0tLS0tLS0tDQo+ID4gIDEgZmlsZSBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCsp LCA4IGRlbGV0aW9ucygtKQ0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9p bXhfdGhlcm1hbC5jDQo+ID4gYi9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYyBpbmRleCBj NTU0N2JkLi45ZmI2MTNlIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvdGhlcm1hbC9pbXhfdGhl cm1hbC5jDQo+ID4gKysrIGIvZHJpdmVycy90aGVybWFsL2lteF90aGVybWFsLmMNCj4gPiBAQCAt NjksOCArNjksOSBAQCBlbnVtIGlteF90aGVybWFsX3RyaXAgew0KPiA+ICAjZGVmaW5lIElNWF9Q QVNTSVZFX0RFTEFZCQkxMDAwDQo+ID4NCj4gPiAgI2RlZmluZSBGQUNUT1IwCQkJCTEwMDAwMDAw DQo+ID4gLSNkZWZpbmUgRkFDVE9SMQkJCQkxNTk3Ng0KPiA+IC0jZGVmaW5lIEZBQ1RPUjIJCQkJ NDI5NzE1Nw0KPiA+ICsjZGVmaW5lIEZBQ1RPUjEJCQkJMTU0MjMNCj4gPiArI2RlZmluZSBGQUNU T1IyCQkJCTQxNDg0NjgNCj4gPiArI2RlZmluZSBPRkZTRVQJCQkJMzU4MDY2MQ0KPiA+DQo+ID4g ICNkZWZpbmUgVEVNUE1PTl9JTVg2UQkJCTENCj4gPiAgI2RlZmluZSBURU1QTU9OX0lNWDZTWAkJ CTINCj4gPiBAQCAtMzg1LDIzICszODYsMjYgQEAgc3RhdGljIGludCBpbXhfZ2V0X3NlbnNvcl9k YXRhKHN0cnVjdA0KPiBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gIAkgKiBEZXJpdmVkIGZy b20gbGluZWFyIGludGVycG9sYXRpb246DQo+ID4gIAkgKiBzbG9wZSA9IDAuNDI5NzE1NyAtICgw LjAwMTU5NzYgKiAyNUMgZnVzZSkNCj4gPiAgCSAqIHNsb3BlID0gKEZBQ1RPUjIgLSBGQUNUT1Ix ICogbjEpIC8gRkFDVE9SMA0KPiA+ICsJICogb2Zmc2V0ID0gT0ZGU0VUIC8gMTAwMDAwMA0KPiA+ ICAJICogKE5tZWFzIC0gbjEpIC8gKFRtZWFzIC0gdDEpID0gc2xvcGUNCj4gPiAgCSAqIFdlIHdh bnQgdG8gcmVkdWNlIHRoaXMgZG93biB0byB0aGUgbWluaW11bSBjb21wdXRhdGlvbg0KPiBuZWNl c3NhcnkNCj4gPiAgCSAqIGZvciBlYWNoIHRlbXBlcmF0dXJlIHJlYWQuICBBbHNvLCB3ZSB3YW50 IFRtZWFzIGluIG1pbGxpY2Vsc2l1cw0KPiA+ICAJICogYW5kIHdlIGRvbid0IHdhbnQgdG8gbG9z ZSBwcmVjaXNpb24gZnJvbSBpbnRlZ2VyIGRpdmlzaW9uLiBTby4uLg0KPiA+IC0JICogVG1lYXMg PSAoTm1lYXMgLSBuMSkgLyBzbG9wZSArIHQxDQo+ID4gLQkgKiBtaWxsaV9UbWVhcyA9IDEwMDAg KiAoTm1lYXMgLSBuMSkgLyBzbG9wZSArIDEwMDAgKiB0MQ0KPiA+IC0JICogbWlsbGlfVG1lYXMg PSAtMTAwMCAqIChuMSAtIE5tZWFzKSAvIHNsb3BlICsgMTAwMCAqIHQxDQo+ID4gKwkgKiBUbWVh cyA9IChObWVhcyAtIG4xKSAvIHNsb3BlICsgdDEgKyBvZmZzZXQNCj4gPiArCSAqIG1pbGxpX1Rt ZWFzID0gMTAwMCAqIChObWVhcyAtIG4xKSAvIHNsb3BlICsgMTAwMCAqIHQxICsgT0ZGU0VUIC8g MTAwMA0KPiA+ICsJICogbWlsbGlfVG1lYXMgPSAtMTAwMCAqIChuMSAtIE5tZWFzKSAvIHNsb3Bl ICsgMTAwMCAqIHQxICsgT0ZGU0VUIC8NCj4gPiArMTAwMA0KPiA+ICAJICogTGV0IGNvbnN0YW50 IGMxID0gKC0xMDAwIC8gc2xvcGUpDQo+ID4gLQkgKiBtaWxsaV9UbWVhcyA9IChuMSAtIE5tZWFz KSAqIGMxICsgMTAwMCAqIHQxDQo+ID4gLQkgKiBMZXQgY29uc3RhbnQgYzIgPSBuMSAqYzEgKyAx MDAwICogdDENCj4gPiArCSAqIG1pbGxpX1RtZWFzID0gKG4xIC0gTm1lYXMpICogYzEgKyAxMDAw ICogdDEgKyBPRkZTRVQgLyAxMDAwDQo+ID4gKwkgKiBMZXQgY29uc3RhbnQgYzIgPSBuMSAqYzEg KyAxMDAwICogdDEgKyBPRkZTRVQgLyAxMDAwDQo+ID4gIAkgKiBtaWxsaV9UbWVhcyA9IGMyIC0g Tm1lYXMgKiBjMQ0KPiA+ICAJICovDQo+ID4gIAl0ZW1wNjQgPSBGQUNUT1IwOw0KPiA+ICAJdGVt cDY0ICo9IDEwMDA7DQo+ID4gIAlkb19kaXYodGVtcDY0LCBGQUNUT1IxICogbjEgLSBGQUNUT1Iy KTsNCj4gPiAgCWRhdGEtPmMxID0gdGVtcDY0Ow0KPiA+IC0JZGF0YS0+YzIgPSBuMSAqIGRhdGEt PmMxICsgMTAwMCAqIHQxOw0KPiA+ICsJdGVtcDY0ID0gT0ZGU0VUOw0KPiA+ICsJZG9fZGl2KHRl bXA2NCwgMTAwMCk7DQo+ID4gKwlkYXRhLT5jMiA9IG4xICogZGF0YS0+YzEgKyAxMDAwICogdDEg KyB0ZW1wNjQ7DQo+IA0KPiBEZWFyIEJhaSBQaW5nLiBDYW4geW91IHBsZWFzZSBnZXQgYXQgbGVh c3Qgb24gVGVzdGVkLWJ5IHJlc3BvbnNlIGluIHRoZSBtYWlsaW5nDQo+IGxpc3QgZm9yIHRoaXMg cGF0Y2ggZnJvbSBvbmUgb2YgeW91ciBjby13b3JrZXJzLCBmb3IgZXhhbXBsZT8NCkNDOiBGdWNo dWFuIGxpdSwgIGhlIGlzIHJlc3BvbnNpYmxlIGZvciB0ZXN0aW5nIGl0Lg0KPiANCj4gTWVhbndo aWxlLCBhIGNvdXBsZSBvZiBxdWVzdGlvbnM6DQo+IA0KPiBEb2VzIHRoaXMgb2Zmc2V0IHdvcmsg d2VsbCBvbiBhbGwgY2hpcCBkaXN0cmlidXRpb24/DQpZZXMsIHRoaXMgb2Zmc2V0IGlzIGZvciBh bGwgY2hpcCBkaXN0cmlidXRpb24uDQo+IA0KPiBEbyB3ZSBuZWVkIGEgZGlmZmVyZW50IG9mZnNl dCBmb3IgZGlmZmVyZW50IHNvYyByZXZpc2lvbiA/IElzIHRoZSBzYW1lIG9mZnNldA0KPiBhcHBs aWNhYmxlIHRvIElNWDZRIGFuZCB0byBJTVg2U1g/DQpZZXMsIFRoZSBzYW1lIG9mZnNldCBmb3Ig YWxsIGkuTVg2IE9TQy4NCj4gDQo+IEkgc3Ryb25nIHJlY29tbWVuZCB5b3UgdG8gdHJhbnNsYXRl IHRoaXMgZHJpdmVyIHRvIGFkZCBvZi10aGVybWFsIHN1cHBvcnQuIFRoaXMNCj4gaXMgbW9yZSB0 aGFuIGRlc2lyYWJsZSwgc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoZSB0eXBlIG9mIGNoYW5nZXMg eW91IGFyZSBpbiBhDQo+IG5lZWQsIHN1Y2ggYXMgdGhlIG9uZSBhYm92ZS4gVGhpcyBpcyBiZXR0 ZXIgZGVzY3JpYmVkIGluIERULCBub3QgaW4gdGhlIGRyaXZlcg0KPiBjb2RlLg0KeW91IGFyZSBy aWdodCwgdXNpbmcgb2YtdGhlcm1hbCBpcyBhIGJlc3Qgd2F5LCBJIGhhdmUgdHJpZWQgdG8gcmVm YWN0b3IgdGhpcyBkcml2ZXIgdG8NCnN1cHBvcnQgb2YtdGhlcm1hbCwgYnV0IHRoZXJlIGFyZSB0 d28gaXNzdWVzIHRoYXQgYXJlIG5vdCBlYXN5IHRvIHRhY2tsZSwgb25lIGlzDQppbiB0aGUgb3Jp Z2luYWwgZHJpdmVyLCBldmVyeXRpbWUgd2UgbW9kaWZpZWQgdGhlICdwYXNzaXZlJyB0cmlwIHBv aW50IHRlbXAoc2V0X3RyaXBfdGVtcCksDQp3ZSB3aWxsIHVwZGF0ZSB0aGUgaGlnaF9hbGFybSB2 YWx1ZSBjb3JyZXNwb25kaW5nbHksIHVzaW5nICdvZi10aGVybWFsJyBzdXBwb3J0LA0KdGhpcyBm dW5jdGlvbiBzZWVtcyBiZSBicm9rZW4uIEFub3RoZXIgaXNzdWUgaXMgdGhhdCAgVGltIEhhcnZl eSA8dGhhcnZleUBnYXRld29ya3MuY29tPg0KYWRkIHRlbXBlcmF0dXJlIGdyYWRlIGNoZWNrIGlu IGNvbW1pdCBhMjI5MWJhZGMzNTVkNSwgaWYgdXNpbmcgb2YtdGhlcm1hbCwgdGhpcyBwYXJ0IG9m IA0KZnVuY3Rpb24gd2lsbCBiZSBub3QgZWFzeSB0byB0YWNrbGUuIGxvb2sgZm9yd2FyZCB0byB5 b3VyIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucy4NCj4gDQo+IA0KPiA+DQo+ID4gIAkvKiB1c2Ug T1RQIGZvciB0aGVybWFsIGdyYWRlICovDQo+ID4gIAlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE9D T1RQX01FTTAsICZ2YWwpOw0KPiA+IC0tDQo+ID4gMS45LjENCj4gPg0K -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Tested-by: Leo Liu <fuchuan.liu@nxp.com> Best Regards, Leo > -----Original Message----- > From: Ping Bai > Sent: Monday, January 04, 2016 3:33 PM > To: Eduardo Valentin > Cc: rui.zhang@intel.com; linux-pm@vger.kernel.org; Fuchuan Liu; > tharvey@gateworks.com > Subject: RE: [PATCH] thermal: imx: update the temperature calibration data for > imx6 soc > > > > > -----Original Message----- > > From: Eduardo Valentin [mailto:edubezval@gmail.com] > > Sent: 2016?1?1? 1:51 > > To: Ping Bai <ping.bai@nxp.com> > > Cc: rui.zhang@intel.com; linux-pm@vger.kernel.org > > Subject: Re: [PATCH] thermal: imx: update the temperature calibration > > data for > > imx6 soc > > > > On Mon, Dec 21, 2015 at 03:27:56PM +0800, Bai Ping wrote: > > > According to the design team: > > > > > > After a thorough accuracy study of the Temp sense circuit,we found > > > that with our current equation, an average part can read 7 degrees > > > lower than a known forced temperature. We also found out that the > > > standard variance was around 2C; which is the tightest distribution > > > that we > > could create. > > > We need to change the temp sense equation to center the average part > > > around the target temperature. > > > > > > Old Equation: > > > > > > Temp = Troom,cal - slope*(Count measured - Count room fuse) Where > > > Troom,cal = 25C and Slope = 0.4297157 - (0.0015974 * Count room > > > fuse) > > > > > > New Equation: > > > > > > Temp = Troom,cal - slope*(Count measured - Count room fuse) +offset > > > Where Troom,cal = 25C and Slope = 0.4148468 - (0.0015423 * Count > > > room > > > fuse) Offset = 3.580661 > > > > > > Signed-off-by: Bai Ping <ping.bai@nxp.com> > > > --- > > > drivers/thermal/imx_thermal.c | 20 ++++++++++++-------- > > > 1 file changed, 12 insertions(+), 8 deletions(-) > > > > > > diff --git a/drivers/thermal/imx_thermal.c > > > b/drivers/thermal/imx_thermal.c index c5547bd..9fb613e 100644 > > > --- a/drivers/thermal/imx_thermal.c > > > +++ b/drivers/thermal/imx_thermal.c > > > @@ -69,8 +69,9 @@ enum imx_thermal_trip { > > > #define IMX_PASSIVE_DELAY 1000 > > > > > > #define FACTOR0 10000000 > > > -#define FACTOR1 15976 > > > -#define FACTOR2 4297157 > > > +#define FACTOR1 15423 > > > +#define FACTOR2 4148468 > > > +#define OFFSET 3580661 > > > > > > #define TEMPMON_IMX6Q 1 > > > #define TEMPMON_IMX6SX 2 > > > @@ -385,23 +386,26 @@ static int imx_get_sensor_data(struct > > platform_device *pdev) > > > * Derived from linear interpolation: > > > * slope = 0.4297157 - (0.0015976 * 25C fuse) > > > * slope = (FACTOR2 - FACTOR1 * n1) / FACTOR0 > > > + * offset = OFFSET / 1000000 > > > * (Nmeas - n1) / (Tmeas - t1) = slope > > > * We want to reduce this down to the minimum computation > > necessary > > > * for each temperature read. Also, we want Tmeas in millicelsius > > > * and we don't want to lose precision from integer division. So... > > > - * Tmeas = (Nmeas - n1) / slope + t1 > > > - * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 > > > - * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 > > > + * Tmeas = (Nmeas - n1) / slope + t1 + offset > > > + * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 + OFFSET / 1000 > > > + * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 + OFFSET > > > +/ > > > +1000 > > > * Let constant c1 = (-1000 / slope) > > > - * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 > > > - * Let constant c2 = n1 *c1 + 1000 * t1 > > > + * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 + OFFSET / 1000 > > > + * Let constant c2 = n1 *c1 + 1000 * t1 + OFFSET / 1000 > > > * milli_Tmeas = c2 - Nmeas * c1 > > > */ > > > temp64 = FACTOR0; > > > temp64 *= 1000; > > > do_div(temp64, FACTOR1 * n1 - FACTOR2); > > > data->c1 = temp64; > > > - data->c2 = n1 * data->c1 + 1000 * t1; > > > + temp64 = OFFSET; > > > + do_div(temp64, 1000); > > > + data->c2 = n1 * data->c1 + 1000 * t1 + temp64; > > > > Dear Bai Ping. Can you please get at least on Tested-by response in > > the mailing list for this patch from one of your co-workers, for example? > CC: Fuchuan liu, he is responsible for testing it. > > > > Meanwhile, a couple of questions: > > > > Does this offset work well on all chip distribution? > Yes, this offset is for all chip distribution. > > > > Do we need a different offset for different soc revision ? Is the same > > offset applicable to IMX6Q and to IMX6SX? > Yes, The same offset for all i.MX6 OSC. > > > > I strong recommend you to translate this driver to add of-thermal > > support. This is more than desirable, specially considering the type > > of changes you are in a need, such as the one above. This is better > > described in DT, not in the driver code. > you are right, using of-thermal is a best way, I have tried to refactor this driver > to support of-thermal, but there are two issues that are not easy to tackle, one > is in the original driver, everytime we modified the 'passive' trip point > temp(set_trip_temp), we will update the high_alarm value correspondingly, > using 'of-thermal' support, this function seems be broken. Another issue is that > Tim Harvey <tharvey@gateworks.com> add temperature grade check in > commit a2291badc355d5, if using of-thermal, this part of function will be not > easy to tackle. look forward to your comments and suggestions. > > > > > > > > > > /* use OTP for thermal grade */ > > > ret = regmap_read(map, OCOTP_MEM0, &val); > > > -- > > > 1.9.1 > > >
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index c5547bd..9fb613e 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -69,8 +69,9 @@ enum imx_thermal_trip { #define IMX_PASSIVE_DELAY 1000 #define FACTOR0 10000000 -#define FACTOR1 15976 -#define FACTOR2 4297157 +#define FACTOR1 15423 +#define FACTOR2 4148468 +#define OFFSET 3580661 #define TEMPMON_IMX6Q 1 #define TEMPMON_IMX6SX 2 @@ -385,23 +386,26 @@ static int imx_get_sensor_data(struct platform_device *pdev) * Derived from linear interpolation: * slope = 0.4297157 - (0.0015976 * 25C fuse) * slope = (FACTOR2 - FACTOR1 * n1) / FACTOR0 + * offset = OFFSET / 1000000 * (Nmeas - n1) / (Tmeas - t1) = slope * We want to reduce this down to the minimum computation necessary * for each temperature read. Also, we want Tmeas in millicelsius * and we don't want to lose precision from integer division. So... - * Tmeas = (Nmeas - n1) / slope + t1 - * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 - * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 + * Tmeas = (Nmeas - n1) / slope + t1 + offset + * milli_Tmeas = 1000 * (Nmeas - n1) / slope + 1000 * t1 + OFFSET / 1000 + * milli_Tmeas = -1000 * (n1 - Nmeas) / slope + 1000 * t1 + OFFSET / 1000 * Let constant c1 = (-1000 / slope) - * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 - * Let constant c2 = n1 *c1 + 1000 * t1 + * milli_Tmeas = (n1 - Nmeas) * c1 + 1000 * t1 + OFFSET / 1000 + * Let constant c2 = n1 *c1 + 1000 * t1 + OFFSET / 1000 * milli_Tmeas = c2 - Nmeas * c1 */ temp64 = FACTOR0; temp64 *= 1000; do_div(temp64, FACTOR1 * n1 - FACTOR2); data->c1 = temp64; - data->c2 = n1 * data->c1 + 1000 * t1; + temp64 = OFFSET; + do_div(temp64, 1000); + data->c2 = n1 * data->c1 + 1000 * t1 + temp64; /* use OTP for thermal grade */ ret = regmap_read(map, OCOTP_MEM0, &val);
According to the design team: After a thorough accuracy study of the Temp sense circuit,we found that with our current equation, an average part can read 7 degrees lower than a known forced temperature. We also found out that the standard variance was around 2C; which is the tightest distribution that we could create. We need to change the temp sense equation to center the average part around the target temperature. Old Equation: Temp = Troom,cal - slope*(Count measured - Count room fuse) Where Troom,cal = 25C and Slope = 0.4297157 - (0.0015974 * Count room fuse) New Equation: Temp = Troom,cal - slope*(Count measured - Count room fuse) +offset Where Troom,cal = 25C and Slope = 0.4148468 - (0.0015423 * Count room fuse) Offset = 3.580661 Signed-off-by: Bai Ping <ping.bai@nxp.com> --- drivers/thermal/imx_thermal.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)