diff options
24 files changed, 649 insertions, 907 deletions
diff --git a/Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt b/Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt index 0b887440e08a..3fd21bb7cb37 100644 --- a/Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt +++ b/Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt | |||
| @@ -2,14 +2,17 @@ Marvell Armada AP806 System Controller | |||
| 2 | ====================================== | 2 | ====================================== |
| 3 | 3 | ||
| 4 | The AP806 is one of the two core HW blocks of the Marvell Armada 7K/8K | 4 | The AP806 is one of the two core HW blocks of the Marvell Armada 7K/8K |
| 5 | SoCs. It contains a system controller, which provides a number | 5 | SoCs. It contains system controllers, which provide several registers |
| 6 | registers giving access to numerous features: clocks, pin-muxing and | 6 | giving access to numerous features: clocks, pin-muxing and many other |
| 7 | many other SoC configuration items. This DT binding allows to describe | 7 | SoC configuration items. This DT binding allows to describe these |
| 8 | this system controller. | 8 | system controllers. |
| 9 | 9 | ||
| 10 | For the top level node: | 10 | For the top level node: |
| 11 | - compatible: must be: "syscon", "simple-mfd"; | 11 | - compatible: must be: "syscon", "simple-mfd"; |
| 12 | - reg: register area of the AP806 system controller | 12 | - reg: register area of the AP806 system controller |
| 13 | |||
| 14 | SYSTEM CONTROLLER 0 | ||
| 15 | =================== | ||
| 13 | 16 | ||
| 14 | Clocks: | 17 | Clocks: |
| 15 | ------- | 18 | ------- |
| @@ -98,3 +101,38 @@ ap_syscon: system-controller@6f4000 { | |||
| 98 | gpio-ranges = <&ap_pinctrl 0 0 19>; | 101 | gpio-ranges = <&ap_pinctrl 0 0 19>; |
| 99 | }; | 102 | }; |
| 100 | }; | 103 | }; |
| 104 | |||
| 105 | SYSTEM CONTROLLER 1 | ||
| 106 | =================== | ||
| 107 | |||
| 108 | Thermal: | ||
| 109 | -------- | ||
| 110 | |||
| 111 | For common binding part and usage, refer to | ||
| 112 | Documentation/devicetree/bindings/thermal/thermal.txt | ||
| 113 | |||
| 114 | The thermal IP can probe the temperature all around the processor. It | ||
| 115 | may feature several channels, each of them wired to one sensor. | ||
| 116 | |||
| 117 | Required properties: | ||
| 118 | - compatible: must be one of: | ||
| 119 | * marvell,armada-ap806-thermal | ||
| 120 | - reg: register range associated with the thermal functions. | ||
| 121 | |||
| 122 | Optional properties: | ||
| 123 | - #thermal-sensor-cells: shall be <1> when thermal-zones subnodes refer | ||
| 124 | to this IP and represents the channel ID. There is one sensor per | ||
| 125 | channel. O refers to the thermal IP internal channel, while positive | ||
| 126 | IDs refer to each CPU. | ||
| 127 | |||
| 128 | Example: | ||
| 129 | ap_syscon1: system-controller@6f8000 { | ||
| 130 | compatible = "syscon", "simple-mfd"; | ||
| 131 | reg = <0x6f8000 0x1000>; | ||
| 132 | |||
| 133 | ap_thermal: thermal-sensor@80 { | ||
| 134 | compatible = "marvell,armada-ap806-thermal"; | ||
| 135 | reg = <0x80 0x10>; | ||
| 136 | #thermal-sensor-cells = <1>; | ||
| 137 | }; | ||
| 138 | }; | ||
diff --git a/Documentation/devicetree/bindings/arm/marvell/cp110-system-controller0.txt b/Documentation/devicetree/bindings/arm/marvell/cp110-system-controller.txt index 29cdbae6c5ac..81ce742d2760 100644 --- a/Documentation/devicetree/bindings/arm/marvell/cp110-system-controller0.txt +++ b/Documentation/devicetree/bindings/arm/marvell/cp110-system-controller.txt | |||
| @@ -1,15 +1,18 @@ | |||
| 1 | Marvell Armada CP110 System Controller 0 | 1 | Marvell Armada CP110 System Controller |
| 2 | ======================================== | 2 | ====================================== |
| 3 | 3 | ||
| 4 | The CP110 is one of the two core HW blocks of the Marvell Armada 7K/8K | 4 | The CP110 is one of the two core HW blocks of the Marvell Armada 7K/8K |
| 5 | SoCs. It contains two sets of system control registers, System | 5 | SoCs. It contains system controllers, which provide several registers |
| 6 | Controller 0 and System Controller 1. This Device Tree binding allows | 6 | giving access to numerous features: clocks, pin-muxing and many other |
| 7 | to describe the first system controller, which provides registers to | 7 | SoC configuration items. This DT binding allows to describe these |
| 8 | configure various aspects of the SoC. | 8 | system controllers. |
| 9 | 9 | ||
| 10 | For the top level node: | 10 | For the top level node: |
| 11 | - compatible: must be: "syscon", "simple-mfd"; | 11 | - compatible: must be: "syscon", "simple-mfd"; |
| 12 | - reg: register area of the CP110 system controller 0 | 12 | - reg: register area of the CP110 system controller |
| 13 | |||
| 14 | SYSTEM CONTROLLER 0 | ||
| 15 | =================== | ||
| 13 | 16 | ||
| 14 | Clocks: | 17 | Clocks: |
| 15 | ------- | 18 | ------- |
| @@ -163,26 +166,60 @@ Required properties: | |||
| 163 | 166 | ||
| 164 | Example: | 167 | Example: |
| 165 | 168 | ||
| 166 | cpm_syscon0: system-controller@440000 { | 169 | CP110_LABEL(syscon0): system-controller@440000 { |
| 167 | compatible = "syscon", "simple-mfd"; | 170 | compatible = "syscon", "simple-mfd"; |
| 168 | reg = <0x440000 0x1000>; | 171 | reg = <0x440000 0x1000>; |
| 169 | 172 | ||
| 170 | cpm_clk: clock { | 173 | CP110_LABEL(clk): clock { |
| 171 | compatible = "marvell,cp110-clock"; | 174 | compatible = "marvell,cp110-clock"; |
| 172 | #clock-cells = <2>; | 175 | #clock-cells = <2>; |
| 173 | }; | 176 | }; |
| 174 | 177 | ||
| 175 | cpm_pinctrl: pinctrl { | 178 | CP110_LABEL(pinctrl): pinctrl { |
| 176 | compatible = "marvell,armada-8k-cpm-pinctrl"; | 179 | compatible = "marvell,armada-8k-cpm-pinctrl"; |
| 177 | }; | 180 | }; |
| 178 | 181 | ||
| 179 | cpm_gpio1: gpio@100 { | 182 | CP110_LABEL(gpio1): gpio@100 { |
| 180 | compatible = "marvell,armada-8k-gpio"; | 183 | compatible = "marvell,armada-8k-gpio"; |
| 181 | offset = <0x100>; | 184 | offset = <0x100>; |
| 182 | ngpios = <32>; | 185 | ngpios = <32>; |
| 183 | gpio-controller; | 186 | gpio-controller; |
| 184 | #gpio-cells = <2>; | 187 | #gpio-cells = <2>; |
| 185 | gpio-ranges = <&cpm_pinctrl 0 0 32>; | 188 | gpio-ranges = <&CP110_LABEL(pinctrl) 0 0 32>; |
| 186 | }; | 189 | }; |
| 187 | 190 | ||
| 188 | }; | 191 | }; |
| 192 | |||
| 193 | SYSTEM CONTROLLER 1 | ||
| 194 | =================== | ||
| 195 | |||
| 196 | Thermal: | ||
| 197 | -------- | ||
| 198 | |||
| 199 | The thermal IP can probe the temperature all around the processor. It | ||
| 200 | may feature several channels, each of them wired to one sensor. | ||
| 201 | |||
| 202 | For common binding part and usage, refer to | ||
| 203 | Documentation/devicetree/bindings/thermal/thermal.txt | ||
| 204 | |||
| 205 | Required properties: | ||
| 206 | - compatible: must be one of: | ||
| 207 | * marvell,armada-cp110-thermal | ||
| 208 | - reg: register range associated with the thermal functions. | ||
| 209 | |||
| 210 | Optional properties: | ||
| 211 | - #thermal-sensor-cells: shall be <1> when thermal-zones subnodes refer | ||
| 212 | to this IP and represents the channel ID. There is one sensor per | ||
| 213 | channel. O refers to the thermal IP internal channel. | ||
| 214 | |||
| 215 | Example: | ||
| 216 | CP110_LABEL(syscon1): system-controller@6f8000 { | ||
| 217 | compatible = "syscon", "simple-mfd"; | ||
| 218 | reg = <0x6f8000 0x1000>; | ||
| 219 | |||
| 220 | CP110_LABEL(thermal): thermal-sensor@70 { | ||
| 221 | compatible = "marvell,armada-cp110-thermal"; | ||
| 222 | reg = <0x70 0x10>; | ||
| 223 | #thermal-sensor-cells = <1>; | ||
| 224 | }; | ||
| 225 | }; | ||
diff --git a/Documentation/devicetree/bindings/thermal/armada-thermal.txt b/Documentation/devicetree/bindings/thermal/armada-thermal.txt index e0d013a2e66d..f3b441100890 100644 --- a/Documentation/devicetree/bindings/thermal/armada-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/armada-thermal.txt | |||
| @@ -10,6 +10,11 @@ Required properties: | |||
| 10 | * marvell,armada-ap806-thermal | 10 | * marvell,armada-ap806-thermal |
| 11 | * marvell,armada-cp110-thermal | 11 | * marvell,armada-cp110-thermal |
| 12 | 12 | ||
| 13 | Note: these bindings are deprecated for AP806/CP110 and should instead | ||
| 14 | follow the rules described in: | ||
| 15 | Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt | ||
| 16 | Documentation/devicetree/bindings/arm/marvell/cp110-system-controller.txt | ||
| 17 | |||
| 13 | - reg: Device's register space. | 18 | - reg: Device's register space. |
| 14 | Two entries are expected, see the examples below. The first one points | 19 | Two entries are expected, see the examples below. The first one points |
| 15 | to the status register (4B). The second one points to the control | 20 | to the status register (4B). The second one points to the control |
diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.txt b/Documentation/devicetree/bindings/thermal/qcom-tsens.txt index 06195e8f35e2..1d9e8cf61018 100644 --- a/Documentation/devicetree/bindings/thermal/qcom-tsens.txt +++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.txt | |||
| @@ -1,18 +1,28 @@ | |||
| 1 | * QCOM SoC Temperature Sensor (TSENS) | 1 | * QCOM SoC Temperature Sensor (TSENS) |
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : | 4 | - compatible: |
| 5 | - "qcom,msm8916-tsens" : For 8916 Family of SoCs | 5 | Must be one of the following: |
| 6 | - "qcom,msm8974-tsens" : For 8974 Family of SoCs | 6 | - "qcom,msm8916-tsens" (MSM8916) |
| 7 | - "qcom,msm8996-tsens" : For 8996 Family of SoCs | 7 | - "qcom,msm8974-tsens" (MSM8974) |
| 8 | - "qcom,msm8996-tsens" (MSM8996) | ||
| 9 | - "qcom,msm8998-tsens", "qcom,tsens-v2" (MSM8998) | ||
| 10 | - "qcom,sdm845-tsens", "qcom,tsens-v2" (SDM845) | ||
| 11 | The generic "qcom,tsens-v2" property must be used as a fallback for any SoC | ||
| 12 | with version 2 of the TSENS IP. MSM8996 is the only exception because the | ||
| 13 | generic property did not exist when support was added. | ||
| 14 | |||
| 15 | - reg: Address range of the thermal registers. | ||
| 16 | New platforms containing v2.x.y of the TSENS IP must specify the SROT and TM | ||
| 17 | register spaces separately, with order being TM before SROT. | ||
| 18 | See Example 2, below. | ||
| 8 | 19 | ||
| 9 | - reg: Address range of the thermal registers | ||
| 10 | - #thermal-sensor-cells : Should be 1. See ./thermal.txt for a description. | 20 | - #thermal-sensor-cells : Should be 1. See ./thermal.txt for a description. |
| 11 | - #qcom,sensors: Number of sensors in tsens block | 21 | - #qcom,sensors: Number of sensors in tsens block |
| 12 | - Refer to Documentation/devicetree/bindings/nvmem/nvmem.txt to know how to specify | 22 | - Refer to Documentation/devicetree/bindings/nvmem/nvmem.txt to know how to specify |
| 13 | nvmem cells | 23 | nvmem cells |
| 14 | 24 | ||
| 15 | Example: | 25 | Example 1 (legacy support before a fallback tsens-v2 property was introduced): |
| 16 | tsens: thermal-sensor@900000 { | 26 | tsens: thermal-sensor@900000 { |
| 17 | compatible = "qcom,msm8916-tsens"; | 27 | compatible = "qcom,msm8916-tsens"; |
| 18 | reg = <0x4a8000 0x2000>; | 28 | reg = <0x4a8000 0x2000>; |
| @@ -20,3 +30,12 @@ tsens: thermal-sensor@900000 { | |||
| 20 | nvmem-cell-names = "caldata", "calsel"; | 30 | nvmem-cell-names = "caldata", "calsel"; |
| 21 | #thermal-sensor-cells = <1>; | 31 | #thermal-sensor-cells = <1>; |
| 22 | }; | 32 | }; |
| 33 | |||
| 34 | Example 2 (for any platform containing v2 of the TSENS IP): | ||
| 35 | tsens0: thermal-sensor@c263000 { | ||
| 36 | compatible = "qcom,sdm845-tsens", "qcom,tsens-v2"; | ||
| 37 | reg = <0xc263000 0x1ff>, /* TM */ | ||
| 38 | <0xc222000 0x1ff>; /* SROT */ | ||
| 39 | #qcom,sensors = <13>; | ||
| 40 | #thermal-sensor-cells = <1>; | ||
| 41 | }; | ||
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index 4c275ec10ac5..2c2f6d93034e 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/of_device.h> | 24 | #include <linux/of_device.h> |
| 25 | #include <linux/thermal.h> | 25 | #include <linux/thermal.h> |
| 26 | #include <linux/iopoll.h> | 26 | #include <linux/iopoll.h> |
| 27 | #include <linux/mfd/syscon.h> | ||
| 28 | #include <linux/regmap.h> | ||
| 27 | 29 | ||
| 28 | /* Thermal Manager Control and Status Register */ | 30 | /* Thermal Manager Control and Status Register */ |
| 29 | #define PMU_TDC0_SW_RST_MASK (0x1 << 1) | 31 | #define PMU_TDC0_SW_RST_MASK (0x1 << 1) |
| @@ -39,24 +41,24 @@ | |||
| 39 | #define A375_READOUT_INVERT BIT(15) | 41 | #define A375_READOUT_INVERT BIT(15) |
| 40 | #define A375_HW_RESETn BIT(8) | 42 | #define A375_HW_RESETn BIT(8) |
| 41 | 43 | ||
| 42 | /* Legacy bindings */ | ||
| 43 | #define LEGACY_CONTROL_MEM_LEN 0x4 | ||
| 44 | |||
| 45 | /* Current bindings with the 2 control registers under the same memory area */ | ||
| 46 | #define LEGACY_CONTROL1_OFFSET 0x0 | ||
| 47 | #define CONTROL0_OFFSET 0x0 | ||
| 48 | #define CONTROL1_OFFSET 0x4 | ||
| 49 | |||
| 50 | /* Errata fields */ | 44 | /* Errata fields */ |
| 51 | #define CONTROL0_TSEN_TC_TRIM_MASK 0x7 | 45 | #define CONTROL0_TSEN_TC_TRIM_MASK 0x7 |
| 52 | #define CONTROL0_TSEN_TC_TRIM_VAL 0x3 | 46 | #define CONTROL0_TSEN_TC_TRIM_VAL 0x3 |
| 53 | 47 | ||
| 54 | /* TSEN refers to the temperature sensors within the AP */ | ||
| 55 | #define CONTROL0_TSEN_START BIT(0) | 48 | #define CONTROL0_TSEN_START BIT(0) |
| 56 | #define CONTROL0_TSEN_RESET BIT(1) | 49 | #define CONTROL0_TSEN_RESET BIT(1) |
| 57 | #define CONTROL0_TSEN_ENABLE BIT(2) | 50 | #define CONTROL0_TSEN_ENABLE BIT(2) |
| 58 | 51 | #define CONTROL0_TSEN_AVG_BYPASS BIT(6) | |
| 59 | /* EXT_TSEN refers to the external temperature sensors, out of the AP */ | 52 | #define CONTROL0_TSEN_CHAN_SHIFT 13 |
| 53 | #define CONTROL0_TSEN_CHAN_MASK 0xF | ||
| 54 | #define CONTROL0_TSEN_OSR_SHIFT 24 | ||
| 55 | #define CONTROL0_TSEN_OSR_MAX 0x3 | ||
| 56 | #define CONTROL0_TSEN_MODE_SHIFT 30 | ||
| 57 | #define CONTROL0_TSEN_MODE_EXTERNAL 0x2 | ||
| 58 | #define CONTROL0_TSEN_MODE_MASK 0x3 | ||
| 59 | |||
| 60 | #define CONTROL1_TSEN_AVG_SHIFT 0 | ||
| 61 | #define CONTROL1_TSEN_AVG_MASK 0x7 | ||
| 60 | #define CONTROL1_EXT_TSEN_SW_RESET BIT(7) | 62 | #define CONTROL1_EXT_TSEN_SW_RESET BIT(7) |
| 61 | #define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) | 63 | #define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) |
| 62 | 64 | ||
| @@ -67,19 +69,19 @@ struct armada_thermal_data; | |||
| 67 | 69 | ||
| 68 | /* Marvell EBU Thermal Sensor Dev Structure */ | 70 | /* Marvell EBU Thermal Sensor Dev Structure */ |
| 69 | struct armada_thermal_priv { | 71 | struct armada_thermal_priv { |
| 70 | void __iomem *status; | 72 | struct device *dev; |
| 71 | void __iomem *control0; | 73 | struct regmap *syscon; |
| 72 | void __iomem *control1; | 74 | char zone_name[THERMAL_NAME_LENGTH]; |
| 75 | /* serialize temperature reads/updates */ | ||
| 76 | struct mutex update_lock; | ||
| 73 | struct armada_thermal_data *data; | 77 | struct armada_thermal_data *data; |
| 78 | int current_channel; | ||
| 74 | }; | 79 | }; |
| 75 | 80 | ||
| 76 | struct armada_thermal_data { | 81 | struct armada_thermal_data { |
| 77 | /* Initialize the sensor */ | 82 | /* Initialize the thermal IC */ |
| 78 | void (*init_sensor)(struct platform_device *pdev, | 83 | void (*init)(struct platform_device *pdev, |
| 79 | struct armada_thermal_priv *); | 84 | struct armada_thermal_priv *priv); |
| 80 | |||
| 81 | /* Test for a valid sensor value (optional) */ | ||
| 82 | bool (*is_valid)(struct armada_thermal_priv *); | ||
| 83 | 85 | ||
| 84 | /* Formula coeficients: temp = (b - m * reg) / div */ | 86 | /* Formula coeficients: temp = (b - m * reg) / div */ |
| 85 | s64 coef_b; | 87 | s64 coef_b; |
| @@ -92,141 +94,242 @@ struct armada_thermal_data { | |||
| 92 | unsigned int temp_shift; | 94 | unsigned int temp_shift; |
| 93 | unsigned int temp_mask; | 95 | unsigned int temp_mask; |
| 94 | u32 is_valid_bit; | 96 | u32 is_valid_bit; |
| 95 | bool needs_control0; | 97 | |
| 98 | /* Syscon access */ | ||
| 99 | unsigned int syscon_control0_off; | ||
| 100 | unsigned int syscon_control1_off; | ||
| 101 | unsigned int syscon_status_off; | ||
| 102 | |||
| 103 | /* One sensor is in the thermal IC, the others are in the CPUs if any */ | ||
| 104 | unsigned int cpu_nr; | ||
| 96 | }; | 105 | }; |
| 97 | 106 | ||
| 98 | static void armadaxp_init_sensor(struct platform_device *pdev, | 107 | struct armada_drvdata { |
| 99 | struct armada_thermal_priv *priv) | 108 | enum drvtype { |
| 109 | LEGACY, | ||
| 110 | SYSCON | ||
| 111 | } type; | ||
| 112 | union { | ||
| 113 | struct armada_thermal_priv *priv; | ||
| 114 | struct thermal_zone_device *tz; | ||
| 115 | } data; | ||
| 116 | }; | ||
| 117 | |||
| 118 | /* | ||
| 119 | * struct armada_thermal_sensor - hold the information of one thermal sensor | ||
| 120 | * @thermal: pointer to the local private structure | ||
| 121 | * @tzd: pointer to the thermal zone device | ||
| 122 | * @id: identifier of the thermal sensor | ||
| 123 | */ | ||
| 124 | struct armada_thermal_sensor { | ||
| 125 | struct armada_thermal_priv *priv; | ||
| 126 | int id; | ||
| 127 | }; | ||
| 128 | |||
| 129 | static void armadaxp_init(struct platform_device *pdev, | ||
| 130 | struct armada_thermal_priv *priv) | ||
| 100 | { | 131 | { |
| 132 | struct armada_thermal_data *data = priv->data; | ||
| 101 | u32 reg; | 133 | u32 reg; |
| 102 | 134 | ||
| 103 | reg = readl_relaxed(priv->control1); | 135 | regmap_read(priv->syscon, data->syscon_control1_off, ®); |
| 104 | reg |= PMU_TDC0_OTF_CAL_MASK; | 136 | reg |= PMU_TDC0_OTF_CAL_MASK; |
| 105 | writel(reg, priv->control1); | ||
| 106 | 137 | ||
| 107 | /* Reference calibration value */ | 138 | /* Reference calibration value */ |
| 108 | reg &= ~PMU_TDC0_REF_CAL_CNT_MASK; | 139 | reg &= ~PMU_TDC0_REF_CAL_CNT_MASK; |
| 109 | reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS); | 140 | reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS); |
| 110 | writel(reg, priv->control1); | ||
| 111 | 141 | ||
| 112 | /* Reset the sensor */ | 142 | /* Reset the sensor */ |
| 113 | reg = readl_relaxed(priv->control1); | 143 | reg |= PMU_TDC0_SW_RST_MASK; |
| 114 | writel((reg | PMU_TDC0_SW_RST_MASK), priv->control1); | ||
| 115 | 144 | ||
| 116 | writel(reg, priv->control1); | 145 | regmap_write(priv->syscon, data->syscon_control1_off, reg); |
| 117 | 146 | ||
| 118 | /* Enable the sensor */ | 147 | /* Enable the sensor */ |
| 119 | reg = readl_relaxed(priv->status); | 148 | regmap_read(priv->syscon, data->syscon_status_off, ®); |
| 120 | reg &= ~PMU_TM_DISABLE_MASK; | 149 | reg &= ~PMU_TM_DISABLE_MASK; |
| 121 | writel(reg, priv->status); | 150 | regmap_write(priv->syscon, data->syscon_status_off, reg); |
| 122 | } | 151 | } |
| 123 | 152 | ||
| 124 | static void armada370_init_sensor(struct platform_device *pdev, | 153 | static void armada370_init(struct platform_device *pdev, |
| 125 | struct armada_thermal_priv *priv) | 154 | struct armada_thermal_priv *priv) |
| 126 | { | 155 | { |
| 156 | struct armada_thermal_data *data = priv->data; | ||
| 127 | u32 reg; | 157 | u32 reg; |
| 128 | 158 | ||
| 129 | reg = readl_relaxed(priv->control1); | 159 | regmap_read(priv->syscon, data->syscon_control1_off, ®); |
| 130 | reg |= PMU_TDC0_OTF_CAL_MASK; | 160 | reg |= PMU_TDC0_OTF_CAL_MASK; |
| 131 | writel(reg, priv->control1); | ||
| 132 | 161 | ||
| 133 | /* Reference calibration value */ | 162 | /* Reference calibration value */ |
| 134 | reg &= ~PMU_TDC0_REF_CAL_CNT_MASK; | 163 | reg &= ~PMU_TDC0_REF_CAL_CNT_MASK; |
| 135 | reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS); | 164 | reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS); |
| 136 | writel(reg, priv->control1); | ||
| 137 | 165 | ||
| 166 | /* Reset the sensor */ | ||
| 138 | reg &= ~PMU_TDC0_START_CAL_MASK; | 167 | reg &= ~PMU_TDC0_START_CAL_MASK; |
| 139 | writel(reg, priv->control1); | 168 | |
| 169 | regmap_write(priv->syscon, data->syscon_control1_off, reg); | ||
| 140 | 170 | ||
| 141 | msleep(10); | 171 | msleep(10); |
| 142 | } | 172 | } |
| 143 | 173 | ||
| 144 | static void armada375_init_sensor(struct platform_device *pdev, | 174 | static void armada375_init(struct platform_device *pdev, |
| 145 | struct armada_thermal_priv *priv) | 175 | struct armada_thermal_priv *priv) |
| 146 | { | 176 | { |
| 177 | struct armada_thermal_data *data = priv->data; | ||
| 147 | u32 reg; | 178 | u32 reg; |
| 148 | 179 | ||
| 149 | reg = readl(priv->control1); | 180 | regmap_read(priv->syscon, data->syscon_control1_off, ®); |
| 150 | reg &= ~(A375_UNIT_CONTROL_MASK << A375_UNIT_CONTROL_SHIFT); | 181 | reg &= ~(A375_UNIT_CONTROL_MASK << A375_UNIT_CONTROL_SHIFT); |
| 151 | reg &= ~A375_READOUT_INVERT; | 182 | reg &= ~A375_READOUT_INVERT; |
| 152 | reg &= ~A375_HW_RESETn; | 183 | reg &= ~A375_HW_RESETn; |
| 184 | regmap_write(priv->syscon, data->syscon_control1_off, reg); | ||
| 153 | 185 | ||
| 154 | writel(reg, priv->control1); | ||
| 155 | msleep(20); | 186 | msleep(20); |
| 156 | 187 | ||
| 157 | reg |= A375_HW_RESETn; | 188 | reg |= A375_HW_RESETn; |
| 158 | writel(reg, priv->control1); | 189 | regmap_write(priv->syscon, data->syscon_control1_off, reg); |
| 190 | |||
| 159 | msleep(50); | 191 | msleep(50); |
| 160 | } | 192 | } |
| 161 | 193 | ||
| 162 | static void armada_wait_sensor_validity(struct armada_thermal_priv *priv) | 194 | static int armada_wait_sensor_validity(struct armada_thermal_priv *priv) |
| 163 | { | 195 | { |
| 164 | u32 reg; | 196 | u32 reg; |
| 165 | 197 | ||
| 166 | readl_relaxed_poll_timeout(priv->status, reg, | 198 | return regmap_read_poll_timeout(priv->syscon, |
| 167 | reg & priv->data->is_valid_bit, | 199 | priv->data->syscon_status_off, reg, |
| 168 | STATUS_POLL_PERIOD_US, | 200 | reg & priv->data->is_valid_bit, |
| 169 | STATUS_POLL_TIMEOUT_US); | 201 | STATUS_POLL_PERIOD_US, |
| 202 | STATUS_POLL_TIMEOUT_US); | ||
| 170 | } | 203 | } |
| 171 | 204 | ||
| 172 | static void armada380_init_sensor(struct platform_device *pdev, | 205 | static void armada380_init(struct platform_device *pdev, |
| 173 | struct armada_thermal_priv *priv) | 206 | struct armada_thermal_priv *priv) |
| 174 | { | 207 | { |
| 175 | u32 reg = readl_relaxed(priv->control1); | 208 | struct armada_thermal_data *data = priv->data; |
| 209 | u32 reg; | ||
| 176 | 210 | ||
| 177 | /* Disable the HW/SW reset */ | 211 | /* Disable the HW/SW reset */ |
| 212 | regmap_read(priv->syscon, data->syscon_control1_off, ®); | ||
| 178 | reg |= CONTROL1_EXT_TSEN_HW_RESETn; | 213 | reg |= CONTROL1_EXT_TSEN_HW_RESETn; |
| 179 | reg &= ~CONTROL1_EXT_TSEN_SW_RESET; | 214 | reg &= ~CONTROL1_EXT_TSEN_SW_RESET; |
| 180 | writel(reg, priv->control1); | 215 | regmap_write(priv->syscon, data->syscon_control1_off, reg); |
| 181 | 216 | ||
| 182 | /* Set Tsen Tc Trim to correct default value (errata #132698) */ | 217 | /* Set Tsen Tc Trim to correct default value (errata #132698) */ |
| 183 | if (priv->control0) { | 218 | regmap_read(priv->syscon, data->syscon_control0_off, ®); |
| 184 | reg = readl_relaxed(priv->control0); | 219 | reg &= ~CONTROL0_TSEN_TC_TRIM_MASK; |
| 185 | reg &= ~CONTROL0_TSEN_TC_TRIM_MASK; | 220 | reg |= CONTROL0_TSEN_TC_TRIM_VAL; |
| 186 | reg |= CONTROL0_TSEN_TC_TRIM_VAL; | 221 | regmap_write(priv->syscon, data->syscon_control0_off, reg); |
| 187 | writel(reg, priv->control0); | ||
| 188 | } | ||
| 189 | |||
| 190 | /* Wait the sensors to be valid or the core will warn the user */ | ||
| 191 | armada_wait_sensor_validity(priv); | ||
| 192 | } | 222 | } |
| 193 | 223 | ||
| 194 | static void armada_ap806_init_sensor(struct platform_device *pdev, | 224 | static void armada_ap806_init(struct platform_device *pdev, |
| 195 | struct armada_thermal_priv *priv) | 225 | struct armada_thermal_priv *priv) |
| 196 | { | 226 | { |
| 227 | struct armada_thermal_data *data = priv->data; | ||
| 197 | u32 reg; | 228 | u32 reg; |
| 198 | 229 | ||
| 199 | reg = readl_relaxed(priv->control0); | 230 | regmap_read(priv->syscon, data->syscon_control0_off, ®); |
| 200 | reg &= ~CONTROL0_TSEN_RESET; | 231 | reg &= ~CONTROL0_TSEN_RESET; |
| 201 | reg |= CONTROL0_TSEN_START | CONTROL0_TSEN_ENABLE; | 232 | reg |= CONTROL0_TSEN_START | CONTROL0_TSEN_ENABLE; |
| 202 | writel(reg, priv->control0); | ||
| 203 | 233 | ||
| 204 | /* Wait the sensors to be valid or the core will warn the user */ | 234 | /* Sample every ~2ms */ |
| 205 | armada_wait_sensor_validity(priv); | 235 | reg |= CONTROL0_TSEN_OSR_MAX << CONTROL0_TSEN_OSR_SHIFT; |
| 236 | |||
| 237 | /* Enable average (2 samples by default) */ | ||
| 238 | reg &= ~CONTROL0_TSEN_AVG_BYPASS; | ||
| 239 | |||
| 240 | regmap_write(priv->syscon, data->syscon_control0_off, reg); | ||
| 241 | } | ||
| 242 | |||
| 243 | static void armada_cp110_init(struct platform_device *pdev, | ||
| 244 | struct armada_thermal_priv *priv) | ||
| 245 | { | ||
| 246 | struct armada_thermal_data *data = priv->data; | ||
| 247 | u32 reg; | ||
| 248 | |||
| 249 | armada380_init(pdev, priv); | ||
| 250 | |||
| 251 | /* Sample every ~2ms */ | ||
| 252 | regmap_read(priv->syscon, data->syscon_control0_off, ®); | ||
| 253 | reg |= CONTROL0_TSEN_OSR_MAX << CONTROL0_TSEN_OSR_SHIFT; | ||
| 254 | regmap_write(priv->syscon, data->syscon_control0_off, reg); | ||
| 255 | |||
| 256 | /* Average the output value over 2^1 = 2 samples */ | ||
| 257 | regmap_read(priv->syscon, data->syscon_control1_off, ®); | ||
| 258 | reg &= ~CONTROL1_TSEN_AVG_MASK << CONTROL1_TSEN_AVG_SHIFT; | ||
| 259 | reg |= 1 << CONTROL1_TSEN_AVG_SHIFT; | ||
| 260 | regmap_write(priv->syscon, data->syscon_control1_off, reg); | ||
| 206 | } | 261 | } |
| 207 | 262 | ||
| 208 | static bool armada_is_valid(struct armada_thermal_priv *priv) | 263 | static bool armada_is_valid(struct armada_thermal_priv *priv) |
| 209 | { | 264 | { |
| 210 | u32 reg = readl_relaxed(priv->status); | 265 | u32 reg; |
| 266 | |||
| 267 | if (!priv->data->is_valid_bit) | ||
| 268 | return true; | ||
| 269 | |||
| 270 | regmap_read(priv->syscon, priv->data->syscon_status_off, ®); | ||
| 211 | 271 | ||
| 212 | return reg & priv->data->is_valid_bit; | 272 | return reg & priv->data->is_valid_bit; |
| 213 | } | 273 | } |
| 214 | 274 | ||
| 215 | static int armada_get_temp(struct thermal_zone_device *thermal, | 275 | /* There is currently no board with more than one sensor per channel */ |
| 216 | int *temp) | 276 | static int armada_select_channel(struct armada_thermal_priv *priv, int channel) |
| 217 | { | 277 | { |
| 218 | struct armada_thermal_priv *priv = thermal->devdata; | 278 | struct armada_thermal_data *data = priv->data; |
| 219 | u32 reg, div; | 279 | u32 ctrl0; |
| 220 | s64 sample, b, m; | 280 | |
| 281 | if (channel < 0 || channel > priv->data->cpu_nr) | ||
| 282 | return -EINVAL; | ||
| 283 | |||
| 284 | if (priv->current_channel == channel) | ||
| 285 | return 0; | ||
| 286 | |||
| 287 | /* Stop the measurements */ | ||
| 288 | regmap_read(priv->syscon, data->syscon_control0_off, &ctrl0); | ||
| 289 | ctrl0 &= ~CONTROL0_TSEN_START; | ||
| 290 | regmap_write(priv->syscon, data->syscon_control0_off, ctrl0); | ||
| 291 | |||
| 292 | /* Reset the mode, internal sensor will be automatically selected */ | ||
| 293 | ctrl0 &= ~(CONTROL0_TSEN_MODE_MASK << CONTROL0_TSEN_MODE_SHIFT); | ||
| 294 | |||
| 295 | /* Other channels are external and should be selected accordingly */ | ||
| 296 | if (channel) { | ||
| 297 | /* Change the mode to external */ | ||
| 298 | ctrl0 |= CONTROL0_TSEN_MODE_EXTERNAL << | ||
| 299 | CONTROL0_TSEN_MODE_SHIFT; | ||
| 300 | /* Select the sensor */ | ||
| 301 | ctrl0 &= ~(CONTROL0_TSEN_CHAN_MASK << CONTROL0_TSEN_CHAN_SHIFT); | ||
| 302 | ctrl0 |= (channel - 1) << CONTROL0_TSEN_CHAN_SHIFT; | ||
| 303 | } | ||
| 221 | 304 | ||
| 222 | /* Valid check */ | 305 | /* Actually set the mode/channel */ |
| 223 | if (priv->data->is_valid && !priv->data->is_valid(priv)) { | 306 | regmap_write(priv->syscon, data->syscon_control0_off, ctrl0); |
| 224 | dev_err(&thermal->device, | 307 | priv->current_channel = channel; |
| 308 | |||
| 309 | /* Re-start the measurements */ | ||
| 310 | ctrl0 |= CONTROL0_TSEN_START; | ||
| 311 | regmap_write(priv->syscon, data->syscon_control0_off, ctrl0); | ||
| 312 | |||
| 313 | /* | ||
| 314 | * The IP has a latency of ~15ms, so after updating the selected source, | ||
| 315 | * we must absolutely wait for the sensor validity bit to ensure we read | ||
| 316 | * actual data. | ||
| 317 | */ | ||
| 318 | if (armada_wait_sensor_validity(priv)) { | ||
| 319 | dev_err(priv->dev, | ||
| 225 | "Temperature sensor reading not valid\n"); | 320 | "Temperature sensor reading not valid\n"); |
| 226 | return -EIO; | 321 | return -EIO; |
| 227 | } | 322 | } |
| 228 | 323 | ||
| 229 | reg = readl_relaxed(priv->status); | 324 | return 0; |
| 325 | } | ||
| 326 | |||
| 327 | static int armada_read_sensor(struct armada_thermal_priv *priv, int *temp) | ||
| 328 | { | ||
| 329 | u32 reg, div; | ||
| 330 | s64 sample, b, m; | ||
| 331 | |||
| 332 | regmap_read(priv->syscon, priv->data->syscon_status_off, ®); | ||
| 230 | reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask; | 333 | reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask; |
| 231 | if (priv->data->signed_sample) | 334 | if (priv->data->signed_sample) |
| 232 | /* The most significant bit is the sign bit */ | 335 | /* The most significant bit is the sign bit */ |
| @@ -247,45 +350,93 @@ static int armada_get_temp(struct thermal_zone_device *thermal, | |||
| 247 | return 0; | 350 | return 0; |
| 248 | } | 351 | } |
| 249 | 352 | ||
| 250 | static struct thermal_zone_device_ops ops = { | 353 | static int armada_get_temp_legacy(struct thermal_zone_device *thermal, |
| 354 | int *temp) | ||
| 355 | { | ||
| 356 | struct armada_thermal_priv *priv = thermal->devdata; | ||
| 357 | int ret; | ||
| 358 | |||
| 359 | /* Valid check */ | ||
| 360 | if (armada_is_valid(priv)) { | ||
| 361 | dev_err(priv->dev, | ||
| 362 | "Temperature sensor reading not valid\n"); | ||
| 363 | return -EIO; | ||
| 364 | } | ||
| 365 | |||
| 366 | /* Do the actual reading */ | ||
| 367 | ret = armada_read_sensor(priv, temp); | ||
| 368 | |||
| 369 | return ret; | ||
| 370 | } | ||
| 371 | |||
| 372 | static struct thermal_zone_device_ops legacy_ops = { | ||
| 373 | .get_temp = armada_get_temp_legacy, | ||
| 374 | }; | ||
| 375 | |||
| 376 | static int armada_get_temp(void *_sensor, int *temp) | ||
| 377 | { | ||
| 378 | struct armada_thermal_sensor *sensor = _sensor; | ||
| 379 | struct armada_thermal_priv *priv = sensor->priv; | ||
| 380 | int ret; | ||
| 381 | |||
| 382 | mutex_lock(&priv->update_lock); | ||
| 383 | |||
| 384 | /* Select the desired channel */ | ||
| 385 | ret = armada_select_channel(priv, sensor->id); | ||
| 386 | if (ret) | ||
| 387 | goto unlock_mutex; | ||
| 388 | |||
| 389 | /* Do the actual reading */ | ||
| 390 | ret = armada_read_sensor(priv, temp); | ||
| 391 | |||
| 392 | unlock_mutex: | ||
| 393 | mutex_unlock(&priv->update_lock); | ||
| 394 | |||
| 395 | return ret; | ||
| 396 | } | ||
| 397 | |||
| 398 | static struct thermal_zone_of_device_ops of_ops = { | ||
| 251 | .get_temp = armada_get_temp, | 399 | .get_temp = armada_get_temp, |
| 252 | }; | 400 | }; |
| 253 | 401 | ||
| 254 | static const struct armada_thermal_data armadaxp_data = { | 402 | static const struct armada_thermal_data armadaxp_data = { |
| 255 | .init_sensor = armadaxp_init_sensor, | 403 | .init = armadaxp_init, |
| 256 | .temp_shift = 10, | 404 | .temp_shift = 10, |
| 257 | .temp_mask = 0x1ff, | 405 | .temp_mask = 0x1ff, |
| 258 | .coef_b = 3153000000ULL, | 406 | .coef_b = 3153000000ULL, |
| 259 | .coef_m = 10000000ULL, | 407 | .coef_m = 10000000ULL, |
| 260 | .coef_div = 13825, | 408 | .coef_div = 13825, |
| 409 | .syscon_status_off = 0xb0, | ||
| 410 | .syscon_control1_off = 0xd0, | ||
| 261 | }; | 411 | }; |
| 262 | 412 | ||
| 263 | static const struct armada_thermal_data armada370_data = { | 413 | static const struct armada_thermal_data armada370_data = { |
| 264 | .is_valid = armada_is_valid, | 414 | .init = armada370_init, |
| 265 | .init_sensor = armada370_init_sensor, | ||
| 266 | .is_valid_bit = BIT(9), | 415 | .is_valid_bit = BIT(9), |
| 267 | .temp_shift = 10, | 416 | .temp_shift = 10, |
| 268 | .temp_mask = 0x1ff, | 417 | .temp_mask = 0x1ff, |
| 269 | .coef_b = 3153000000ULL, | 418 | .coef_b = 3153000000ULL, |
| 270 | .coef_m = 10000000ULL, | 419 | .coef_m = 10000000ULL, |
| 271 | .coef_div = 13825, | 420 | .coef_div = 13825, |
| 421 | .syscon_status_off = 0x0, | ||
| 422 | .syscon_control1_off = 0x4, | ||
| 272 | }; | 423 | }; |
| 273 | 424 | ||
| 274 | static const struct armada_thermal_data armada375_data = { | 425 | static const struct armada_thermal_data armada375_data = { |
| 275 | .is_valid = armada_is_valid, | 426 | .init = armada375_init, |
| 276 | .init_sensor = armada375_init_sensor, | ||
| 277 | .is_valid_bit = BIT(10), | 427 | .is_valid_bit = BIT(10), |
| 278 | .temp_shift = 0, | 428 | .temp_shift = 0, |
| 279 | .temp_mask = 0x1ff, | 429 | .temp_mask = 0x1ff, |
| 280 | .coef_b = 3171900000ULL, | 430 | .coef_b = 3171900000ULL, |
| 281 | .coef_m = 10000000ULL, | 431 | .coef_m = 10000000ULL, |
| 282 | .coef_div = 13616, | 432 | .coef_div = 13616, |
| 283 | .needs_control0 = true, | 433 | .syscon_status_off = 0x78, |
| 434 | .syscon_control0_off = 0x7c, | ||
| 435 | .syscon_control1_off = 0x80, | ||
| 284 | }; | 436 | }; |
| 285 | 437 | ||
| 286 | static const struct armada_thermal_data armada380_data = { | 438 | static const struct armada_thermal_data armada380_data = { |
| 287 | .is_valid = armada_is_valid, | 439 | .init = armada380_init, |
| 288 | .init_sensor = armada380_init_sensor, | ||
| 289 | .is_valid_bit = BIT(10), | 440 | .is_valid_bit = BIT(10), |
| 290 | .temp_shift = 0, | 441 | .temp_shift = 0, |
| 291 | .temp_mask = 0x3ff, | 442 | .temp_mask = 0x3ff, |
| @@ -293,11 +444,13 @@ static const struct armada_thermal_data armada380_data = { | |||
| 293 | .coef_m = 2000096ULL, | 444 | .coef_m = 2000096ULL, |
| 294 | .coef_div = 4201, | 445 | .coef_div = 4201, |
| 295 | .inverted = true, | 446 | .inverted = true, |
| 447 | .syscon_control0_off = 0x70, | ||
| 448 | .syscon_control1_off = 0x74, | ||
| 449 | .syscon_status_off = 0x78, | ||
| 296 | }; | 450 | }; |
| 297 | 451 | ||
| 298 | static const struct armada_thermal_data armada_ap806_data = { | 452 | static const struct armada_thermal_data armada_ap806_data = { |
| 299 | .is_valid = armada_is_valid, | 453 | .init = armada_ap806_init, |
| 300 | .init_sensor = armada_ap806_init_sensor, | ||
| 301 | .is_valid_bit = BIT(16), | 454 | .is_valid_bit = BIT(16), |
| 302 | .temp_shift = 0, | 455 | .temp_shift = 0, |
| 303 | .temp_mask = 0x3ff, | 456 | .temp_mask = 0x3ff, |
| @@ -306,12 +459,14 @@ static const struct armada_thermal_data armada_ap806_data = { | |||
| 306 | .coef_div = 1, | 459 | .coef_div = 1, |
| 307 | .inverted = true, | 460 | .inverted = true, |
| 308 | .signed_sample = true, | 461 | .signed_sample = true, |
| 309 | .needs_control0 = true, | 462 | .syscon_control0_off = 0x84, |
| 463 | .syscon_control1_off = 0x88, | ||
| 464 | .syscon_status_off = 0x8C, | ||
| 465 | .cpu_nr = 4, | ||
| 310 | }; | 466 | }; |
| 311 | 467 | ||
| 312 | static const struct armada_thermal_data armada_cp110_data = { | 468 | static const struct armada_thermal_data armada_cp110_data = { |
| 313 | .is_valid = armada_is_valid, | 469 | .init = armada_cp110_init, |
| 314 | .init_sensor = armada380_init_sensor, | ||
| 315 | .is_valid_bit = BIT(10), | 470 | .is_valid_bit = BIT(10), |
| 316 | .temp_shift = 0, | 471 | .temp_shift = 0, |
| 317 | .temp_mask = 0x3ff, | 472 | .temp_mask = 0x3ff, |
| @@ -319,7 +474,9 @@ static const struct armada_thermal_data armada_cp110_data = { | |||
| 319 | .coef_m = 2000096ULL, | 474 | .coef_m = 2000096ULL, |
| 320 | .coef_div = 4201, | 475 | .coef_div = 4201, |
| 321 | .inverted = true, | 476 | .inverted = true, |
| 322 | .needs_control0 = true, | 477 | .syscon_control0_off = 0x70, |
| 478 | .syscon_control1_off = 0x74, | ||
| 479 | .syscon_status_off = 0x78, | ||
| 323 | }; | 480 | }; |
| 324 | 481 | ||
| 325 | static const struct of_device_id armada_thermal_id_table[] = { | 482 | static const struct of_device_id armada_thermal_id_table[] = { |
| @@ -353,13 +510,97 @@ static const struct of_device_id armada_thermal_id_table[] = { | |||
| 353 | }; | 510 | }; |
| 354 | MODULE_DEVICE_TABLE(of, armada_thermal_id_table); | 511 | MODULE_DEVICE_TABLE(of, armada_thermal_id_table); |
| 355 | 512 | ||
| 513 | static const struct regmap_config armada_thermal_regmap_config = { | ||
| 514 | .reg_bits = 32, | ||
| 515 | .reg_stride = 4, | ||
| 516 | .val_bits = 32, | ||
| 517 | .fast_io = true, | ||
| 518 | }; | ||
| 519 | |||
| 520 | static int armada_thermal_probe_legacy(struct platform_device *pdev, | ||
| 521 | struct armada_thermal_priv *priv) | ||
| 522 | { | ||
| 523 | struct armada_thermal_data *data = priv->data; | ||
| 524 | struct resource *res; | ||
| 525 | void __iomem *base; | ||
| 526 | |||
| 527 | /* First memory region points towards the status register */ | ||
| 528 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 529 | if (IS_ERR(res)) | ||
| 530 | return PTR_ERR(res); | ||
| 531 | |||
| 532 | /* | ||
| 533 | * Edit the resource start address and length to map over all the | ||
| 534 | * registers, instead of pointing at them one by one. | ||
| 535 | */ | ||
| 536 | res->start -= data->syscon_status_off; | ||
| 537 | res->end = res->start + max(data->syscon_status_off, | ||
| 538 | max(data->syscon_control0_off, | ||
| 539 | data->syscon_control1_off)) + | ||
| 540 | sizeof(unsigned int) - 1; | ||
| 541 | |||
| 542 | base = devm_ioremap_resource(&pdev->dev, res); | ||
| 543 | if (IS_ERR(base)) | ||
| 544 | return PTR_ERR(base); | ||
| 545 | |||
| 546 | priv->syscon = devm_regmap_init_mmio(&pdev->dev, base, | ||
| 547 | &armada_thermal_regmap_config); | ||
| 548 | if (IS_ERR(priv->syscon)) | ||
| 549 | return PTR_ERR(priv->syscon); | ||
| 550 | |||
| 551 | return 0; | ||
| 552 | } | ||
| 553 | |||
| 554 | static int armada_thermal_probe_syscon(struct platform_device *pdev, | ||
| 555 | struct armada_thermal_priv *priv) | ||
| 556 | { | ||
| 557 | priv->syscon = syscon_node_to_regmap(pdev->dev.parent->of_node); | ||
| 558 | if (IS_ERR(priv->syscon)) | ||
| 559 | return PTR_ERR(priv->syscon); | ||
| 560 | |||
| 561 | return 0; | ||
| 562 | } | ||
| 563 | |||
| 564 | static void armada_set_sane_name(struct platform_device *pdev, | ||
| 565 | struct armada_thermal_priv *priv) | ||
| 566 | { | ||
| 567 | const char *name = dev_name(&pdev->dev); | ||
| 568 | char *insane_char; | ||
| 569 | |||
| 570 | if (strlen(name) > THERMAL_NAME_LENGTH) { | ||
| 571 | /* | ||
| 572 | * When inside a system controller, the device name has the | ||
| 573 | * form: f06f8000.system-controller:ap-thermal so stripping | ||
| 574 | * after the ':' should give us a shorter but meaningful name. | ||
| 575 | */ | ||
| 576 | name = strrchr(name, ':'); | ||
| 577 | if (!name) | ||
| 578 | name = "armada_thermal"; | ||
| 579 | else | ||
| 580 | name++; | ||
| 581 | } | ||
| 582 | |||
| 583 | /* Save the name locally */ | ||
| 584 | strncpy(priv->zone_name, name, THERMAL_NAME_LENGTH - 1); | ||
| 585 | priv->zone_name[THERMAL_NAME_LENGTH - 1] = '\0'; | ||
| 586 | |||
| 587 | /* Then check there are no '-' or hwmon core will complain */ | ||
| 588 | do { | ||
| 589 | insane_char = strpbrk(priv->zone_name, "-"); | ||
| 590 | if (insane_char) | ||
| 591 | *insane_char = '_'; | ||
| 592 | } while (insane_char); | ||
| 593 | } | ||
| 594 | |||
| 356 | static int armada_thermal_probe(struct platform_device *pdev) | 595 | static int armada_thermal_probe(struct platform_device *pdev) |
| 357 | { | 596 | { |
| 358 | void __iomem *control = NULL; | 597 | struct thermal_zone_device *tz; |
| 359 | struct thermal_zone_device *thermal; | 598 | struct armada_thermal_sensor *sensor; |
| 599 | struct armada_drvdata *drvdata; | ||
| 360 | const struct of_device_id *match; | 600 | const struct of_device_id *match; |
| 361 | struct armada_thermal_priv *priv; | 601 | struct armada_thermal_priv *priv; |
| 362 | struct resource *res; | 602 | int sensor_id; |
| 603 | int ret; | ||
| 363 | 604 | ||
| 364 | match = of_match_device(armada_thermal_id_table, &pdev->dev); | 605 | match = of_match_device(armada_thermal_id_table, &pdev->dev); |
| 365 | if (!match) | 606 | if (!match) |
| @@ -369,58 +610,99 @@ static int armada_thermal_probe(struct platform_device *pdev) | |||
| 369 | if (!priv) | 610 | if (!priv) |
| 370 | return -ENOMEM; | 611 | return -ENOMEM; |
| 371 | 612 | ||
| 372 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 613 | drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL); |
| 373 | priv->status = devm_ioremap_resource(&pdev->dev, res); | 614 | if (!drvdata) |
| 374 | if (IS_ERR(priv->status)) | 615 | return -ENOMEM; |
| 375 | return PTR_ERR(priv->status); | ||
| 376 | |||
| 377 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
| 378 | control = devm_ioremap_resource(&pdev->dev, res); | ||
| 379 | if (IS_ERR(control)) | ||
| 380 | return PTR_ERR(control); | ||
| 381 | 616 | ||
| 617 | priv->dev = &pdev->dev; | ||
| 382 | priv->data = (struct armada_thermal_data *)match->data; | 618 | priv->data = (struct armada_thermal_data *)match->data; |
| 383 | 619 | ||
| 620 | mutex_init(&priv->update_lock); | ||
| 621 | |||
| 384 | /* | 622 | /* |
| 385 | * Legacy DT bindings only described "control1" register (also referred | 623 | * Legacy DT bindings only described "control1" register (also referred |
| 386 | * as "control MSB" on old documentation). New bindings cover | 624 | * as "control MSB" on old documentation). Then, bindings moved to cover |
| 387 | * "control0/control LSB" and "control1/control MSB" registers within | 625 | * "control0/control LSB" and "control1/control MSB" registers within |
| 388 | * the same resource, which is then of size 8 instead of 4. | 626 | * the same resource, which was then of size 8 instead of 4. |
| 627 | * | ||
| 628 | * The logic of defining sporadic registers is broken. For instance, it | ||
| 629 | * blocked the addition of the overheat interrupt feature that needed | ||
| 630 | * another resource somewhere else in the same memory area. One solution | ||
| 631 | * is to define an overall system controller and put the thermal node | ||
| 632 | * into it, which requires the use of regmaps across all the driver. | ||
| 389 | */ | 633 | */ |
| 390 | if (resource_size(res) == LEGACY_CONTROL_MEM_LEN) { | 634 | if (IS_ERR(syscon_node_to_regmap(pdev->dev.parent->of_node))) { |
| 391 | /* ->control0 unavailable in this configuration */ | 635 | /* Ensure device name is correct for the thermal core */ |
| 392 | if (priv->data->needs_control0) { | 636 | armada_set_sane_name(pdev, priv); |
| 393 | dev_err(&pdev->dev, "No access to control0 register\n"); | 637 | |
| 394 | return -EINVAL; | 638 | ret = armada_thermal_probe_legacy(pdev, priv); |
| 639 | if (ret) | ||
| 640 | return ret; | ||
| 641 | |||
| 642 | priv->data->init(pdev, priv); | ||
| 643 | |||
| 644 | /* Wait the sensors to be valid */ | ||
| 645 | armada_wait_sensor_validity(priv); | ||
| 646 | |||
| 647 | tz = thermal_zone_device_register(priv->zone_name, 0, 0, priv, | ||
| 648 | &legacy_ops, NULL, 0, 0); | ||
| 649 | if (IS_ERR(tz)) { | ||
| 650 | dev_err(&pdev->dev, | ||
| 651 | "Failed to register thermal zone device\n"); | ||
| 652 | return PTR_ERR(tz); | ||
| 395 | } | 653 | } |
| 396 | 654 | ||
| 397 | priv->control1 = control + LEGACY_CONTROL1_OFFSET; | 655 | drvdata->type = LEGACY; |
| 398 | } else { | 656 | drvdata->data.tz = tz; |
| 399 | priv->control0 = control + CONTROL0_OFFSET; | 657 | platform_set_drvdata(pdev, drvdata); |
| 400 | priv->control1 = control + CONTROL1_OFFSET; | 658 | |
| 659 | return 0; | ||
| 401 | } | 660 | } |
| 402 | 661 | ||
| 403 | priv->data->init_sensor(pdev, priv); | 662 | ret = armada_thermal_probe_syscon(pdev, priv); |
| 663 | if (ret) | ||
| 664 | return ret; | ||
| 404 | 665 | ||
| 405 | thermal = thermal_zone_device_register(dev_name(&pdev->dev), 0, 0, priv, | 666 | priv->current_channel = -1; |
| 406 | &ops, NULL, 0, 0); | 667 | priv->data->init(pdev, priv); |
| 407 | if (IS_ERR(thermal)) { | 668 | drvdata->type = SYSCON; |
| 408 | dev_err(&pdev->dev, | 669 | drvdata->data.priv = priv; |
| 409 | "Failed to register thermal zone device\n"); | 670 | platform_set_drvdata(pdev, drvdata); |
| 410 | return PTR_ERR(thermal); | ||
| 411 | } | ||
| 412 | 671 | ||
| 413 | platform_set_drvdata(pdev, thermal); | 672 | /* |
| 673 | * There is one channel for the IC and one per CPU (if any), each | ||
| 674 | * channel has one sensor. | ||
| 675 | */ | ||
| 676 | for (sensor_id = 0; sensor_id <= priv->data->cpu_nr; sensor_id++) { | ||
| 677 | sensor = devm_kzalloc(&pdev->dev, | ||
| 678 | sizeof(struct armada_thermal_sensor), | ||
| 679 | GFP_KERNEL); | ||
| 680 | if (!sensor) | ||
| 681 | return -ENOMEM; | ||
| 682 | |||
| 683 | /* Register the sensor */ | ||
| 684 | sensor->priv = priv; | ||
| 685 | sensor->id = sensor_id; | ||
| 686 | tz = devm_thermal_zone_of_sensor_register(&pdev->dev, | ||
| 687 | sensor->id, sensor, | ||
| 688 | &of_ops); | ||
| 689 | if (IS_ERR(tz)) { | ||
| 690 | dev_info(&pdev->dev, "Thermal sensor %d unavailable\n", | ||
| 691 | sensor_id); | ||
| 692 | devm_kfree(&pdev->dev, sensor); | ||
| 693 | continue; | ||
| 694 | } | ||
| 695 | } | ||
| 414 | 696 | ||
| 415 | return 0; | 697 | return 0; |
| 416 | } | 698 | } |
| 417 | 699 | ||
| 418 | static int armada_thermal_exit(struct platform_device *pdev) | 700 | static int armada_thermal_exit(struct platform_device *pdev) |
| 419 | { | 701 | { |
| 420 | struct thermal_zone_device *armada_thermal = | 702 | struct armada_drvdata *drvdata = platform_get_drvdata(pdev); |
| 421 | platform_get_drvdata(pdev); | ||
| 422 | 703 | ||
| 423 | thermal_zone_device_unregister(armada_thermal); | 704 | if (drvdata->type == LEGACY) |
| 705 | thermal_zone_device_unregister(drvdata->data.tz); | ||
| 424 | 706 | ||
| 425 | return 0; | 707 | return 0; |
| 426 | } | 708 | } |
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index cbfcca828cd7..aa452acb60b6 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c | |||
| @@ -605,7 +605,10 @@ static int imx_init_from_nvmem_cells(struct platform_device *pdev) | |||
| 605 | ret = nvmem_cell_read_u32(&pdev->dev, "calib", &val); | 605 | ret = nvmem_cell_read_u32(&pdev->dev, "calib", &val); |
| 606 | if (ret) | 606 | if (ret) |
| 607 | return ret; | 607 | return ret; |
| 608 | imx_init_calib(pdev, val); | 608 | |
| 609 | ret = imx_init_calib(pdev, val); | ||
| 610 | if (ret) | ||
| 611 | return ret; | ||
| 609 | 612 | ||
| 610 | ret = nvmem_cell_read_u32(&pdev->dev, "temp_grade", &val); | 613 | ret = nvmem_cell_read_u32(&pdev->dev, "temp_grade", &val); |
| 611 | if (ret) | 614 | if (ret) |
diff --git a/drivers/thermal/qcom/Makefile b/drivers/thermal/qcom/Makefile index 2cc2193637e7..a821929ede0b 100644 --- a/drivers/thermal/qcom/Makefile +++ b/drivers/thermal/qcom/Makefile | |||
| @@ -1,2 +1,2 @@ | |||
| 1 | obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o | 1 | obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o |
| 2 | qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-8996.o | 2 | qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-v2.o |
diff --git a/drivers/thermal/qcom/tsens-8996.c b/drivers/thermal/qcom/tsens-8996.c deleted file mode 100644 index e1f77818d8fa..000000000000 --- a/drivers/thermal/qcom/tsens-8996.c +++ /dev/null | |||
| @@ -1,84 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015, The Linux Foundation. All rights reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 and | ||
| 6 | * only version 2 as published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/platform_device.h> | ||
| 16 | #include <linux/regmap.h> | ||
| 17 | #include "tsens.h" | ||
| 18 | |||
| 19 | #define STATUS_OFFSET 0x10a0 | ||
| 20 | #define LAST_TEMP_MASK 0xfff | ||
| 21 | #define STATUS_VALID_BIT BIT(21) | ||
| 22 | #define CODE_SIGN_BIT BIT(11) | ||
| 23 | |||
| 24 | static int get_temp_8996(struct tsens_device *tmdev, int id, int *temp) | ||
| 25 | { | ||
| 26 | struct tsens_sensor *s = &tmdev->sensor[id]; | ||
| 27 | u32 code; | ||
| 28 | unsigned int sensor_addr; | ||
| 29 | int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret; | ||
| 30 | |||
| 31 | sensor_addr = STATUS_OFFSET + s->hw_id * 4; | ||
| 32 | ret = regmap_read(tmdev->map, sensor_addr, &code); | ||
| 33 | if (ret) | ||
| 34 | return ret; | ||
| 35 | last_temp = code & LAST_TEMP_MASK; | ||
| 36 | if (code & STATUS_VALID_BIT) | ||
| 37 | goto done; | ||
| 38 | |||
| 39 | /* Try a second time */ | ||
| 40 | ret = regmap_read(tmdev->map, sensor_addr, &code); | ||
| 41 | if (ret) | ||
| 42 | return ret; | ||
| 43 | if (code & STATUS_VALID_BIT) { | ||
| 44 | last_temp = code & LAST_TEMP_MASK; | ||
| 45 | goto done; | ||
| 46 | } else { | ||
| 47 | last_temp2 = code & LAST_TEMP_MASK; | ||
| 48 | } | ||
| 49 | |||
| 50 | /* Try a third/last time */ | ||
| 51 | ret = regmap_read(tmdev->map, sensor_addr, &code); | ||
| 52 | if (ret) | ||
| 53 | return ret; | ||
| 54 | if (code & STATUS_VALID_BIT) { | ||
| 55 | last_temp = code & LAST_TEMP_MASK; | ||
| 56 | goto done; | ||
| 57 | } else { | ||
| 58 | last_temp3 = code & LAST_TEMP_MASK; | ||
| 59 | } | ||
| 60 | |||
| 61 | if (last_temp == last_temp2) | ||
| 62 | last_temp = last_temp2; | ||
| 63 | else if (last_temp2 == last_temp3) | ||
| 64 | last_temp = last_temp3; | ||
| 65 | done: | ||
| 66 | /* Code sign bit is the sign extension for a negative value */ | ||
| 67 | if (last_temp & CODE_SIGN_BIT) | ||
| 68 | last_temp |= ~CODE_SIGN_BIT; | ||
| 69 | |||
| 70 | /* Temperatures are in deciCelicius */ | ||
| 71 | *temp = last_temp * 100; | ||
| 72 | |||
| 73 | return 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | static const struct tsens_ops ops_8996 = { | ||
| 77 | .init = init_common, | ||
| 78 | .get_temp = get_temp_8996, | ||
| 79 | }; | ||
| 80 | |||
| 81 | const struct tsens_data data_8996 = { | ||
| 82 | .num_sensors = 13, | ||
| 83 | .ops = &ops_8996, | ||
| 84 | }; | ||
diff --git a/drivers/thermal/qcom/tsens-common.c b/drivers/thermal/qcom/tsens-common.c index b1449ad67fc0..6207d8d92351 100644 --- a/drivers/thermal/qcom/tsens-common.c +++ b/drivers/thermal/qcom/tsens-common.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
| 17 | #include <linux/nvmem-consumer.h> | 17 | #include <linux/nvmem-consumer.h> |
| 18 | #include <linux/of_address.h> | 18 | #include <linux/of_address.h> |
| 19 | #include <linux/of_platform.h> | ||
| 19 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 20 | #include <linux/regmap.h> | 21 | #include <linux/regmap.h> |
| 21 | #include "tsens.h" | 22 | #include "tsens.h" |
| @@ -103,11 +104,11 @@ int get_temp_common(struct tsens_device *tmdev, int id, int *temp) | |||
| 103 | { | 104 | { |
| 104 | struct tsens_sensor *s = &tmdev->sensor[id]; | 105 | struct tsens_sensor *s = &tmdev->sensor[id]; |
| 105 | u32 code; | 106 | u32 code; |
| 106 | unsigned int sensor_addr; | 107 | unsigned int status_reg; |
| 107 | int last_temp = 0, ret; | 108 | int last_temp = 0, ret; |
| 108 | 109 | ||
| 109 | sensor_addr = S0_ST_ADDR + s->hw_id * SN_ADDR_OFFSET; | 110 | status_reg = S0_ST_ADDR + s->hw_id * SN_ADDR_OFFSET; |
| 110 | ret = regmap_read(tmdev->map, sensor_addr, &code); | 111 | ret = regmap_read(tmdev->map, status_reg, &code); |
| 111 | if (ret) | 112 | if (ret) |
| 112 | return ret; | 113 | return ret; |
| 113 | last_temp = code & SN_ST_TEMP_MASK; | 114 | last_temp = code & SN_ST_TEMP_MASK; |
| @@ -126,16 +127,28 @@ static const struct regmap_config tsens_config = { | |||
| 126 | int __init init_common(struct tsens_device *tmdev) | 127 | int __init init_common(struct tsens_device *tmdev) |
| 127 | { | 128 | { |
| 128 | void __iomem *base; | 129 | void __iomem *base; |
| 130 | struct resource *res; | ||
| 131 | struct platform_device *op = of_find_device_by_node(tmdev->dev->of_node); | ||
| 129 | 132 | ||
| 130 | base = of_iomap(tmdev->dev->of_node, 0); | 133 | if (!op) |
| 131 | if (!base) | ||
| 132 | return -EINVAL; | 134 | return -EINVAL; |
| 133 | 135 | ||
| 136 | /* The driver only uses the TM register address space for now */ | ||
| 137 | if (op->num_resources > 1) { | ||
| 138 | tmdev->tm_offset = 0; | ||
| 139 | } else { | ||
| 140 | /* old DTs where SROT and TM were in a contiguous 2K block */ | ||
| 141 | tmdev->tm_offset = 0x1000; | ||
| 142 | } | ||
| 143 | |||
| 144 | res = platform_get_resource(op, IORESOURCE_MEM, 0); | ||
| 145 | base = devm_ioremap_resource(&op->dev, res); | ||
| 146 | if (IS_ERR(base)) | ||
| 147 | return PTR_ERR(base); | ||
| 148 | |||
| 134 | tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config); | 149 | tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config); |
| 135 | if (IS_ERR(tmdev->map)) { | 150 | if (IS_ERR(tmdev->map)) |
| 136 | iounmap(base); | ||
| 137 | return PTR_ERR(tmdev->map); | 151 | return PTR_ERR(tmdev->map); |
| 138 | } | ||
| 139 | 152 | ||
| 140 | return 0; | 153 | return 0; |
| 141 | } | 154 | } |
diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c new file mode 100644 index 000000000000..44da02f594ac --- /dev/null +++ b/drivers/thermal/qcom/tsens-v2.c | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 2 | /* | ||
| 3 | * Copyright (c) 2015, The Linux Foundation. All rights reserved. | ||
| 4 | * Copyright (c) 2018, Linaro Limited | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <linux/regmap.h> | ||
| 8 | #include <linux/bitops.h> | ||
| 9 | #include "tsens.h" | ||
| 10 | |||
| 11 | #define STATUS_OFFSET 0xa0 | ||
| 12 | #define LAST_TEMP_MASK 0xfff | ||
| 13 | #define STATUS_VALID_BIT BIT(21) | ||
| 14 | |||
| 15 | static int get_temp_tsens_v2(struct tsens_device *tmdev, int id, int *temp) | ||
| 16 | { | ||
| 17 | struct tsens_sensor *s = &tmdev->sensor[id]; | ||
| 18 | u32 code; | ||
| 19 | unsigned int status_reg; | ||
| 20 | u32 last_temp = 0, last_temp2 = 0, last_temp3 = 0; | ||
| 21 | int ret; | ||
| 22 | |||
| 23 | status_reg = tmdev->tm_offset + STATUS_OFFSET + s->hw_id * 4; | ||
| 24 | ret = regmap_read(tmdev->map, status_reg, &code); | ||
| 25 | if (ret) | ||
| 26 | return ret; | ||
| 27 | last_temp = code & LAST_TEMP_MASK; | ||
| 28 | if (code & STATUS_VALID_BIT) | ||
| 29 | goto done; | ||
| 30 | |||
| 31 | /* Try a second time */ | ||
| 32 | ret = regmap_read(tmdev->map, status_reg, &code); | ||
| 33 | if (ret) | ||
| 34 | return ret; | ||
| 35 | if (code & STATUS_VALID_BIT) { | ||
| 36 | last_temp = code & LAST_TEMP_MASK; | ||
| 37 | goto done; | ||
| 38 | } else { | ||
| 39 | last_temp2 = code & LAST_TEMP_MASK; | ||
| 40 | } | ||
| 41 | |||
| 42 | /* Try a third/last time */ | ||
| 43 | ret = regmap_read(tmdev->map, status_reg, &code); | ||
| 44 | if (ret) | ||
| 45 | return ret; | ||
| 46 | if (code & STATUS_VALID_BIT) { | ||
| 47 | last_temp = code & LAST_TEMP_MASK; | ||
| 48 | goto done; | ||
| 49 | } else { | ||
| 50 | last_temp3 = code & LAST_TEMP_MASK; | ||
| 51 | } | ||
| 52 | |||
| 53 | if (last_temp == last_temp2) | ||
| 54 | last_temp = last_temp2; | ||
| 55 | else if (last_temp2 == last_temp3) | ||
| 56 | last_temp = last_temp3; | ||
| 57 | done: | ||
| 58 | /* Convert temperature from deciCelsius to milliCelsius */ | ||
| 59 | *temp = sign_extend32(last_temp, fls(LAST_TEMP_MASK) - 1) * 100; | ||
| 60 | |||
| 61 | return 0; | ||
| 62 | } | ||
| 63 | |||
| 64 | static const struct tsens_ops ops_generic_v2 = { | ||
| 65 | .init = init_common, | ||
| 66 | .get_temp = get_temp_tsens_v2, | ||
| 67 | }; | ||
| 68 | |||
| 69 | const struct tsens_data data_tsens_v2 = { | ||
| 70 | .ops = &ops_generic_v2, | ||
| 71 | }; | ||
| 72 | |||
| 73 | /* Kept around for backward compatibility with old msm8996.dtsi */ | ||
| 74 | const struct tsens_data data_8996 = { | ||
| 75 | .num_sensors = 13, | ||
| 76 | .ops = &ops_generic_v2, | ||
| 77 | }; | ||
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c index 3440166c2ae9..a2c9bfae3d86 100644 --- a/drivers/thermal/qcom/tsens.c +++ b/drivers/thermal/qcom/tsens.c | |||
| @@ -72,6 +72,9 @@ static const struct of_device_id tsens_table[] = { | |||
| 72 | }, { | 72 | }, { |
| 73 | .compatible = "qcom,msm8996-tsens", | 73 | .compatible = "qcom,msm8996-tsens", |
| 74 | .data = &data_8996, | 74 | .data = &data_8996, |
| 75 | }, { | ||
| 76 | .compatible = "qcom,tsens-v2", | ||
| 77 | .data = &data_tsens_v2, | ||
| 75 | }, | 78 | }, |
| 76 | {} | 79 | {} |
| 77 | }; | 80 | }; |
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h index 911c1978892b..14331eb45a86 100644 --- a/drivers/thermal/qcom/tsens.h +++ b/drivers/thermal/qcom/tsens.h | |||
| @@ -77,9 +77,8 @@ struct tsens_device { | |||
| 77 | struct device *dev; | 77 | struct device *dev; |
| 78 | u32 num_sensors; | 78 | u32 num_sensors; |
| 79 | struct regmap *map; | 79 | struct regmap *map; |
| 80 | struct regmap_field *status_field; | 80 | u32 tm_offset; |
| 81 | struct tsens_context ctx; | 81 | struct tsens_context ctx; |
| 82 | bool trdy; | ||
| 83 | const struct tsens_ops *ops; | 82 | const struct tsens_ops *ops; |
| 84 | struct tsens_sensor sensor[0]; | 83 | struct tsens_sensor sensor[0]; |
| 85 | }; | 84 | }; |
| @@ -89,6 +88,9 @@ void compute_intercept_slope(struct tsens_device *, u32 *, u32 *, u32); | |||
| 89 | int init_common(struct tsens_device *); | 88 | int init_common(struct tsens_device *); |
| 90 | int get_temp_common(struct tsens_device *, int, int *); | 89 | int get_temp_common(struct tsens_device *, int, int *); |
| 91 | 90 | ||
| 92 | extern const struct tsens_data data_8916, data_8974, data_8960, data_8996; | 91 | /* TSENS v1 targets */ |
| 92 | extern const struct tsens_data data_8916, data_8974, data_8960; | ||
| 93 | /* TSENS v2 targets */ | ||
| 94 | extern const struct tsens_data data_8996, data_tsens_v2; | ||
| 93 | 95 | ||
| 94 | #endif /* __QCOM_TSENS_H__ */ | 96 | #endif /* __QCOM_TSENS_H__ */ |
diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c index 45fb284d4c11..e77e63070e99 100644 --- a/drivers/thermal/rcar_thermal.c +++ b/drivers/thermal/rcar_thermal.c | |||
| @@ -598,7 +598,7 @@ static int rcar_thermal_probe(struct platform_device *pdev) | |||
| 598 | enr_bits |= 3 << (i * 8); | 598 | enr_bits |= 3 << (i * 8); |
| 599 | } | 599 | } |
| 600 | 600 | ||
| 601 | if (enr_bits) | 601 | if (common->base && enr_bits) |
| 602 | rcar_thermal_common_write(common, ENR, enr_bits); | 602 | rcar_thermal_common_write(common, ENR, enr_bits); |
| 603 | 603 | ||
| 604 | dev_info(dev, "%d sensor probed\n", i); | 604 | dev_info(dev, "%d sensor probed\n", i); |
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index a992e51ef065..48eef552cba4 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c | |||
| @@ -789,11 +789,6 @@ static void exynos_tmu_work(struct work_struct *work) | |||
| 789 | struct exynos_tmu_data *data = container_of(work, | 789 | struct exynos_tmu_data *data = container_of(work, |
| 790 | struct exynos_tmu_data, irq_work); | 790 | struct exynos_tmu_data, irq_work); |
| 791 | 791 | ||
| 792 | if (!IS_ERR(data->clk_sec)) | ||
| 793 | clk_enable(data->clk_sec); | ||
| 794 | if (!IS_ERR(data->clk_sec)) | ||
| 795 | clk_disable(data->clk_sec); | ||
| 796 | |||
| 797 | thermal_zone_device_update(data->tzd, THERMAL_EVENT_UNSPECIFIED); | 792 | thermal_zone_device_update(data->tzd, THERMAL_EVENT_UNSPECIFIED); |
| 798 | 793 | ||
| 799 | mutex_lock(&data->lock); | 794 | mutex_lock(&data->lock); |
diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c index 11278836ed12..40c69a533b24 100644 --- a/drivers/thermal/thermal_hwmon.c +++ b/drivers/thermal/thermal_hwmon.c | |||
| @@ -142,7 +142,8 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz) | |||
| 142 | 142 | ||
| 143 | INIT_LIST_HEAD(&hwmon->tz_list); | 143 | INIT_LIST_HEAD(&hwmon->tz_list); |
| 144 | strlcpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH); | 144 | strlcpy(hwmon->type, tz->type, THERMAL_NAME_LENGTH); |
| 145 | hwmon->device = hwmon_device_register_with_info(NULL, hwmon->type, | 145 | strreplace(hwmon->type, '-', '_'); |
| 146 | hwmon->device = hwmon_device_register_with_info(&tz->device, hwmon->type, | ||
| 146 | hwmon, NULL, NULL); | 147 | hwmon, NULL, NULL); |
| 147 | if (IS_ERR(hwmon->device)) { | 148 | if (IS_ERR(hwmon->device)) { |
| 148 | result = PTR_ERR(hwmon->device); | 149 | result = PTR_ERR(hwmon->device); |
diff --git a/drivers/thermal/ti-soc-thermal/dra752-bandgap.h b/drivers/thermal/ti-soc-thermal/dra752-bandgap.h index a31e4b5e82cd..9490cd63fa6a 100644 --- a/drivers/thermal/ti-soc-thermal/dra752-bandgap.h +++ b/drivers/thermal/ti-soc-thermal/dra752-bandgap.h | |||
| @@ -54,56 +54,36 @@ | |||
| 54 | #define DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET 0x8 | 54 | #define DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET 0x8 |
| 55 | #define DRA752_TEMP_SENSOR_CORE_OFFSET 0x154 | 55 | #define DRA752_TEMP_SENSOR_CORE_OFFSET 0x154 |
| 56 | #define DRA752_BANDGAP_THRESHOLD_CORE_OFFSET 0x1ac | 56 | #define DRA752_BANDGAP_THRESHOLD_CORE_OFFSET 0x1ac |
| 57 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_OFFSET 0x1c4 | ||
| 58 | #define DRA752_DTEMP_CORE_0_OFFSET 0x208 | ||
| 59 | #define DRA752_DTEMP_CORE_1_OFFSET 0x20c | 57 | #define DRA752_DTEMP_CORE_1_OFFSET 0x20c |
| 60 | #define DRA752_DTEMP_CORE_2_OFFSET 0x210 | 58 | #define DRA752_DTEMP_CORE_2_OFFSET 0x210 |
| 61 | #define DRA752_DTEMP_CORE_3_OFFSET 0x214 | ||
| 62 | #define DRA752_DTEMP_CORE_4_OFFSET 0x218 | ||
| 63 | 59 | ||
| 64 | /* DRA752.iva register offsets */ | 60 | /* DRA752.iva register offsets */ |
| 65 | #define DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET 0x388 | 61 | #define DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET 0x388 |
| 66 | #define DRA752_TEMP_SENSOR_IVA_OFFSET 0x398 | 62 | #define DRA752_TEMP_SENSOR_IVA_OFFSET 0x398 |
| 67 | #define DRA752_BANDGAP_THRESHOLD_IVA_OFFSET 0x3a4 | 63 | #define DRA752_BANDGAP_THRESHOLD_IVA_OFFSET 0x3a4 |
| 68 | #define DRA752_BANDGAP_CUMUL_DTEMP_IVA_OFFSET 0x3b4 | ||
| 69 | #define DRA752_DTEMP_IVA_0_OFFSET 0x3d0 | ||
| 70 | #define DRA752_DTEMP_IVA_1_OFFSET 0x3d4 | 64 | #define DRA752_DTEMP_IVA_1_OFFSET 0x3d4 |
| 71 | #define DRA752_DTEMP_IVA_2_OFFSET 0x3d8 | 65 | #define DRA752_DTEMP_IVA_2_OFFSET 0x3d8 |
| 72 | #define DRA752_DTEMP_IVA_3_OFFSET 0x3dc | ||
| 73 | #define DRA752_DTEMP_IVA_4_OFFSET 0x3e0 | ||
| 74 | 66 | ||
| 75 | /* DRA752.mpu register offsets */ | 67 | /* DRA752.mpu register offsets */ |
| 76 | #define DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET 0x4 | 68 | #define DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET 0x4 |
| 77 | #define DRA752_TEMP_SENSOR_MPU_OFFSET 0x14c | 69 | #define DRA752_TEMP_SENSOR_MPU_OFFSET 0x14c |
| 78 | #define DRA752_BANDGAP_THRESHOLD_MPU_OFFSET 0x1a4 | 70 | #define DRA752_BANDGAP_THRESHOLD_MPU_OFFSET 0x1a4 |
| 79 | #define DRA752_BANDGAP_CUMUL_DTEMP_MPU_OFFSET 0x1bc | ||
| 80 | #define DRA752_DTEMP_MPU_0_OFFSET 0x1e0 | ||
| 81 | #define DRA752_DTEMP_MPU_1_OFFSET 0x1e4 | 71 | #define DRA752_DTEMP_MPU_1_OFFSET 0x1e4 |
| 82 | #define DRA752_DTEMP_MPU_2_OFFSET 0x1e8 | 72 | #define DRA752_DTEMP_MPU_2_OFFSET 0x1e8 |
| 83 | #define DRA752_DTEMP_MPU_3_OFFSET 0x1ec | ||
| 84 | #define DRA752_DTEMP_MPU_4_OFFSET 0x1f0 | ||
| 85 | 73 | ||
| 86 | /* DRA752.dspeve register offsets */ | 74 | /* DRA752.dspeve register offsets */ |
| 87 | #define DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET 0x384 | 75 | #define DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET 0x384 |
| 88 | #define DRA752_TEMP_SENSOR_DSPEVE_OFFSET 0x394 | 76 | #define DRA752_TEMP_SENSOR_DSPEVE_OFFSET 0x394 |
| 89 | #define DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET 0x3a0 | 77 | #define DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET 0x3a0 |
| 90 | #define DRA752_BANDGAP_CUMUL_DTEMP_DSPEVE_OFFSET 0x3b0 | ||
| 91 | #define DRA752_DTEMP_DSPEVE_0_OFFSET 0x3bc | ||
| 92 | #define DRA752_DTEMP_DSPEVE_1_OFFSET 0x3c0 | 78 | #define DRA752_DTEMP_DSPEVE_1_OFFSET 0x3c0 |
| 93 | #define DRA752_DTEMP_DSPEVE_2_OFFSET 0x3c4 | 79 | #define DRA752_DTEMP_DSPEVE_2_OFFSET 0x3c4 |
| 94 | #define DRA752_DTEMP_DSPEVE_3_OFFSET 0x3c8 | ||
| 95 | #define DRA752_DTEMP_DSPEVE_4_OFFSET 0x3cc | ||
| 96 | 80 | ||
| 97 | /* DRA752.gpu register offsets */ | 81 | /* DRA752.gpu register offsets */ |
| 98 | #define DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET 0x0 | 82 | #define DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET 0x0 |
| 99 | #define DRA752_TEMP_SENSOR_GPU_OFFSET 0x150 | 83 | #define DRA752_TEMP_SENSOR_GPU_OFFSET 0x150 |
| 100 | #define DRA752_BANDGAP_THRESHOLD_GPU_OFFSET 0x1a8 | 84 | #define DRA752_BANDGAP_THRESHOLD_GPU_OFFSET 0x1a8 |
| 101 | #define DRA752_BANDGAP_CUMUL_DTEMP_GPU_OFFSET 0x1c0 | ||
| 102 | #define DRA752_DTEMP_GPU_0_OFFSET 0x1f4 | ||
| 103 | #define DRA752_DTEMP_GPU_1_OFFSET 0x1f8 | 85 | #define DRA752_DTEMP_GPU_1_OFFSET 0x1f8 |
| 104 | #define DRA752_DTEMP_GPU_2_OFFSET 0x1fc | 86 | #define DRA752_DTEMP_GPU_2_OFFSET 0x1fc |
| 105 | #define DRA752_DTEMP_GPU_3_OFFSET 0x200 | ||
| 106 | #define DRA752_DTEMP_GPU_4_OFFSET 0x204 | ||
| 107 | 87 | ||
| 108 | /** | 88 | /** |
| 109 | * Register bitfields for DRA752 | 89 | * Register bitfields for DRA752 |
| @@ -114,7 +94,6 @@ | |||
| 114 | */ | 94 | */ |
| 115 | 95 | ||
| 116 | /* DRA752.BANDGAP_STATUS_1 */ | 96 | /* DRA752.BANDGAP_STATUS_1 */ |
| 117 | #define DRA752_BANDGAP_STATUS_1_ALERT_MASK BIT(31) | ||
| 118 | #define DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK BIT(5) | 97 | #define DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK BIT(5) |
| 119 | #define DRA752_BANDGAP_STATUS_1_COLD_CORE_MASK BIT(4) | 98 | #define DRA752_BANDGAP_STATUS_1_COLD_CORE_MASK BIT(4) |
| 120 | #define DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK BIT(3) | 99 | #define DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK BIT(3) |
| @@ -125,10 +104,6 @@ | |||
| 125 | /* DRA752.BANDGAP_CTRL_2 */ | 104 | /* DRA752.BANDGAP_CTRL_2 */ |
| 126 | #define DRA752_BANDGAP_CTRL_2_FREEZE_IVA_MASK BIT(22) | 105 | #define DRA752_BANDGAP_CTRL_2_FREEZE_IVA_MASK BIT(22) |
| 127 | #define DRA752_BANDGAP_CTRL_2_FREEZE_DSPEVE_MASK BIT(21) | 106 | #define DRA752_BANDGAP_CTRL_2_FREEZE_DSPEVE_MASK BIT(21) |
| 128 | #define DRA752_BANDGAP_CTRL_2_CLEAR_IVA_MASK BIT(19) | ||
| 129 | #define DRA752_BANDGAP_CTRL_2_CLEAR_DSPEVE_MASK BIT(18) | ||
| 130 | #define DRA752_BANDGAP_CTRL_2_CLEAR_ACCUM_IVA_MASK BIT(16) | ||
| 131 | #define DRA752_BANDGAP_CTRL_2_CLEAR_ACCUM_DSPEVE_MASK BIT(15) | ||
| 132 | #define DRA752_BANDGAP_CTRL_2_MASK_HOT_IVA_MASK BIT(3) | 107 | #define DRA752_BANDGAP_CTRL_2_MASK_HOT_IVA_MASK BIT(3) |
| 133 | #define DRA752_BANDGAP_CTRL_2_MASK_COLD_IVA_MASK BIT(2) | 108 | #define DRA752_BANDGAP_CTRL_2_MASK_COLD_IVA_MASK BIT(2) |
| 134 | #define DRA752_BANDGAP_CTRL_2_MASK_HOT_DSPEVE_MASK BIT(1) | 109 | #define DRA752_BANDGAP_CTRL_2_MASK_HOT_DSPEVE_MASK BIT(1) |
| @@ -141,17 +116,10 @@ | |||
| 141 | #define DRA752_BANDGAP_STATUS_2_COLD_DSPEVE_MASK BIT(0) | 116 | #define DRA752_BANDGAP_STATUS_2_COLD_DSPEVE_MASK BIT(0) |
| 142 | 117 | ||
| 143 | /* DRA752.BANDGAP_CTRL_1 */ | 118 | /* DRA752.BANDGAP_CTRL_1 */ |
| 144 | #define DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK (0x3 << 30) | ||
| 145 | #define DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK (0x7 << 27) | 119 | #define DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK (0x7 << 27) |
| 146 | #define DRA752_BANDGAP_CTRL_1_FREEZE_CORE_MASK BIT(23) | 120 | #define DRA752_BANDGAP_CTRL_1_FREEZE_CORE_MASK BIT(23) |
| 147 | #define DRA752_BANDGAP_CTRL_1_FREEZE_GPU_MASK BIT(22) | 121 | #define DRA752_BANDGAP_CTRL_1_FREEZE_GPU_MASK BIT(22) |
| 148 | #define DRA752_BANDGAP_CTRL_1_FREEZE_MPU_MASK BIT(21) | 122 | #define DRA752_BANDGAP_CTRL_1_FREEZE_MPU_MASK BIT(21) |
| 149 | #define DRA752_BANDGAP_CTRL_1_CLEAR_CORE_MASK BIT(20) | ||
| 150 | #define DRA752_BANDGAP_CTRL_1_CLEAR_GPU_MASK BIT(19) | ||
| 151 | #define DRA752_BANDGAP_CTRL_1_CLEAR_MPU_MASK BIT(18) | ||
| 152 | #define DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_CORE_MASK BIT(17) | ||
| 153 | #define DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_GPU_MASK BIT(16) | ||
| 154 | #define DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_MPU_MASK BIT(15) | ||
| 155 | #define DRA752_BANDGAP_CTRL_1_MASK_HOT_CORE_MASK BIT(5) | 123 | #define DRA752_BANDGAP_CTRL_1_MASK_HOT_CORE_MASK BIT(5) |
| 156 | #define DRA752_BANDGAP_CTRL_1_MASK_COLD_CORE_MASK BIT(4) | 124 | #define DRA752_BANDGAP_CTRL_1_MASK_COLD_CORE_MASK BIT(4) |
| 157 | #define DRA752_BANDGAP_CTRL_1_MASK_HOT_GPU_MASK BIT(3) | 125 | #define DRA752_BANDGAP_CTRL_1_MASK_HOT_GPU_MASK BIT(3) |
| @@ -168,22 +136,6 @@ | |||
| 168 | #define DRA752_BANDGAP_THRESHOLD_HOT_MASK (0x3ff << 16) | 136 | #define DRA752_BANDGAP_THRESHOLD_HOT_MASK (0x3ff << 16) |
| 169 | #define DRA752_BANDGAP_THRESHOLD_COLD_MASK (0x3ff << 0) | 137 | #define DRA752_BANDGAP_THRESHOLD_COLD_MASK (0x3ff << 0) |
| 170 | 138 | ||
| 171 | |||
| 172 | /* DRA752.BANDGAP_CUMUL_DTEMP_CORE */ | ||
| 173 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_MASK (0xffffffff << 0) | ||
| 174 | |||
| 175 | /* DRA752.BANDGAP_CUMUL_DTEMP_IVA */ | ||
| 176 | #define DRA752_BANDGAP_CUMUL_DTEMP_IVA_MASK (0xffffffff << 0) | ||
| 177 | |||
| 178 | /* DRA752.BANDGAP_CUMUL_DTEMP_MPU */ | ||
| 179 | #define DRA752_BANDGAP_CUMUL_DTEMP_MPU_MASK (0xffffffff << 0) | ||
| 180 | |||
| 181 | /* DRA752.BANDGAP_CUMUL_DTEMP_DSPEVE */ | ||
| 182 | #define DRA752_BANDGAP_CUMUL_DTEMP_DSPEVE_MASK (0xffffffff << 0) | ||
| 183 | |||
| 184 | /* DRA752.BANDGAP_CUMUL_DTEMP_GPU */ | ||
| 185 | #define DRA752_BANDGAP_CUMUL_DTEMP_GPU_MASK (0xffffffff << 0) | ||
| 186 | |||
| 187 | /** | 139 | /** |
| 188 | * Temperature limits and thresholds for DRA752 | 140 | * Temperature limits and thresholds for DRA752 |
| 189 | * | 141 | * |
| @@ -202,10 +154,6 @@ | |||
| 202 | /* bandgap clock limits */ | 154 | /* bandgap clock limits */ |
| 203 | #define DRA752_GPU_MAX_FREQ 1500000 | 155 | #define DRA752_GPU_MAX_FREQ 1500000 |
| 204 | #define DRA752_GPU_MIN_FREQ 1000000 | 156 | #define DRA752_GPU_MIN_FREQ 1000000 |
| 205 | /* sensor limits */ | ||
| 206 | #define DRA752_GPU_MIN_TEMP -40000 | ||
| 207 | #define DRA752_GPU_MAX_TEMP 125000 | ||
| 208 | #define DRA752_GPU_HYST_VAL 5000 | ||
| 209 | /* interrupts thresholds */ | 157 | /* interrupts thresholds */ |
| 210 | #define DRA752_GPU_T_HOT 800 | 158 | #define DRA752_GPU_T_HOT 800 |
| 211 | #define DRA752_GPU_T_COLD 795 | 159 | #define DRA752_GPU_T_COLD 795 |
| @@ -214,10 +162,6 @@ | |||
| 214 | /* bandgap clock limits */ | 162 | /* bandgap clock limits */ |
| 215 | #define DRA752_MPU_MAX_FREQ 1500000 | 163 | #define DRA752_MPU_MAX_FREQ 1500000 |
| 216 | #define DRA752_MPU_MIN_FREQ 1000000 | 164 | #define DRA752_MPU_MIN_FREQ 1000000 |
| 217 | /* sensor limits */ | ||
| 218 | #define DRA752_MPU_MIN_TEMP -40000 | ||
| 219 | #define DRA752_MPU_MAX_TEMP 125000 | ||
| 220 | #define DRA752_MPU_HYST_VAL 5000 | ||
| 221 | /* interrupts thresholds */ | 165 | /* interrupts thresholds */ |
| 222 | #define DRA752_MPU_T_HOT 800 | 166 | #define DRA752_MPU_T_HOT 800 |
| 223 | #define DRA752_MPU_T_COLD 795 | 167 | #define DRA752_MPU_T_COLD 795 |
| @@ -226,10 +170,6 @@ | |||
| 226 | /* bandgap clock limits */ | 170 | /* bandgap clock limits */ |
| 227 | #define DRA752_CORE_MAX_FREQ 1500000 | 171 | #define DRA752_CORE_MAX_FREQ 1500000 |
| 228 | #define DRA752_CORE_MIN_FREQ 1000000 | 172 | #define DRA752_CORE_MIN_FREQ 1000000 |
| 229 | /* sensor limits */ | ||
| 230 | #define DRA752_CORE_MIN_TEMP -40000 | ||
| 231 | #define DRA752_CORE_MAX_TEMP 125000 | ||
| 232 | #define DRA752_CORE_HYST_VAL 5000 | ||
| 233 | /* interrupts thresholds */ | 173 | /* interrupts thresholds */ |
| 234 | #define DRA752_CORE_T_HOT 800 | 174 | #define DRA752_CORE_T_HOT 800 |
| 235 | #define DRA752_CORE_T_COLD 795 | 175 | #define DRA752_CORE_T_COLD 795 |
| @@ -238,10 +178,6 @@ | |||
| 238 | /* bandgap clock limits */ | 178 | /* bandgap clock limits */ |
| 239 | #define DRA752_DSPEVE_MAX_FREQ 1500000 | 179 | #define DRA752_DSPEVE_MAX_FREQ 1500000 |
| 240 | #define DRA752_DSPEVE_MIN_FREQ 1000000 | 180 | #define DRA752_DSPEVE_MIN_FREQ 1000000 |
| 241 | /* sensor limits */ | ||
| 242 | #define DRA752_DSPEVE_MIN_TEMP -40000 | ||
| 243 | #define DRA752_DSPEVE_MAX_TEMP 125000 | ||
| 244 | #define DRA752_DSPEVE_HYST_VAL 5000 | ||
| 245 | /* interrupts thresholds */ | 181 | /* interrupts thresholds */ |
| 246 | #define DRA752_DSPEVE_T_HOT 800 | 182 | #define DRA752_DSPEVE_T_HOT 800 |
| 247 | #define DRA752_DSPEVE_T_COLD 795 | 183 | #define DRA752_DSPEVE_T_COLD 795 |
| @@ -250,10 +186,6 @@ | |||
| 250 | /* bandgap clock limits */ | 186 | /* bandgap clock limits */ |
| 251 | #define DRA752_IVA_MAX_FREQ 1500000 | 187 | #define DRA752_IVA_MAX_FREQ 1500000 |
| 252 | #define DRA752_IVA_MIN_FREQ 1000000 | 188 | #define DRA752_IVA_MIN_FREQ 1000000 |
| 253 | /* sensor limits */ | ||
| 254 | #define DRA752_IVA_MIN_TEMP -40000 | ||
| 255 | #define DRA752_IVA_MAX_TEMP 125000 | ||
| 256 | #define DRA752_IVA_HYST_VAL 5000 | ||
| 257 | /* interrupts thresholds */ | 189 | /* interrupts thresholds */ |
| 258 | #define DRA752_IVA_T_HOT 800 | 190 | #define DRA752_IVA_T_HOT 800 |
| 259 | #define DRA752_IVA_T_COLD 795 | 191 | #define DRA752_IVA_T_COLD 795 |
diff --git a/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c b/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c index 4167373327d9..33a3030aa3c0 100644 --- a/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c +++ b/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c | |||
| @@ -41,24 +41,16 @@ dra752_core_temp_sensor_registers = { | |||
| 41 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, | 41 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, |
| 42 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_CORE_MASK, | 42 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_CORE_MASK, |
| 43 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_CORE_MASK, | 43 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_CORE_MASK, |
| 44 | .mask_sidlemode_mask = DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK, | ||
| 45 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, | 44 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, |
| 46 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_CORE_MASK, | 45 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_CORE_MASK, |
| 47 | .mask_clear_mask = DRA752_BANDGAP_CTRL_1_CLEAR_CORE_MASK, | ||
| 48 | .mask_clear_accum_mask = DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_CORE_MASK, | ||
| 49 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_CORE_OFFSET, | 46 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_CORE_OFFSET, |
| 50 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 47 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
| 51 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 48 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
| 52 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 49 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
| 53 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | ||
| 54 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK, | 50 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK, |
| 55 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_CORE_MASK, | 51 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_CORE_MASK, |
| 56 | .bgap_cumul_dtemp = DRA752_BANDGAP_CUMUL_DTEMP_CORE_OFFSET, | ||
| 57 | .ctrl_dtemp_0 = DRA752_DTEMP_CORE_0_OFFSET, | ||
| 58 | .ctrl_dtemp_1 = DRA752_DTEMP_CORE_1_OFFSET, | 52 | .ctrl_dtemp_1 = DRA752_DTEMP_CORE_1_OFFSET, |
| 59 | .ctrl_dtemp_2 = DRA752_DTEMP_CORE_2_OFFSET, | 53 | .ctrl_dtemp_2 = DRA752_DTEMP_CORE_2_OFFSET, |
| 60 | .ctrl_dtemp_3 = DRA752_DTEMP_CORE_3_OFFSET, | ||
| 61 | .ctrl_dtemp_4 = DRA752_DTEMP_CORE_4_OFFSET, | ||
| 62 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET, | 54 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET, |
| 63 | }; | 55 | }; |
| 64 | 56 | ||
| @@ -74,24 +66,16 @@ dra752_iva_temp_sensor_registers = { | |||
| 74 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_2_OFFSET, | 66 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_2_OFFSET, |
| 75 | .mask_hot_mask = DRA752_BANDGAP_CTRL_2_MASK_HOT_IVA_MASK, | 67 | .mask_hot_mask = DRA752_BANDGAP_CTRL_2_MASK_HOT_IVA_MASK, |
| 76 | .mask_cold_mask = DRA752_BANDGAP_CTRL_2_MASK_COLD_IVA_MASK, | 68 | .mask_cold_mask = DRA752_BANDGAP_CTRL_2_MASK_COLD_IVA_MASK, |
| 77 | .mask_sidlemode_mask = DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK, | ||
| 78 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, | 69 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, |
| 79 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_2_FREEZE_IVA_MASK, | 70 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_2_FREEZE_IVA_MASK, |
| 80 | .mask_clear_mask = DRA752_BANDGAP_CTRL_2_CLEAR_IVA_MASK, | ||
| 81 | .mask_clear_accum_mask = DRA752_BANDGAP_CTRL_2_CLEAR_ACCUM_IVA_MASK, | ||
| 82 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_IVA_OFFSET, | 71 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_IVA_OFFSET, |
| 83 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 72 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
| 84 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 73 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
| 85 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, | 74 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, |
| 86 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | ||
| 87 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_IVA_MASK, | 75 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_IVA_MASK, |
| 88 | .status_cold_mask = DRA752_BANDGAP_STATUS_2_COLD_IVA_MASK, | 76 | .status_cold_mask = DRA752_BANDGAP_STATUS_2_COLD_IVA_MASK, |
| 89 | .bgap_cumul_dtemp = DRA752_BANDGAP_CUMUL_DTEMP_IVA_OFFSET, | ||
| 90 | .ctrl_dtemp_0 = DRA752_DTEMP_IVA_0_OFFSET, | ||
| 91 | .ctrl_dtemp_1 = DRA752_DTEMP_IVA_1_OFFSET, | 77 | .ctrl_dtemp_1 = DRA752_DTEMP_IVA_1_OFFSET, |
| 92 | .ctrl_dtemp_2 = DRA752_DTEMP_IVA_2_OFFSET, | 78 | .ctrl_dtemp_2 = DRA752_DTEMP_IVA_2_OFFSET, |
| 93 | .ctrl_dtemp_3 = DRA752_DTEMP_IVA_3_OFFSET, | ||
| 94 | .ctrl_dtemp_4 = DRA752_DTEMP_IVA_4_OFFSET, | ||
| 95 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET, | 79 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET, |
| 96 | }; | 80 | }; |
| 97 | 81 | ||
| @@ -107,24 +91,16 @@ dra752_mpu_temp_sensor_registers = { | |||
| 107 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, | 91 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, |
| 108 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_MPU_MASK, | 92 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_MPU_MASK, |
| 109 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_MPU_MASK, | 93 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_MPU_MASK, |
| 110 | .mask_sidlemode_mask = DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK, | ||
| 111 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, | 94 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, |
| 112 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_MPU_MASK, | 95 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_MPU_MASK, |
| 113 | .mask_clear_mask = DRA752_BANDGAP_CTRL_1_CLEAR_MPU_MASK, | ||
| 114 | .mask_clear_accum_mask = DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_MPU_MASK, | ||
| 115 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_MPU_OFFSET, | 96 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_MPU_OFFSET, |
| 116 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 97 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
| 117 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 98 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
| 118 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 99 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
| 119 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | ||
| 120 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_MPU_MASK, | 100 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_MPU_MASK, |
| 121 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_MPU_MASK, | 101 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_MPU_MASK, |
| 122 | .bgap_cumul_dtemp = DRA752_BANDGAP_CUMUL_DTEMP_MPU_OFFSET, | ||
| 123 | .ctrl_dtemp_0 = DRA752_DTEMP_MPU_0_OFFSET, | ||
| 124 | .ctrl_dtemp_1 = DRA752_DTEMP_MPU_1_OFFSET, | 102 | .ctrl_dtemp_1 = DRA752_DTEMP_MPU_1_OFFSET, |
| 125 | .ctrl_dtemp_2 = DRA752_DTEMP_MPU_2_OFFSET, | 103 | .ctrl_dtemp_2 = DRA752_DTEMP_MPU_2_OFFSET, |
| 126 | .ctrl_dtemp_3 = DRA752_DTEMP_MPU_3_OFFSET, | ||
| 127 | .ctrl_dtemp_4 = DRA752_DTEMP_MPU_4_OFFSET, | ||
| 128 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET, | 104 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET, |
| 129 | }; | 105 | }; |
| 130 | 106 | ||
| @@ -140,24 +116,16 @@ dra752_dspeve_temp_sensor_registers = { | |||
| 140 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_2_OFFSET, | 116 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_2_OFFSET, |
| 141 | .mask_hot_mask = DRA752_BANDGAP_CTRL_2_MASK_HOT_DSPEVE_MASK, | 117 | .mask_hot_mask = DRA752_BANDGAP_CTRL_2_MASK_HOT_DSPEVE_MASK, |
| 142 | .mask_cold_mask = DRA752_BANDGAP_CTRL_2_MASK_COLD_DSPEVE_MASK, | 118 | .mask_cold_mask = DRA752_BANDGAP_CTRL_2_MASK_COLD_DSPEVE_MASK, |
| 143 | .mask_sidlemode_mask = DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK, | ||
| 144 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, | 119 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, |
| 145 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_2_FREEZE_DSPEVE_MASK, | 120 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_2_FREEZE_DSPEVE_MASK, |
| 146 | .mask_clear_mask = DRA752_BANDGAP_CTRL_2_CLEAR_DSPEVE_MASK, | ||
| 147 | .mask_clear_accum_mask = DRA752_BANDGAP_CTRL_2_CLEAR_ACCUM_DSPEVE_MASK, | ||
| 148 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET, | 121 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET, |
| 149 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 122 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
| 150 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 123 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
| 151 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, | 124 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, |
| 152 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | ||
| 153 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_DSPEVE_MASK, | 125 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_DSPEVE_MASK, |
| 154 | .status_cold_mask = DRA752_BANDGAP_STATUS_2_COLD_DSPEVE_MASK, | 126 | .status_cold_mask = DRA752_BANDGAP_STATUS_2_COLD_DSPEVE_MASK, |
| 155 | .bgap_cumul_dtemp = DRA752_BANDGAP_CUMUL_DTEMP_DSPEVE_OFFSET, | ||
| 156 | .ctrl_dtemp_0 = DRA752_DTEMP_DSPEVE_0_OFFSET, | ||
| 157 | .ctrl_dtemp_1 = DRA752_DTEMP_DSPEVE_1_OFFSET, | 127 | .ctrl_dtemp_1 = DRA752_DTEMP_DSPEVE_1_OFFSET, |
| 158 | .ctrl_dtemp_2 = DRA752_DTEMP_DSPEVE_2_OFFSET, | 128 | .ctrl_dtemp_2 = DRA752_DTEMP_DSPEVE_2_OFFSET, |
| 159 | .ctrl_dtemp_3 = DRA752_DTEMP_DSPEVE_3_OFFSET, | ||
| 160 | .ctrl_dtemp_4 = DRA752_DTEMP_DSPEVE_4_OFFSET, | ||
| 161 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET, | 129 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET, |
| 162 | }; | 130 | }; |
| 163 | 131 | ||
| @@ -173,24 +141,16 @@ dra752_gpu_temp_sensor_registers = { | |||
| 173 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, | 141 | .bgap_mask_ctrl = DRA752_BANDGAP_CTRL_1_OFFSET, |
| 174 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_GPU_MASK, | 142 | .mask_hot_mask = DRA752_BANDGAP_CTRL_1_MASK_HOT_GPU_MASK, |
| 175 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_GPU_MASK, | 143 | .mask_cold_mask = DRA752_BANDGAP_CTRL_1_MASK_COLD_GPU_MASK, |
| 176 | .mask_sidlemode_mask = DRA752_BANDGAP_CTRL_1_SIDLEMODE_MASK, | ||
| 177 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, | 144 | .mask_counter_delay_mask = DRA752_BANDGAP_CTRL_1_COUNTER_DELAY_MASK, |
| 178 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_GPU_MASK, | 145 | .mask_freeze_mask = DRA752_BANDGAP_CTRL_1_FREEZE_GPU_MASK, |
| 179 | .mask_clear_mask = DRA752_BANDGAP_CTRL_1_CLEAR_GPU_MASK, | ||
| 180 | .mask_clear_accum_mask = DRA752_BANDGAP_CTRL_1_CLEAR_ACCUM_GPU_MASK, | ||
| 181 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_GPU_OFFSET, | 146 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_GPU_OFFSET, |
| 182 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 147 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
| 183 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 148 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
| 184 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 149 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
| 185 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | ||
| 186 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK, | 150 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK, |
| 187 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_GPU_MASK, | 151 | .status_cold_mask = DRA752_BANDGAP_STATUS_1_COLD_GPU_MASK, |
| 188 | .bgap_cumul_dtemp = DRA752_BANDGAP_CUMUL_DTEMP_GPU_OFFSET, | ||
| 189 | .ctrl_dtemp_0 = DRA752_DTEMP_GPU_0_OFFSET, | ||
| 190 | .ctrl_dtemp_1 = DRA752_DTEMP_GPU_1_OFFSET, | 152 | .ctrl_dtemp_1 = DRA752_DTEMP_GPU_1_OFFSET, |
| 191 | .ctrl_dtemp_2 = DRA752_DTEMP_GPU_2_OFFSET, | 153 | .ctrl_dtemp_2 = DRA752_DTEMP_GPU_2_OFFSET, |
| 192 | .ctrl_dtemp_3 = DRA752_DTEMP_GPU_3_OFFSET, | ||
| 193 | .ctrl_dtemp_4 = DRA752_DTEMP_GPU_4_OFFSET, | ||
| 194 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET, | 154 | .bgap_efuse = DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET, |
| 195 | }; | 155 | }; |
| 196 | 156 | ||
| @@ -200,11 +160,6 @@ static struct temp_sensor_data dra752_mpu_temp_sensor_data = { | |||
| 200 | .t_cold = DRA752_MPU_T_COLD, | 160 | .t_cold = DRA752_MPU_T_COLD, |
| 201 | .min_freq = DRA752_MPU_MIN_FREQ, | 161 | .min_freq = DRA752_MPU_MIN_FREQ, |
| 202 | .max_freq = DRA752_MPU_MAX_FREQ, | 162 | .max_freq = DRA752_MPU_MAX_FREQ, |
| 203 | .max_temp = DRA752_MPU_MAX_TEMP, | ||
| 204 | .min_temp = DRA752_MPU_MIN_TEMP, | ||
| 205 | .hyst_val = DRA752_MPU_HYST_VAL, | ||
| 206 | .update_int1 = 1000, | ||
| 207 | .update_int2 = 2000, | ||
| 208 | }; | 163 | }; |
| 209 | 164 | ||
| 210 | /* Thresholds and limits for DRA752 GPU temperature sensor */ | 165 | /* Thresholds and limits for DRA752 GPU temperature sensor */ |
| @@ -213,11 +168,6 @@ static struct temp_sensor_data dra752_gpu_temp_sensor_data = { | |||
| 213 | .t_cold = DRA752_GPU_T_COLD, | 168 | .t_cold = DRA752_GPU_T_COLD, |
| 214 | .min_freq = DRA752_GPU_MIN_FREQ, | 169 | .min_freq = DRA752_GPU_MIN_FREQ, |
| 215 | .max_freq = DRA752_GPU_MAX_FREQ, | 170 | .max_freq = DRA752_GPU_MAX_FREQ, |
| 216 | .max_temp = DRA752_GPU_MAX_TEMP, | ||
| 217 | .min_temp = DRA752_GPU_MIN_TEMP, | ||
| 218 | .hyst_val = DRA752_GPU_HYST_VAL, | ||
| 219 | .update_int1 = 1000, | ||
| 220 | .update_int2 = 2000, | ||
| 221 | }; | 171 | }; |
| 222 | 172 | ||
| 223 | /* Thresholds and limits for DRA752 CORE temperature sensor */ | 173 | /* Thresholds and limits for DRA752 CORE temperature sensor */ |
| @@ -226,11 +176,6 @@ static struct temp_sensor_data dra752_core_temp_sensor_data = { | |||
| 226 | .t_cold = DRA752_CORE_T_COLD, | 176 | .t_cold = DRA752_CORE_T_COLD, |
| 227 | .min_freq = DRA752_CORE_MIN_FREQ, | 177 | .min_freq = DRA752_CORE_MIN_FREQ, |
| 228 | .max_freq = DRA752_CORE_MAX_FREQ, | 178 | .max_freq = DRA752_CORE_MAX_FREQ, |
| 229 | .max_temp = DRA752_CORE_MAX_TEMP, | ||
| 230 | .min_temp = DRA752_CORE_MIN_TEMP, | ||
| 231 | .hyst_val = DRA752_CORE_HYST_VAL, | ||
| 232 | .update_int1 = 1000, | ||
| 233 | .update_int2 = 2000, | ||
| 234 | }; | 179 | }; |
| 235 | 180 | ||
| 236 | /* Thresholds and limits for DRA752 DSPEVE temperature sensor */ | 181 | /* Thresholds and limits for DRA752 DSPEVE temperature sensor */ |
| @@ -239,11 +184,6 @@ static struct temp_sensor_data dra752_dspeve_temp_sensor_data = { | |||
| 239 | .t_cold = DRA752_DSPEVE_T_COLD, | 184 | .t_cold = DRA752_DSPEVE_T_COLD, |
| 240 | .min_freq = DRA752_DSPEVE_MIN_FREQ, | 185 | .min_freq = DRA752_DSPEVE_MIN_FREQ, |
| 241 | .max_freq = DRA752_DSPEVE_MAX_FREQ, | 186 | .max_freq = DRA752_DSPEVE_MAX_FREQ, |
| 242 | .max_temp = DRA752_DSPEVE_MAX_TEMP, | ||
| 243 | .min_temp = DRA752_DSPEVE_MIN_TEMP, | ||
| 244 | .hyst_val = DRA752_DSPEVE_HYST_VAL, | ||
| 245 | .update_int1 = 1000, | ||
| 246 | .update_int2 = 2000, | ||
| 247 | }; | 187 | }; |
| 248 | 188 | ||
| 249 | /* Thresholds and limits for DRA752 IVA temperature sensor */ | 189 | /* Thresholds and limits for DRA752 IVA temperature sensor */ |
| @@ -252,11 +192,6 @@ static struct temp_sensor_data dra752_iva_temp_sensor_data = { | |||
| 252 | .t_cold = DRA752_IVA_T_COLD, | 192 | .t_cold = DRA752_IVA_T_COLD, |
| 253 | .min_freq = DRA752_IVA_MIN_FREQ, | 193 | .min_freq = DRA752_IVA_MIN_FREQ, |
| 254 | .max_freq = DRA752_IVA_MAX_FREQ, | 194 | .max_freq = DRA752_IVA_MAX_FREQ, |
| 255 | .max_temp = DRA752_IVA_MAX_TEMP, | ||
| 256 | .min_temp = DRA752_IVA_MIN_TEMP, | ||
| 257 | .hyst_val = DRA752_IVA_HYST_VAL, | ||
| 258 | .update_int1 = 1000, | ||
| 259 | .update_int2 = 2000, | ||
| 260 | }; | 195 | }; |
| 261 | 196 | ||
| 262 | /* | 197 | /* |
diff --git a/drivers/thermal/ti-soc-thermal/omap3-thermal-data.c b/drivers/thermal/ti-soc-thermal/omap3-thermal-data.c index c6d217913dd1..f5366807daf0 100644 --- a/drivers/thermal/ti-soc-thermal/omap3-thermal-data.c +++ b/drivers/thermal/ti-soc-thermal/omap3-thermal-data.c | |||
| @@ -48,9 +48,6 @@ omap34xx_mpu_temp_sensor_registers = { | |||
| 48 | static struct temp_sensor_data omap34xx_mpu_temp_sensor_data = { | 48 | static struct temp_sensor_data omap34xx_mpu_temp_sensor_data = { |
| 49 | .min_freq = 32768, | 49 | .min_freq = 32768, |
| 50 | .max_freq = 32768, | 50 | .max_freq = 32768, |
| 51 | .max_temp = 125000, | ||
| 52 | .min_temp = -40000, | ||
| 53 | .hyst_val = 5000, | ||
| 54 | }; | 51 | }; |
| 55 | 52 | ||
| 56 | /* | 53 | /* |
| @@ -119,9 +116,6 @@ omap36xx_mpu_temp_sensor_registers = { | |||
| 119 | static struct temp_sensor_data omap36xx_mpu_temp_sensor_data = { | 116 | static struct temp_sensor_data omap36xx_mpu_temp_sensor_data = { |
| 120 | .min_freq = 32768, | 117 | .min_freq = 32768, |
| 121 | .max_freq = 32768, | 118 | .max_freq = 32768, |
| 122 | .max_temp = 125000, | ||
| 123 | .min_temp = -40000, | ||
| 124 | .hyst_val = 5000, | ||
| 125 | }; | 119 | }; |
| 126 | 120 | ||
| 127 | /* | 121 | /* |
diff --git a/drivers/thermal/ti-soc-thermal/omap4-thermal-data.c b/drivers/thermal/ti-soc-thermal/omap4-thermal-data.c index fd1113360603..c12211eaaac4 100644 --- a/drivers/thermal/ti-soc-thermal/omap4-thermal-data.c +++ b/drivers/thermal/ti-soc-thermal/omap4-thermal-data.c | |||
| @@ -42,9 +42,6 @@ omap4430_mpu_temp_sensor_registers = { | |||
| 42 | static struct temp_sensor_data omap4430_mpu_temp_sensor_data = { | 42 | static struct temp_sensor_data omap4430_mpu_temp_sensor_data = { |
| 43 | .min_freq = OMAP4430_MIN_FREQ, | 43 | .min_freq = OMAP4430_MIN_FREQ, |
| 44 | .max_freq = OMAP4430_MAX_FREQ, | 44 | .max_freq = OMAP4430_MAX_FREQ, |
| 45 | .max_temp = OMAP4430_MAX_TEMP, | ||
| 46 | .min_temp = OMAP4430_MIN_TEMP, | ||
| 47 | .hyst_val = OMAP4430_HYST_VAL, | ||
| 48 | }; | 45 | }; |
| 49 | 46 | ||
| 50 | /* | 47 | /* |
| @@ -121,8 +118,6 @@ omap4460_mpu_temp_sensor_registers = { | |||
| 121 | .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK, | 118 | .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK, |
| 122 | 119 | ||
| 123 | .bgap_status = OMAP4460_BGAP_STATUS_OFFSET, | 120 | .bgap_status = OMAP4460_BGAP_STATUS_OFFSET, |
| 124 | .status_clean_stop_mask = OMAP4460_CLEAN_STOP_MASK, | ||
| 125 | .status_bgap_alert_mask = OMAP4460_BGAP_ALERT_MASK, | ||
| 126 | .status_hot_mask = OMAP4460_HOT_FLAG_MASK, | 121 | .status_hot_mask = OMAP4460_HOT_FLAG_MASK, |
| 127 | .status_cold_mask = OMAP4460_COLD_FLAG_MASK, | 122 | .status_cold_mask = OMAP4460_COLD_FLAG_MASK, |
| 128 | 123 | ||
| @@ -137,11 +132,6 @@ static struct temp_sensor_data omap4460_mpu_temp_sensor_data = { | |||
| 137 | .t_cold = OMAP4460_T_COLD, | 132 | .t_cold = OMAP4460_T_COLD, |
| 138 | .min_freq = OMAP4460_MIN_FREQ, | 133 | .min_freq = OMAP4460_MIN_FREQ, |
| 139 | .max_freq = OMAP4460_MAX_FREQ, | 134 | .max_freq = OMAP4460_MAX_FREQ, |
| 140 | .max_temp = OMAP4460_MAX_TEMP, | ||
| 141 | .min_temp = OMAP4460_MIN_TEMP, | ||
| 142 | .hyst_val = OMAP4460_HYST_VAL, | ||
| 143 | .update_int1 = 1000, | ||
| 144 | .update_int2 = 2000, | ||
| 145 | }; | 135 | }; |
| 146 | 136 | ||
| 147 | /* | 137 | /* |
diff --git a/drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h b/drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h index 6f2de3a3356d..b87c8659ec60 100644 --- a/drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h +++ b/drivers/thermal/ti-soc-thermal/omap4xxx-bandgap.h | |||
| @@ -73,10 +73,6 @@ | |||
| 73 | /* bandgap clock limits (no control on 4430) */ | 73 | /* bandgap clock limits (no control on 4430) */ |
| 74 | #define OMAP4430_MAX_FREQ 32768 | 74 | #define OMAP4430_MAX_FREQ 32768 |
| 75 | #define OMAP4430_MIN_FREQ 32768 | 75 | #define OMAP4430_MIN_FREQ 32768 |
| 76 | /* sensor limits */ | ||
| 77 | #define OMAP4430_MIN_TEMP -40000 | ||
| 78 | #define OMAP4430_MAX_TEMP 125000 | ||
| 79 | #define OMAP4430_HYST_VAL 5000 | ||
| 80 | 76 | ||
| 81 | /** | 77 | /** |
| 82 | * *** OMAP4460 *** Applicable for OMAP4470 | 78 | * *** OMAP4460 *** Applicable for OMAP4470 |
| @@ -143,8 +139,6 @@ | |||
| 143 | #define OMAP4460_TSHUT_COLD_MASK (0x3ff << 0) | 139 | #define OMAP4460_TSHUT_COLD_MASK (0x3ff << 0) |
| 144 | 140 | ||
| 145 | /* OMAP4460.BANDGAP_STATUS bits */ | 141 | /* OMAP4460.BANDGAP_STATUS bits */ |
| 146 | #define OMAP4460_CLEAN_STOP_MASK BIT(3) | ||
| 147 | #define OMAP4460_BGAP_ALERT_MASK BIT(2) | ||
| 148 | #define OMAP4460_HOT_FLAG_MASK BIT(1) | 142 | #define OMAP4460_HOT_FLAG_MASK BIT(1) |
| 149 | #define OMAP4460_COLD_FLAG_MASK BIT(0) | 143 | #define OMAP4460_COLD_FLAG_MASK BIT(0) |
| 150 | 144 | ||
| @@ -162,10 +156,6 @@ | |||
| 162 | /* bandgap clock limits */ | 156 | /* bandgap clock limits */ |
| 163 | #define OMAP4460_MAX_FREQ 1500000 | 157 | #define OMAP4460_MAX_FREQ 1500000 |
| 164 | #define OMAP4460_MIN_FREQ 1000000 | 158 | #define OMAP4460_MIN_FREQ 1000000 |
| 165 | /* sensor limits */ | ||
| 166 | #define OMAP4460_MIN_TEMP -40000 | ||
| 167 | #define OMAP4460_MAX_TEMP 123000 | ||
| 168 | #define OMAP4460_HYST_VAL 5000 | ||
| 169 | /* interrupts thresholds */ | 159 | /* interrupts thresholds */ |
| 170 | #define OMAP4460_TSHUT_HOT 900 /* 122 deg C */ | 160 | #define OMAP4460_TSHUT_HOT 900 /* 122 deg C */ |
| 171 | #define OMAP4460_TSHUT_COLD 895 /* 100 deg C */ | 161 | #define OMAP4460_TSHUT_COLD 895 /* 100 deg C */ |
diff --git a/drivers/thermal/ti-soc-thermal/omap5-thermal-data.c b/drivers/thermal/ti-soc-thermal/omap5-thermal-data.c index 6ac037098b52..8191bae834de 100644 --- a/drivers/thermal/ti-soc-thermal/omap5-thermal-data.c +++ b/drivers/thermal/ti-soc-thermal/omap5-thermal-data.c | |||
| @@ -38,12 +38,8 @@ omap5430_mpu_temp_sensor_registers = { | |||
| 38 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, | 38 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, |
| 39 | .mask_hot_mask = OMAP5430_MASK_HOT_MPU_MASK, | 39 | .mask_hot_mask = OMAP5430_MASK_HOT_MPU_MASK, |
| 40 | .mask_cold_mask = OMAP5430_MASK_COLD_MPU_MASK, | 40 | .mask_cold_mask = OMAP5430_MASK_COLD_MPU_MASK, |
| 41 | .mask_sidlemode_mask = OMAP5430_MASK_SIDLEMODE_MASK, | ||
| 42 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, | 41 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, |
| 43 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_MPU_MASK, | 42 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_MPU_MASK, |
| 44 | .mask_clear_mask = OMAP5430_MASK_CLEAR_MPU_MASK, | ||
| 45 | .mask_clear_accum_mask = OMAP5430_MASK_CLEAR_ACCUM_MPU_MASK, | ||
| 46 | |||
| 47 | 43 | ||
| 48 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, | 44 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, |
| 49 | .counter_mask = OMAP5430_COUNTER_MASK, | 45 | .counter_mask = OMAP5430_COUNTER_MASK, |
| @@ -57,17 +53,11 @@ omap5430_mpu_temp_sensor_registers = { | |||
| 57 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, | 53 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, |
| 58 | 54 | ||
| 59 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, | 55 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, |
| 60 | .status_clean_stop_mask = 0x0, | ||
| 61 | .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, | ||
| 62 | .status_hot_mask = OMAP5430_HOT_MPU_FLAG_MASK, | 56 | .status_hot_mask = OMAP5430_HOT_MPU_FLAG_MASK, |
| 63 | .status_cold_mask = OMAP5430_COLD_MPU_FLAG_MASK, | 57 | .status_cold_mask = OMAP5430_COLD_MPU_FLAG_MASK, |
| 64 | 58 | ||
| 65 | .bgap_cumul_dtemp = OMAP5430_BGAP_CUMUL_DTEMP_MPU_OFFSET, | ||
| 66 | .ctrl_dtemp_0 = OMAP5430_BGAP_DTEMP_MPU_0_OFFSET, | ||
| 67 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_MPU_1_OFFSET, | 59 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_MPU_1_OFFSET, |
| 68 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_MPU_2_OFFSET, | 60 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_MPU_2_OFFSET, |
| 69 | .ctrl_dtemp_3 = OMAP5430_BGAP_DTEMP_MPU_3_OFFSET, | ||
| 70 | .ctrl_dtemp_4 = OMAP5430_BGAP_DTEMP_MPU_4_OFFSET, | ||
| 71 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_MPU, | 61 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_MPU, |
| 72 | }; | 62 | }; |
| 73 | 63 | ||
| @@ -84,11 +74,8 @@ omap5430_gpu_temp_sensor_registers = { | |||
| 84 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, | 74 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, |
| 85 | .mask_hot_mask = OMAP5430_MASK_HOT_GPU_MASK, | 75 | .mask_hot_mask = OMAP5430_MASK_HOT_GPU_MASK, |
| 86 | .mask_cold_mask = OMAP5430_MASK_COLD_GPU_MASK, | 76 | .mask_cold_mask = OMAP5430_MASK_COLD_GPU_MASK, |
| 87 | .mask_sidlemode_mask = OMAP5430_MASK_SIDLEMODE_MASK, | ||
| 88 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, | 77 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, |
| 89 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_GPU_MASK, | 78 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_GPU_MASK, |
| 90 | .mask_clear_mask = OMAP5430_MASK_CLEAR_GPU_MASK, | ||
| 91 | .mask_clear_accum_mask = OMAP5430_MASK_CLEAR_ACCUM_GPU_MASK, | ||
| 92 | 79 | ||
| 93 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, | 80 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, |
| 94 | .counter_mask = OMAP5430_COUNTER_MASK, | 81 | .counter_mask = OMAP5430_COUNTER_MASK, |
| @@ -102,17 +89,11 @@ omap5430_gpu_temp_sensor_registers = { | |||
| 102 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, | 89 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, |
| 103 | 90 | ||
| 104 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, | 91 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, |
| 105 | .status_clean_stop_mask = 0x0, | ||
| 106 | .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, | ||
| 107 | .status_hot_mask = OMAP5430_HOT_GPU_FLAG_MASK, | 92 | .status_hot_mask = OMAP5430_HOT_GPU_FLAG_MASK, |
| 108 | .status_cold_mask = OMAP5430_COLD_GPU_FLAG_MASK, | 93 | .status_cold_mask = OMAP5430_COLD_GPU_FLAG_MASK, |
| 109 | 94 | ||
| 110 | .bgap_cumul_dtemp = OMAP5430_BGAP_CUMUL_DTEMP_GPU_OFFSET, | ||
| 111 | .ctrl_dtemp_0 = OMAP5430_BGAP_DTEMP_GPU_0_OFFSET, | ||
| 112 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_GPU_1_OFFSET, | 95 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_GPU_1_OFFSET, |
| 113 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_GPU_2_OFFSET, | 96 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_GPU_2_OFFSET, |
| 114 | .ctrl_dtemp_3 = OMAP5430_BGAP_DTEMP_GPU_3_OFFSET, | ||
| 115 | .ctrl_dtemp_4 = OMAP5430_BGAP_DTEMP_GPU_4_OFFSET, | ||
| 116 | 97 | ||
| 117 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_GPU, | 98 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_GPU, |
| 118 | }; | 99 | }; |
| @@ -130,11 +111,8 @@ omap5430_core_temp_sensor_registers = { | |||
| 130 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, | 111 | .bgap_mask_ctrl = OMAP5430_BGAP_CTRL_OFFSET, |
| 131 | .mask_hot_mask = OMAP5430_MASK_HOT_CORE_MASK, | 112 | .mask_hot_mask = OMAP5430_MASK_HOT_CORE_MASK, |
| 132 | .mask_cold_mask = OMAP5430_MASK_COLD_CORE_MASK, | 113 | .mask_cold_mask = OMAP5430_MASK_COLD_CORE_MASK, |
| 133 | .mask_sidlemode_mask = OMAP5430_MASK_SIDLEMODE_MASK, | ||
| 134 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, | 114 | .mask_counter_delay_mask = OMAP5430_MASK_COUNTER_DELAY_MASK, |
| 135 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_CORE_MASK, | 115 | .mask_freeze_mask = OMAP5430_MASK_FREEZE_CORE_MASK, |
| 136 | .mask_clear_mask = OMAP5430_MASK_CLEAR_CORE_MASK, | ||
| 137 | .mask_clear_accum_mask = OMAP5430_MASK_CLEAR_ACCUM_CORE_MASK, | ||
| 138 | 116 | ||
| 139 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, | 117 | .bgap_counter = OMAP5430_BGAP_CTRL_OFFSET, |
| 140 | .counter_mask = OMAP5430_COUNTER_MASK, | 118 | .counter_mask = OMAP5430_COUNTER_MASK, |
| @@ -148,17 +126,11 @@ omap5430_core_temp_sensor_registers = { | |||
| 148 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, | 126 | .tshut_cold_mask = OMAP5430_TSHUT_COLD_MASK, |
| 149 | 127 | ||
| 150 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, | 128 | .bgap_status = OMAP5430_BGAP_STATUS_OFFSET, |
| 151 | .status_clean_stop_mask = 0x0, | ||
| 152 | .status_bgap_alert_mask = OMAP5430_BGAP_ALERT_MASK, | ||
| 153 | .status_hot_mask = OMAP5430_HOT_CORE_FLAG_MASK, | 129 | .status_hot_mask = OMAP5430_HOT_CORE_FLAG_MASK, |
| 154 | .status_cold_mask = OMAP5430_COLD_CORE_FLAG_MASK, | 130 | .status_cold_mask = OMAP5430_COLD_CORE_FLAG_MASK, |
| 155 | 131 | ||
| 156 | .bgap_cumul_dtemp = OMAP5430_BGAP_CUMUL_DTEMP_CORE_OFFSET, | ||
| 157 | .ctrl_dtemp_0 = OMAP5430_BGAP_DTEMP_CORE_0_OFFSET, | ||
| 158 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_CORE_1_OFFSET, | 132 | .ctrl_dtemp_1 = OMAP5430_BGAP_DTEMP_CORE_1_OFFSET, |
| 159 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_CORE_2_OFFSET, | 133 | .ctrl_dtemp_2 = OMAP5430_BGAP_DTEMP_CORE_2_OFFSET, |
| 160 | .ctrl_dtemp_3 = OMAP5430_BGAP_DTEMP_CORE_3_OFFSET, | ||
| 161 | .ctrl_dtemp_4 = OMAP5430_BGAP_DTEMP_CORE_4_OFFSET, | ||
| 162 | 134 | ||
| 163 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_CORE, | 135 | .bgap_efuse = OMAP5430_FUSE_OPP_BGAP_CORE, |
| 164 | }; | 136 | }; |
| @@ -171,11 +143,6 @@ static struct temp_sensor_data omap5430_mpu_temp_sensor_data = { | |||
| 171 | .t_cold = OMAP5430_MPU_T_COLD, | 143 | .t_cold = OMAP5430_MPU_T_COLD, |
| 172 | .min_freq = OMAP5430_MPU_MIN_FREQ, | 144 | .min_freq = OMAP5430_MPU_MIN_FREQ, |
| 173 | .max_freq = OMAP5430_MPU_MAX_FREQ, | 145 | .max_freq = OMAP5430_MPU_MAX_FREQ, |
| 174 | .max_temp = OMAP5430_MPU_MAX_TEMP, | ||
| 175 | .min_temp = OMAP5430_MPU_MIN_TEMP, | ||
| 176 | .hyst_val = OMAP5430_MPU_HYST_VAL, | ||
| 177 | .update_int1 = 1000, | ||
| 178 | .update_int2 = 2000, | ||
| 179 | }; | 146 | }; |
| 180 | 147 | ||
| 181 | /* Thresholds and limits for OMAP5430 GPU temperature sensor */ | 148 | /* Thresholds and limits for OMAP5430 GPU temperature sensor */ |
| @@ -186,11 +153,6 @@ static struct temp_sensor_data omap5430_gpu_temp_sensor_data = { | |||
| 186 | .t_cold = OMAP5430_GPU_T_COLD, | 153 | .t_cold = OMAP5430_GPU_T_COLD, |
| 187 | .min_freq = OMAP5430_GPU_MIN_FREQ, | 154 | .min_freq = OMAP5430_GPU_MIN_FREQ, |
| 188 | .max_freq = OMAP5430_GPU_MAX_FREQ, | 155 | .max_freq = OMAP5430_GPU_MAX_FREQ, |
| 189 | .max_temp = OMAP5430_GPU_MAX_TEMP, | ||
| 190 | .min_temp = OMAP5430_GPU_MIN_TEMP, | ||
| 191 | .hyst_val = OMAP5430_GPU_HYST_VAL, | ||
| 192 | .update_int1 = 1000, | ||
| 193 | .update_int2 = 2000, | ||
| 194 | }; | 156 | }; |
| 195 | 157 | ||
| 196 | /* Thresholds and limits for OMAP5430 CORE temperature sensor */ | 158 | /* Thresholds and limits for OMAP5430 CORE temperature sensor */ |
| @@ -201,11 +163,6 @@ static struct temp_sensor_data omap5430_core_temp_sensor_data = { | |||
| 201 | .t_cold = OMAP5430_CORE_T_COLD, | 163 | .t_cold = OMAP5430_CORE_T_COLD, |
| 202 | .min_freq = OMAP5430_CORE_MIN_FREQ, | 164 | .min_freq = OMAP5430_CORE_MIN_FREQ, |
| 203 | .max_freq = OMAP5430_CORE_MAX_FREQ, | 165 | .max_freq = OMAP5430_CORE_MAX_FREQ, |
| 204 | .max_temp = OMAP5430_CORE_MAX_TEMP, | ||
| 205 | .min_temp = OMAP5430_CORE_MIN_TEMP, | ||
| 206 | .hyst_val = OMAP5430_CORE_HYST_VAL, | ||
| 207 | .update_int1 = 1000, | ||
| 208 | .update_int2 = 2000, | ||
| 209 | }; | 166 | }; |
| 210 | 167 | ||
| 211 | /* | 168 | /* |
| @@ -319,8 +276,7 @@ const struct ti_bandgap_data omap5430_data = { | |||
| 319 | TI_BANDGAP_FEATURE_FREEZE_BIT | | 276 | TI_BANDGAP_FEATURE_FREEZE_BIT | |
| 320 | TI_BANDGAP_FEATURE_TALERT | | 277 | TI_BANDGAP_FEATURE_TALERT | |
| 321 | TI_BANDGAP_FEATURE_COUNTER_DELAY | | 278 | TI_BANDGAP_FEATURE_COUNTER_DELAY | |
| 322 | TI_BANDGAP_FEATURE_HISTORY_BUFFER | | 279 | TI_BANDGAP_FEATURE_HISTORY_BUFFER, |
| 323 | TI_BANDGAP_FEATURE_ERRATA_813, | ||
| 324 | .fclock_name = "l3instr_ts_gclk_div", | 280 | .fclock_name = "l3instr_ts_gclk_div", |
| 325 | .div_ck_name = "l3instr_ts_gclk_div", | 281 | .div_ck_name = "l3instr_ts_gclk_div", |
| 326 | .conv_table = omap5430_adc_to_temp, | 282 | .conv_table = omap5430_adc_to_temp, |
diff --git a/drivers/thermal/ti-soc-thermal/omap5xxx-bandgap.h b/drivers/thermal/ti-soc-thermal/omap5xxx-bandgap.h index 400b55dffadd..9096403b74b0 100644 --- a/drivers/thermal/ti-soc-thermal/omap5xxx-bandgap.h +++ b/drivers/thermal/ti-soc-thermal/omap5xxx-bandgap.h | |||
| @@ -44,36 +44,24 @@ | |||
| 44 | #define OMAP5430_TEMP_SENSOR_GPU_OFFSET 0x150 | 44 | #define OMAP5430_TEMP_SENSOR_GPU_OFFSET 0x150 |
| 45 | #define OMAP5430_BGAP_THRESHOLD_GPU_OFFSET 0x1A8 | 45 | #define OMAP5430_BGAP_THRESHOLD_GPU_OFFSET 0x1A8 |
| 46 | #define OMAP5430_BGAP_TSHUT_GPU_OFFSET 0x1B4 | 46 | #define OMAP5430_BGAP_TSHUT_GPU_OFFSET 0x1B4 |
| 47 | #define OMAP5430_BGAP_CUMUL_DTEMP_GPU_OFFSET 0x1C0 | ||
| 48 | #define OMAP5430_BGAP_DTEMP_GPU_0_OFFSET 0x1F4 | ||
| 49 | #define OMAP5430_BGAP_DTEMP_GPU_1_OFFSET 0x1F8 | 47 | #define OMAP5430_BGAP_DTEMP_GPU_1_OFFSET 0x1F8 |
| 50 | #define OMAP5430_BGAP_DTEMP_GPU_2_OFFSET 0x1FC | 48 | #define OMAP5430_BGAP_DTEMP_GPU_2_OFFSET 0x1FC |
| 51 | #define OMAP5430_BGAP_DTEMP_GPU_3_OFFSET 0x200 | ||
| 52 | #define OMAP5430_BGAP_DTEMP_GPU_4_OFFSET 0x204 | ||
| 53 | 49 | ||
| 54 | /* OMAP5430.MPU register offsets */ | 50 | /* OMAP5430.MPU register offsets */ |
| 55 | #define OMAP5430_FUSE_OPP_BGAP_MPU 0x4 | 51 | #define OMAP5430_FUSE_OPP_BGAP_MPU 0x4 |
| 56 | #define OMAP5430_TEMP_SENSOR_MPU_OFFSET 0x14C | 52 | #define OMAP5430_TEMP_SENSOR_MPU_OFFSET 0x14C |
| 57 | #define OMAP5430_BGAP_THRESHOLD_MPU_OFFSET 0x1A4 | 53 | #define OMAP5430_BGAP_THRESHOLD_MPU_OFFSET 0x1A4 |
| 58 | #define OMAP5430_BGAP_TSHUT_MPU_OFFSET 0x1B0 | 54 | #define OMAP5430_BGAP_TSHUT_MPU_OFFSET 0x1B0 |
| 59 | #define OMAP5430_BGAP_CUMUL_DTEMP_MPU_OFFSET 0x1BC | ||
| 60 | #define OMAP5430_BGAP_DTEMP_MPU_0_OFFSET 0x1E0 | ||
| 61 | #define OMAP5430_BGAP_DTEMP_MPU_1_OFFSET 0x1E4 | 55 | #define OMAP5430_BGAP_DTEMP_MPU_1_OFFSET 0x1E4 |
| 62 | #define OMAP5430_BGAP_DTEMP_MPU_2_OFFSET 0x1E8 | 56 | #define OMAP5430_BGAP_DTEMP_MPU_2_OFFSET 0x1E8 |
| 63 | #define OMAP5430_BGAP_DTEMP_MPU_3_OFFSET 0x1EC | ||
| 64 | #define OMAP5430_BGAP_DTEMP_MPU_4_OFFSET 0x1F0 | ||
| 65 | 57 | ||
| 66 | /* OMAP5430.MPU register offsets */ | 58 | /* OMAP5430.MPU register offsets */ |
| 67 | #define OMAP5430_FUSE_OPP_BGAP_CORE 0x8 | 59 | #define OMAP5430_FUSE_OPP_BGAP_CORE 0x8 |
| 68 | #define OMAP5430_TEMP_SENSOR_CORE_OFFSET 0x154 | 60 | #define OMAP5430_TEMP_SENSOR_CORE_OFFSET 0x154 |
| 69 | #define OMAP5430_BGAP_THRESHOLD_CORE_OFFSET 0x1AC | 61 | #define OMAP5430_BGAP_THRESHOLD_CORE_OFFSET 0x1AC |
| 70 | #define OMAP5430_BGAP_TSHUT_CORE_OFFSET 0x1B8 | 62 | #define OMAP5430_BGAP_TSHUT_CORE_OFFSET 0x1B8 |
| 71 | #define OMAP5430_BGAP_CUMUL_DTEMP_CORE_OFFSET 0x1C4 | ||
| 72 | #define OMAP5430_BGAP_DTEMP_CORE_0_OFFSET 0x208 | ||
| 73 | #define OMAP5430_BGAP_DTEMP_CORE_1_OFFSET 0x20C | 63 | #define OMAP5430_BGAP_DTEMP_CORE_1_OFFSET 0x20C |
| 74 | #define OMAP5430_BGAP_DTEMP_CORE_2_OFFSET 0x210 | 64 | #define OMAP5430_BGAP_DTEMP_CORE_2_OFFSET 0x210 |
| 75 | #define OMAP5430_BGAP_DTEMP_CORE_3_OFFSET 0x214 | ||
| 76 | #define OMAP5430_BGAP_DTEMP_CORE_4_OFFSET 0x218 | ||
| 77 | 65 | ||
| 78 | /* OMAP5430.common register offsets */ | 66 | /* OMAP5430.common register offsets */ |
| 79 | #define OMAP5430_BGAP_CTRL_OFFSET 0x1A0 | 67 | #define OMAP5430_BGAP_CTRL_OFFSET 0x1A0 |
| @@ -94,17 +82,10 @@ | |||
| 94 | #define OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK (0x3ff << 0) | 82 | #define OMAP5430_BGAP_TEMP_SENSOR_DTEMP_MASK (0x3ff << 0) |
| 95 | 83 | ||
| 96 | /* OMAP5430.BANDGAP_CTRL */ | 84 | /* OMAP5430.BANDGAP_CTRL */ |
| 97 | #define OMAP5430_MASK_SIDLEMODE_MASK (0x3 << 30) | ||
| 98 | #define OMAP5430_MASK_COUNTER_DELAY_MASK (0x7 << 27) | 85 | #define OMAP5430_MASK_COUNTER_DELAY_MASK (0x7 << 27) |
| 99 | #define OMAP5430_MASK_FREEZE_CORE_MASK BIT(23) | 86 | #define OMAP5430_MASK_FREEZE_CORE_MASK BIT(23) |
| 100 | #define OMAP5430_MASK_FREEZE_GPU_MASK BIT(22) | 87 | #define OMAP5430_MASK_FREEZE_GPU_MASK BIT(22) |
| 101 | #define OMAP5430_MASK_FREEZE_MPU_MASK BIT(21) | 88 | #define OMAP5430_MASK_FREEZE_MPU_MASK BIT(21) |
| 102 | #define OMAP5430_MASK_CLEAR_CORE_MASK BIT(20) | ||
| 103 | #define OMAP5430_MASK_CLEAR_GPU_MASK BIT(19) | ||
| 104 | #define OMAP5430_MASK_CLEAR_MPU_MASK BIT(18) | ||
| 105 | #define OMAP5430_MASK_CLEAR_ACCUM_CORE_MASK BIT(17) | ||
| 106 | #define OMAP5430_MASK_CLEAR_ACCUM_GPU_MASK BIT(16) | ||
| 107 | #define OMAP5430_MASK_CLEAR_ACCUM_MPU_MASK BIT(15) | ||
| 108 | #define OMAP5430_MASK_HOT_CORE_MASK BIT(5) | 89 | #define OMAP5430_MASK_HOT_CORE_MASK BIT(5) |
| 109 | #define OMAP5430_MASK_COLD_CORE_MASK BIT(4) | 90 | #define OMAP5430_MASK_COLD_CORE_MASK BIT(4) |
| 110 | #define OMAP5430_MASK_HOT_GPU_MASK BIT(3) | 91 | #define OMAP5430_MASK_HOT_GPU_MASK BIT(3) |
| @@ -123,17 +104,7 @@ | |||
| 123 | #define OMAP5430_TSHUT_HOT_MASK (0x3ff << 16) | 104 | #define OMAP5430_TSHUT_HOT_MASK (0x3ff << 16) |
| 124 | #define OMAP5430_TSHUT_COLD_MASK (0x3ff << 0) | 105 | #define OMAP5430_TSHUT_COLD_MASK (0x3ff << 0) |
| 125 | 106 | ||
| 126 | /* OMAP5430.BANDGAP_CUMUL_DTEMP_MPU */ | ||
| 127 | #define OMAP5430_CUMUL_DTEMP_MPU_MASK (0xffffffff << 0) | ||
| 128 | |||
| 129 | /* OMAP5430.BANDGAP_CUMUL_DTEMP_GPU */ | ||
| 130 | #define OMAP5430_CUMUL_DTEMP_GPU_MASK (0xffffffff << 0) | ||
| 131 | |||
| 132 | /* OMAP5430.BANDGAP_CUMUL_DTEMP_CORE */ | ||
| 133 | #define OMAP5430_CUMUL_DTEMP_CORE_MASK (0xffffffff << 0) | ||
| 134 | |||
| 135 | /* OMAP5430.BANDGAP_STATUS */ | 107 | /* OMAP5430.BANDGAP_STATUS */ |
| 136 | #define OMAP5430_BGAP_ALERT_MASK BIT(31) | ||
| 137 | #define OMAP5430_HOT_CORE_FLAG_MASK BIT(5) | 108 | #define OMAP5430_HOT_CORE_FLAG_MASK BIT(5) |
| 138 | #define OMAP5430_COLD_CORE_FLAG_MASK BIT(4) | 109 | #define OMAP5430_COLD_CORE_FLAG_MASK BIT(4) |
| 139 | #define OMAP5430_HOT_GPU_FLAG_MASK BIT(3) | 110 | #define OMAP5430_HOT_GPU_FLAG_MASK BIT(3) |
| @@ -159,10 +130,6 @@ | |||
| 159 | /* bandgap clock limits */ | 130 | /* bandgap clock limits */ |
| 160 | #define OMAP5430_GPU_MAX_FREQ 1500000 | 131 | #define OMAP5430_GPU_MAX_FREQ 1500000 |
| 161 | #define OMAP5430_GPU_MIN_FREQ 1000000 | 132 | #define OMAP5430_GPU_MIN_FREQ 1000000 |
| 162 | /* sensor limits */ | ||
| 163 | #define OMAP5430_GPU_MIN_TEMP -40000 | ||
| 164 | #define OMAP5430_GPU_MAX_TEMP 125000 | ||
| 165 | #define OMAP5430_GPU_HYST_VAL 5000 | ||
| 166 | /* interrupts thresholds */ | 133 | /* interrupts thresholds */ |
| 167 | #define OMAP5430_GPU_TSHUT_HOT 915 | 134 | #define OMAP5430_GPU_TSHUT_HOT 915 |
| 168 | #define OMAP5430_GPU_TSHUT_COLD 900 | 135 | #define OMAP5430_GPU_TSHUT_COLD 900 |
| @@ -173,10 +140,6 @@ | |||
| 173 | /* bandgap clock limits */ | 140 | /* bandgap clock limits */ |
| 174 | #define OMAP5430_MPU_MAX_FREQ 1500000 | 141 | #define OMAP5430_MPU_MAX_FREQ 1500000 |
| 175 | #define OMAP5430_MPU_MIN_FREQ 1000000 | 142 | #define OMAP5430_MPU_MIN_FREQ 1000000 |
| 176 | /* sensor limits */ | ||
| 177 | #define OMAP5430_MPU_MIN_TEMP -40000 | ||
| 178 | #define OMAP5430_MPU_MAX_TEMP 125000 | ||
| 179 | #define OMAP5430_MPU_HYST_VAL 5000 | ||
| 180 | /* interrupts thresholds */ | 143 | /* interrupts thresholds */ |
| 181 | #define OMAP5430_MPU_TSHUT_HOT 915 | 144 | #define OMAP5430_MPU_TSHUT_HOT 915 |
| 182 | #define OMAP5430_MPU_TSHUT_COLD 900 | 145 | #define OMAP5430_MPU_TSHUT_COLD 900 |
| @@ -187,10 +150,6 @@ | |||
| 187 | /* bandgap clock limits */ | 150 | /* bandgap clock limits */ |
| 188 | #define OMAP5430_CORE_MAX_FREQ 1500000 | 151 | #define OMAP5430_CORE_MAX_FREQ 1500000 |
| 189 | #define OMAP5430_CORE_MIN_FREQ 1000000 | 152 | #define OMAP5430_CORE_MIN_FREQ 1000000 |
| 190 | /* sensor limits */ | ||
| 191 | #define OMAP5430_CORE_MIN_TEMP -40000 | ||
| 192 | #define OMAP5430_CORE_MAX_TEMP 125000 | ||
| 193 | #define OMAP5430_CORE_HYST_VAL 5000 | ||
| 194 | /* interrupts thresholds */ | 153 | /* interrupts thresholds */ |
| 195 | #define OMAP5430_CORE_TSHUT_HOT 915 | 154 | #define OMAP5430_CORE_TSHUT_HOT 915 |
| 196 | #define OMAP5430_CORE_TSHUT_COLD 900 | 155 | #define OMAP5430_CORE_TSHUT_COLD 900 |
diff --git a/drivers/thermal/ti-soc-thermal/ti-bandgap.c b/drivers/thermal/ti-soc-thermal/ti-bandgap.c index 696ab3046b87..097328d8e943 100644 --- a/drivers/thermal/ti-soc-thermal/ti-bandgap.c +++ b/drivers/thermal/ti-soc-thermal/ti-bandgap.c | |||
| @@ -306,217 +306,6 @@ int ti_bandgap_adc_to_mcelsius(struct ti_bandgap *bgp, int adc_val, int *t) | |||
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | /** | 308 | /** |
| 309 | * ti_bandgap_mcelsius_to_adc() - converts a mCelsius value to ADC scale | ||
| 310 | * @bgp: struct ti_bandgap pointer | ||
| 311 | * @temp: value in mCelsius | ||
| 312 | * @adc: address where to write the resulting temperature in ADC representation | ||
| 313 | * | ||
| 314 | * Simple conversion from mCelsius to ADC values. In case the temp value | ||
| 315 | * is out of the ADC conv table range, it returns -ERANGE, 0 on success. | ||
| 316 | * The conversion table is indexed by the ADC values. | ||
| 317 | * | ||
| 318 | * Return: 0 if conversion was successful, else -ERANGE in case the @temp | ||
| 319 | * argument is out of the ADC conv table range. | ||
| 320 | */ | ||
| 321 | static | ||
| 322 | int ti_bandgap_mcelsius_to_adc(struct ti_bandgap *bgp, long temp, int *adc) | ||
| 323 | { | ||
| 324 | const struct ti_bandgap_data *conf = bgp->conf; | ||
| 325 | const int *conv_table = bgp->conf->conv_table; | ||
| 326 | int high, low, mid; | ||
| 327 | |||
| 328 | low = 0; | ||
| 329 | high = conf->adc_end_val - conf->adc_start_val; | ||
| 330 | mid = (high + low) / 2; | ||
| 331 | |||
| 332 | if (temp < conv_table[low] || temp > conv_table[high]) | ||
| 333 | return -ERANGE; | ||
| 334 | |||
| 335 | while (low < high) { | ||
| 336 | if (temp < conv_table[mid]) | ||
| 337 | high = mid - 1; | ||
| 338 | else | ||
| 339 | low = mid + 1; | ||
| 340 | mid = (low + high) / 2; | ||
| 341 | } | ||
| 342 | |||
| 343 | *adc = conf->adc_start_val + low; | ||
| 344 | return 0; | ||
| 345 | } | ||
| 346 | |||
| 347 | /** | ||
| 348 | * ti_bandgap_add_hyst() - add hysteresis (in mCelsius) to an ADC value | ||
| 349 | * @bgp: struct ti_bandgap pointer | ||
| 350 | * @adc_val: temperature value in ADC representation | ||
| 351 | * @hyst_val: hysteresis value in mCelsius | ||
| 352 | * @sum: address where to write the resulting temperature (in ADC scale) | ||
| 353 | * | ||
| 354 | * Adds an hysteresis value (in mCelsius) to a ADC temperature value. | ||
| 355 | * | ||
| 356 | * Return: 0 on success, -ERANGE otherwise. | ||
| 357 | */ | ||
| 358 | static | ||
| 359 | int ti_bandgap_add_hyst(struct ti_bandgap *bgp, int adc_val, int hyst_val, | ||
| 360 | u32 *sum) | ||
| 361 | { | ||
| 362 | int temp, ret; | ||
| 363 | |||
| 364 | /* | ||
| 365 | * Need to add in the mcelsius domain, so we have a temperature | ||
| 366 | * the conv_table range | ||
| 367 | */ | ||
| 368 | ret = ti_bandgap_adc_to_mcelsius(bgp, adc_val, &temp); | ||
| 369 | if (ret < 0) | ||
| 370 | return ret; | ||
| 371 | |||
| 372 | temp += hyst_val; | ||
| 373 | |||
| 374 | ret = ti_bandgap_mcelsius_to_adc(bgp, temp, sum); | ||
| 375 | return ret; | ||
| 376 | } | ||
| 377 | |||
| 378 | /*** Helper functions handling device Alert/Shutdown signals ***/ | ||
| 379 | |||
| 380 | /** | ||
| 381 | * ti_bandgap_unmask_interrupts() - unmasks the events of thot & tcold | ||
| 382 | * @bgp: struct ti_bandgap pointer | ||
| 383 | * @id: bandgap sensor id | ||
| 384 | * @t_hot: hot temperature value to trigger alert signal | ||
| 385 | * @t_cold: cold temperature value to trigger alert signal | ||
| 386 | * | ||
| 387 | * Checks the requested t_hot and t_cold values and configures the IRQ event | ||
| 388 | * masks accordingly. Call this function only if bandgap features HAS(TALERT). | ||
| 389 | */ | ||
| 390 | static void ti_bandgap_unmask_interrupts(struct ti_bandgap *bgp, int id, | ||
| 391 | u32 t_hot, u32 t_cold) | ||
| 392 | { | ||
| 393 | struct temp_sensor_registers *tsr; | ||
| 394 | u32 temp, reg_val; | ||
| 395 | |||
| 396 | /* Read the current on die temperature */ | ||
| 397 | temp = ti_bandgap_read_temp(bgp, id); | ||
| 398 | |||
| 399 | tsr = bgp->conf->sensors[id].registers; | ||
| 400 | reg_val = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl); | ||
| 401 | |||
| 402 | if (temp < t_hot) | ||
| 403 | reg_val |= tsr->mask_hot_mask; | ||
| 404 | else | ||
| 405 | reg_val &= ~tsr->mask_hot_mask; | ||
| 406 | |||
| 407 | if (t_cold < temp) | ||
| 408 | reg_val |= tsr->mask_cold_mask; | ||
| 409 | else | ||
| 410 | reg_val &= ~tsr->mask_cold_mask; | ||
| 411 | ti_bandgap_writel(bgp, reg_val, tsr->bgap_mask_ctrl); | ||
| 412 | } | ||
| 413 | |||
| 414 | /** | ||
| 415 | * ti_bandgap_update_alert_threshold() - sequence to update thresholds | ||
| 416 | * @bgp: struct ti_bandgap pointer | ||
| 417 | * @id: bandgap sensor id | ||
| 418 | * @val: value (ADC) of a new threshold | ||
| 419 | * @hot: desired threshold to be updated. true if threshold hot, false if | ||
| 420 | * threshold cold | ||
| 421 | * | ||
| 422 | * It will program the required thresholds (hot and cold) for TALERT signal. | ||
| 423 | * This function can be used to update t_hot or t_cold, depending on @hot value. | ||
| 424 | * It checks the resulting t_hot and t_cold values, based on the new passed @val | ||
| 425 | * and configures the thresholds so that t_hot is always greater than t_cold. | ||
| 426 | * Call this function only if bandgap features HAS(TALERT). | ||
| 427 | * | ||
| 428 | * Return: 0 if no error, else corresponding error | ||
| 429 | */ | ||
| 430 | static int ti_bandgap_update_alert_threshold(struct ti_bandgap *bgp, int id, | ||
| 431 | int val, bool hot) | ||
| 432 | { | ||
| 433 | struct temp_sensor_data *ts_data = bgp->conf->sensors[id].ts_data; | ||
| 434 | struct temp_sensor_registers *tsr; | ||
| 435 | u32 thresh_val, reg_val, t_hot, t_cold, ctrl; | ||
| 436 | int err = 0; | ||
| 437 | |||
| 438 | tsr = bgp->conf->sensors[id].registers; | ||
| 439 | |||
| 440 | /* obtain the current value */ | ||
| 441 | thresh_val = ti_bandgap_readl(bgp, tsr->bgap_threshold); | ||
| 442 | t_cold = (thresh_val & tsr->threshold_tcold_mask) >> | ||
| 443 | __ffs(tsr->threshold_tcold_mask); | ||
| 444 | t_hot = (thresh_val & tsr->threshold_thot_mask) >> | ||
| 445 | __ffs(tsr->threshold_thot_mask); | ||
| 446 | if (hot) | ||
| 447 | t_hot = val; | ||
| 448 | else | ||
| 449 | t_cold = val; | ||
| 450 | |||
| 451 | if (t_cold > t_hot) { | ||
| 452 | if (hot) | ||
| 453 | err = ti_bandgap_add_hyst(bgp, t_hot, | ||
| 454 | -ts_data->hyst_val, | ||
| 455 | &t_cold); | ||
| 456 | else | ||
| 457 | err = ti_bandgap_add_hyst(bgp, t_cold, | ||
| 458 | ts_data->hyst_val, | ||
| 459 | &t_hot); | ||
| 460 | } | ||
| 461 | |||
| 462 | /* write the new threshold values */ | ||
| 463 | reg_val = thresh_val & | ||
| 464 | ~(tsr->threshold_thot_mask | tsr->threshold_tcold_mask); | ||
| 465 | reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)) | | ||
| 466 | (t_cold << __ffs(tsr->threshold_tcold_mask)); | ||
| 467 | |||
| 468 | /** | ||
| 469 | * Errata i813: | ||
| 470 | * Spurious Thermal Alert: Talert can happen randomly while the device | ||
| 471 | * remains under the temperature limit defined for this event to trig. | ||
| 472 | * This spurious event is caused by a incorrect re-synchronization | ||
| 473 | * between clock domains. The comparison between configured threshold | ||
| 474 | * and current temperature value can happen while the value is | ||
| 475 | * transitioning (metastable), thus causing inappropriate event | ||
| 476 | * generation. No spurious event occurs as long as the threshold value | ||
| 477 | * stays unchanged. Spurious event can be generated while a thermal | ||
| 478 | * alert threshold is modified in | ||
| 479 | * CONTROL_BANDGAP_THRESHOLD_MPU/GPU/CORE/DSPEVE/IVA_n. | ||
| 480 | */ | ||
| 481 | |||
| 482 | if (TI_BANDGAP_HAS(bgp, ERRATA_813)) { | ||
| 483 | /* Mask t_hot and t_cold events at the IP Level */ | ||
| 484 | ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl); | ||
| 485 | |||
| 486 | if (hot) | ||
| 487 | ctrl &= ~tsr->mask_hot_mask; | ||
| 488 | else | ||
| 489 | ctrl &= ~tsr->mask_cold_mask; | ||
| 490 | |||
| 491 | ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl); | ||
| 492 | } | ||
| 493 | |||
| 494 | /* Write the threshold value */ | ||
| 495 | ti_bandgap_writel(bgp, reg_val, tsr->bgap_threshold); | ||
| 496 | |||
| 497 | if (TI_BANDGAP_HAS(bgp, ERRATA_813)) { | ||
| 498 | /* Unmask t_hot and t_cold events at the IP Level */ | ||
| 499 | ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl); | ||
| 500 | if (hot) | ||
| 501 | ctrl |= tsr->mask_hot_mask; | ||
| 502 | else | ||
| 503 | ctrl |= tsr->mask_cold_mask; | ||
| 504 | |||
| 505 | ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl); | ||
| 506 | } | ||
| 507 | |||
| 508 | if (err) { | ||
| 509 | dev_err(bgp->dev, "failed to reprogram thot threshold\n"); | ||
| 510 | err = -EIO; | ||
| 511 | goto exit; | ||
| 512 | } | ||
| 513 | |||
| 514 | ti_bandgap_unmask_interrupts(bgp, id, t_hot, t_cold); | ||
| 515 | exit: | ||
| 516 | return err; | ||
| 517 | } | ||
| 518 | |||
| 519 | /** | ||
| 520 | * ti_bandgap_validate() - helper to check the sanity of a struct ti_bandgap | 309 | * ti_bandgap_validate() - helper to check the sanity of a struct ti_bandgap |
| 521 | * @bgp: struct ti_bandgap pointer | 310 | * @bgp: struct ti_bandgap pointer |
| 522 | * @id: bandgap sensor id | 311 | * @id: bandgap sensor id |
| @@ -544,165 +333,6 @@ static inline int ti_bandgap_validate(struct ti_bandgap *bgp, int id) | |||
| 544 | } | 333 | } |
| 545 | 334 | ||
| 546 | /** | 335 | /** |
| 547 | * _ti_bandgap_write_threshold() - helper to update TALERT t_cold or t_hot | ||
| 548 | * @bgp: struct ti_bandgap pointer | ||
| 549 | * @id: bandgap sensor id | ||
| 550 | * @val: value (mCelsius) of a new threshold | ||
| 551 | * @hot: desired threshold to be updated. true if threshold hot, false if | ||
| 552 | * threshold cold | ||
| 553 | * | ||
| 554 | * It will update the required thresholds (hot and cold) for TALERT signal. | ||
| 555 | * This function can be used to update t_hot or t_cold, depending on @hot value. | ||
| 556 | * Validates the mCelsius range and update the requested threshold. | ||
| 557 | * Call this function only if bandgap features HAS(TALERT). | ||
| 558 | * | ||
| 559 | * Return: 0 if no error, else corresponding error value. | ||
| 560 | */ | ||
| 561 | static int _ti_bandgap_write_threshold(struct ti_bandgap *bgp, int id, int val, | ||
| 562 | bool hot) | ||
| 563 | { | ||
| 564 | struct temp_sensor_data *ts_data; | ||
| 565 | struct temp_sensor_registers *tsr; | ||
| 566 | u32 adc_val; | ||
| 567 | int ret; | ||
| 568 | |||
| 569 | ret = ti_bandgap_validate(bgp, id); | ||
| 570 | if (ret) | ||
| 571 | return ret; | ||
| 572 | |||
| 573 | if (!TI_BANDGAP_HAS(bgp, TALERT)) | ||
| 574 | return -ENOTSUPP; | ||
| 575 | |||
| 576 | ts_data = bgp->conf->sensors[id].ts_data; | ||
| 577 | tsr = bgp->conf->sensors[id].registers; | ||
| 578 | if (hot) { | ||
| 579 | if (val < ts_data->min_temp + ts_data->hyst_val) | ||
| 580 | ret = -EINVAL; | ||
| 581 | } else { | ||
| 582 | if (val > ts_data->max_temp + ts_data->hyst_val) | ||
| 583 | ret = -EINVAL; | ||
| 584 | } | ||
| 585 | |||
| 586 | if (ret) | ||
| 587 | return ret; | ||
| 588 | |||
| 589 | ret = ti_bandgap_mcelsius_to_adc(bgp, val, &adc_val); | ||
| 590 | if (ret < 0) | ||
| 591 | return ret; | ||
| 592 | |||
| 593 | spin_lock(&bgp->lock); | ||
| 594 | ret = ti_bandgap_update_alert_threshold(bgp, id, adc_val, hot); | ||
| 595 | spin_unlock(&bgp->lock); | ||
| 596 | return ret; | ||
| 597 | } | ||
| 598 | |||
| 599 | /** | ||
| 600 | * _ti_bandgap_read_threshold() - helper to read TALERT t_cold or t_hot | ||
| 601 | * @bgp: struct ti_bandgap pointer | ||
| 602 | * @id: bandgap sensor id | ||
| 603 | * @val: value (mCelsius) of a threshold | ||
| 604 | * @hot: desired threshold to be read. true if threshold hot, false if | ||
| 605 | * threshold cold | ||
| 606 | * | ||
| 607 | * It will fetch the required thresholds (hot and cold) for TALERT signal. | ||
| 608 | * This function can be used to read t_hot or t_cold, depending on @hot value. | ||
| 609 | * Call this function only if bandgap features HAS(TALERT). | ||
| 610 | * | ||
| 611 | * Return: 0 if no error, -ENOTSUPP if it has no TALERT support, or the | ||
| 612 | * corresponding error value if some operation fails. | ||
| 613 | */ | ||
| 614 | static int _ti_bandgap_read_threshold(struct ti_bandgap *bgp, int id, | ||
| 615 | int *val, bool hot) | ||
| 616 | { | ||
| 617 | struct temp_sensor_registers *tsr; | ||
| 618 | u32 temp, mask; | ||
| 619 | int ret = 0; | ||
| 620 | |||
| 621 | ret = ti_bandgap_validate(bgp, id); | ||
| 622 | if (ret) | ||
| 623 | goto exit; | ||
| 624 | |||
| 625 | if (!TI_BANDGAP_HAS(bgp, TALERT)) { | ||
| 626 | ret = -ENOTSUPP; | ||
| 627 | goto exit; | ||
| 628 | } | ||
| 629 | |||
| 630 | tsr = bgp->conf->sensors[id].registers; | ||
| 631 | if (hot) | ||
| 632 | mask = tsr->threshold_thot_mask; | ||
| 633 | else | ||
| 634 | mask = tsr->threshold_tcold_mask; | ||
| 635 | |||
| 636 | temp = ti_bandgap_readl(bgp, tsr->bgap_threshold); | ||
| 637 | temp = (temp & mask) >> __ffs(mask); | ||
| 638 | ret = ti_bandgap_adc_to_mcelsius(bgp, temp, &temp); | ||
| 639 | if (ret) { | ||
| 640 | dev_err(bgp->dev, "failed to read thot\n"); | ||
| 641 | ret = -EIO; | ||
| 642 | goto exit; | ||
| 643 | } | ||
| 644 | |||
| 645 | *val = temp; | ||
| 646 | |||
| 647 | exit: | ||
| 648 | return ret; | ||
| 649 | } | ||
| 650 | |||
| 651 | /*** Exposed APIs ***/ | ||
| 652 | |||
| 653 | /** | ||
| 654 | * ti_bandgap_read_thot() - reads sensor current thot | ||
| 655 | * @bgp: pointer to bandgap instance | ||
| 656 | * @id: sensor id | ||
| 657 | * @thot: resulting current thot value | ||
| 658 | * | ||
| 659 | * Return: 0 on success or the proper error code | ||
| 660 | */ | ||
| 661 | int ti_bandgap_read_thot(struct ti_bandgap *bgp, int id, int *thot) | ||
| 662 | { | ||
| 663 | return _ti_bandgap_read_threshold(bgp, id, thot, true); | ||
| 664 | } | ||
| 665 | |||
| 666 | /** | ||
| 667 | * ti_bandgap_write_thot() - sets sensor current thot | ||
| 668 | * @bgp: pointer to bandgap instance | ||
| 669 | * @id: sensor id | ||
| 670 | * @val: desired thot value | ||
| 671 | * | ||
| 672 | * Return: 0 on success or the proper error code | ||
| 673 | */ | ||
| 674 | int ti_bandgap_write_thot(struct ti_bandgap *bgp, int id, int val) | ||
| 675 | { | ||
| 676 | return _ti_bandgap_write_threshold(bgp, id, val, true); | ||
| 677 | } | ||
| 678 | |||
| 679 | /** | ||
| 680 | * ti_bandgap_read_tcold() - reads sensor current tcold | ||
| 681 | * @bgp: pointer to bandgap instance | ||
| 682 | * @id: sensor id | ||
| 683 | * @tcold: resulting current tcold value | ||
| 684 | * | ||
| 685 | * Return: 0 on success or the proper error code | ||
| 686 | */ | ||
| 687 | int ti_bandgap_read_tcold(struct ti_bandgap *bgp, int id, int *tcold) | ||
| 688 | { | ||
| 689 | return _ti_bandgap_read_threshold(bgp, id, tcold, false); | ||
| 690 | } | ||
| 691 | |||
| 692 | /** | ||
| 693 | * ti_bandgap_write_tcold() - sets the sensor tcold | ||
| 694 | * @bgp: pointer to bandgap instance | ||
| 695 | * @id: sensor id | ||
| 696 | * @val: desired tcold value | ||
| 697 | * | ||
| 698 | * Return: 0 on success or the proper error code | ||
| 699 | */ | ||
| 700 | int ti_bandgap_write_tcold(struct ti_bandgap *bgp, int id, int val) | ||
| 701 | { | ||
| 702 | return _ti_bandgap_write_threshold(bgp, id, val, false); | ||
| 703 | } | ||
| 704 | |||
| 705 | /** | ||
| 706 | * ti_bandgap_read_counter() - read the sensor counter | 336 | * ti_bandgap_read_counter() - read the sensor counter |
| 707 | * @bgp: pointer to bandgap instance | 337 | * @bgp: pointer to bandgap instance |
| 708 | * @id: sensor id | 338 | * @id: sensor id |
diff --git a/drivers/thermal/ti-soc-thermal/ti-bandgap.h b/drivers/thermal/ti-soc-thermal/ti-bandgap.h index 209c664c2823..68d39ad43241 100644 --- a/drivers/thermal/ti-soc-thermal/ti-bandgap.h +++ b/drivers/thermal/ti-soc-thermal/ti-bandgap.h | |||
| @@ -78,11 +78,8 @@ | |||
| 78 | * @bgap_mask_ctrl: BANDGAP_MASK_CTRL register offset | 78 | * @bgap_mask_ctrl: BANDGAP_MASK_CTRL register offset |
| 79 | * @mask_hot_mask: mask to bandgap_mask_ctrl.mask_hot | 79 | * @mask_hot_mask: mask to bandgap_mask_ctrl.mask_hot |
| 80 | * @mask_cold_mask: mask to bandgap_mask_ctrl.mask_cold | 80 | * @mask_cold_mask: mask to bandgap_mask_ctrl.mask_cold |
| 81 | * @mask_sidlemode_mask: mask to bandgap_mask_ctrl.mask_sidlemode | ||
| 82 | * @mask_counter_delay_mask: mask to bandgap_mask_ctrl.mask_counter_delay | 81 | * @mask_counter_delay_mask: mask to bandgap_mask_ctrl.mask_counter_delay |
| 83 | * @mask_freeze_mask: mask to bandgap_mask_ctrl.mask_free | 82 | * @mask_freeze_mask: mask to bandgap_mask_ctrl.mask_free |
| 84 | * @mask_clear_mask: mask to bandgap_mask_ctrl.mask_clear | ||
| 85 | * @mask_clear_accum_mask: mask to bandgap_mask_ctrl.mask_clear_accum | ||
| 86 | * @bgap_mode_ctrl: BANDGAP_MODE_CTRL register offset | 83 | * @bgap_mode_ctrl: BANDGAP_MODE_CTRL register offset |
| 87 | * @mode_ctrl_mask: mask to bandgap_mode_ctrl.mode_ctrl | 84 | * @mode_ctrl_mask: mask to bandgap_mode_ctrl.mode_ctrl |
| 88 | * @bgap_counter: BANDGAP_COUNTER register offset | 85 | * @bgap_counter: BANDGAP_COUNTER register offset |
| @@ -91,21 +88,13 @@ | |||
| 91 | * @threshold_thot_mask: mask to bandgap_threhold.thot | 88 | * @threshold_thot_mask: mask to bandgap_threhold.thot |
| 92 | * @threshold_tcold_mask: mask to bandgap_threhold.tcold | 89 | * @threshold_tcold_mask: mask to bandgap_threhold.tcold |
| 93 | * @tshut_threshold: TSHUT_THRESHOLD register offset (TSHUT thresholds) | 90 | * @tshut_threshold: TSHUT_THRESHOLD register offset (TSHUT thresholds) |
| 94 | * @tshut_efuse_mask: mask to tshut_threshold.tshut_efuse | ||
| 95 | * @tshut_efuse_shift: shift to tshut_threshold.tshut_efuse | ||
| 96 | * @tshut_hot_mask: mask to tshut_threhold.thot | 91 | * @tshut_hot_mask: mask to tshut_threhold.thot |
| 97 | * @tshut_cold_mask: mask to tshut_threhold.thot | 92 | * @tshut_cold_mask: mask to tshut_threhold.thot |
| 98 | * @bgap_status: BANDGAP_STATUS register offset | 93 | * @bgap_status: BANDGAP_STATUS register offset |
| 99 | * @status_clean_stop_mask: mask to bandgap_status.clean_stop | ||
| 100 | * @status_bgap_alert_mask: mask to bandgap_status.bandgap_alert | ||
| 101 | * @status_hot_mask: mask to bandgap_status.hot | 94 | * @status_hot_mask: mask to bandgap_status.hot |
| 102 | * @status_cold_mask: mask to bandgap_status.cold | 95 | * @status_cold_mask: mask to bandgap_status.cold |
| 103 | * @bgap_cumul_dtemp: BANDGAP_CUMUL_DTEMP register offset | ||
| 104 | * @ctrl_dtemp_0: CTRL_DTEMP0 register offset | ||
| 105 | * @ctrl_dtemp_1: CTRL_DTEMP1 register offset | 96 | * @ctrl_dtemp_1: CTRL_DTEMP1 register offset |
| 106 | * @ctrl_dtemp_2: CTRL_DTEMP2 register offset | 97 | * @ctrl_dtemp_2: CTRL_DTEMP2 register offset |
| 107 | * @ctrl_dtemp_3: CTRL_DTEMP3 register offset | ||
| 108 | * @ctrl_dtemp_4: CTRL_DTEMP4 register offset | ||
| 109 | * @bgap_efuse: BANDGAP_EFUSE register offset | 98 | * @bgap_efuse: BANDGAP_EFUSE register offset |
| 110 | * | 99 | * |
| 111 | * The register offsets and bitfields might change across | 100 | * The register offsets and bitfields might change across |
| @@ -121,17 +110,14 @@ struct temp_sensor_registers { | |||
| 121 | u32 temp_sensor_ctrl; | 110 | u32 temp_sensor_ctrl; |
| 122 | u32 bgap_tempsoff_mask; | 111 | u32 bgap_tempsoff_mask; |
| 123 | u32 bgap_soc_mask; | 112 | u32 bgap_soc_mask; |
| 124 | u32 bgap_eocz_mask; /* not used: but needs revisit */ | 113 | u32 bgap_eocz_mask; |
| 125 | u32 bgap_dtemp_mask; | 114 | u32 bgap_dtemp_mask; |
| 126 | 115 | ||
| 127 | u32 bgap_mask_ctrl; | 116 | u32 bgap_mask_ctrl; |
| 128 | u32 mask_hot_mask; | 117 | u32 mask_hot_mask; |
| 129 | u32 mask_cold_mask; | 118 | u32 mask_cold_mask; |
| 130 | u32 mask_sidlemode_mask; /* not used: but may be needed for pm */ | ||
| 131 | u32 mask_counter_delay_mask; | 119 | u32 mask_counter_delay_mask; |
| 132 | u32 mask_freeze_mask; | 120 | u32 mask_freeze_mask; |
| 133 | u32 mask_clear_mask; /* not used: but needed for trending */ | ||
| 134 | u32 mask_clear_accum_mask; /* not used: but needed for trending */ | ||
| 135 | 121 | ||
| 136 | u32 bgap_mode_ctrl; | 122 | u32 bgap_mode_ctrl; |
| 137 | u32 mode_ctrl_mask; | 123 | u32 mode_ctrl_mask; |
| @@ -144,23 +130,15 @@ struct temp_sensor_registers { | |||
| 144 | u32 threshold_tcold_mask; | 130 | u32 threshold_tcold_mask; |
| 145 | 131 | ||
| 146 | u32 tshut_threshold; | 132 | u32 tshut_threshold; |
| 147 | u32 tshut_efuse_mask; /* not used */ | ||
| 148 | u32 tshut_efuse_shift; /* not used */ | ||
| 149 | u32 tshut_hot_mask; | 133 | u32 tshut_hot_mask; |
| 150 | u32 tshut_cold_mask; | 134 | u32 tshut_cold_mask; |
| 151 | 135 | ||
| 152 | u32 bgap_status; | 136 | u32 bgap_status; |
| 153 | u32 status_clean_stop_mask; /* not used: but needed for trending */ | ||
| 154 | u32 status_bgap_alert_mask; /* not used */ | ||
| 155 | u32 status_hot_mask; | 137 | u32 status_hot_mask; |
| 156 | u32 status_cold_mask; | 138 | u32 status_cold_mask; |
| 157 | 139 | ||
| 158 | u32 bgap_cumul_dtemp; /* not used: but needed for trending */ | 140 | u32 ctrl_dtemp_1; |
| 159 | u32 ctrl_dtemp_0; /* not used: but needed for trending */ | 141 | u32 ctrl_dtemp_2; |
| 160 | u32 ctrl_dtemp_1; /* not used: but needed for trending */ | ||
| 161 | u32 ctrl_dtemp_2; /* not used: but needed for trending */ | ||
| 162 | u32 ctrl_dtemp_3; /* not used: but needed for trending */ | ||
| 163 | u32 ctrl_dtemp_4; /* not used: but needed for trending */ | ||
| 164 | u32 bgap_efuse; | 142 | u32 bgap_efuse; |
| 165 | }; | 143 | }; |
| 166 | 144 | ||
| @@ -172,11 +150,6 @@ struct temp_sensor_registers { | |||
| 172 | * @t_cold: temperature to trigger a thermal alert (low initial value) | 150 | * @t_cold: temperature to trigger a thermal alert (low initial value) |
| 173 | * @min_freq: sensor minimum clock rate | 151 | * @min_freq: sensor minimum clock rate |
| 174 | * @max_freq: sensor maximum clock rate | 152 | * @max_freq: sensor maximum clock rate |
| 175 | * @max_temp: sensor maximum temperature | ||
| 176 | * @min_temp: sensor minimum temperature | ||
| 177 | * @hyst_val: temperature hysteresis considered while converting ADC values | ||
| 178 | * @update_int1: update interval | ||
| 179 | * @update_int2: update interval | ||
| 180 | * | 153 | * |
| 181 | * This data structure will hold the required thresholds and temperature limits | 154 | * This data structure will hold the required thresholds and temperature limits |
| 182 | * for a specific temperature sensor, like shutdown temperature, alert | 155 | * for a specific temperature sensor, like shutdown temperature, alert |
| @@ -189,11 +162,6 @@ struct temp_sensor_data { | |||
| 189 | u32 t_cold; | 162 | u32 t_cold; |
| 190 | u32 min_freq; | 163 | u32 min_freq; |
| 191 | u32 max_freq; | 164 | u32 max_freq; |
| 192 | int max_temp; | ||
| 193 | int min_temp; | ||
| 194 | int hyst_val; | ||
| 195 | u32 update_int1; /* not used */ | ||
| 196 | u32 update_int2; /* not used */ | ||
| 197 | }; | 165 | }; |
| 198 | 166 | ||
| 199 | struct ti_bandgap_data; | 167 | struct ti_bandgap_data; |
| @@ -316,8 +284,6 @@ struct ti_temp_sensor { | |||
| 316 | * | 284 | * |
| 317 | * TI_BANDGAP_FEATURE_ERRATA_814 - used to workaorund when the bandgap device | 285 | * TI_BANDGAP_FEATURE_ERRATA_814 - used to workaorund when the bandgap device |
| 318 | * has Errata 814 | 286 | * has Errata 814 |
| 319 | * TI_BANDGAP_FEATURE_ERRATA_813 - used to workaorund when the bandgap device | ||
| 320 | * has Errata 813 | ||
| 321 | * TI_BANDGAP_FEATURE_UNRELIABLE - used when the sensor readings are too | 287 | * TI_BANDGAP_FEATURE_UNRELIABLE - used when the sensor readings are too |
| 322 | * inaccurate. | 288 | * inaccurate. |
| 323 | * TI_BANDGAP_HAS(b, f) - macro to check if a bandgap device is capable of a | 289 | * TI_BANDGAP_HAS(b, f) - macro to check if a bandgap device is capable of a |
| @@ -334,8 +300,7 @@ struct ti_temp_sensor { | |||
| 334 | #define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8) | 300 | #define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8) |
| 335 | #define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9) | 301 | #define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9) |
| 336 | #define TI_BANDGAP_FEATURE_ERRATA_814 BIT(10) | 302 | #define TI_BANDGAP_FEATURE_ERRATA_814 BIT(10) |
| 337 | #define TI_BANDGAP_FEATURE_ERRATA_813 BIT(11) | 303 | #define TI_BANDGAP_FEATURE_UNRELIABLE BIT(11) |
| 338 | #define TI_BANDGAP_FEATURE_UNRELIABLE BIT(12) | ||
| 339 | #define TI_BANDGAP_HAS(b, f) \ | 304 | #define TI_BANDGAP_HAS(b, f) \ |
| 340 | ((b)->conf->features & TI_BANDGAP_FEATURE_ ## f) | 305 | ((b)->conf->features & TI_BANDGAP_FEATURE_ ## f) |
| 341 | 306 | ||
