aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch
diff options
context:
space:
mode:
authorAnsuel Smith <ansuelsmth@gmail.com>2020-01-26 04:32:45 +0100
committerPetr Štetiar <ynezz@true.cz>2020-03-03 23:38:23 +0100
commitefc5be2ecfd0f43b5a603f63a8f0950d484c5e8f (patch)
tree237cabb56c472320c7a2c5a8023bf5bf64976fd1 /target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch
parentc692d896eb6315edb46df851f5ecd96c49e2b65d (diff)
downloadupstream-efc5be2ecfd0f43b5a603f63a8f0950d484c5e8f.tar.gz
upstream-efc5be2ecfd0f43b5a603f63a8f0950d484c5e8f.tar.bz2
upstream-efc5be2ecfd0f43b5a603f63a8f0950d484c5e8f.zip
ipq806x: fix tsens driver
Rework tsens driver. Since in the new kernel 5.4 init common do more than it should, inizialize the kernel memory directly in the driver and drop use of this function. Rework all the patch with the new variable names. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Diffstat (limited to 'target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch')
-rw-r--r--target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch156
1 files changed, 79 insertions, 77 deletions
diff --git a/target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch b/target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch
index 9ee88533aa..80954c17fd 100644
--- a/target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch
+++ b/target/linux/ipq806x/patches-5.4/0063-1-ipq806x-tsens-driver.patch
@@ -27,11 +27,13 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
--- a/drivers/thermal/qcom/Makefile
+++ b/drivers/thermal/qcom/Makefile
-@@ -1,2 +1,3 @@
+@@ -2,5 +2,5 @@
obj-$(CONFIG_QCOM_TSENS) += qcom_tsens.o
--qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-v2.o
-+qcom_tsens-y += tsens.o tsens-common.o tsens-8916.o tsens-8974.o tsens-8960.o tsens-v2.o \
-+ tsens-ipq8064.o
+
+ qcom_tsens-y += tsens.o tsens-common.o tsens-v0_1.o \
+- tsens-8960.o tsens-v2.o tsens-v1.o
++ tsens-8960.o tsens-v2.o tsens-v1.o tsens-ipq8064.o
+ obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM) += qcom-spmi-temp-alarm.o
--- /dev/null
+++ b/drivers/thermal/qcom/tsens-ipq8064.c
@@ -0,0 +1,551 @@
@@ -187,17 +189,17 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ return code;
+}
+
-+static int suspend_ipq8064(struct tsens_device *tmdev)
++static int suspend_ipq8064(struct tsens_priv *priv)
+{
+ int ret;
+ unsigned int mask;
-+ struct regmap *map = tmdev->map;
++ struct regmap *map = priv->tm_map;
+
-+ ret = regmap_read(map, THRESHOLD_ADDR, &tmdev->ctx.threshold);
++ ret = regmap_read(map, THRESHOLD_ADDR, &priv->ctx.threshold);
+ if (ret)
+ return ret;
+
-+ ret = regmap_read(map, CNTL_ADDR, &tmdev->ctx.control);
++ ret = regmap_read(map, CNTL_ADDR, &priv->ctx.control);
+ if (ret)
+ return ret;
+
@@ -210,10 +212,10 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ return 0;
+}
+
-+static int resume_ipq8064(struct tsens_device *tmdev)
++static int resume_ipq8064(struct tsens_priv *priv)
+{
+ int ret;
-+ struct regmap *map = tmdev->map;
++ struct regmap *map = priv->tm_map;
+
+ ret = regmap_update_bits(map, CNTL_ADDR, SW_RST, SW_RST);
+ if (ret)
@@ -223,11 +225,11 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ if (ret)
+ return ret;
+
-+ ret = regmap_write(map, THRESHOLD_ADDR, tmdev->ctx.threshold);
++ ret = regmap_write(map, THRESHOLD_ADDR, priv->ctx.threshold);
+ if (ret)
+ return ret;
+
-+ ret = regmap_write(map, CNTL_ADDR, tmdev->ctx.control);
++ ret = regmap_write(map, CNTL_ADDR, priv->ctx.control);
+ if (ret)
+ return ret;
+
@@ -244,23 +246,23 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+
+static void tsens_scheduler_fn(struct work_struct *work)
+{
-+ struct tsens_device *tmdev = container_of(work, struct tsens_device,
++ struct tsens_priv *priv = container_of(work, struct tsens_priv,
+ tsens_work);
+ unsigned int threshold, threshold_low, code, reg, sensor, mask;
+ unsigned int sensor_addr;
+ bool upper_th_x, lower_th_x;
+ int adc_code, ret;
+
-+ ret = regmap_read(tmdev->map, STATUS_CNTL_8064, &reg);
++ ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg);
+ if (ret)
+ return;
+ reg = reg | LOWER_STATUS_CLR | UPPER_STATUS_CLR;
-+ ret = regmap_write(tmdev->map, STATUS_CNTL_8064, reg);
++ ret = regmap_write(priv->tm_map, STATUS_CNTL_8064, reg);
+ if (ret)
+ return;
+
+ mask = ~(LOWER_STATUS_CLR | UPPER_STATUS_CLR);
-+ ret = regmap_read(tmdev->map, THRESHOLD_ADDR, &threshold);
++ ret = regmap_read(priv->tm_map, THRESHOLD_ADDR, &threshold);
+ if (ret)
+ return;
+ threshold_low = (threshold & THRESHOLD_LOWER_LIMIT_MASK)
@@ -268,11 +270,11 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ threshold = (threshold & THRESHOLD_UPPER_LIMIT_MASK)
+ >> THRESHOLD_UPPER_LIMIT_SHIFT;
+
-+ ret = regmap_read(tmdev->map, STATUS_CNTL_8064, &reg);
++ ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg);
+ if (ret)
+ return;
+
-+ ret = regmap_read(tmdev->map, CNTL_ADDR, &sensor);
++ ret = regmap_read(priv->tm_map, CNTL_ADDR, &sensor);
+ if (ret)
+ return;
+ sensor &= (uint32_t) TSENS_8064_SENSORS_EN;
@@ -286,7 +288,7 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+
+ /* Skip if the sensor is disabled */
+ if (sensor & 1) {
-+ ret = regmap_read(tmdev->map, tmdev->sensor[0].status, &code);
++ ret = regmap_read(priv->tm_map, priv->sensor[0].status, &code);
+ if (ret)
+ return;
+ upper_th_x = code >= threshold;
@@ -297,13 +299,13 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ mask |= LOWER_STATUS_CLR;
+ if (upper_th_x || lower_th_x) {
+ /* Notify user space */
-+ schedule_work(&tmdev->sensor[0].notify_work);
-+ regmap_read(tmdev->map, sensor_addr, &adc_code);
++ schedule_work(&priv->sensor[0].notify_work);
++ regmap_read(priv->tm_map, sensor_addr, &adc_code);
+ pr_debug("Trigger (%d degrees) for sensor %d\n",
-+ code_to_degC(adc_code, &tmdev->sensor[0]), 0);
++ code_to_degC(adc_code, &priv->sensor[0]), 0);
+ }
+ }
-+ regmap_write(tmdev->map, STATUS_CNTL_8064, reg & mask);
++ regmap_write(priv->tm_map, STATUS_CNTL_8064, reg & mask);
+
+ /* force memory to sync */
+ mb();
@@ -311,59 +313,59 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+
+static irqreturn_t tsens_isr(int irq, void *data)
+{
-+ struct tsens_device *tmdev = data;
++ struct tsens_priv *priv = data;
+
-+ schedule_work(&tmdev->tsens_work);
++ schedule_work(&priv->tsens_work);
+ return IRQ_HANDLED;
+}
+
-+static void hw_init(struct tsens_device *tmdev)
++static void hw_init(struct tsens_priv *priv)
+{
+ int ret;
+ unsigned int reg_cntl = 0, reg_cfg = 0, reg_thr = 0;
+ unsigned int reg_status_cntl = 0;
+
-+ regmap_read(tmdev->map, CNTL_ADDR, &reg_cntl);
-+ regmap_write(tmdev->map, CNTL_ADDR, reg_cntl | TSENS_SW_RST);
++ regmap_read(priv->tm_map, CNTL_ADDR, &reg_cntl);
++ regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl | TSENS_SW_RST);
+
+ reg_cntl |= SLP_CLK_ENA | (MEASURE_PERIOD << 18)
-+ | (((1 << tmdev->num_sensors) - 1) << SENSOR0_SHIFT);
-+ regmap_write(tmdev->map, CNTL_ADDR, reg_cntl);
-+ regmap_read(tmdev->map, STATUS_CNTL_8064, &reg_status_cntl);
++ | (((1 << priv->num_sensors) - 1) << SENSOR0_SHIFT);
++ regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
++ regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg_status_cntl);
+ reg_status_cntl |= LOWER_STATUS_CLR | UPPER_STATUS_CLR
+ | MIN_STATUS_MASK | MAX_STATUS_MASK;
-+ regmap_write(tmdev->map, STATUS_CNTL_8064, reg_status_cntl);
++ regmap_write(priv->tm_map, STATUS_CNTL_8064, reg_status_cntl);
+ reg_cntl |= TSENS_EN;
-+ regmap_write(tmdev->map, CNTL_ADDR, reg_cntl);
++ regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
+
-+ regmap_read(tmdev->map, CONFIG_ADDR, &reg_cfg);
++ regmap_read(priv->tm_map, CONFIG_ADDR, &reg_cfg);
+ reg_cfg = (reg_cfg & ~CONFIG_MASK) | (CONFIG << CONFIG_SHIFT);
-+ regmap_write(tmdev->map, CONFIG_ADDR, reg_cfg);
++ regmap_write(priv->tm_map, CONFIG_ADDR, reg_cfg);
+
+ reg_thr |= (LOWER_LIMIT_TH << THRESHOLD_LOWER_LIMIT_SHIFT)
+ | (UPPER_LIMIT_TH << THRESHOLD_UPPER_LIMIT_SHIFT)
+ | (MIN_LIMIT_TH << THRESHOLD_MIN_LIMIT_SHIFT)
+ | (MAX_LIMIT_TH << THRESHOLD_MAX_LIMIT_SHIFT);
+
-+ regmap_write(tmdev->map, THRESHOLD_ADDR, reg_thr);
++ regmap_write(priv->tm_map, THRESHOLD_ADDR, reg_thr);
+
-+ ret = devm_request_irq(tmdev->dev, tmdev->tsens_irq, tsens_isr,
-+ IRQF_TRIGGER_RISING, "tsens_interrupt", tmdev);
++ ret = devm_request_irq(priv->dev, priv->tsens_irq, tsens_isr,
++ IRQF_TRIGGER_RISING, "tsens_interrupt", priv);
+ if (ret < 0) {
+ pr_err("%s: request_irq FAIL: %d\n", __func__, ret);
+ return;
+ }
+
-+ INIT_WORK(&tmdev->tsens_work, tsens_scheduler_fn);
++ INIT_WORK(&priv->tsens_work, tsens_scheduler_fn);
+}
+
-+static int init_ipq8064(struct tsens_device *tmdev)
++static int init_ipq8064(struct tsens_priv *priv)
+{
+ int ret, i;
+ u32 reg_cntl, offset = 0;
+
-+ init_common(tmdev);
-+ if (!tmdev->map)
++ init_common(priv);
++ if (!priv->tm_map)
+ return -ENODEV;
+
+ /*
@@ -372,55 +374,55 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ * but the control registers stay in the same place, i.e
+ * directly after the first 5 status registers.
+ */
-+ for (i = 0; i < tmdev->num_sensors; i++) {
++ for (i = 0; i < priv->num_sensors; i++) {
+ if (i >= TSENS_8064_SEQ_SENSORS)
+ offset = TSENS_8064_S4_S5_OFFSET;
+
-+ tmdev->sensor[i].status = S0_STATUS_ADDR + offset
++ priv->sensor[i].status = S0_STATUS_ADDR + offset
+ + (i << STATUS_ADDR_OFFSET);
-+ tmdev->sensor[i].slope = tsens_8064_slope[i];
-+ INIT_WORK(&tmdev->sensor[i].notify_work,
++ priv->sensor[i].slope = tsens_8064_slope[i];
++ INIT_WORK(&priv->sensor[i].notify_work,
+ notify_uspace_tsens_fn);
+ }
+
+ reg_cntl = SW_RST;
-+ ret = regmap_update_bits(tmdev->map, CNTL_ADDR, SW_RST, reg_cntl);
++ ret = regmap_update_bits(priv->tm_map, CNTL_ADDR, SW_RST, reg_cntl);
+ if (ret)
+ return ret;
+
+ reg_cntl |= SLP_CLK_ENA | (MEASURE_PERIOD << 18);
+ reg_cntl &= ~SW_RST;
-+ ret = regmap_update_bits(tmdev->map, CONFIG_ADDR,
++ ret = regmap_update_bits(priv->tm_map, CONFIG_ADDR,
+ CONFIG_MASK, CONFIG);
+
-+ reg_cntl |= GENMASK(tmdev->num_sensors - 1, 0) << SENSOR0_SHIFT;
-+ ret = regmap_write(tmdev->map, CNTL_ADDR, reg_cntl);
++ reg_cntl |= GENMASK(priv->num_sensors - 1, 0) << SENSOR0_SHIFT;
++ ret = regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
+ if (ret)
+ return ret;
+
+ reg_cntl |= EN;
-+ ret = regmap_write(tmdev->map, CNTL_ADDR, reg_cntl);
++ ret = regmap_write(priv->tm_map, CNTL_ADDR, reg_cntl);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
-+static int calibrate_ipq8064(struct tsens_device *tmdev)
++static int calibrate_ipq8064(struct tsens_priv *priv)
+{
+ int i;
+ char *data, *data_backup;
+
-+ ssize_t num_read = tmdev->num_sensors;
-+ struct tsens_sensor *s = tmdev->sensor;
++ ssize_t num_read = priv->num_sensors;
++ struct tsens_sensor *s = priv->sensor;
+
-+ data = qfprom_read(tmdev->dev, "calib");
++ data = qfprom_read(priv->dev, "calib");
+ if (IS_ERR(data)) {
+ pr_err("Calibration not found.\n");
+ return PTR_ERR(data);
+ }
+
-+ data_backup = qfprom_read(tmdev->dev, "calib_backup");
++ data_backup = qfprom_read(priv->dev, "calib_backup");
+ if (IS_ERR(data_backup)) {
+ pr_err("Backup calibration not found.\n");
+ return PTR_ERR(data_backup);
@@ -440,26 +442,26 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ s[i].offset = CAL_MDEGC - (s[i].calib_data * s[i].slope);
+ }
+
-+ hw_init(tmdev);
++ hw_init(priv);
+
+ return 0;
+}
+
-+static int get_temp_ipq8064(struct tsens_device *tmdev, int id, int *temp)
++static int get_temp_ipq8064(struct tsens_priv *priv, int id, int *temp)
+{
+ int ret;
+ u32 code, trdy;
-+ const struct tsens_sensor *s = &tmdev->sensor[id];
++ const struct tsens_sensor *s = &priv->sensor[id];
+ unsigned long timeout;
+
+ timeout = jiffies + usecs_to_jiffies(TIMEOUT_US);
+ do {
-+ ret = regmap_read(tmdev->map, INT_STATUS_ADDR, &trdy);
++ ret = regmap_read(priv->tm_map, INT_STATUS_ADDR, &trdy);
+ if (ret)
+ return ret;
+ if (!(trdy & TRDY_MASK))
+ continue;
-+ ret = regmap_read(tmdev->map, s->status, &code);
++ ret = regmap_read(priv->tm_map, s->status, &code);
+ if (ret)
+ return ret;
+ *temp = code_to_degC(code, s);
@@ -474,18 +476,18 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ unsigned int reg_th, reg_cntl;
+ int ret, code, code_chk, hi_code, lo_code;
+ const struct tsens_sensor *s = data;
-+ struct tsens_device *tmdev = s->tmdev;
++ struct tsens_priv *priv = s->priv;
+
+ code_chk = code = degC_to_code(temp, s);
+
+ if (code < THRESHOLD_MIN_CODE || code > THRESHOLD_MAX_CODE)
+ return -EINVAL;
+
-+ ret = regmap_read(tmdev->map, STATUS_CNTL_8064, &reg_cntl);
++ ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg_cntl);
+ if (ret)
+ return ret;
+
-+ ret = regmap_read(tmdev->map, THRESHOLD_ADDR, &reg_th);
++ ret = regmap_read(priv->tm_map, THRESHOLD_ADDR, &reg_th);
+ if (ret)
+ return ret;
+
@@ -519,7 +521,7 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ return -EINVAL;
+ }
+
-+ ret = regmap_write(tmdev->map, THRESHOLD_ADDR, reg_th | code);
++ ret = regmap_write(priv->tm_map, THRESHOLD_ADDR, reg_th | code);
+ if (ret)
+ return ret;
+
@@ -531,13 +533,13 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+{
+ unsigned int reg_cntl, mask, val;
+ const struct tsens_sensor *s = data;
-+ struct tsens_device *tmdev = s->tmdev;
++ struct tsens_priv *priv = s->priv;
+ int ret;
+
-+ if (!tmdev || trip < 0)
++ if (!priv || trip < 0)
+ return -EINVAL;
+
-+ ret = regmap_read(tmdev->map, STATUS_CNTL_8064, &reg_cntl);
++ ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, &reg_cntl);
+ if (ret)
+ return ret;
+
@@ -563,7 +565,7 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ else
+ val = reg_cntl & ~mask;
+
-+ ret = regmap_write(tmdev->map, STATUS_CNTL_8064, val);
++ ret = regmap_write(priv->tm_map, STATUS_CNTL_8064, val);
+ if (ret)
+ return ret;
+
@@ -582,13 +584,13 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
+ .set_trip_activate = set_trip_activate_ipq8064,
+};
+
-+const struct tsens_data data_ipq8064 = {
++const struct tsens_plat_data data_ipq8064 = {
+ .num_sensors = 11,
+ .ops = &ops_ipq8064,
+};
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
-@@ -75,8 +75,11 @@ static const struct of_device_id tsens_t
+@@ -69,8 +69,11 @@ static const struct of_device_id tsens_t
}, {
.compatible = "qcom,tsens-v2",
.data = &data_tsens_v2,
@@ -603,12 +605,12 @@ Signed-off-by: Rajith Cherian <rajith@codeaurora.org>
--- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h
-@@ -89,7 +89,7 @@ int init_common(struct tsens_device *);
- int get_temp_common(struct tsens_device *, int, int *);
+@@ -324,7 +324,7 @@ extern const struct tsens_plat_data data
+ extern const struct tsens_plat_data data_8916, data_8974;
/* TSENS v1 targets */
--extern const struct tsens_data data_8916, data_8974, data_8960;
-+extern const struct tsens_data data_8916, data_8974, data_8960, data_ipq8064;
- /* TSENS v2 targets */
- extern const struct tsens_data data_8996, data_tsens_v2;
+-extern const struct tsens_plat_data data_tsens_v1;
++extern const struct tsens_plat_data data_tsens_v1, data_ipq8064;
+ /* TSENS v2 targets */
+ extern const struct tsens_plat_data data_8996, data_tsens_v2;