thermal: tsens: Add support to split up register address space into two
authorAmit Kucheria <amit.kucheria@linaro.org>
Wed, 18 Jul 2018 06:43:09 +0000 (12:13 +0530)
committerEduardo Valentin <edubezval@gmail.com>
Fri, 27 Jul 2018 22:02:37 +0000 (15:02 -0700)
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>
drivers/thermal/qcom/tsens-8996.c
drivers/thermal/qcom/tsens-common.c
drivers/thermal/qcom/tsens.h

index e1f77818d8fa3bd4cf4608e47820b1974f4e65fb..3e60cecd2c454ff35d36c78c63ff980447c49050 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/regmap.h>
 #include "tsens.h"
 
-#define STATUS_OFFSET  0x10a0
+#define STATUS_OFFSET  0xa0
 #define LAST_TEMP_MASK 0xfff
 #define STATUS_VALID_BIT       BIT(21)
 #define CODE_SIGN_BIT          BIT(11)
@@ -28,7 +28,7 @@ static int get_temp_8996(struct tsens_device *tmdev, int id, int *temp)
        unsigned int sensor_addr;
        int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret;
 
-       sensor_addr = STATUS_OFFSET + s->hw_id * 4;
+       sensor_addr = tmdev->tm_offset + STATUS_OFFSET + s->hw_id * 4;
        ret = regmap_read(tmdev->map, sensor_addr, &code);
        if (ret)
                return ret;
index b1449ad67fc0a13b9ea35ec2086aaaf3c1b36c1e..c22dc18c7c65823120e825cf88296e441bcd6d4d 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/io.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/of_address.h>
+#include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include "tsens.h"
@@ -126,11 +127,22 @@ static const struct regmap_config tsens_config = {
 int __init init_common(struct tsens_device *tmdev)
 {
        void __iomem *base;
+       struct platform_device *op = of_find_device_by_node(tmdev->dev->of_node);
 
+       if (!op)
+               return -EINVAL;
        base = of_iomap(tmdev->dev->of_node, 0);
        if (!base)
                return -EINVAL;
 
+       /* The driver only uses the TM register address space for now */
+       if (op->num_resources > 1) {
+               tmdev->tm_offset = 0;
+       } else {
+               /* old DTs where SROT and TM were in a contiguous 2K block */
+               tmdev->tm_offset = 0x1000;
+       }
+
        tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config);
        if (IS_ERR(tmdev->map)) {
                iounmap(base);
index dc56e1e2a19eaea108456e8bd5e432ab871840d6..d785b37b47d23053806f2f2d71762cdcc6cddebf 100644 (file)
@@ -77,6 +77,7 @@ struct tsens_device {
        struct device                   *dev;
        u32                             num_sensors;
        struct regmap                   *map;
+       u32                             tm_offset;
        struct tsens_context            ctx;
        const struct tsens_ops          *ops;
        struct tsens_sensor             sensor[0];