Message ID | 1387487791-3259-1-git-send-email-b20788@freescale.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Zhang Rui |
Headers | show |
On 19-12-2013 17:16, Anson Huang wrote: > Thermal sensor needs pll3_usb_otg when measuring temperature, > otherwise the temperature read will be incorrect, so need to > enable this clk before sensor working, for alarm function, > as hardware will take measurement periodically, so we should > keep this clk always on once alarm function is enabled. > > Signed-off-by: Anson Huang <b20788@freescale.com> > --- > .../devicetree/bindings/thermal/imx-thermal.txt | 4 ++++ > drivers/thermal/imx_thermal.c | 18 ++++++++++++++++++ > 2 files changed, 22 insertions(+) > > diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.txt b/Documentation/devicetree/bindings/thermal/imx-thermal.txt > index 541c25e..1f0f672 100644 > --- a/Documentation/devicetree/bindings/thermal/imx-thermal.txt > +++ b/Documentation/devicetree/bindings/thermal/imx-thermal.txt > @@ -8,10 +8,14 @@ Required properties: > calibration data, e.g. OCOTP on imx6q. The details about calibration data > can be found in SoC Reference Manual. > > +Optional properties: > +- clocks : thermal sensor's clock source. > + > Example: > > tempmon { > compatible = "fsl,imx6q-tempmon"; > fsl,tempmon = <&anatop>; > fsl,tempmon-data = <&ocotp>; > + clocks = <&clks 172>; > }; > diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c > index 1d6c801..c2b8173 100644 > --- a/drivers/thermal/imx_thermal.c > +++ b/drivers/thermal/imx_thermal.c > @@ -7,6 +7,7 @@ > * > */ > > +#include <linux/clk.h> > #include <linux/cpu_cooling.h> > #include <linux/cpufreq.h> > #include <linux/delay.h> > @@ -73,6 +74,7 @@ struct imx_thermal_data { > unsigned long last_temp; > bool irq_enabled; > int irq; > + struct clk *thermal_clk; > }; > > static void imx_set_alarm_temp(struct imx_thermal_data *data, > @@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev) > return ret; > } > There are several reg writes before this point. Are you sure you won't need this clock for performing those operations? > + data->thermal_clk = devm_clk_get(&pdev->dev, NULL); > + if (IS_ERR(data->thermal_clk)) { > + dev_warn(&pdev->dev, "failed to get thermal clk!\n"); > + } else { > + /* > + * Thermal sensor needs clk on to get correct value, normally > + * we should enable its clk before taking measurement and disable > + * clk after measurement is done, but if alarm function is enabled, > + * hardware will auto measure the temperature periodically, so we > + * need to keep the clk always on for alarm function. > + */ > + ret = clk_prepare_enable(data->thermal_clk); > + if (ret) > + dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret); > + } > + > /* Enable measurements at ~ 10 Hz */ > regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ); > measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */ > Don't you need to release the clock when .remove is called either on driver or device removal? What about suspend / resume path? Do you want to keep this clock on when suspending? Is it gonna work or prevent your system to enter low power states?
DQoNClNlbnQgZnJvbSBBbnNvbidzIGlQaG9uZQ0KDQo+INTaIDIwMTPE6jEy1MIxOcjVo6wyMTox M6OsIkVkdWFyZG8gVmFsZW50aW4iIDxlZHVhcmRvLnZhbGVudGluQHRpLmNvbT4g0LS1wKO6DQo+ IA0KPj4gT24gMTktMTItMjAxMyAxNzoxNiwgQW5zb24gSHVhbmcgd3JvdGU6DQo+PiBUaGVybWFs IHNlbnNvciBuZWVkcyBwbGwzX3VzYl9vdGcgd2hlbiBtZWFzdXJpbmcgdGVtcGVyYXR1cmUsDQo+ PiBvdGhlcndpc2UgdGhlIHRlbXBlcmF0dXJlIHJlYWQgd2lsbCBiZSBpbmNvcnJlY3QsIHNvIG5l ZWQgdG8NCj4+IGVuYWJsZSB0aGlzIGNsayBiZWZvcmUgc2Vuc29yIHdvcmtpbmcsIGZvciBhbGFy bSBmdW5jdGlvbiwNCj4+IGFzIGhhcmR3YXJlIHdpbGwgdGFrZSBtZWFzdXJlbWVudCBwZXJpb2Rp Y2FsbHksIHNvIHdlIHNob3VsZA0KPj4ga2VlcCB0aGlzIGNsayBhbHdheXMgb24gb25jZSBhbGFy bSBmdW5jdGlvbiBpcyBlbmFibGVkLg0KPj4gDQo+PiBTaWduZWQtb2ZmLWJ5OiBBbnNvbiBIdWFu ZyA8YjIwNzg4QGZyZWVzY2FsZS5jb20+DQo+PiAtLS0NCj4+IC4uLi9kZXZpY2V0cmVlL2JpbmRp bmdzL3RoZXJtYWwvaW14LXRoZXJtYWwudHh0ICAgIHwgICAgNCArKysrDQo+PiBkcml2ZXJzL3Ro ZXJtYWwvaW14X3RoZXJtYWwuYyAgICAgICAgICAgICAgICAgICAgICB8ICAgMTggKysrKysrKysr KysrKysrKysrDQo+PiAyIGZpbGVzIGNoYW5nZWQsIDIyIGluc2VydGlvbnMoKykNCj4+IA0KPj4g ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL2lt eC10aGVybWFsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFs L2lteC10aGVybWFsLnR4dA0KPj4gaW5kZXggNTQxYzI1ZS4uMWYwZjY3MiAxMDA2NDQNCj4+IC0t LSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL2lteC10aGVybWFs LnR4dA0KPj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwv aW14LXRoZXJtYWwudHh0DQo+PiBAQCAtOCwxMCArOCwxNCBAQCBSZXF1aXJlZCBwcm9wZXJ0aWVz Og0KPj4gICBjYWxpYnJhdGlvbiBkYXRhLCBlLmcuIE9DT1RQIG9uIGlteDZxLiAgVGhlIGRldGFp bHMgYWJvdXQgY2FsaWJyYXRpb24gZGF0YQ0KPj4gICBjYW4gYmUgZm91bmQgaW4gU29DIFJlZmVy ZW5jZSBNYW51YWwuDQo+PiANCj4+ICtPcHRpb25hbCBwcm9wZXJ0aWVzOg0KPj4gKy0gY2xvY2tz IDogdGhlcm1hbCBzZW5zb3IncyBjbG9jayBzb3VyY2UuDQo+PiArDQo+PiBFeGFtcGxlOg0KPj4g DQo+PiB0ZW1wbW9uIHsNCj4+ICAgIGNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXRlbXBtb24iOw0K Pj4gICAgZnNsLHRlbXBtb24gPSA8JmFuYXRvcD47DQo+PiAgICBmc2wsdGVtcG1vbi1kYXRhID0g PCZvY290cD47DQo+PiArICAgIGNsb2NrcyA9IDwmY2xrcyAxNzI+Ow0KPj4gfTsNCj4+IGRpZmYg LS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9p bXhfdGhlcm1hbC5jDQo+PiBpbmRleCAxZDZjODAxLi5jMmI4MTczIDEwMDY0NA0KPj4gLS0tIGEv ZHJpdmVycy90aGVybWFsL2lteF90aGVybWFsLmMNCj4+ICsrKyBiL2RyaXZlcnMvdGhlcm1hbC9p bXhfdGhlcm1hbC5jDQo+PiBAQCAtNyw2ICs3LDcgQEANCj4+ICAqDQo+PiAgKi8NCj4+IA0KPj4g KyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9jcHVfY29vbGluZy5o Pg0KPj4gI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9kZWxh eS5oPg0KPj4gQEAgLTczLDYgKzc0LDcgQEAgc3RydWN0IGlteF90aGVybWFsX2RhdGEgew0KPj4g ICAgdW5zaWduZWQgbG9uZyBsYXN0X3RlbXA7DQo+PiAgICBib29sIGlycV9lbmFibGVkOw0KPj4g ICAgaW50IGlycTsNCj4+ICsgICAgc3RydWN0IGNsayAqdGhlcm1hbF9jbGs7DQo+PiB9Ow0KPj4g DQo+PiBzdGF0aWMgdm9pZCBpbXhfc2V0X2FsYXJtX3RlbXAoc3RydWN0IGlteF90aGVybWFsX2Rh dGEgKmRhdGEsDQo+PiBAQCAtNDU3LDYgKzQ1OSwyMiBAQCBzdGF0aWMgaW50IGlteF90aGVybWFs X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+PiAgICAgICAgcmV0dXJuIHJl dDsNCj4+ICAgIH0NCj4gDQo+IFRoZXJlIGFyZSBzZXZlcmFsIHJlZyB3cml0ZXMgYmVmb3JlIHRo aXMgcG9pbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd29uJ3QNCj4gbmVlZCB0aGlzIGNsb2NrIGZvciBw ZXJmb3JtaW5nIHRob3NlIG9wZXJhdGlvbnM/DQoNCnRoZXJtYWwgcmVnJ3MgYWNjZXNzIHVzZXMg c3lzdGVtIGlwZyBjbG9jayB3aGljaCBpcyBhbHdheXMgb24sIHNvIG5vIG5lZWQgdG8gZW5hYmxl IGl0LCBhY3R1YWxseSB0aGVyZSBpcyBubyBjbG9jayBnYXRlIGZvciB0aGlzIGlwZyBjbG9jay4N Cj4gDQo+PiArICAgIGRhdGEtPnRoZXJtYWxfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYs IE5VTEwpOw0KPj4gKyAgICBpZiAoSVNfRVJSKGRhdGEtPnRoZXJtYWxfY2xrKSkgew0KPj4gKyAg ICAgICAgZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdGhlcm1hbCBjbGshXG4i KTsNCj4+ICsgICAgfSBlbHNlIHsNCj4+ICsgICAgICAgIC8qDQo+PiArICAgICAgICAgKiBUaGVy bWFsIHNlbnNvciBuZWVkcyBjbGsgb24gdG8gZ2V0IGNvcnJlY3QgdmFsdWUsIG5vcm1hbGx5DQo+ PiArICAgICAgICAgKiB3ZSBzaG91bGQgZW5hYmxlIGl0cyBjbGsgYmVmb3JlIHRha2luZyBtZWFz dXJlbWVudCBhbmQgZGlzYWJsZQ0KPj4gKyAgICAgICAgICogY2xrIGFmdGVyIG1lYXN1cmVtZW50 IGlzIGRvbmUsIGJ1dCBpZiBhbGFybSBmdW5jdGlvbiBpcyBlbmFibGVkLA0KPj4gKyAgICAgICAg ICogaGFyZHdhcmUgd2lsbCBhdXRvIG1lYXN1cmUgdGhlIHRlbXBlcmF0dXJlIHBlcmlvZGljYWxs eSwgc28gd2UNCj4+ICsgICAgICAgICAqIG5lZWQgdG8ga2VlcCB0aGUgY2xrIGFsd2F5cyBvbiBm b3IgYWxhcm0gZnVuY3Rpb24uDQo+PiArICAgICAgICAgKi8NCj4+ICsgICAgICAgIHJldCA9IGNs a19wcmVwYXJlX2VuYWJsZShkYXRhLT50aGVybWFsX2Nsayk7DQo+PiArICAgICAgICBpZiAocmV0 KQ0KPj4gKyAgICAgICAgICAgIGRldl93YXJuKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxl IHRoZXJtYWwgY2xrOiAlZFxuIiwgcmV0KTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gICAgLyogRW5h YmxlIG1lYXN1cmVtZW50cyBhdCB+IDEwIEh6ICovDQo+PiAgICByZWdtYXBfd3JpdGUobWFwLCBU RU1QU0VOU0UxICsgUkVHX0NMUiwgVEVNUFNFTlNFMV9NRUFTVVJFX0ZSRVEpOw0KPj4gICAgbWVh c3VyZV9mcmVxID0gRElWX1JPVU5EX1VQKDMyNzY4LCAxMCk7IC8qIDEwIEh6ICovDQo+IA0KPiBE b24ndCB5b3UgbmVlZCB0byByZWxlYXNlIHRoZSBjbG9jayB3aGVuIC5yZW1vdmUgaXMgY2FsbGVk IGVpdGhlciBvbg0KPiBkcml2ZXIgb3IgZGV2aWNlIHJlbW92YWw/DQoNCnllcywgdGhhbmtzIGZv ciByZW1pbmRlci4NCj4gDQo+IFdoYXQgYWJvdXQgc3VzcGVuZCAvIHJlc3VtZSBwYXRoPyBEbyB5 b3Ugd2FudCB0byBrZWVwIHRoaXMgY2xvY2sgb24gd2hlbg0KPiBzdXNwZW5kaW5nPyBJcyBpdCBn b25uYSB3b3JrIG9yIHByZXZlbnQgeW91ciBzeXN0ZW0gdG8gZW50ZXIgbG93IHBvd2VyDQo+IHN0 YXRlcz8NCg0Kbm8gbmVlZCB0byBkaXNhYmxlIHRoaXMgY2xvY2sgaW4gc3VzcGVuZCwgYXMgQ0NN IHdpbGwgZGlzYWJsZSBhbGwgY2xvY2tzIGFmdGVyIGVudGVyaW5nIHN0b3AgbW9kZS4gdGhlcm1h bCBzZW5zb3Igc2hvdWxkIGJlIHBvd2VyZWQgZG93biBpbiBpdHMgc3VzcGVuZCBmdW5jdGlvbi4g aXQgd2lsbCBub3QgaW1wYWN0IGFueSBsb3cgcG93ZXIgbW9kZSBvZiB0aGVybWFsIHNlbnNvci4N Cg0KQlRXLCBjdXJyZW50IHRoZXJtYWwgZHJpdmVyIHdpbGwgYmxvY2sgc3lzdGVtIHN1c3BlbmQg YXMgaXQgaXMgYWx3YXlzIGJlIHBvd2VyZWQgdXAgYW5kIHN1c3BlbmQgZnVuY3Rpb24gd2lsbCBy ZXR1cm4gZXJyb3IsIEkgd2lsbCBjcmVhdGUgYW5vdGhlciBwYXRjaCB0byBmaXggdGhhdCBsYXRl ci4NCj4gDQo+IA0KPiANCj4gLS0gDQo+IFlvdSBoYXZlIGdvdCB0byBiZSBleGNpdGVkIGFib3V0 IHdoYXQgeW91IGFyZSBkb2luZy4gKEwuIExhbXBvcnQpDQo+IA0KPiBFZHVhcmRvIFZhbGVudGlu DQo+IA0K -- 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
diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.txt b/Documentation/devicetree/bindings/thermal/imx-thermal.txt index 541c25e..1f0f672 100644 --- a/Documentation/devicetree/bindings/thermal/imx-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/imx-thermal.txt @@ -8,10 +8,14 @@ Required properties: calibration data, e.g. OCOTP on imx6q. The details about calibration data can be found in SoC Reference Manual. +Optional properties: +- clocks : thermal sensor's clock source. + Example: tempmon { compatible = "fsl,imx6q-tempmon"; fsl,tempmon = <&anatop>; fsl,tempmon-data = <&ocotp>; + clocks = <&clks 172>; }; diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index 1d6c801..c2b8173 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -7,6 +7,7 @@ * */ +#include <linux/clk.h> #include <linux/cpu_cooling.h> #include <linux/cpufreq.h> #include <linux/delay.h> @@ -73,6 +74,7 @@ struct imx_thermal_data { unsigned long last_temp; bool irq_enabled; int irq; + struct clk *thermal_clk; }; static void imx_set_alarm_temp(struct imx_thermal_data *data, @@ -457,6 +459,22 @@ static int imx_thermal_probe(struct platform_device *pdev) return ret; } + data->thermal_clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(data->thermal_clk)) { + dev_warn(&pdev->dev, "failed to get thermal clk!\n"); + } else { + /* + * Thermal sensor needs clk on to get correct value, normally + * we should enable its clk before taking measurement and disable + * clk after measurement is done, but if alarm function is enabled, + * hardware will auto measure the temperature periodically, so we + * need to keep the clk always on for alarm function. + */ + ret = clk_prepare_enable(data->thermal_clk); + if (ret) + dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret); + } + /* Enable measurements at ~ 10 Hz */ regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ); measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
Thermal sensor needs pll3_usb_otg when measuring temperature, otherwise the temperature read will be incorrect, so need to enable this clk before sensor working, for alarm function, as hardware will take measurement periodically, so we should keep this clk always on once alarm function is enabled. Signed-off-by: Anson Huang <b20788@freescale.com> --- .../devicetree/bindings/thermal/imx-thermal.txt | 4 ++++ drivers/thermal/imx_thermal.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+)