Commit 5b128398 authored by Amit Kucheria's avatar Amit Kucheria Committed by Eduardo Valentin

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: default avatarAmit Kucheria <amit.kucheria@linaro.org>
Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: default avatarMatthias Kaehlcke <mka@chromium.org>
Reviewed-by: default avatarMatthias Kaehlcke <mka@chromium.org>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 4ce6dcfd
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include "tsens.h" #include "tsens.h"
#define STATUS_OFFSET 0x10a0 #define STATUS_OFFSET 0xa0
#define LAST_TEMP_MASK 0xfff #define LAST_TEMP_MASK 0xfff
#define STATUS_VALID_BIT BIT(21) #define STATUS_VALID_BIT BIT(21)
#define CODE_SIGN_BIT BIT(11) #define CODE_SIGN_BIT BIT(11)
...@@ -28,7 +28,7 @@ static int get_temp_8996(struct tsens_device *tmdev, int id, int *temp) ...@@ -28,7 +28,7 @@ static int get_temp_8996(struct tsens_device *tmdev, int id, int *temp)
unsigned int sensor_addr; unsigned int sensor_addr;
int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret; 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); ret = regmap_read(tmdev->map, sensor_addr, &code);
if (ret) if (ret)
return ret; return ret;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/nvmem-consumer.h> #include <linux/nvmem-consumer.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include "tsens.h" #include "tsens.h"
...@@ -126,11 +127,22 @@ static const struct regmap_config tsens_config = { ...@@ -126,11 +127,22 @@ static const struct regmap_config tsens_config = {
int __init init_common(struct tsens_device *tmdev) int __init init_common(struct tsens_device *tmdev)
{ {
void __iomem *base; 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); base = of_iomap(tmdev->dev->of_node, 0);
if (!base) if (!base)
return -EINVAL; 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); tmdev->map = devm_regmap_init_mmio(tmdev->dev, base, &tsens_config);
if (IS_ERR(tmdev->map)) { if (IS_ERR(tmdev->map)) {
iounmap(base); iounmap(base);
......
...@@ -77,6 +77,7 @@ struct tsens_device { ...@@ -77,6 +77,7 @@ struct tsens_device {
struct device *dev; struct device *dev;
u32 num_sensors; u32 num_sensors;
struct regmap *map; struct regmap *map;
u32 tm_offset;
struct tsens_context ctx; struct tsens_context ctx;
const struct tsens_ops *ops; const struct tsens_ops *ops;
struct tsens_sensor sensor[0]; struct tsens_sensor sensor[0];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment