diff mbox

[V3] Thermal: imx: add i.mx6sx thermal support

Message ID 1407309129-5562-1-git-send-email-b20788@freescale.com (mailing list archive)
State Accepted
Delegated to: Eduardo Valentin
Headers show

Commit Message

Anson Huang Aug. 6, 2014, 7:12 a.m. UTC
i.MX6SX has some new features of thermal interrupt function,
there are LOW, HIGH and PANIC irq for thermal sensor, so add
platform data to separate different thermal version;

The reset value of LOW ALARM is 0 which means the highest
temp, so the LOW ALARM will be triggered once irq is enabled,
so we need to correct it before enabling thermal irq;

Enable PANIC ALARM as critical trip point, it will trigger
system reset via SRC module once PANIC IRQ is triggered, it
is pure hardware function, so use it instead of software
reset by cooling device.

Signed-off-by: Anson Huang <b20788@freescale.com>
---
 .../devicetree/bindings/thermal/imx-thermal.txt    |    5 +-
 drivers/thermal/imx_thermal.c                      |   91 +++++++++++++++++---
 2 files changed, 82 insertions(+), 14 deletions(-)

Comments

Eduardo Valentin Aug. 6, 2014, 1:24 p.m. UTC | #1
Hello Anson,

On Wed, Aug 6, 2014 at 3:12 AM, Anson Huang <b20788@freescale.com> wrote:
> i.MX6SX has some new features of thermal interrupt function,
> there are LOW, HIGH and PANIC irq for thermal sensor, so add
> platform data to separate different thermal version;
>
> The reset value of LOW ALARM is 0 which means the highest
> temp, so the LOW ALARM will be triggered once irq is enabled,
> so we need to correct it before enabling thermal irq;
>
> Enable PANIC ALARM as critical trip point, it will trigger
> system reset via SRC module once PANIC IRQ is triggered, it
> is pure hardware function, so use it instead of software
> reset by cooling device.

So far the patch is pretty much better now. Unfortunately, I do not
have a way to test it. Can you please check if some workmate of yours
can do a testing on both hardwares and send his/her tested-by?



>
> Signed-off-by: Anson Huang <b20788@freescale.com>
> ---
>  .../devicetree/bindings/thermal/imx-thermal.txt    |    5 +-
>  drivers/thermal/imx_thermal.c                      |   91 +++++++++++++++++---
>  2 files changed, 82 insertions(+), 14 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.txt b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> index 1f0f672..3c67bd5 100644
> --- a/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> +++ b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> @@ -1,7 +1,10 @@
>  * Temperature Monitor (TEMPMON) on Freescale i.MX SoCs
>
>  Required properties:
> -- compatible : "fsl,imx6q-thermal"
> +- compatible : "fsl,imx6q-tempmon" for i.MX6Q, "fsl,imx6sx-tempmon" for i.MX6SX.
> +  i.MX6SX has two more IRQs than i.MX6Q, one is IRQ_LOW and the other is IRQ_PANIC,
> +  when temperature is below than low threshold, IRQ_LOW will be triggered, when temperature
> +  is higher than panic threshold, system will auto reboot by SRC module.
>  - fsl,tempmon : phandle pointer to system controller that contains TEMPMON
>    control registers, e.g. ANATOP on imx6q.
>  - fsl,tempmon-data : phandle pointer to fuse controller that contains TEMPMON
> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
> index 2c516f2..461bf3d 100644
> --- a/drivers/thermal/imx_thermal.c
> +++ b/drivers/thermal/imx_thermal.c
> @@ -19,6 +19,7 @@
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
> @@ -31,6 +32,11 @@
>
>  #define MISC0                          0x0150
>  #define MISC0_REFTOP_SELBIASOFF                (1 << 3)
> +#define MISC1                          0x0160
> +#define MISC1_IRQ_TEMPHIGH             (1 << 29)
> +/* Below LOW and PANIC bits are only for TEMPMON_IMX6SX */
> +#define MISC1_IRQ_TEMPLOW              (1 << 28)
> +#define MISC1_IRQ_TEMPPANIC            (1 << 27)
>
>  #define TEMPSENSE0                     0x0180
>  #define TEMPSENSE0_ALARM_VALUE_SHIFT   20
> @@ -43,6 +49,12 @@
>
>  #define TEMPSENSE1                     0x0190
>  #define TEMPSENSE1_MEASURE_FREQ                0xffff
> +/* Below TEMPSENSE2 is only for TEMPMON_IMX6SX */
> +#define TEMPSENSE2                     0x0290
> +#define TEMPSENSE2_LOW_VALUE_SHIFT     0
> +#define TEMPSENSE2_LOW_VALUE_MASK      0xfff
> +#define TEMPSENSE2_PANIC_VALUE_SHIFT   16
> +#define TEMPSENSE2_PANIC_VALUE_MASK    0xfff0000
>
>  #define OCOTP_ANA1                     0x04e0
>
> @@ -66,6 +78,21 @@ enum imx_thermal_trip {
>  #define FACTOR1                                15976
>  #define FACTOR2                                4297157
>
> +#define TEMPMON_IMX6Q                  1
> +#define TEMPMON_IMX6SX                 2
> +
> +struct thermal_soc_data {
> +       u32 version;
> +};
> +
> +static struct thermal_soc_data thermal_imx6q_data = {
> +       .version = TEMPMON_IMX6Q,
> +};
> +
> +static struct thermal_soc_data thermal_imx6sx_data = {
> +       .version = TEMPMON_IMX6SX,
> +};
> +
>  struct imx_thermal_data {
>         struct thermal_zone_device *tz;
>         struct thermal_cooling_device *cdev;
> @@ -79,8 +106,21 @@ struct imx_thermal_data {
>         bool irq_enabled;
>         int irq;
>         struct clk *thermal_clk;
> +       const struct thermal_soc_data *socdata;
>  };
>
> +static void imx_set_panic_temp(struct imx_thermal_data *data,
> +                              signed long panic_temp)
> +{
> +       struct regmap *map = data->tempmon;
> +       int critical_value;
> +
> +       critical_value = (data->c2 - panic_temp) / data->c1;
> +       regmap_write(map, TEMPSENSE2 + REG_CLR, TEMPSENSE2_PANIC_VALUE_MASK);
> +       regmap_write(map, TEMPSENSE2 + REG_SET, critical_value <<
> +                       TEMPSENSE2_PANIC_VALUE_SHIFT);
> +}
> +
>  static void imx_set_alarm_temp(struct imx_thermal_data *data,
>                                signed long alarm_temp)
>  {
> @@ -142,13 +182,17 @@ static int imx_get_temp(struct thermal_zone_device *tz, unsigned long *temp)
>         /* See imx_get_sensor_data() for formula derivation */
>         *temp = data->c2 - n_meas * data->c1;
>
> -       /* Update alarm value to next higher trip point */
> -       if (data->alarm_temp == data->temp_passive && *temp >= data->temp_passive)
> -               imx_set_alarm_temp(data, data->temp_critical);
> -       if (data->alarm_temp == data->temp_critical && *temp < data->temp_passive) {
> -               imx_set_alarm_temp(data, data->temp_passive);
> -               dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
> -                       data->alarm_temp / 1000);
> +       /* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
> +       if (data->socdata->version == TEMPMON_IMX6Q) {
> +               if (data->alarm_temp == data->temp_passive &&
> +                       *temp >= data->temp_passive)
> +                       imx_set_alarm_temp(data, data->temp_critical);
> +               if (data->alarm_temp == data->temp_critical &&
> +                       *temp < data->temp_passive) {
> +                       imx_set_alarm_temp(data, data->temp_passive);
> +                       dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
> +                               data->alarm_temp / 1000);
> +               }
>         }
>
>         if (*temp != data->last_temp) {
> @@ -398,8 +442,17 @@ static irqreturn_t imx_thermal_alarm_irq_thread(int irq, void *dev)
>         return IRQ_HANDLED;
>  }
>
> +static const struct of_device_id of_imx_thermal_match[] = {
> +       { .compatible = "fsl,imx6q-tempmon", .data = &thermal_imx6q_data, },
> +       { .compatible = "fsl,imx6sx-tempmon", .data = &thermal_imx6sx_data, },
> +       { /* end */ }
> +};
> +MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
> +
>  static int imx_thermal_probe(struct platform_device *pdev)
>  {
> +       const struct of_device_id *of_id =
> +               of_match_device(of_imx_thermal_match, &pdev->dev);
>         struct imx_thermal_data *data;
>         struct cpumask clip_cpus;
>         struct regmap *map;
> @@ -418,6 +471,20 @@ static int imx_thermal_probe(struct platform_device *pdev)
>         }
>         data->tempmon = map;
>
> +       data->socdata = of_id->data;
> +
> +       /* make sure the IRQ flag is clear before enabling irq on i.MX6SX */
> +       if (data->socdata->version == TEMPMON_IMX6SX) {

A general question on the patch strategy. You have chosen to split the
features per chip version. While this strategy is straight forward,
and one would even say very natural, I would say it is not very
scalable. In case your next chip versions have an overlap in features
with the existing ones, you will make your code a nightmare of ifs per
chip version. One suggestion is, that I have experienced to work with
TI and Samsung chips, to split the code per feature, not per chip
version.

In chis case, you will have a .supports or .features bitfield instead
of a .version. Then you would check if particular feature is present
in the chip you are dealing with, instead of asking for chip version.
What do you think?

> +               regmap_write(map, MISC1 + REG_CLR, MISC1_IRQ_TEMPHIGH |
> +                       MISC1_IRQ_TEMPLOW | MISC1_IRQ_TEMPPANIC);
> +               /*
> +                * reset value of LOW ALARM is incorrect, set it to lowest
> +                * value to avoid false trigger of low alarm.
> +                */
> +               regmap_write(map, TEMPSENSE2 + REG_SET,
> +                       TEMPSENSE2_LOW_VALUE_MASK);
> +       }
> +
>         data->irq = platform_get_irq(pdev, 0);
>         if (data->irq < 0)
>                 return data->irq;
> @@ -489,6 +556,10 @@ static int imx_thermal_probe(struct platform_device *pdev)
>         measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
>         regmap_write(map, TEMPSENSE1 + REG_SET, measure_freq);
>         imx_set_alarm_temp(data, data->temp_passive);
> +
> +       if (data->socdata->version == TEMPMON_IMX6SX)
> +               imx_set_panic_temp(data, data->temp_critical);
> +
>         regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN);
>         regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP);
>
> @@ -550,12 +621,6 @@ static int imx_thermal_resume(struct device *dev)
>  static SIMPLE_DEV_PM_OPS(imx_thermal_pm_ops,
>                          imx_thermal_suspend, imx_thermal_resume);
>
> -static const struct of_device_id of_imx_thermal_match[] = {
> -       { .compatible = "fsl,imx6q-tempmon", },
> -       { /* end */ }
> -};
> -MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
> -
>  static struct platform_driver imx_thermal = {
>         .driver = {
>                 .name   = "imx_thermal",
> --
> 1.7.9.5
>
Anson.Huang@freescale.com Aug. 6, 2014, 1:56 p.m. UTC | #2
SGksIEVkdWFyZG8NCiAgICAgICAgVGhhbmtzIGFnYWluIGZvciByZXZpZXcsIHBsZWFzZSBzZWUg
YmVsb3cgaW4gbGluZXM6DQoNClNlbnQgZnJvbSBteSBpUGFkDQoNCtTaIDIwMTQtOC02o6wyMToy
NKOsImVkdWJlenZhbEBnbWFpbC5jb20iIDxlZHViZXp2YWxAZ21haWwuY29tPiDQtLXAo7oNCg0K
PiBIZWxsbyBBbnNvbiwNCj4gDQo+IE9uIFdlZCwgQXVnIDYsIDIwMTQgYXQgMzoxMiBBTSwgQW5z
b24gSHVhbmcgPGIyMDc4OEBmcmVlc2NhbGUuY29tPiB3cm90ZToNCj4+IGkuTVg2U1ggaGFzIHNv
bWUgbmV3IGZlYXR1cmVzIG9mIHRoZXJtYWwgaW50ZXJydXB0IGZ1bmN0aW9uLA0KPj4gdGhlcmUg
YXJlIExPVywgSElHSCBhbmQgUEFOSUMgaXJxIGZvciB0aGVybWFsIHNlbnNvciwgc28gYWRkDQo+
PiBwbGF0Zm9ybSBkYXRhIHRvIHNlcGFyYXRlIGRpZmZlcmVudCB0aGVybWFsIHZlcnNpb247DQo+
PiANCj4+IFRoZSByZXNldCB2YWx1ZSBvZiBMT1cgQUxBUk0gaXMgMCB3aGljaCBtZWFucyB0aGUg
aGlnaGVzdA0KPj4gdGVtcCwgc28gdGhlIExPVyBBTEFSTSB3aWxsIGJlIHRyaWdnZXJlZCBvbmNl
IGlycSBpcyBlbmFibGVkLA0KPj4gc28gd2UgbmVlZCB0byBjb3JyZWN0IGl0IGJlZm9yZSBlbmFi
bGluZyB0aGVybWFsIGlycTsNCj4+IA0KPj4gRW5hYmxlIFBBTklDIEFMQVJNIGFzIGNyaXRpY2Fs
IHRyaXAgcG9pbnQsIGl0IHdpbGwgdHJpZ2dlcg0KPj4gc3lzdGVtIHJlc2V0IHZpYSBTUkMgbW9k
dWxlIG9uY2UgUEFOSUMgSVJRIGlzIHRyaWdnZXJlZCwgaXQNCj4+IGlzIHB1cmUgaGFyZHdhcmUg
ZnVuY3Rpb24sIHNvIHVzZSBpdCBpbnN0ZWFkIG9mIHNvZnR3YXJlDQo+PiByZXNldCBieSBjb29s
aW5nIGRldmljZS4NCj4gDQo+IFNvIGZhciB0aGUgcGF0Y2ggaXMgcHJldHR5IG11Y2ggYmV0dGVy
IG5vdy4gVW5mb3J0dW5hdGVseSwgSSBkbyBub3QNCj4gaGF2ZSBhIHdheSB0byB0ZXN0IGl0LiBD
YW4geW91IHBsZWFzZSBjaGVjayBpZiBzb21lIHdvcmttYXRlIG9mIHlvdXJzDQo+IGNhbiBkbyBh
IHRlc3Rpbmcgb24gYm90aCBoYXJkd2FyZXMgYW5kIHNlbmQgaGlzL2hlciB0ZXN0ZWQtYnk/DQo+
IA0KSSBoYXZlIHRlc3RlZCBpdCBvbiBpLk1YNlEsIGkuTVg2U0wgYW5kIGkuTVg2U1ggYmVmb3Jl
IHNlbmRpbmcgdGhlDQpwYXRjaCBvdXQgZm9yIHJldmlldywgYnV0IGlmIGl0IGhhcyB0byBiZSBz
b21lb25lIGVsc2UgdG8gdGVzdCB0aGlzIHBhdGNoLA0KSSBjYW4gdHJ5IHRvIGFzayBzb21lb25l
IGVsc2UgdG8gaGVscCB0ZXN0IGl0IGFuZCBzZW5kIHRoZSB0ZXN0ZWQtYnkgbGF0ZXIuDQpEbyB5
b3UgdGhpbmsgaXQgaXMgbmVjZXNzYXJ5LCBhcyBJIHNhdyBvdGhlciB0ZWFtIG1lbWJlcnMgYXJl
IHNvIGJ1c3kNCldpdGggdGhlaXIgdGFza3MsIGxldCBtZSBrbm93IGlmIHlvdSB0aGluayB3ZSBt
dXN0IGFkZCBhIHRlc3RlZC1ieSwgdGhhbmtzLg0KPiANCj4gDQo+PiANCj4+IFNpZ25lZC1vZmYt
Ynk6IEFuc29uIEh1YW5nIDxiMjA3ODhAZnJlZXNjYWxlLmNvbT4NCj4+IC0tLQ0KPj4gLi4uL2Rl
dmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9pbXgtdGhlcm1hbC50eHQgICAgfCAgICA1ICstDQo+
PiBkcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYyAgICAgICAgICAgICAgICAgICAgICB8ICAg
OTEgKysrKysrKysrKysrKysrKystLS0NCj4+IDIgZmlsZXMgY2hhbmdlZCwgODIgaW5zZXJ0aW9u
cygrKSwgMTQgZGVsZXRpb25zKC0pDQo+PiANCj4+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u
L2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9pbXgtdGhlcm1hbC50eHQgYi9Eb2N1bWVudGF0
aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9pbXgtdGhlcm1hbC50eHQNCj4+IGluZGV4
IDFmMGY2NzIuLjNjNjdiZDUgMTAwNjQ0DQo+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRy
ZWUvYmluZGluZ3MvdGhlcm1hbC9pbXgtdGhlcm1hbC50eHQNCj4+ICsrKyBiL0RvY3VtZW50YXRp
b24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL2lteC10aGVybWFsLnR4dA0KPj4gQEAgLTEs
NyArMSwxMCBAQA0KPj4gKiBUZW1wZXJhdHVyZSBNb25pdG9yIChURU1QTU9OKSBvbiBGcmVlc2Nh
bGUgaS5NWCBTb0NzDQo+PiANCj4+IFJlcXVpcmVkIHByb3BlcnRpZXM6DQo+PiAtLSBjb21wYXRp
YmxlIDogImZzbCxpbXg2cS10aGVybWFsIg0KPj4gKy0gY29tcGF0aWJsZSA6ICJmc2wsaW14NnEt
dGVtcG1vbiIgZm9yIGkuTVg2USwgImZzbCxpbXg2c3gtdGVtcG1vbiIgZm9yIGkuTVg2U1guDQo+
PiArICBpLk1YNlNYIGhhcyB0d28gbW9yZSBJUlFzIHRoYW4gaS5NWDZRLCBvbmUgaXMgSVJRX0xP
VyBhbmQgdGhlIG90aGVyIGlzIElSUV9QQU5JQywNCj4+ICsgIHdoZW4gdGVtcGVyYXR1cmUgaXMg
YmVsb3cgdGhhbiBsb3cgdGhyZXNob2xkLCBJUlFfTE9XIHdpbGwgYmUgdHJpZ2dlcmVkLCB3aGVu
IHRlbXBlcmF0dXJlDQo+PiArICBpcyBoaWdoZXIgdGhhbiBwYW5pYyB0aHJlc2hvbGQsIHN5c3Rl
bSB3aWxsIGF1dG8gcmVib290IGJ5IFNSQyBtb2R1bGUuDQo+PiAtIGZzbCx0ZW1wbW9uIDogcGhh
bmRsZSBwb2ludGVyIHRvIHN5c3RlbSBjb250cm9sbGVyIHRoYXQgY29udGFpbnMgVEVNUE1PTg0K
Pj4gICBjb250cm9sIHJlZ2lzdGVycywgZS5nLiBBTkFUT1Agb24gaW14NnEuDQo+PiAtIGZzbCx0
ZW1wbW9uLWRhdGEgOiBwaGFuZGxlIHBvaW50ZXIgdG8gZnVzZSBjb250cm9sbGVyIHRoYXQgY29u
dGFpbnMgVEVNUE1PTg0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9pbXhfdGhlcm1h
bC5jIGIvZHJpdmVycy90aGVybWFsL2lteF90aGVybWFsLmMNCj4+IGluZGV4IDJjNTE2ZjIuLjQ2
MWJmM2QgMTAwNjQ0DQo+PiAtLS0gYS9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYw0KPj4g
KysrIGIvZHJpdmVycy90aGVybWFsL2lteF90aGVybWFsLmMNCj4+IEBAIC0xOSw2ICsxOSw3IEBA
DQo+PiAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPg0KPj4gI2luY2x1ZGUgPGxpbnV4L21v
ZHVsZS5oPg0KPj4gI2luY2x1ZGUgPGxpbnV4L29mLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L29m
X2RldmljZS5oPg0KPj4gI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KPj4gI2lu
Y2x1ZGUgPGxpbnV4L3JlZ21hcC5oPg0KPj4gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCj4+IEBA
IC0zMSw2ICszMiwxMSBAQA0KPj4gDQo+PiAjZGVmaW5lIE1JU0MwICAgICAgICAgICAgICAgICAg
ICAgICAgICAweDAxNTANCj4+ICNkZWZpbmUgTUlTQzBfUkVGVE9QX1NFTEJJQVNPRkYgICAgICAg
ICAgICAgICAgKDEgPDwgMykNCj4+ICsjZGVmaW5lIE1JU0MxICAgICAgICAgICAgICAgICAgICAg
ICAgICAweDAxNjANCj4+ICsjZGVmaW5lIE1JU0MxX0lSUV9URU1QSElHSCAgICAgICAgICAgICAo
MSA8PCAyOSkNCj4+ICsvKiBCZWxvdyBMT1cgYW5kIFBBTklDIGJpdHMgYXJlIG9ubHkgZm9yIFRF
TVBNT05fSU1YNlNYICovDQo+PiArI2RlZmluZSBNSVNDMV9JUlFfVEVNUExPVyAgICAgICAgICAg
ICAgKDEgPDwgMjgpDQo+PiArI2RlZmluZSBNSVNDMV9JUlFfVEVNUFBBTklDICAgICAgICAgICAg
KDEgPDwgMjcpDQo+PiANCj4+ICNkZWZpbmUgVEVNUFNFTlNFMCAgICAgICAgICAgICAgICAgICAg
IDB4MDE4MA0KPj4gI2RlZmluZSBURU1QU0VOU0UwX0FMQVJNX1ZBTFVFX1NISUZUICAgMjANCj4+
IEBAIC00Myw2ICs0OSwxMiBAQA0KPj4gDQo+PiAjZGVmaW5lIFRFTVBTRU5TRTEgICAgICAgICAg
ICAgICAgICAgICAweDAxOTANCj4+ICNkZWZpbmUgVEVNUFNFTlNFMV9NRUFTVVJFX0ZSRVEgICAg
ICAgICAgICAgICAgMHhmZmZmDQo+PiArLyogQmVsb3cgVEVNUFNFTlNFMiBpcyBvbmx5IGZvciBU
RU1QTU9OX0lNWDZTWCAqLw0KPj4gKyNkZWZpbmUgVEVNUFNFTlNFMiAgICAgICAgICAgICAgICAg
ICAgIDB4MDI5MA0KPj4gKyNkZWZpbmUgVEVNUFNFTlNFMl9MT1dfVkFMVUVfU0hJRlQgICAgIDAN
Cj4+ICsjZGVmaW5lIFRFTVBTRU5TRTJfTE9XX1ZBTFVFX01BU0sgICAgICAweGZmZg0KPj4gKyNk
ZWZpbmUgVEVNUFNFTlNFMl9QQU5JQ19WQUxVRV9TSElGVCAgIDE2DQo+PiArI2RlZmluZSBURU1Q
U0VOU0UyX1BBTklDX1ZBTFVFX01BU0sgICAgMHhmZmYwMDAwDQo+PiANCj4+ICNkZWZpbmUgT0NP
VFBfQU5BMSAgICAgICAgICAgICAgICAgICAgIDB4MDRlMA0KPj4gDQo+PiBAQCAtNjYsNiArNzgs
MjEgQEAgZW51bSBpbXhfdGhlcm1hbF90cmlwIHsNCj4+ICNkZWZpbmUgRkFDVE9SMSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgMTU5NzYNCj4+ICNkZWZpbmUgRkFDVE9SMiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgNDI5NzE1Nw0KPj4gDQo+PiArI2RlZmluZSBURU1QTU9O
X0lNWDZRICAgICAgICAgICAgICAgICAgMQ0KPj4gKyNkZWZpbmUgVEVNUE1PTl9JTVg2U1ggICAg
ICAgICAgICAgICAgIDINCj4+ICsNCj4+ICtzdHJ1Y3QgdGhlcm1hbF9zb2NfZGF0YSB7DQo+PiAr
ICAgICAgIHUzMiB2ZXJzaW9uOw0KPj4gK307DQo+PiArDQo+PiArc3RhdGljIHN0cnVjdCB0aGVy
bWFsX3NvY19kYXRhIHRoZXJtYWxfaW14NnFfZGF0YSA9IHsNCj4+ICsgICAgICAgLnZlcnNpb24g
PSBURU1QTU9OX0lNWDZRLA0KPj4gK307DQo+PiArDQo+PiArc3RhdGljIHN0cnVjdCB0aGVybWFs
X3NvY19kYXRhIHRoZXJtYWxfaW14NnN4X2RhdGEgPSB7DQo+PiArICAgICAgIC52ZXJzaW9uID0g
VEVNUE1PTl9JTVg2U1gsDQo+PiArfTsNCj4+ICsNCj4+IHN0cnVjdCBpbXhfdGhlcm1hbF9kYXRh
IHsNCj4+ICAgICAgICBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHo7DQo+PiAgICAgICAg
c3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7DQo+PiBAQCAtNzksOCArMTA2LDIx
IEBAIHN0cnVjdCBpbXhfdGhlcm1hbF9kYXRhIHsNCj4+ICAgICAgICBib29sIGlycV9lbmFibGVk
Ow0KPj4gICAgICAgIGludCBpcnE7DQo+PiAgICAgICAgc3RydWN0IGNsayAqdGhlcm1hbF9jbGs7
DQo+PiArICAgICAgIGNvbnN0IHN0cnVjdCB0aGVybWFsX3NvY19kYXRhICpzb2NkYXRhOw0KPj4g
fTsNCj4+IA0KPj4gK3N0YXRpYyB2b2lkIGlteF9zZXRfcGFuaWNfdGVtcChzdHJ1Y3QgaW14X3Ro
ZXJtYWxfZGF0YSAqZGF0YSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdu
ZWQgbG9uZyBwYW5pY190ZW1wKQ0KPj4gK3sNCj4+ICsgICAgICAgc3RydWN0IHJlZ21hcCAqbWFw
ID0gZGF0YS0+dGVtcG1vbjsNCj4+ICsgICAgICAgaW50IGNyaXRpY2FsX3ZhbHVlOw0KPj4gKw0K
Pj4gKyAgICAgICBjcml0aWNhbF92YWx1ZSA9IChkYXRhLT5jMiAtIHBhbmljX3RlbXApIC8gZGF0
YS0+YzE7DQo+PiArICAgICAgIHJlZ21hcF93cml0ZShtYXAsIFRFTVBTRU5TRTIgKyBSRUdfQ0xS
LCBURU1QU0VOU0UyX1BBTklDX1ZBTFVFX01BU0spOw0KPj4gKyAgICAgICByZWdtYXBfd3JpdGUo
bWFwLCBURU1QU0VOU0UyICsgUkVHX1NFVCwgY3JpdGljYWxfdmFsdWUgPDwNCj4+ICsgICAgICAg
ICAgICAgICAgICAgICAgIFRFTVBTRU5TRTJfUEFOSUNfVkFMVUVfU0hJRlQpOw0KPj4gK30NCj4+
ICsNCj4+IHN0YXRpYyB2b2lkIGlteF9zZXRfYWxhcm1fdGVtcChzdHJ1Y3QgaW14X3RoZXJtYWxf
ZGF0YSAqZGF0YSwNCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBsb25n
IGFsYXJtX3RlbXApDQo+PiB7DQo+PiBAQCAtMTQyLDEzICsxODIsMTcgQEAgc3RhdGljIGludCBp
bXhfZ2V0X3RlbXAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6LCB1bnNpZ25lZCBsb25n
ICp0ZW1wKQ0KPj4gICAgICAgIC8qIFNlZSBpbXhfZ2V0X3NlbnNvcl9kYXRhKCkgZm9yIGZvcm11
bGEgZGVyaXZhdGlvbiAqLw0KPj4gICAgICAgICp0ZW1wID0gZGF0YS0+YzIgLSBuX21lYXMgKiBk
YXRhLT5jMTsNCj4+IA0KPj4gLSAgICAgICAvKiBVcGRhdGUgYWxhcm0gdmFsdWUgdG8gbmV4dCBo
aWdoZXIgdHJpcCBwb2ludCAqLw0KPj4gLSAgICAgICBpZiAoZGF0YS0+YWxhcm1fdGVtcCA9PSBk
YXRhLT50ZW1wX3Bhc3NpdmUgJiYgKnRlbXAgPj0gZGF0YS0+dGVtcF9wYXNzaXZlKQ0KPj4gLSAg
ICAgICAgICAgICAgIGlteF9zZXRfYWxhcm1fdGVtcChkYXRhLCBkYXRhLT50ZW1wX2NyaXRpY2Fs
KTsNCj4+IC0gICAgICAgaWYgKGRhdGEtPmFsYXJtX3RlbXAgPT0gZGF0YS0+dGVtcF9jcml0aWNh
bCAmJiAqdGVtcCA8IGRhdGEtPnRlbXBfcGFzc2l2ZSkgew0KPj4gLSAgICAgICAgICAgICAgIGlt
eF9zZXRfYWxhcm1fdGVtcChkYXRhLCBkYXRhLT50ZW1wX3Bhc3NpdmUpOw0KPj4gLSAgICAgICAg
ICAgICAgIGRldl9kYmcoJnR6LT5kZXZpY2UsICJ0aGVybWFsIGFsYXJtIG9mZjogVCA8ICVsdVxu
IiwNCj4+IC0gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmFsYXJtX3RlbXAgLyAxMDAwKTsN
Cj4+ICsgICAgICAgLyogVXBkYXRlIGFsYXJtIHZhbHVlIHRvIG5leHQgaGlnaGVyIHRyaXAgcG9p
bnQgZm9yIFRFTVBNT05fSU1YNlEgKi8NCj4+ICsgICAgICAgaWYgKGRhdGEtPnNvY2RhdGEtPnZl
cnNpb24gPT0gVEVNUE1PTl9JTVg2USkgew0KPj4gKyAgICAgICAgICAgICAgIGlmIChkYXRhLT5h
bGFybV90ZW1wID09IGRhdGEtPnRlbXBfcGFzc2l2ZSAmJg0KPj4gKyAgICAgICAgICAgICAgICAg
ICAgICAgKnRlbXAgPj0gZGF0YS0+dGVtcF9wYXNzaXZlKQ0KPj4gKyAgICAgICAgICAgICAgICAg
ICAgICAgaW14X3NldF9hbGFybV90ZW1wKGRhdGEsIGRhdGEtPnRlbXBfY3JpdGljYWwpOw0KPj4g
KyAgICAgICAgICAgICAgIGlmIChkYXRhLT5hbGFybV90ZW1wID09IGRhdGEtPnRlbXBfY3JpdGlj
YWwgJiYNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICp0ZW1wIDwgZGF0YS0+dGVtcF9wYXNz
aXZlKSB7DQo+PiArICAgICAgICAgICAgICAgICAgICAgICBpbXhfc2V0X2FsYXJtX3RlbXAoZGF0
YSwgZGF0YS0+dGVtcF9wYXNzaXZlKTsNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGRldl9k
YmcoJnR6LT5kZXZpY2UsICJ0aGVybWFsIGFsYXJtIG9mZjogVCA8ICVsdVxuIiwNCj4+ICsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+YWxhcm1fdGVtcCAvIDEwMDApOw0KPj4g
KyAgICAgICAgICAgICAgIH0NCj4+ICAgICAgICB9DQo+PiANCj4+ICAgICAgICBpZiAoKnRlbXAg
IT0gZGF0YS0+bGFzdF90ZW1wKSB7DQo+PiBAQCAtMzk4LDggKzQ0MiwxNyBAQCBzdGF0aWMgaXJx
cmV0dXJuX3QgaW14X3RoZXJtYWxfYWxhcm1faXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYp
DQo+PiAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KPj4gfQ0KPj4gDQo+PiArc3RhdGljIGNv
bnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfaW14X3RoZXJtYWxfbWF0Y2hbXSA9IHsNCj4+ICsg
ICAgICAgeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdGVtcG1vbiIsIC5kYXRhID0gJnRoZXJt
YWxfaW14NnFfZGF0YSwgfSwNCj4+ICsgICAgICAgeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnN4
LXRlbXBtb24iLCAuZGF0YSA9ICZ0aGVybWFsX2lteDZzeF9kYXRhLCB9LA0KPj4gKyAgICAgICB7
IC8qIGVuZCAqLyB9DQo+PiArfTsNCj4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9pbXhf
dGhlcm1hbF9tYXRjaCk7DQo+PiArDQo+PiBzdGF0aWMgaW50IGlteF90aGVybWFsX3Byb2JlKHN0
cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+PiB7DQo+PiArICAgICAgIGNvbnN0IHN0cnVj
dCBvZl9kZXZpY2VfaWQgKm9mX2lkID0NCj4+ICsgICAgICAgICAgICAgICBvZl9tYXRjaF9kZXZp
Y2Uob2ZfaW14X3RoZXJtYWxfbWF0Y2gsICZwZGV2LT5kZXYpOw0KPj4gICAgICAgIHN0cnVjdCBp
bXhfdGhlcm1hbF9kYXRhICpkYXRhOw0KPj4gICAgICAgIHN0cnVjdCBjcHVtYXNrIGNsaXBfY3B1
czsNCj4+ICAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXA7DQo+PiBAQCAtNDE4LDYgKzQ3MSwyMCBA
QCBzdGF0aWMgaW50IGlteF90aGVybWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk
ZXYpDQo+PiAgICAgICAgfQ0KPj4gICAgICAgIGRhdGEtPnRlbXBtb24gPSBtYXA7DQo+PiANCj4+
ICsgICAgICAgZGF0YS0+c29jZGF0YSA9IG9mX2lkLT5kYXRhOw0KPj4gKw0KPj4gKyAgICAgICAv
KiBtYWtlIHN1cmUgdGhlIElSUSBmbGFnIGlzIGNsZWFyIGJlZm9yZSBlbmFibGluZyBpcnEgb24g
aS5NWDZTWCAqLw0KPj4gKyAgICAgICBpZiAoZGF0YS0+c29jZGF0YS0+dmVyc2lvbiA9PSBURU1Q
TU9OX0lNWDZTWCkgew0KPiANCj4gQSBnZW5lcmFsIHF1ZXN0aW9uIG9uIHRoZSBwYXRjaCBzdHJh
dGVneS4gWW91IGhhdmUgY2hvc2VuIHRvIHNwbGl0IHRoZQ0KPiBmZWF0dXJlcyBwZXIgY2hpcCB2
ZXJzaW9uLiBXaGlsZSB0aGlzIHN0cmF0ZWd5IGlzIHN0cmFpZ2h0IGZvcndhcmQsDQo+IGFuZCBv
bmUgd291bGQgZXZlbiBzYXkgdmVyeSBuYXR1cmFsLCBJIHdvdWxkIHNheSBpdCBpcyBub3QgdmVy
eQ0KPiBzY2FsYWJsZS4gSW4gY2FzZSB5b3VyIG5leHQgY2hpcCB2ZXJzaW9ucyBoYXZlIGFuIG92
ZXJsYXAgaW4gZmVhdHVyZXMNCj4gd2l0aCB0aGUgZXhpc3Rpbmcgb25lcywgeW91IHdpbGwgbWFr
ZSB5b3VyIGNvZGUgYSBuaWdodG1hcmUgb2YgaWZzIHBlcg0KPiBjaGlwIHZlcnNpb24uIE9uZSBz
dWdnZXN0aW9uIGlzLCB0aGF0IEkgaGF2ZSBleHBlcmllbmNlZCB0byB3b3JrIHdpdGgNCj4gVEkg
YW5kIFNhbXN1bmcgY2hpcHMsIHRvIHNwbGl0IHRoZSBjb2RlIHBlciBmZWF0dXJlLCBub3QgcGVy
IGNoaXANCj4gdmVyc2lvbi4NCj4gDQo+IEluIGNoaXMgY2FzZSwgeW91IHdpbGwgaGF2ZSBhIC5z
dXBwb3J0cyBvciAuZmVhdHVyZXMgYml0ZmllbGQgaW5zdGVhZA0KPiBvZiBhIC52ZXJzaW9uLiBU
aGVuIHlvdSB3b3VsZCBjaGVjayBpZiBwYXJ0aWN1bGFyIGZlYXR1cmUgaXMgcHJlc2VudA0KPiBp
biB0aGUgY2hpcCB5b3UgYXJlIGRlYWxpbmcgd2l0aCwgaW5zdGVhZCBvZiBhc2tpbmcgZm9yIGNo
aXAgdmVyc2lvbi4NCj4gV2hhdCBkbyB5b3UgdGhpbms/DQoNClRoYW5rIHlvdSB2ZXJ5IG11Y2gg
Zm9yIHNoYXJpbmcgZXhwZXJpZW5jZSBvbiBzdWNoIHNjZW5hcmlvLiBJIHRoaW5rDQplaXRoZXIg
d2F5IGlzIE9LIGZvciB0aGlzIGNhc2UsIGFzIHRoaXMgbmV3IGZlYXR1cmUgb24gaS5NWDZTWCBp
cyBhbiBwdXJlDQppbXByb3ZlbWVudCBvbiB0aGlzIHRoZXJtYWwgSVAgYmFzZWQgb24gb3VyIHN1
Z2dlc3Rpb24gdG8gaGFyZHdhcmUgZGVzaWduDQp0ZWFtLEkgYmVsaWV2ZSBhbGwgdGhlIG5leHQg
Y2hpcHMgd2lsbA0KcmV1c2UgaS5NWDZTWCdzIHRoZXJtYWwgSVAsIGJ1dCBOT1Qgc2VsZWN0IHNv
bWUgb3ZlcmxhcCBmZWF0dXJlcyBvbg0KaS5NWDZTWCBhbmQgaS5NWDZRLiBUaGF0IGlzIHdoeSBJ
IG5hbWVkIGl0IGFzIGEgVjEgYW5kIFYyIGZvciB0aGlzDQp0aGVybWFsIHNlbnNvciBJUCBiZWZv
cmUuIERvIHlvdSB0aGluayBpdCBpcyBPSyB0byBqdXN0IGxlYXZlIGl0IHVzaW5nIHZlcnNpb24s
DQpvciBpZiB5b3UgdGhpbmsgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGUgd2F5IHlvdSByZWNvbW1l
bmRlZCwgSSBjYW4gdHJ5IGl0LCBidXQNCnRvIGJlIGhvbmVzdCwgSSB0aGluayB1c2luZyB2ZXJz
aW9uIHNob3VsZCBiZSBPSyBmb3IgdGhpcyBjYXNlLg0KPiANCj4+ICsgICAgICAgICAgICAgICBy
ZWdtYXBfd3JpdGUobWFwLCBNSVNDMSArIFJFR19DTFIsIE1JU0MxX0lSUV9URU1QSElHSCB8DQo+
PiArICAgICAgICAgICAgICAgICAgICAgICBNSVNDMV9JUlFfVEVNUExPVyB8IE1JU0MxX0lSUV9U
RU1QUEFOSUMpOw0KPj4gKyAgICAgICAgICAgICAgIC8qDQo+PiArICAgICAgICAgICAgICAgICog
cmVzZXQgdmFsdWUgb2YgTE9XIEFMQVJNIGlzIGluY29ycmVjdCwgc2V0IGl0IHRvIGxvd2VzdA0K
Pj4gKyAgICAgICAgICAgICAgICAqIHZhbHVlIHRvIGF2b2lkIGZhbHNlIHRyaWdnZXIgb2YgbG93
IGFsYXJtLg0KPj4gKyAgICAgICAgICAgICAgICAqLw0KPj4gKyAgICAgICAgICAgICAgIHJlZ21h
cF93cml0ZShtYXAsIFRFTVBTRU5TRTIgKyBSRUdfU0VULA0KPj4gKyAgICAgICAgICAgICAgICAg
ICAgICAgVEVNUFNFTlNFMl9MT1dfVkFMVUVfTUFTSyk7DQo+PiArICAgICAgIH0NCj4+ICsNCj4+
ICAgICAgICBkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOw0KPj4gICAgICAg
IGlmIChkYXRhLT5pcnEgPCAwKQ0KPj4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEtPmlycTsN
Cj4+IEBAIC00ODksNiArNTU2LDEwIEBAIHN0YXRpYyBpbnQgaW14X3RoZXJtYWxfcHJvYmUoc3Ry
dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4+ICAgICAgICBtZWFzdXJlX2ZyZXEgPSBESVZf
Uk9VTkRfVVAoMzI3NjgsIDEwKTsgLyogMTAgSHogKi8NCj4+ICAgICAgICByZWdtYXBfd3JpdGUo
bWFwLCBURU1QU0VOU0UxICsgUkVHX1NFVCwgbWVhc3VyZV9mcmVxKTsNCj4+ICAgICAgICBpbXhf
c2V0X2FsYXJtX3RlbXAoZGF0YSwgZGF0YS0+dGVtcF9wYXNzaXZlKTsNCj4+ICsNCj4+ICsgICAg
ICAgaWYgKGRhdGEtPnNvY2RhdGEtPnZlcnNpb24gPT0gVEVNUE1PTl9JTVg2U1gpDQo+PiArICAg
ICAgICAgICAgICAgaW14X3NldF9wYW5pY190ZW1wKGRhdGEsIGRhdGEtPnRlbXBfY3JpdGljYWwp
Ow0KPj4gKw0KPj4gICAgICAgIHJlZ21hcF93cml0ZShtYXAsIFRFTVBTRU5TRTAgKyBSRUdfQ0xS
LCBURU1QU0VOU0UwX1BPV0VSX0RPV04pOw0KPj4gICAgICAgIHJlZ21hcF93cml0ZShtYXAsIFRF
TVBTRU5TRTAgKyBSRUdfU0VULCBURU1QU0VOU0UwX01FQVNVUkVfVEVNUCk7DQo+PiANCj4+IEBA
IC01NTAsMTIgKzYyMSw2IEBAIHN0YXRpYyBpbnQgaW14X3RoZXJtYWxfcmVzdW1lKHN0cnVjdCBk
ZXZpY2UgKmRldikNCj4+IHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhpbXhfdGhlcm1hbF9wbV9v
cHMsDQo+PiAgICAgICAgICAgICAgICAgICAgICAgICBpbXhfdGhlcm1hbF9zdXNwZW5kLCBpbXhf
dGhlcm1hbF9yZXN1bWUpOw0KPj4gDQo+PiAtc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf
aWQgb2ZfaW14X3RoZXJtYWxfbWF0Y2hbXSA9IHsNCj4+IC0gICAgICAgeyAuY29tcGF0aWJsZSA9
ICJmc2wsaW14NnEtdGVtcG1vbiIsIH0sDQo+PiAtICAgICAgIHsgLyogZW5kICovIH0NCj4+IC19
Ow0KPj4gLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2lteF90aGVybWFsX21hdGNoKTsNCj4+
IC0NCj4+IHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlteF90aGVybWFsID0gew0KPj4g
ICAgICAgIC5kcml2ZXIgPSB7DQo+PiAgICAgICAgICAgICAgICAubmFtZSAgID0gImlteF90aGVy
bWFsIiwNCj4+IC0tDQo+PiAxLjcuOS41DQo+PiANCj4gDQo+IA0KPiANCj4gLS0gDQo+IEVkdWFy
ZG8gQmV6ZXJyYSBWYWxlbnRpbg0K
--
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
Shawn Guo Aug. 7, 2014, 8:50 a.m. UTC | #3
On Wed, Aug 06, 2014 at 03:12:09PM +0800, Anson Huang wrote:
> i.MX6SX has some new features of thermal interrupt function,
> there are LOW, HIGH and PANIC irq for thermal sensor, so add
> platform data to separate different thermal version;
> 
> The reset value of LOW ALARM is 0 which means the highest
> temp, so the LOW ALARM will be triggered once irq is enabled,
> so we need to correct it before enabling thermal irq;
> 
> Enable PANIC ALARM as critical trip point, it will trigger
> system reset via SRC module once PANIC IRQ is triggered, it
> is pure hardware function, so use it instead of software
> reset by cooling device.
> 
> Signed-off-by: Anson Huang <b20788@freescale.com>

Tested-by: Shawn Guo <shawn.guo@linaro.org>
--
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
Eduardo Valentin Aug. 8, 2014, 12:15 p.m. UTC | #4
Hello Shawn,

On Thu, Aug 7, 2014 at 4:50 AM, Shawn Guo <shawn.guo@linaro.org> wrote:
> On Wed, Aug 06, 2014 at 03:12:09PM +0800, Anson Huang wrote:
>> i.MX6SX has some new features of thermal interrupt function,
>> there are LOW, HIGH and PANIC irq for thermal sensor, so add
>> platform data to separate different thermal version;
>>
>> The reset value of LOW ALARM is 0 which means the highest
>> temp, so the LOW ALARM will be triggered once irq is enabled,
>> so we need to correct it before enabling thermal irq;
>>
>> Enable PANIC ALARM as critical trip point, it will trigger
>> system reset via SRC module once PANIC IRQ is triggered, it
>> is pure hardware function, so use it instead of software
>> reset by cooling device.
>>
>> Signed-off-by: Anson Huang <b20788@freescale.com>
>
> Tested-by: Shawn Guo <shawn.guo@linaro.org>

Thanks!

Did you have the chance to test on both? i.MX6Q and i.MX6SX?
Shawn Guo Aug. 9, 2014, 1:25 p.m. UTC | #5
On Fri, Aug 08, 2014 at 08:15:54AM -0400, edubezval@gmail.com wrote:
> Hello Shawn,
> 
> On Thu, Aug 7, 2014 at 4:50 AM, Shawn Guo <shawn.guo@linaro.org> wrote:
> > On Wed, Aug 06, 2014 at 03:12:09PM +0800, Anson Huang wrote:
> >> i.MX6SX has some new features of thermal interrupt function,
> >> there are LOW, HIGH and PANIC irq for thermal sensor, so add
> >> platform data to separate different thermal version;
> >>
> >> The reset value of LOW ALARM is 0 which means the highest
> >> temp, so the LOW ALARM will be triggered once irq is enabled,
> >> so we need to correct it before enabling thermal irq;
> >>
> >> Enable PANIC ALARM as critical trip point, it will trigger
> >> system reset via SRC module once PANIC IRQ is triggered, it
> >> is pure hardware function, so use it instead of software
> >> reset by cooling device.
> >>
> >> Signed-off-by: Anson Huang <b20788@freescale.com>
> >
> > Tested-by: Shawn Guo <shawn.guo@linaro.org>
> 
> Thanks!
> 
> Did you have the chance to test on both? i.MX6Q and i.MX6SX?

Yes, I did test on both i.MX6Q and i.MX6SX.

Shawn
--
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
Eduardo Valentin Aug. 9, 2014, 2:29 p.m. UTC | #6
Hello Anson,

On Wed, Aug 06, 2014 at 03:12:09PM +0800, Anson Huang wrote:
> i.MX6SX has some new features of thermal interrupt function,
> there are LOW, HIGH and PANIC irq for thermal sensor, so add
> platform data to separate different thermal version;
> 
> The reset value of LOW ALARM is 0 which means the highest
> temp, so the LOW ALARM will be triggered once irq is enabled,
> so we need to correct it before enabling thermal irq;
> 
> Enable PANIC ALARM as critical trip point, it will trigger
> system reset via SRC module once PANIC IRQ is triggered, it
> is pure hardware function, so use it instead of software
> reset by cooling device.
> 
> Signed-off-by: Anson Huang <b20788@freescale.com>
> ---

Pulled. Thanks.

>  .../devicetree/bindings/thermal/imx-thermal.txt    |    5 +-
>  drivers/thermal/imx_thermal.c                      |   91 +++++++++++++++++---
>  2 files changed, 82 insertions(+), 14 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.txt b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> index 1f0f672..3c67bd5 100644
> --- a/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> +++ b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
> @@ -1,7 +1,10 @@
>  * Temperature Monitor (TEMPMON) on Freescale i.MX SoCs
>  
>  Required properties:
> -- compatible : "fsl,imx6q-thermal"
> +- compatible : "fsl,imx6q-tempmon" for i.MX6Q, "fsl,imx6sx-tempmon" for i.MX6SX.
> +  i.MX6SX has two more IRQs than i.MX6Q, one is IRQ_LOW and the other is IRQ_PANIC,
> +  when temperature is below than low threshold, IRQ_LOW will be triggered, when temperature
> +  is higher than panic threshold, system will auto reboot by SRC module.
>  - fsl,tempmon : phandle pointer to system controller that contains TEMPMON
>    control registers, e.g. ANATOP on imx6q.
>  - fsl,tempmon-data : phandle pointer to fuse controller that contains TEMPMON
> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
> index 2c516f2..461bf3d 100644
> --- a/drivers/thermal/imx_thermal.c
> +++ b/drivers/thermal/imx_thermal.c
> @@ -19,6 +19,7 @@
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
> @@ -31,6 +32,11 @@
>  
>  #define MISC0				0x0150
>  #define MISC0_REFTOP_SELBIASOFF		(1 << 3)
> +#define MISC1				0x0160
> +#define MISC1_IRQ_TEMPHIGH		(1 << 29)
> +/* Below LOW and PANIC bits are only for TEMPMON_IMX6SX */
> +#define MISC1_IRQ_TEMPLOW		(1 << 28)
> +#define MISC1_IRQ_TEMPPANIC		(1 << 27)
>  
>  #define TEMPSENSE0			0x0180
>  #define TEMPSENSE0_ALARM_VALUE_SHIFT	20
> @@ -43,6 +49,12 @@
>  
>  #define TEMPSENSE1			0x0190
>  #define TEMPSENSE1_MEASURE_FREQ		0xffff
> +/* Below TEMPSENSE2 is only for TEMPMON_IMX6SX */
> +#define TEMPSENSE2			0x0290
> +#define TEMPSENSE2_LOW_VALUE_SHIFT	0
> +#define TEMPSENSE2_LOW_VALUE_MASK	0xfff
> +#define TEMPSENSE2_PANIC_VALUE_SHIFT	16
> +#define TEMPSENSE2_PANIC_VALUE_MASK	0xfff0000
>  
>  #define OCOTP_ANA1			0x04e0
>  
> @@ -66,6 +78,21 @@ enum imx_thermal_trip {
>  #define FACTOR1				15976
>  #define FACTOR2				4297157
>  
> +#define TEMPMON_IMX6Q			1
> +#define TEMPMON_IMX6SX			2
> +
> +struct thermal_soc_data {
> +	u32 version;
> +};
> +
> +static struct thermal_soc_data thermal_imx6q_data = {
> +	.version = TEMPMON_IMX6Q,
> +};
> +
> +static struct thermal_soc_data thermal_imx6sx_data = {
> +	.version = TEMPMON_IMX6SX,
> +};
> +
>  struct imx_thermal_data {
>  	struct thermal_zone_device *tz;
>  	struct thermal_cooling_device *cdev;
> @@ -79,8 +106,21 @@ struct imx_thermal_data {
>  	bool irq_enabled;
>  	int irq;
>  	struct clk *thermal_clk;
> +	const struct thermal_soc_data *socdata;
>  };
>  
> +static void imx_set_panic_temp(struct imx_thermal_data *data,
> +			       signed long panic_temp)
> +{
> +	struct regmap *map = data->tempmon;
> +	int critical_value;
> +
> +	critical_value = (data->c2 - panic_temp) / data->c1;
> +	regmap_write(map, TEMPSENSE2 + REG_CLR, TEMPSENSE2_PANIC_VALUE_MASK);
> +	regmap_write(map, TEMPSENSE2 + REG_SET, critical_value <<
> +			TEMPSENSE2_PANIC_VALUE_SHIFT);
> +}
> +
>  static void imx_set_alarm_temp(struct imx_thermal_data *data,
>  			       signed long alarm_temp)
>  {
> @@ -142,13 +182,17 @@ static int imx_get_temp(struct thermal_zone_device *tz, unsigned long *temp)
>  	/* See imx_get_sensor_data() for formula derivation */
>  	*temp = data->c2 - n_meas * data->c1;
>  
> -	/* Update alarm value to next higher trip point */
> -	if (data->alarm_temp == data->temp_passive && *temp >= data->temp_passive)
> -		imx_set_alarm_temp(data, data->temp_critical);
> -	if (data->alarm_temp == data->temp_critical && *temp < data->temp_passive) {
> -		imx_set_alarm_temp(data, data->temp_passive);
> -		dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
> -			data->alarm_temp / 1000);
> +	/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
> +	if (data->socdata->version == TEMPMON_IMX6Q) {
> +		if (data->alarm_temp == data->temp_passive &&
> +			*temp >= data->temp_passive)
> +			imx_set_alarm_temp(data, data->temp_critical);
> +		if (data->alarm_temp == data->temp_critical &&
> +			*temp < data->temp_passive) {
> +			imx_set_alarm_temp(data, data->temp_passive);
> +			dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
> +				data->alarm_temp / 1000);
> +		}
>  	}
>  
>  	if (*temp != data->last_temp) {
> @@ -398,8 +442,17 @@ static irqreturn_t imx_thermal_alarm_irq_thread(int irq, void *dev)
>  	return IRQ_HANDLED;
>  }
>  
> +static const struct of_device_id of_imx_thermal_match[] = {
> +	{ .compatible = "fsl,imx6q-tempmon", .data = &thermal_imx6q_data, },
> +	{ .compatible = "fsl,imx6sx-tempmon", .data = &thermal_imx6sx_data, },
> +	{ /* end */ }
> +};
> +MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
> +
>  static int imx_thermal_probe(struct platform_device *pdev)
>  {
> +	const struct of_device_id *of_id =
> +		of_match_device(of_imx_thermal_match, &pdev->dev);
>  	struct imx_thermal_data *data;
>  	struct cpumask clip_cpus;
>  	struct regmap *map;
> @@ -418,6 +471,20 @@ static int imx_thermal_probe(struct platform_device *pdev)
>  	}
>  	data->tempmon = map;
>  
> +	data->socdata = of_id->data;
> +
> +	/* make sure the IRQ flag is clear before enabling irq on i.MX6SX */
> +	if (data->socdata->version == TEMPMON_IMX6SX) {
> +		regmap_write(map, MISC1 + REG_CLR, MISC1_IRQ_TEMPHIGH |
> +			MISC1_IRQ_TEMPLOW | MISC1_IRQ_TEMPPANIC);
> +		/*
> +		 * reset value of LOW ALARM is incorrect, set it to lowest
> +		 * value to avoid false trigger of low alarm.
> +		 */
> +		regmap_write(map, TEMPSENSE2 + REG_SET,
> +			TEMPSENSE2_LOW_VALUE_MASK);
> +	}
> +
>  	data->irq = platform_get_irq(pdev, 0);
>  	if (data->irq < 0)
>  		return data->irq;
> @@ -489,6 +556,10 @@ static int imx_thermal_probe(struct platform_device *pdev)
>  	measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
>  	regmap_write(map, TEMPSENSE1 + REG_SET, measure_freq);
>  	imx_set_alarm_temp(data, data->temp_passive);
> +
> +	if (data->socdata->version == TEMPMON_IMX6SX)
> +		imx_set_panic_temp(data, data->temp_critical);
> +
>  	regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN);
>  	regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP);
>  
> @@ -550,12 +621,6 @@ static int imx_thermal_resume(struct device *dev)
>  static SIMPLE_DEV_PM_OPS(imx_thermal_pm_ops,
>  			 imx_thermal_suspend, imx_thermal_resume);
>  
> -static const struct of_device_id of_imx_thermal_match[] = {
> -	{ .compatible = "fsl,imx6q-tempmon", },
> -	{ /* end */ }
> -};
> -MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
> -
>  static struct platform_driver imx_thermal = {
>  	.driver = {
>  		.name	= "imx_thermal",
> -- 
> 1.7.9.5
> 
--
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 mbox

Patch

diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.txt b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
index 1f0f672..3c67bd5 100644
--- a/Documentation/devicetree/bindings/thermal/imx-thermal.txt
+++ b/Documentation/devicetree/bindings/thermal/imx-thermal.txt
@@ -1,7 +1,10 @@ 
 * Temperature Monitor (TEMPMON) on Freescale i.MX SoCs
 
 Required properties:
-- compatible : "fsl,imx6q-thermal"
+- compatible : "fsl,imx6q-tempmon" for i.MX6Q, "fsl,imx6sx-tempmon" for i.MX6SX.
+  i.MX6SX has two more IRQs than i.MX6Q, one is IRQ_LOW and the other is IRQ_PANIC,
+  when temperature is below than low threshold, IRQ_LOW will be triggered, when temperature
+  is higher than panic threshold, system will auto reboot by SRC module.
 - fsl,tempmon : phandle pointer to system controller that contains TEMPMON
   control registers, e.g. ANATOP on imx6q.
 - fsl,tempmon-data : phandle pointer to fuse controller that contains TEMPMON
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 2c516f2..461bf3d 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -19,6 +19,7 @@ 
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
@@ -31,6 +32,11 @@ 
 
 #define MISC0				0x0150
 #define MISC0_REFTOP_SELBIASOFF		(1 << 3)
+#define MISC1				0x0160
+#define MISC1_IRQ_TEMPHIGH		(1 << 29)
+/* Below LOW and PANIC bits are only for TEMPMON_IMX6SX */
+#define MISC1_IRQ_TEMPLOW		(1 << 28)
+#define MISC1_IRQ_TEMPPANIC		(1 << 27)
 
 #define TEMPSENSE0			0x0180
 #define TEMPSENSE0_ALARM_VALUE_SHIFT	20
@@ -43,6 +49,12 @@ 
 
 #define TEMPSENSE1			0x0190
 #define TEMPSENSE1_MEASURE_FREQ		0xffff
+/* Below TEMPSENSE2 is only for TEMPMON_IMX6SX */
+#define TEMPSENSE2			0x0290
+#define TEMPSENSE2_LOW_VALUE_SHIFT	0
+#define TEMPSENSE2_LOW_VALUE_MASK	0xfff
+#define TEMPSENSE2_PANIC_VALUE_SHIFT	16
+#define TEMPSENSE2_PANIC_VALUE_MASK	0xfff0000
 
 #define OCOTP_ANA1			0x04e0
 
@@ -66,6 +78,21 @@  enum imx_thermal_trip {
 #define FACTOR1				15976
 #define FACTOR2				4297157
 
+#define TEMPMON_IMX6Q			1
+#define TEMPMON_IMX6SX			2
+
+struct thermal_soc_data {
+	u32 version;
+};
+
+static struct thermal_soc_data thermal_imx6q_data = {
+	.version = TEMPMON_IMX6Q,
+};
+
+static struct thermal_soc_data thermal_imx6sx_data = {
+	.version = TEMPMON_IMX6SX,
+};
+
 struct imx_thermal_data {
 	struct thermal_zone_device *tz;
 	struct thermal_cooling_device *cdev;
@@ -79,8 +106,21 @@  struct imx_thermal_data {
 	bool irq_enabled;
 	int irq;
 	struct clk *thermal_clk;
+	const struct thermal_soc_data *socdata;
 };
 
+static void imx_set_panic_temp(struct imx_thermal_data *data,
+			       signed long panic_temp)
+{
+	struct regmap *map = data->tempmon;
+	int critical_value;
+
+	critical_value = (data->c2 - panic_temp) / data->c1;
+	regmap_write(map, TEMPSENSE2 + REG_CLR, TEMPSENSE2_PANIC_VALUE_MASK);
+	regmap_write(map, TEMPSENSE2 + REG_SET, critical_value <<
+			TEMPSENSE2_PANIC_VALUE_SHIFT);
+}
+
 static void imx_set_alarm_temp(struct imx_thermal_data *data,
 			       signed long alarm_temp)
 {
@@ -142,13 +182,17 @@  static int imx_get_temp(struct thermal_zone_device *tz, unsigned long *temp)
 	/* See imx_get_sensor_data() for formula derivation */
 	*temp = data->c2 - n_meas * data->c1;
 
-	/* Update alarm value to next higher trip point */
-	if (data->alarm_temp == data->temp_passive && *temp >= data->temp_passive)
-		imx_set_alarm_temp(data, data->temp_critical);
-	if (data->alarm_temp == data->temp_critical && *temp < data->temp_passive) {
-		imx_set_alarm_temp(data, data->temp_passive);
-		dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
-			data->alarm_temp / 1000);
+	/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
+	if (data->socdata->version == TEMPMON_IMX6Q) {
+		if (data->alarm_temp == data->temp_passive &&
+			*temp >= data->temp_passive)
+			imx_set_alarm_temp(data, data->temp_critical);
+		if (data->alarm_temp == data->temp_critical &&
+			*temp < data->temp_passive) {
+			imx_set_alarm_temp(data, data->temp_passive);
+			dev_dbg(&tz->device, "thermal alarm off: T < %lu\n",
+				data->alarm_temp / 1000);
+		}
 	}
 
 	if (*temp != data->last_temp) {
@@ -398,8 +442,17 @@  static irqreturn_t imx_thermal_alarm_irq_thread(int irq, void *dev)
 	return IRQ_HANDLED;
 }
 
+static const struct of_device_id of_imx_thermal_match[] = {
+	{ .compatible = "fsl,imx6q-tempmon", .data = &thermal_imx6q_data, },
+	{ .compatible = "fsl,imx6sx-tempmon", .data = &thermal_imx6sx_data, },
+	{ /* end */ }
+};
+MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
+
 static int imx_thermal_probe(struct platform_device *pdev)
 {
+	const struct of_device_id *of_id =
+		of_match_device(of_imx_thermal_match, &pdev->dev);
 	struct imx_thermal_data *data;
 	struct cpumask clip_cpus;
 	struct regmap *map;
@@ -418,6 +471,20 @@  static int imx_thermal_probe(struct platform_device *pdev)
 	}
 	data->tempmon = map;
 
+	data->socdata = of_id->data;
+
+	/* make sure the IRQ flag is clear before enabling irq on i.MX6SX */
+	if (data->socdata->version == TEMPMON_IMX6SX) {
+		regmap_write(map, MISC1 + REG_CLR, MISC1_IRQ_TEMPHIGH |
+			MISC1_IRQ_TEMPLOW | MISC1_IRQ_TEMPPANIC);
+		/*
+		 * reset value of LOW ALARM is incorrect, set it to lowest
+		 * value to avoid false trigger of low alarm.
+		 */
+		regmap_write(map, TEMPSENSE2 + REG_SET,
+			TEMPSENSE2_LOW_VALUE_MASK);
+	}
+
 	data->irq = platform_get_irq(pdev, 0);
 	if (data->irq < 0)
 		return data->irq;
@@ -489,6 +556,10 @@  static int imx_thermal_probe(struct platform_device *pdev)
 	measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
 	regmap_write(map, TEMPSENSE1 + REG_SET, measure_freq);
 	imx_set_alarm_temp(data, data->temp_passive);
+
+	if (data->socdata->version == TEMPMON_IMX6SX)
+		imx_set_panic_temp(data, data->temp_critical);
+
 	regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN);
 	regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP);
 
@@ -550,12 +621,6 @@  static int imx_thermal_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(imx_thermal_pm_ops,
 			 imx_thermal_suspend, imx_thermal_resume);
 
-static const struct of_device_id of_imx_thermal_match[] = {
-	{ .compatible = "fsl,imx6q-tempmon", },
-	{ /* end */ }
-};
-MODULE_DEVICE_TABLE(of, of_imx_thermal_match);
-
 static struct platform_driver imx_thermal = {
 	.driver = {
 		.name	= "imx_thermal",