aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch
diff options
context:
space:
mode:
authorYangbo Lu <yangbo.lu@nxp.com>2020-04-10 10:47:05 +0800
committerPetr Štetiar <ynezz@true.cz>2020-05-07 12:53:06 +0200
commitcddd4591404fb4c53dc0b3c0b15b942cdbed4356 (patch)
tree392c1179de46b0f804e3789edca19069b64e6b44 /target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch
parentd1d2c0b5579ea4f69a42246c9318539d61ba1999 (diff)
downloadupstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.gz
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.bz2
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.zip
layerscape: add patches-5.4
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release which was tagged LSDK-20.04-V5.4. https://source.codeaurora.org/external/qoriq/qoriq-components/linux/ For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in LSDK, port the dts patches from 4.14. The patches are sorted into the following categories: 301-arch-xxxx 302-dts-xxxx 303-core-xxxx 701-net-xxxx 801-audio-xxxx 802-can-xxxx 803-clock-xxxx 804-crypto-xxxx 805-display-xxxx 806-dma-xxxx 807-gpio-xxxx 808-i2c-xxxx 809-jailhouse-xxxx 810-keys-xxxx 811-kvm-xxxx 812-pcie-xxxx 813-pm-xxxx 814-qe-xxxx 815-sata-xxxx 816-sdhc-xxxx 817-spi-xxxx 818-thermal-xxxx 819-uart-xxxx 820-usb-xxxx 821-vfio-xxxx Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch211
1 files changed, 211 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch b/target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch
new file mode 100644
index 0000000000..5dbf3ec455
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/818-thermal-0003-thermal-qoriq-add-thermal-monitor-unit-version-2-sup.patch
@@ -0,0 +1,211 @@
+From 031573a8a1e73b0ac548812c10c3e426c2b4ce61 Mon Sep 17 00:00:00 2001
+From: Yuantian Tang <andy.tang@nxp.com>
+Date: Tue, 15 Oct 2019 20:08:58 +0800
+Subject: [PATCH] thermal: qoriq: add thermal monitor unit version 2 support
+
+Thermal Monitor Unit v2 is introduced on new Layscape SoC.
+Compared to v1, TMUv2 has a little different register layout
+and digital output is fairly linear.
+
+Signed-off-by: Yuantian Tang <andy.tang@nxp.com>
+Reviewed-by: Anson Huang <Anson.Huang@nxp.com>
+---
+ drivers/thermal/qoriq_thermal.c | 118 ++++++++++++++++++++++++++++++++--------
+ 1 file changed, 96 insertions(+), 22 deletions(-)
+
+--- a/drivers/thermal/qoriq_thermal.c
++++ b/drivers/thermal/qoriq_thermal.c
+@@ -16,6 +16,15 @@
+
+ #define SITES_MAX 16
+ #define TMU_TEMP_PASSIVE_COOL_DELTA 10000
++#define TMR_DISABLE 0x0
++#define TMR_ME 0x80000000
++#define TMR_ALPF 0x0c000000
++#define TMR_ALPF_V2 0x03000000
++#define TMTMIR_DEFAULT 0x0000000f
++#define TIER_DISABLE 0x0
++#define TEUMR0_V2 0x51009c00
++#define TMU_VER1 0x1
++#define TMU_VER2 0x2
+
+ /*
+ * QorIQ TMU Registers
+@@ -26,17 +35,12 @@ struct qoriq_tmu_site_regs {
+ u8 res0[0x8];
+ };
+
+-struct qoriq_tmu_regs {
++struct qoriq_tmu_regs_v1 {
+ u32 tmr; /* Mode Register */
+-#define TMR_DISABLE 0x0
+-#define TMR_ME 0x80000000
+-#define TMR_ALPF 0x0c000000
+ u32 tsr; /* Status Register */
+ u32 tmtmir; /* Temperature measurement interval Register */
+-#define TMTMIR_DEFAULT 0x0000000f
+ u8 res0[0x14];
+ u32 tier; /* Interrupt Enable Register */
+-#define TIER_DISABLE 0x0
+ u32 tidr; /* Interrupt Detect Register */
+ u32 tiscr; /* Interrupt Site Capture Register */
+ u32 ticscr; /* Interrupt Critical Site Capture Register */
+@@ -56,12 +60,52 @@ struct qoriq_tmu_regs {
+ u32 ipbrr0; /* IP Block Revision Register 0 */
+ u32 ipbrr1; /* IP Block Revision Register 1 */
+ u8 res6[0x310];
+- u32 ttr0cr; /* Temperature Range 0 Control Register */
+- u32 ttr1cr; /* Temperature Range 1 Control Register */
+- u32 ttr2cr; /* Temperature Range 2 Control Register */
+- u32 ttr3cr; /* Temperature Range 3 Control Register */
++ u32 ttrcr[4]; /* Temperature Range Control Register */
+ };
+
++struct qoriq_tmu_regs_v2 {
++ u32 tmr; /* Mode Register */
++ u32 tsr; /* Status Register */
++ u32 tmsr; /* monitor site register */
++ u32 tmtmir; /* Temperature measurement interval Register */
++ u8 res0[0x10];
++ u32 tier; /* Interrupt Enable Register */
++ u32 tidr; /* Interrupt Detect Register */
++ u8 res1[0x8];
++ u32 tiiscr; /* interrupt immediate site capture register */
++ u32 tiascr; /* interrupt average site capture register */
++ u32 ticscr; /* Interrupt Critical Site Capture Register */
++ u32 res2;
++ u32 tmhtcr; /* monitor high temperature capture register */
++ u32 tmltcr; /* monitor low temperature capture register */
++ u32 tmrtrcr; /* monitor rising temperature rate capture register */
++ u32 tmftrcr; /* monitor falling temperature rate capture register */
++ u32 tmhtitr; /* High Temperature Immediate Threshold */
++ u32 tmhtatr; /* High Temperature Average Threshold */
++ u32 tmhtactr; /* High Temperature Average Crit Threshold */
++ u32 res3;
++ u32 tmltitr; /* monitor low temperature immediate threshold */
++ u32 tmltatr; /* monitor low temperature average threshold register */
++ u32 tmltactr; /* monitor low temperature average critical threshold */
++ u32 res4;
++ u32 tmrtrctr; /* monitor rising temperature rate critical threshold */
++ u32 tmftrctr; /* monitor falling temperature rate critical threshold*/
++ u8 res5[0x8];
++ u32 ttcfgr; /* Temperature Configuration Register */
++ u32 tscfgr; /* Sensor Configuration Register */
++ u8 res6[0x78];
++ struct qoriq_tmu_site_regs site[SITES_MAX];
++ u8 res7[0x9f8];
++ u32 ipbrr0; /* IP Block Revision Register 0 */
++ u32 ipbrr1; /* IP Block Revision Register 1 */
++ u8 res8[0x300];
++ u32 teumr0;
++ u32 teumr1;
++ u32 teumr2;
++ u32 res9;
++ u32 ttrcr[4]; /* Temperature Range Control Register */
++ };
++
+ struct qoriq_tmu_data;
+
+ /*
+@@ -77,7 +121,9 @@ struct qoriq_sensor {
+ };
+
+ struct qoriq_tmu_data {
+- struct qoriq_tmu_regs __iomem *regs;
++ int ver;
++ struct qoriq_tmu_regs_v1 __iomem *regs;
++ struct qoriq_tmu_regs_v2 __iomem *regs_v2;
+ struct clk *clk;
+ bool little_endian;
+ struct qoriq_sensor *sensor[SITES_MAX];
+@@ -210,12 +256,23 @@ static int qoriq_tmu_register_tmu_zone(s
+ qdata->sensor[id]->temp_critical = trip[1].temperature;
+ }
+
+- sites |= 0x1 << (15 - id);
++ if (qdata->ver == TMU_VER1)
++ sites |= 0x1 << (15 - id);
++ else
++ sites |= 0x1 << id;
+ }
+
+ /* Enable monitoring */
+- if (sites != 0)
+- tmu_write(qdata, sites | TMR_ME | TMR_ALPF, &qdata->regs->tmr);
++ if (sites != 0) {
++ if (qdata->ver == TMU_VER1) {
++ tmu_write(qdata, sites | TMR_ME | TMR_ALPF,
++ &qdata->regs->tmr);
++ } else {
++ tmu_write(qdata, sites, &qdata->regs_v2->tmsr);
++ tmu_write(qdata, TMR_ME | TMR_ALPF_V2,
++ &qdata->regs_v2->tmr);
++ }
++ }
+
+ return 0;
+ }
+@@ -228,16 +285,21 @@ static int qoriq_tmu_calibration(struct
+ struct device_node *np = pdev->dev.of_node;
+ struct qoriq_tmu_data *data = platform_get_drvdata(pdev);
+
+- if (of_property_read_u32_array(np, "fsl,tmu-range", range, 4)) {
+- dev_err(&pdev->dev, "missing calibration range.\n");
+- return -ENODEV;
++ len = of_property_count_u32_elems(np, "fsl,tmu-range");
++ if (len < 0 || len > 4) {
++ dev_err(&pdev->dev, "invalid range data.\n");
++ return len;
++ }
++
++ val = of_property_read_u32_array(np, "fsl,tmu-range", range, len);
++ if (val != 0) {
++ dev_err(&pdev->dev, "failed to read range data.\n");
++ return val;
+ }
+
+ /* Init temperature range registers */
+- tmu_write(data, range[0], &data->regs->ttr0cr);
+- tmu_write(data, range[1], &data->regs->ttr1cr);
+- tmu_write(data, range[2], &data->regs->ttr2cr);
+- tmu_write(data, range[3], &data->regs->ttr3cr);
++ for (i = 0; i < len; i++)
++ tmu_write(data, range[i], &data->regs->ttrcr[i]);
+
+ calibration = of_get_property(np, "fsl,tmu-calibration", &len);
+ if (calibration == NULL || len % 8) {
+@@ -261,7 +323,12 @@ static void qoriq_tmu_init_device(struct
+ tmu_write(data, TIER_DISABLE, &data->regs->tier);
+
+ /* Set update_interval */
+- tmu_write(data, TMTMIR_DEFAULT, &data->regs->tmtmir);
++ if (data->ver == TMU_VER1) {
++ tmu_write(data, TMTMIR_DEFAULT, &data->regs->tmtmir);
++ } else {
++ tmu_write(data, TMTMIR_DEFAULT, &data->regs_v2->tmtmir);
++ tmu_write(data, TEUMR0_V2, &data->regs_v2->teumr0);
++ }
+
+ /* Disable monitoring */
+ tmu_write(data, TMR_DISABLE, &data->regs->tmr);
+@@ -270,6 +337,7 @@ static void qoriq_tmu_init_device(struct
+ static int qoriq_tmu_probe(struct platform_device *pdev)
+ {
+ int ret;
++ u32 ver;
+ struct qoriq_tmu_data *data;
+ struct device_node *np = pdev->dev.of_node;
+
+@@ -298,6 +366,12 @@ static int qoriq_tmu_probe(struct platfo
+ return ret;
+ }
+
++ /* version register offset at: 0xbf8 on both v1 and v2 */
++ ver = tmu_read(data, &data->regs->ipbrr0);
++ data->ver = (ver >> 8) & 0xff;
++ if (data->ver == TMU_VER2)
++ data->regs_v2 = (void __iomem *)data->regs;
++
+ qoriq_tmu_init_device(data); /* TMU initialization */
+
+ ret = qoriq_tmu_calibration(pdev); /* TMU calibration */