aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmit Kucheria <amit.kucheria@linaro.org>2018-07-18 02:43:09 -0400
committerEduardo Valentin <edubezval@gmail.com>2018-07-27 18:02:37 -0400
commit5b1283984fa39933e094d237387ad8fd39527fc1 (patch)
tree3b31d82ac01f3dc19762318878caa8aa78008263
parent4ce6dcfd0d38169d9067c768fcce8e0d49f60fac (diff)
thermal: tsens: Add support to split up register address space into two
There are two banks of registers for v2 TSENS IPs: SROT and TM. On older SoCs these were contiguous, leading to DTs mapping them as one register address space of size 0x2000. In newer SoCs, these two banks are not contiguous anymore. Add logic to init_common() to differentiate between old and new DTs and adjust associated offsets for the TM register bank so that the old DTs will continue to function correctly. Signed-off-by: Amit Kucheria <amit.kucheria@linaro.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Tested-by: Matthias Kaehlcke <mka@chromium.org> Reviewed-by: Matthias Kaehlcke <mka@chromium.org> Reviewed-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
-rw-r--r--drivers/thermal/qcom/tsens-8996.c4
-rw-r--r--drivers/thermal/qcom/tsens-common.c12
-rw-r--r--drivers/thermal/qcom/tsens.h1
3 files changed, 15 insertions, 2 deletions
diff --git a/drivers/thermal/qcom/tsens-8996.c b/drivers/thermal/qcom/tsens-8996.c
index e1f77818d8fa..3e60cecd2c45 100644
--- a/drivers/thermal/qcom/tsens-8996.c
+++ b/drivers/thermal/qcom/tsens-8996.c
@@ -16,7 +16,7 @@
16#include <linux/regmap.h> 16#include <linux/regmap.h>
17#include "tsens.h" 17#include "tsens.h"
18 18
19#define STATUS_OFFSET 0x10a0 19#define STATUS_OFFSET 0xa0
20#define LAST_TEMP_MASK 0xfff 20#define LAST_TEMP_MASK 0xfff
21#define STATUS_VALID_BIT BIT(21) 21#define STATUS_VALID_BIT BIT(21)
22#define CODE_SIGN_BIT BIT(11) 22#define CODE_SIGN_BIT BIT(11)
@@ -28,7 +28,7 @@ static int get_temp_8996(struct tsens_device *tmdev, int id, int *temp)
28 unsigned int sensor_addr; 28 unsigned int sensor_addr;
29 int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret; 29 int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret;
30 30
31 sensor_addr = STATUS_OFFSET + s->hw_id * 4; 31 sensor_addr = tmdev->tm_offset + STATUS_OFFSET + s->hw_id * 4;
32 ret = regmap_read(tmdev->map, sensor_addr, &code); 32 ret = regmap_read(tmdev->map, sensor_addr, &code);
33 if (ret) 33 if (ret)
34 return ret; 34 return ret;
diff --git a/drivers/thermal/qcom/tsens-common.c b/drivers/thermal/qcom/tsens-common.c
index b1449ad67fc0..c22dc18c7c65 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"
@@ -126,11 +127,22 @@ static const struct regmap_config tsens_config = {
126int __init init_common(struct tsens_device *tmdev) 127int __init init_common(struct tsens_device *tmdev)
127{ 128{
128 void __iomem *base; 129 void __iomem *base;
130 struct platform_device *op = of_find_device_by_node(tmdev->dev->of_node);
129 131
132 if (!op)
133 return -EINVAL;
130 base = of_iomap(tmdev->dev->of_node, 0); 134 base = of_iomap(tmdev->dev->of_node, 0);
131 if (!base) 135 if (!base)
132 return -EINVAL; 136 return -EINVAL;
133 137
138 /* The driver only uses the TM register address space for now */
139 if (op->num_resources > 1) {
140 tmdev->tm_offset = 0;
141 } else {
142 /* old DTs where SROT and TM were in a contiguous 2K block */
143 tmdev->tm_offset = 0x1000;
144 }
145
134 tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config); 146 tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config);
135 if (IS_ERR(tmdev->map)) { 147 if (IS_ERR(tmdev->map)) {
136 iounmap(base); 148 iounmap(base);
diff --git a/drivers/thermal/qcom/tsens.h b/drivers/thermal/qcom/tsens.h
index dc56e1e2a19e..d785b37b47d2 100644
--- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h
@@ -77,6 +77,7 @@ 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 u32 tm_offset;
80 struct tsens_context ctx; 81 struct tsens_context ctx;
81 const struct tsens_ops *ops; 82 const struct tsens_ops *ops;
82 struct tsens_sensor sensor[0]; 83 struct tsens_sensor sensor[0];