| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2014-2016, Fuzhou Rockchip Electronics Co., Ltd |
|---|
| 3 | 4 | * Caesar Wang <wxt@rock-chips.com> |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 6 | | - * under the terms and conditions of the GNU General Public License, |
|---|
| 7 | | - * version 2, as published by the Free Software Foundation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is distributed in the hope it will be useful, but WITHOUT |
|---|
| 10 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|---|
| 11 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|---|
| 12 | | - * more details. |
|---|
| 13 | 5 | */ |
|---|
| 14 | 6 | |
|---|
| 15 | 7 | #include <linux/clk.h> |
|---|
| .. | .. |
|---|
| 29 | 21 | #include <linux/pinctrl/consumer.h> |
|---|
| 30 | 22 | #include <linux/nvmem-consumer.h> |
|---|
| 31 | 23 | |
|---|
| 32 | | -/** |
|---|
| 24 | +/* |
|---|
| 33 | 25 | * If the temperature over a period of time High, |
|---|
| 34 | 26 | * the resulting TSHUT gave CRU module,let it reset the entire chip, |
|---|
| 35 | 27 | * or via GPIO give PMIC. |
|---|
| .. | .. |
|---|
| 39 | 31 | TSHUT_MODE_OTP, |
|---|
| 40 | 32 | }; |
|---|
| 41 | 33 | |
|---|
| 42 | | -/** |
|---|
| 34 | +/* |
|---|
| 43 | 35 | * The system Temperature Sensors tshut(tshut) polarity |
|---|
| 44 | 36 | * the bit 8 is tshut polarity. |
|---|
| 45 | 37 | * 0: low active, 1: high active |
|---|
| .. | .. |
|---|
| 49 | 41 | TSHUT_HIGH_ACTIVE, |
|---|
| 50 | 42 | }; |
|---|
| 51 | 43 | |
|---|
| 52 | | -/** |
|---|
| 44 | +/* |
|---|
| 53 | 45 | * The system has two Temperature Sensors. |
|---|
| 54 | 46 | * sensor0 is for CPU, and sensor1 is for GPU. |
|---|
| 55 | 47 | */ |
|---|
| .. | .. |
|---|
| 58 | 50 | SENSOR_GPU, |
|---|
| 59 | 51 | }; |
|---|
| 60 | 52 | |
|---|
| 61 | | -/** |
|---|
| 53 | +/* |
|---|
| 62 | 54 | * The conversion table has the adc value and temperature. |
|---|
| 63 | 55 | * ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table) |
|---|
| 64 | 56 | * ADC_INCREMENT: the adc value is incremental.(e.g. rk3368_code_table) |
|---|
| .. | .. |
|---|
| 67 | 59 | ADC_DECREMENT = 0, |
|---|
| 68 | 60 | ADC_INCREMENT, |
|---|
| 69 | 61 | }; |
|---|
| 62 | + |
|---|
| 63 | +#include "thermal_hwmon.h" |
|---|
| 70 | 64 | |
|---|
| 71 | 65 | /** |
|---|
| 72 | 66 | * The max sensors is seven in rockchip SoCs. |
|---|
| .. | .. |
|---|
| 78 | 72 | * @id: conversion table |
|---|
| 79 | 73 | * @length: size of conversion table |
|---|
| 80 | 74 | * @data_mask: mask to apply on data inputs |
|---|
| 75 | + * @kNum: linear parameter k |
|---|
| 76 | + * @bNum: linear parameter b |
|---|
| 81 | 77 | * @mode: sort mode of this adc variant (incrementing or decrementing) |
|---|
| 82 | 78 | */ |
|---|
| 83 | 79 | struct chip_tsadc_table { |
|---|
| .. | .. |
|---|
| 92 | 88 | |
|---|
| 93 | 89 | /** |
|---|
| 94 | 90 | * struct rockchip_tsadc_chip - hold the private data of tsadc chip |
|---|
| 95 | | - * @chn_id[SOC_MAX_SENSORS]: the sensor id of chip correspond to the channel |
|---|
| 91 | + * @chn_id: array of sensor ids of chip corresponding to the channel |
|---|
| 96 | 92 | * @chn_num: the channel number of tsadc chip |
|---|
| 97 | 93 | * @conversion_time: the conversion time of tsadc |
|---|
| 98 | 94 | * @trim_slope: use to conversion trim code to trim temp |
|---|
| .. | .. |
|---|
| 101 | 97 | * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH) |
|---|
| 102 | 98 | * @initialize: SoC special initialize tsadc controller method |
|---|
| 103 | 99 | * @irq_ack: clear the interrupt |
|---|
| 100 | + * @control: enable/disable method for the tsadc controller |
|---|
| 104 | 101 | * @get_temp: get the temperature |
|---|
| 105 | 102 | * @set_alarm_temp: set the high temperature interrupt |
|---|
| 106 | 103 | * @set_tshut_temp: set the hardware-controlled shutdown temperature |
|---|
| .. | .. |
|---|
| 169 | 166 | * @chip: pointer to the platform/configuration data |
|---|
| 170 | 167 | * @pdev: platform device of thermal |
|---|
| 171 | 168 | * @reset: the reset controller of tsadc |
|---|
| 172 | | - * @sensors[SOC_MAX_SENSORS]: the thermal sensor |
|---|
| 173 | | - * @clk: the controller clock is divided by the exteral 24MHz |
|---|
| 174 | | - * @pclk: the advanced peripherals bus clock |
|---|
| 169 | + * @sensors: array of thermal sensors |
|---|
| 170 | + * @clk: the bulk clk of tsadc, include controller clock and peripherals bus clock |
|---|
| 171 | + * @num_clks: the number of tsadc clks |
|---|
| 175 | 172 | * @grf: the general register file will be used to do static set by software |
|---|
| 176 | 173 | * @regs: the base address of tsadc controller |
|---|
| 177 | 174 | * @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO) |
|---|
| 178 | 175 | * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH) |
|---|
| 176 | + * @pinctrl: the pinctrl of tsadc |
|---|
| 177 | + * @gpio_state: pinctrl select gpio function |
|---|
| 178 | + * @otp_state: pinctrl select otp out function |
|---|
| 179 | + * @panic_nb: panic notifier block |
|---|
| 179 | 180 | */ |
|---|
| 180 | 181 | struct rockchip_thermal_data { |
|---|
| 181 | 182 | const struct rockchip_tsadc_chip *chip; |
|---|
| .. | .. |
|---|
| 230 | 231 | #define TSADCV2_AUTO_PERIOD_HT 0x6c |
|---|
| 231 | 232 | #define TSADCV3_AUTO_PERIOD 0x154 |
|---|
| 232 | 233 | #define TSADCV3_AUTO_PERIOD_HT 0x158 |
|---|
| 233 | | -#define TSADCV3_Q_MAX 0x210 |
|---|
| 234 | +#define TSADCV9_Q_MAX 0x210 |
|---|
| 235 | +#define TSADCV9_FLOW_CON 0x218 |
|---|
| 234 | 236 | |
|---|
| 235 | 237 | #define TSADCV2_AUTO_EN BIT(0) |
|---|
| 236 | 238 | #define TSADCV2_AUTO_EN_MASK BIT(16) |
|---|
| .. | .. |
|---|
| 269 | 271 | #define TSADCV6_AUTO_PERIOD_HT_TIME 5000 /* 2.5ms */ |
|---|
| 270 | 272 | #define TSADCV7_AUTO_PERIOD_TIME 3000 /* 2.5ms */ |
|---|
| 271 | 273 | #define TSADCV7_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */ |
|---|
| 274 | +#define TSADCV12_AUTO_PERIOD_TIME 3000 /* 2.5ms */ |
|---|
| 275 | +#define TSADCV12_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */ |
|---|
| 272 | 276 | #define TSADCV3_Q_MAX_VAL 0x7ff /* 11bit 2047 */ |
|---|
| 277 | +#define TSADCV12_Q_MAX_VAL 0xfff /* 12bit 4095 */ |
|---|
| 273 | 278 | |
|---|
| 274 | 279 | #define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */ |
|---|
| 275 | 280 | #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */ |
|---|
| 281 | + |
|---|
| 282 | +#define TSADCV9_AUTO_SRC (0x10001 << 0) |
|---|
| 283 | +#define TSADCV9_PD_MODE (0x10001 << 4) |
|---|
| 284 | +#define TSADCV9_Q_MAX_VAL (0xffff0400 << 0) |
|---|
| 276 | 285 | |
|---|
| 277 | 286 | #define GRF_SARADC_TESTBIT 0x0e644 |
|---|
| 278 | 287 | #define GRF_TSADC_TESTBIT_L 0x0e648 |
|---|
| .. | .. |
|---|
| 283 | 292 | |
|---|
| 284 | 293 | #define RK1808_BUS_GRF_SOC_CON0 0x0400 |
|---|
| 285 | 294 | |
|---|
| 286 | | -#define RK3568_GRF_TSADC_CON 0x0600 |
|---|
| 287 | 295 | #define RK3528_GRF_TSADC_CON 0x40030 |
|---|
| 296 | + |
|---|
| 297 | +#define RK3562_GRF_TSADC_CON 0x0580 |
|---|
| 298 | + |
|---|
| 299 | +#define RK3568_GRF_TSADC_CON 0x0600 |
|---|
| 288 | 300 | #define RK3568_GRF_TSADC_ANA_REG0 (0x10001 << 0) |
|---|
| 289 | 301 | #define RK3568_GRF_TSADC_ANA_REG1 (0x10001 << 1) |
|---|
| 290 | 302 | #define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2) |
|---|
| 291 | 303 | #define RK3568_GRF_TSADC_TSEN (0x10001 << 8) |
|---|
| 304 | + |
|---|
| 305 | +#define RV1106_VOGRF_TSADC_CON 0x6000C |
|---|
| 306 | +#define RV1106_VOGRF_TSADC_TSEN (0x10001 << 8) |
|---|
| 307 | +#define RV1106_VOGRF_TSADC_ANA (0xff0007 << 0) |
|---|
| 292 | 308 | |
|---|
| 293 | 309 | #define RV1126_GRF0_TSADC_CON 0x0100 |
|---|
| 294 | 310 | |
|---|
| .. | .. |
|---|
| 309 | 325 | |
|---|
| 310 | 326 | /* -40 to 125 is reliable, outside the range existed unreliability */ |
|---|
| 311 | 327 | #define MIN_TEMP (-60000) |
|---|
| 312 | | -#define LOWEST_TEMP (-273000) |
|---|
| 313 | 328 | #define MAX_TEMP (180000) |
|---|
| 314 | | -#define MAX_ENV_TEMP (85000) |
|---|
| 315 | | - |
|---|
| 316 | | -#define BASE (1024) |
|---|
| 317 | | -#define BASE_SHIFT (10) |
|---|
| 318 | | -#define START_DEBOUNCE_COUNT (100) |
|---|
| 319 | | -#define HIGHER_DEBOUNCE_TEMP (30000) |
|---|
| 320 | | -#define LOWER_DEBOUNCE_TEMP (15000) |
|---|
| 321 | 329 | |
|---|
| 322 | 330 | /** |
|---|
| 323 | 331 | * struct tsadc_table - code to temperature conversion table |
|---|
| .. | .. |
|---|
| 332 | 340 | struct tsadc_table { |
|---|
| 333 | 341 | u32 code; |
|---|
| 334 | 342 | int temp; |
|---|
| 343 | +}; |
|---|
| 344 | + |
|---|
| 345 | +static const struct tsadc_table rv1106_code_table[] = { |
|---|
| 346 | + {0, MIN_TEMP}, |
|---|
| 347 | + {363, MIN_TEMP}, |
|---|
| 348 | + {396, -40000}, |
|---|
| 349 | + {504, 25000}, |
|---|
| 350 | + {605, 85000}, |
|---|
| 351 | + {673, 125000}, |
|---|
| 352 | + {758, MAX_TEMP}, |
|---|
| 353 | + {TSADCV2_DATA_MASK, MAX_TEMP}, |
|---|
| 335 | 354 | }; |
|---|
| 336 | 355 | |
|---|
| 337 | 356 | static const struct tsadc_table rv1108_table[] = { |
|---|
| .. | .. |
|---|
| 665 | 684 | {TSADCV5_DATA_MASK, MAX_TEMP}, |
|---|
| 666 | 685 | }; |
|---|
| 667 | 686 | |
|---|
| 687 | +static const struct tsadc_table rk3562_code_table[] = { |
|---|
| 688 | + {0, MIN_TEMP}, |
|---|
| 689 | + {1385, MIN_TEMP}, |
|---|
| 690 | + {1419, -40000}, |
|---|
| 691 | + {1428, -35000}, |
|---|
| 692 | + {1436, -30000}, |
|---|
| 693 | + {1445, -25000}, |
|---|
| 694 | + {1453, -20000}, |
|---|
| 695 | + {1462, -15000}, |
|---|
| 696 | + {1470, -10000}, |
|---|
| 697 | + {1479, -5000}, |
|---|
| 698 | + {1487, 0}, |
|---|
| 699 | + {1496, 5000}, |
|---|
| 700 | + {1504, 10000}, |
|---|
| 701 | + {1512, 15000}, |
|---|
| 702 | + {1521, 20000}, |
|---|
| 703 | + {1529, 25000}, |
|---|
| 704 | + {1538, 30000}, |
|---|
| 705 | + {1546, 35000}, |
|---|
| 706 | + {1555, 40000}, |
|---|
| 707 | + {1563, 45000}, |
|---|
| 708 | + {1572, 50000}, |
|---|
| 709 | + {1580, 55000}, |
|---|
| 710 | + {1589, 60000}, |
|---|
| 711 | + {1598, 65000}, |
|---|
| 712 | + {1606, 70000}, |
|---|
| 713 | + {1615, 75000}, |
|---|
| 714 | + {1623, 80000}, |
|---|
| 715 | + {1632, 85000}, |
|---|
| 716 | + {1640, 90000}, |
|---|
| 717 | + {1648, 95000}, |
|---|
| 718 | + {1657, 100000}, |
|---|
| 719 | + {1666, 105000}, |
|---|
| 720 | + {1674, 110000}, |
|---|
| 721 | + {1682, 115000}, |
|---|
| 722 | + {1691, 120000}, |
|---|
| 723 | + {1699, 125000}, |
|---|
| 724 | + {1793, MAX_TEMP}, |
|---|
| 725 | + {TSADCV2_DATA_MASK, MAX_TEMP}, |
|---|
| 726 | +}; |
|---|
| 727 | + |
|---|
| 668 | 728 | static const struct tsadc_table rk3568_code_table[] = { |
|---|
| 669 | 729 | {0, MIN_TEMP}, |
|---|
| 670 | 730 | {1448, MIN_TEMP}, |
|---|
| .. | .. |
|---|
| 846 | 906 | |
|---|
| 847 | 907 | /** |
|---|
| 848 | 908 | * rk_tsadcv2_initialize - initialize TASDC Controller. |
|---|
| 909 | + * @grf: the general register file will be used to do static set by software |
|---|
| 910 | + * @regs: the base address of tsadc controller |
|---|
| 911 | + * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH) |
|---|
| 849 | 912 | * |
|---|
| 850 | 913 | * (1) Set TSADC_V2_AUTO_PERIOD: |
|---|
| 851 | 914 | * Configure the interleave between every two accessing of |
|---|
| .. | .. |
|---|
| 880 | 943 | |
|---|
| 881 | 944 | /** |
|---|
| 882 | 945 | * rk_tsadcv3_initialize - initialize TASDC Controller. |
|---|
| 946 | + * @grf: the general register file will be used to do static set by software |
|---|
| 947 | + * @regs: the base address of tsadc controller |
|---|
| 948 | + * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH) |
|---|
| 883 | 949 | * |
|---|
| 884 | 950 | * (1) The tsadc control power sequence. |
|---|
| 885 | 951 | * |
|---|
| .. | .. |
|---|
| 945 | 1011 | enum tshut_polarity tshut_polarity) |
|---|
| 946 | 1012 | { |
|---|
| 947 | 1013 | rk_tsadcv2_initialize(grf, regs, tshut_polarity); |
|---|
| 948 | | - if (!IS_ERR(grf)) |
|---|
| 949 | | - regmap_write(grf, PX30_GRF_SOC_CON2, GRF_CON_TSADC_CH_INV); |
|---|
| 1014 | + regmap_write(grf, PX30_GRF_SOC_CON2, GRF_CON_TSADC_CH_INV); |
|---|
| 950 | 1015 | } |
|---|
| 951 | 1016 | |
|---|
| 952 | 1017 | static void rk_tsadcv5_initialize(struct regmap *grf, void __iomem *regs, |
|---|
| .. | .. |
|---|
| 1003 | 1068 | writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH, |
|---|
| 1004 | 1069 | regs + TSADCV2_AUTO_CON); |
|---|
| 1005 | 1070 | |
|---|
| 1071 | + /* |
|---|
| 1072 | + * The general register file will is optional |
|---|
| 1073 | + * and might not be available. |
|---|
| 1074 | + */ |
|---|
| 1006 | 1075 | if (!IS_ERR(grf)) { |
|---|
| 1007 | 1076 | regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN); |
|---|
| 1077 | + /* |
|---|
| 1078 | + * RK3568 TRM, section 18.5. requires a delay no less |
|---|
| 1079 | + * than 10us between the rising edge of tsadc_tsen_en |
|---|
| 1080 | + * and the rising edge of tsadc_ana_reg_0/1/2. |
|---|
| 1081 | + */ |
|---|
| 1008 | 1082 | udelay(15); |
|---|
| 1009 | 1083 | regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0); |
|---|
| 1010 | 1084 | regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1); |
|---|
| 1011 | 1085 | regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2); |
|---|
| 1086 | + |
|---|
| 1087 | + /* |
|---|
| 1088 | + * RK3568 TRM, section 18.5. requires a delay no less |
|---|
| 1089 | + * than 90us after the rising edge of tsadc_ana_reg_0/1/2. |
|---|
| 1090 | + */ |
|---|
| 1012 | 1091 | usleep_range(100, 200); |
|---|
| 1013 | 1092 | } |
|---|
| 1014 | 1093 | } |
|---|
| .. | .. |
|---|
| 1035 | 1114 | static void rk_tsadcv9_initialize(struct regmap *grf, void __iomem *regs, |
|---|
| 1036 | 1115 | enum tshut_polarity tshut_polarity) |
|---|
| 1037 | 1116 | { |
|---|
| 1117 | + regmap_write(grf, RV1106_VOGRF_TSADC_CON, RV1106_VOGRF_TSADC_TSEN); |
|---|
| 1118 | + udelay(10); |
|---|
| 1119 | + regmap_write(grf, RV1106_VOGRF_TSADC_CON, RV1106_VOGRF_TSADC_ANA); |
|---|
| 1120 | + udelay(100); |
|---|
| 1121 | + |
|---|
| 1122 | + writel_relaxed(TSADCV2_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD); |
|---|
| 1123 | + writel_relaxed(TSADCV2_AUTO_PERIOD_TIME, |
|---|
| 1124 | + regs + TSADCV3_AUTO_PERIOD_HT); |
|---|
| 1125 | + writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT, |
|---|
| 1126 | + regs + TSADCV3_HIGHT_INT_DEBOUNCE); |
|---|
| 1127 | + writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, |
|---|
| 1128 | + regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE); |
|---|
| 1129 | + writel_relaxed(TSADCV9_AUTO_SRC, regs + TSADCV2_INT_PD); |
|---|
| 1130 | + writel_relaxed(TSADCV9_PD_MODE, regs + TSADCV9_FLOW_CON); |
|---|
| 1131 | + writel_relaxed(TSADCV9_Q_MAX_VAL, regs + TSADCV9_Q_MAX); |
|---|
| 1132 | + if (tshut_polarity == TSHUT_HIGH_ACTIVE) |
|---|
| 1133 | + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH | |
|---|
| 1134 | + TSADCV2_AUTO_TSHUT_POLARITY_MASK, |
|---|
| 1135 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1136 | + else |
|---|
| 1137 | + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK, |
|---|
| 1138 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1139 | + writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | (TSADCV3_AUTO_Q_SEL_EN << 16), |
|---|
| 1140 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1141 | +} |
|---|
| 1142 | + |
|---|
| 1143 | +static void rk_tsadcv10_initialize(struct regmap *grf, void __iomem *regs, |
|---|
| 1144 | + enum tshut_polarity tshut_polarity) |
|---|
| 1145 | +{ |
|---|
| 1038 | 1146 | rk_tsadcv2_initialize(grf, regs, tshut_polarity); |
|---|
| 1039 | 1147 | if (!IS_ERR(grf)) { |
|---|
| 1040 | 1148 | regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TDC_MODE); |
|---|
| .. | .. |
|---|
| 1052 | 1160 | regs + TSADCV3_HIGHT_INT_DEBOUNCE); |
|---|
| 1053 | 1161 | writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, |
|---|
| 1054 | 1162 | regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE); |
|---|
| 1055 | | - writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV3_Q_MAX); |
|---|
| 1163 | + writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV9_Q_MAX); |
|---|
| 1056 | 1164 | writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK, |
|---|
| 1057 | 1165 | regs + TSADCV2_AUTO_CON); |
|---|
| 1058 | 1166 | if (tshut_polarity == TSHUT_HIGH_ACTIVE) |
|---|
| .. | .. |
|---|
| 1069 | 1177 | regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0); |
|---|
| 1070 | 1178 | regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1); |
|---|
| 1071 | 1179 | regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2); |
|---|
| 1180 | + usleep_range(100, 200); |
|---|
| 1181 | + } |
|---|
| 1182 | +} |
|---|
| 1183 | + |
|---|
| 1184 | +static void rk_tsadcv12_initialize(struct regmap *grf, void __iomem *regs, |
|---|
| 1185 | + enum tshut_polarity tshut_polarity) |
|---|
| 1186 | +{ |
|---|
| 1187 | + writel_relaxed(TSADCV12_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD); |
|---|
| 1188 | + writel_relaxed(TSADCV12_AUTO_PERIOD_HT_TIME, |
|---|
| 1189 | + regs + TSADCV3_AUTO_PERIOD_HT); |
|---|
| 1190 | + writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT, |
|---|
| 1191 | + regs + TSADCV3_HIGHT_INT_DEBOUNCE); |
|---|
| 1192 | + writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, |
|---|
| 1193 | + regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE); |
|---|
| 1194 | + writel_relaxed(TSADCV12_Q_MAX_VAL, regs + TSADCV9_Q_MAX); |
|---|
| 1195 | + writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK, |
|---|
| 1196 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1197 | + if (tshut_polarity == TSHUT_HIGH_ACTIVE) |
|---|
| 1198 | + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH | |
|---|
| 1199 | + TSADCV2_AUTO_TSHUT_POLARITY_MASK, |
|---|
| 1200 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1201 | + else |
|---|
| 1202 | + writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK, |
|---|
| 1203 | + regs + TSADCV2_AUTO_CON); |
|---|
| 1204 | + |
|---|
| 1205 | + if (!IS_ERR(grf)) { |
|---|
| 1206 | + regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN); |
|---|
| 1207 | + udelay(15); |
|---|
| 1208 | + regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0); |
|---|
| 1209 | + regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1); |
|---|
| 1210 | + regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2); |
|---|
| 1072 | 1211 | usleep_range(100, 200); |
|---|
| 1073 | 1212 | } |
|---|
| 1074 | 1213 | } |
|---|
| .. | .. |
|---|
| 1115 | 1254 | |
|---|
| 1116 | 1255 | /** |
|---|
| 1117 | 1256 | * rk_tsadcv3_control - the tsadc controller is enabled or disabled. |
|---|
| 1257 | + * @regs: the base address of tsadc controller |
|---|
| 1258 | + * @enable: boolean flag to enable the controller |
|---|
| 1118 | 1259 | * |
|---|
| 1119 | 1260 | * NOTE: TSADC controller works at auto mode, and some SoCs need set the |
|---|
| 1120 | 1261 | * tsadc_q_sel bit on TSADCV2_AUTO_CON[1]. The (1024 - tsadc_q) as output |
|---|
| .. | .. |
|---|
| 1153 | 1294 | val = readl_relaxed(regs + TSADCV2_DATA(chn)); |
|---|
| 1154 | 1295 | |
|---|
| 1155 | 1296 | return rk_tsadcv2_code_to_temp(table, val, temp); |
|---|
| 1156 | | -} |
|---|
| 1157 | | - |
|---|
| 1158 | | -static int predict_temp(int temp) |
|---|
| 1159 | | -{ |
|---|
| 1160 | | - /* |
|---|
| 1161 | | - * The deviation of prediction. the temperature will not change rapidly, |
|---|
| 1162 | | - * so this cov_q is small |
|---|
| 1163 | | - */ |
|---|
| 1164 | | - int cov_q = 18; |
|---|
| 1165 | | - /* |
|---|
| 1166 | | - * The deviation of tsadc's reading, deviation of tsadc is very big when |
|---|
| 1167 | | - * abnormal temperature is get |
|---|
| 1168 | | - */ |
|---|
| 1169 | | - int cov_r = 542; |
|---|
| 1170 | | - |
|---|
| 1171 | | - int gain; |
|---|
| 1172 | | - int temp_mid; |
|---|
| 1173 | | - int temp_now; |
|---|
| 1174 | | - int prob_mid; |
|---|
| 1175 | | - int prob_now; |
|---|
| 1176 | | - static int temp_last = LOWEST_TEMP; |
|---|
| 1177 | | - static int prob_last = 160; |
|---|
| 1178 | | - static int bounding_cnt; |
|---|
| 1179 | | - |
|---|
| 1180 | | - /* |
|---|
| 1181 | | - * init temp_last with a more suitable value, which mostly equals to |
|---|
| 1182 | | - * temp reading from tsadc, but not higher than MAX_ENV_TEMP. If the |
|---|
| 1183 | | - * temp is higher than MAX_ENV_TEMP, it is assumed to be abnormal |
|---|
| 1184 | | - * value and temp_last is adjusted to MAX_ENV_TEMP. |
|---|
| 1185 | | - */ |
|---|
| 1186 | | - if (temp_last == LOWEST_TEMP) |
|---|
| 1187 | | - temp_last = min(temp, MAX_ENV_TEMP); |
|---|
| 1188 | | - |
|---|
| 1189 | | - /* |
|---|
| 1190 | | - * Before START_DEBOUNCE_COUNT's samples of temperature, we consider |
|---|
| 1191 | | - * tsadc is stable, i.e. after that, the temperature may be not stable |
|---|
| 1192 | | - * and may have abnormal reading, so we set a bounding temperature. If |
|---|
| 1193 | | - * the reading from tsadc is too big, we set the delta temperature of |
|---|
| 1194 | | - * DEBOUNCE_TEMP/3 comparing to the last temperature. |
|---|
| 1195 | | - */ |
|---|
| 1196 | | - |
|---|
| 1197 | | - if (bounding_cnt++ > START_DEBOUNCE_COUNT) { |
|---|
| 1198 | | - bounding_cnt = START_DEBOUNCE_COUNT; |
|---|
| 1199 | | - if (temp - temp_last > HIGHER_DEBOUNCE_TEMP) |
|---|
| 1200 | | - temp = temp_last + HIGHER_DEBOUNCE_TEMP / 3; |
|---|
| 1201 | | - if (temp_last - temp > LOWER_DEBOUNCE_TEMP) |
|---|
| 1202 | | - temp = temp_last - LOWER_DEBOUNCE_TEMP / 3; |
|---|
| 1203 | | - } |
|---|
| 1204 | | - |
|---|
| 1205 | | - temp_mid = temp_last; |
|---|
| 1206 | | - |
|---|
| 1207 | | - /* calculate the probability of this time's prediction */ |
|---|
| 1208 | | - prob_mid = prob_last + cov_q; |
|---|
| 1209 | | - |
|---|
| 1210 | | - /* calculate the Kalman Gain */ |
|---|
| 1211 | | - gain = (prob_mid * BASE) / (prob_mid + cov_r); |
|---|
| 1212 | | - |
|---|
| 1213 | | - /* calculate the prediction of temperature */ |
|---|
| 1214 | | - temp_now = (temp_mid * BASE + gain * (temp - temp_mid)) >> BASE_SHIFT; |
|---|
| 1215 | | - |
|---|
| 1216 | | - /* |
|---|
| 1217 | | - * Base on this time's Kalman Gain, ajust our probability of prediction |
|---|
| 1218 | | - * for next time calculation |
|---|
| 1219 | | - */ |
|---|
| 1220 | | - prob_now = ((BASE - gain) * prob_mid) >> BASE_SHIFT; |
|---|
| 1221 | | - |
|---|
| 1222 | | - prob_last = prob_now; |
|---|
| 1223 | | - temp_last = temp_now; |
|---|
| 1224 | | - |
|---|
| 1225 | | - return temp_last; |
|---|
| 1226 | | -} |
|---|
| 1227 | | - |
|---|
| 1228 | | -static int rk_tsadcv3_get_temp(const struct chip_tsadc_table *table, |
|---|
| 1229 | | - int chn, void __iomem *regs, int *temp) |
|---|
| 1230 | | -{ |
|---|
| 1231 | | - u32 val; |
|---|
| 1232 | | - int ret; |
|---|
| 1233 | | - |
|---|
| 1234 | | - val = readl_relaxed(regs + TSADCV2_DATA(chn)); |
|---|
| 1235 | | - |
|---|
| 1236 | | - ret = rk_tsadcv2_code_to_temp(table, val, temp); |
|---|
| 1237 | | - if (!ret) |
|---|
| 1238 | | - *temp = predict_temp(*temp); |
|---|
| 1239 | | - |
|---|
| 1240 | | - return ret; |
|---|
| 1241 | 1297 | } |
|---|
| 1242 | 1298 | |
|---|
| 1243 | 1299 | static int rk_tsadcv4_get_temp(const struct chip_tsadc_table *table, |
|---|
| .. | .. |
|---|
| 1449 | 1505 | return 0; |
|---|
| 1450 | 1506 | } |
|---|
| 1451 | 1507 | |
|---|
| 1508 | +static const struct rockchip_tsadc_chip px30_tsadc_data = { |
|---|
| 1509 | + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1510 | + .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ |
|---|
| 1511 | + .chn_num = 2, /* 2 channels for tsadc */ |
|---|
| 1512 | + |
|---|
| 1513 | + .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1514 | + .tshut_temp = 95000, |
|---|
| 1515 | + |
|---|
| 1516 | + .initialize = rk_tsadcv4_initialize, |
|---|
| 1517 | + .irq_ack = rk_tsadcv3_irq_ack, |
|---|
| 1518 | + .control = rk_tsadcv3_control, |
|---|
| 1519 | + .get_temp = rk_tsadcv2_get_temp, |
|---|
| 1520 | + .set_alarm_temp = rk_tsadcv2_alarm_temp, |
|---|
| 1521 | + .set_tshut_temp = rk_tsadcv2_tshut_temp, |
|---|
| 1522 | + .set_tshut_mode = rk_tsadcv2_tshut_mode, |
|---|
| 1523 | + |
|---|
| 1524 | + .table = { |
|---|
| 1525 | + .id = rk3328_code_table, |
|---|
| 1526 | + .length = ARRAY_SIZE(rk3328_code_table), |
|---|
| 1527 | + .data_mask = TSADCV2_DATA_MASK, |
|---|
| 1528 | + .mode = ADC_INCREMENT, |
|---|
| 1529 | + }, |
|---|
| 1530 | +}; |
|---|
| 1531 | + |
|---|
| 1532 | +static const struct rockchip_tsadc_chip px30s_tsadc_data = { |
|---|
| 1533 | + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1534 | + .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ |
|---|
| 1535 | + .chn_num = 2, /* 1 channels for tsadc */ |
|---|
| 1536 | + .conversion_time = 2100, /* us */ |
|---|
| 1537 | + .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1538 | + .tshut_temp = 95000, |
|---|
| 1539 | + .initialize = rk_tsadcv10_initialize, |
|---|
| 1540 | + .irq_ack = rk_tsadcv3_irq_ack, |
|---|
| 1541 | + .control = rk_tsadcv2_control, |
|---|
| 1542 | + .get_temp = rk_tsadcv2_get_temp, |
|---|
| 1543 | + .set_alarm_temp = rk_tsadcv2_alarm_temp, |
|---|
| 1544 | + .set_tshut_temp = rk_tsadcv2_tshut_temp, |
|---|
| 1545 | + .set_tshut_mode = rk_tsadcv2_tshut_mode, |
|---|
| 1546 | + .set_clk_rate = rk_tsadcv1_set_clk_rate, |
|---|
| 1547 | + .table = { |
|---|
| 1548 | + .kNum = 2699, |
|---|
| 1549 | + .bNum = 2796, |
|---|
| 1550 | + .data_mask = TSADCV2_DATA_MASK, |
|---|
| 1551 | + .mode = ADC_INCREMENT, |
|---|
| 1552 | + }, |
|---|
| 1553 | +}; |
|---|
| 1554 | + |
|---|
| 1555 | +static const struct rockchip_tsadc_chip rv1106_tsadc_data = { |
|---|
| 1556 | + /* top, big_core0, big_core1, little_core, center, gpu, npu */ |
|---|
| 1557 | + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1558 | + .chn_num = 1, /* seven channels for tsadc */ |
|---|
| 1559 | + .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1560 | + .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */ |
|---|
| 1561 | + .tshut_temp = 95000, |
|---|
| 1562 | + .initialize = rk_tsadcv9_initialize, |
|---|
| 1563 | + .irq_ack = rk_tsadcv4_irq_ack, |
|---|
| 1564 | + .control = rk_tsadcv4_control, |
|---|
| 1565 | + .get_temp = rk_tsadcv4_get_temp, |
|---|
| 1566 | + .set_alarm_temp = rk_tsadcv3_alarm_temp, |
|---|
| 1567 | + .set_tshut_temp = rk_tsadcv3_tshut_temp, |
|---|
| 1568 | + .set_tshut_mode = rk_tsadcv4_tshut_mode, |
|---|
| 1569 | + .table = { |
|---|
| 1570 | + .id = rv1106_code_table, |
|---|
| 1571 | + .length = ARRAY_SIZE(rv1106_code_table), |
|---|
| 1572 | + .data_mask = TSADCV2_DATA_MASK, |
|---|
| 1573 | + .mode = ADC_INCREMENT, |
|---|
| 1574 | + }, |
|---|
| 1575 | +}; |
|---|
| 1576 | + |
|---|
| 1452 | 1577 | static const struct rockchip_tsadc_chip rv1108_tsadc_data = { |
|---|
| 1453 | 1578 | .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1454 | 1579 | .chn_num = 1, /* one channel for tsadc */ |
|---|
| .. | .. |
|---|
| 1559 | 1684 | .initialize = rk_tsadcv2_initialize, |
|---|
| 1560 | 1685 | .irq_ack = rk_tsadcv2_irq_ack, |
|---|
| 1561 | 1686 | .control = rk_tsadcv2_control, |
|---|
| 1562 | | - .get_temp = rk_tsadcv3_get_temp, |
|---|
| 1687 | + .get_temp = rk_tsadcv2_get_temp, |
|---|
| 1563 | 1688 | .set_alarm_temp = rk_tsadcv2_alarm_temp, |
|---|
| 1564 | 1689 | .set_tshut_temp = rk_tsadcv2_tshut_temp, |
|---|
| 1565 | 1690 | .set_tshut_mode = rk_tsadcv2_tshut_mode, |
|---|
| .. | .. |
|---|
| 1580 | 1705 | .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1581 | 1706 | .tshut_temp = 95000, |
|---|
| 1582 | 1707 | |
|---|
| 1583 | | - .initialize = rk_tsadcv4_initialize, |
|---|
| 1708 | + .initialize = rk_tsadcv2_initialize, |
|---|
| 1584 | 1709 | .irq_ack = rk_tsadcv3_irq_ack, |
|---|
| 1585 | 1710 | .control = rk_tsadcv3_control, |
|---|
| 1586 | 1711 | .get_temp = rk_tsadcv2_get_temp, |
|---|
| .. | .. |
|---|
| 1596 | 1721 | }, |
|---|
| 1597 | 1722 | }; |
|---|
| 1598 | 1723 | |
|---|
| 1599 | | -static const struct rockchip_tsadc_chip px30_tsadc_data = { |
|---|
| 1724 | +static const struct rockchip_tsadc_chip rk3308bs_tsadc_data = { |
|---|
| 1600 | 1725 | .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1601 | | - .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ |
|---|
| 1602 | | - .chn_num = 2, /* 2 channels for tsadc */ |
|---|
| 1726 | + .chn_num = 1, /* 1 channels for tsadc */ |
|---|
| 1603 | 1727 | |
|---|
| 1604 | | - .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1605 | | - .tshut_temp = 95000, |
|---|
| 1606 | | - |
|---|
| 1607 | | - .initialize = rk_tsadcv4_initialize, |
|---|
| 1608 | | - .irq_ack = rk_tsadcv3_irq_ack, |
|---|
| 1609 | | - .control = rk_tsadcv3_control, |
|---|
| 1610 | | - .get_temp = rk_tsadcv2_get_temp, |
|---|
| 1611 | | - .set_alarm_temp = rk_tsadcv2_alarm_temp, |
|---|
| 1612 | | - .set_tshut_temp = rk_tsadcv2_tshut_temp, |
|---|
| 1613 | | - .set_tshut_mode = rk_tsadcv2_tshut_mode, |
|---|
| 1614 | | - |
|---|
| 1615 | | - .table = { |
|---|
| 1616 | | - .id = rk3328_code_table, |
|---|
| 1617 | | - .length = ARRAY_SIZE(rk3328_code_table), |
|---|
| 1618 | | - .data_mask = TSADCV2_DATA_MASK, |
|---|
| 1619 | | - .mode = ADC_INCREMENT, |
|---|
| 1620 | | - }, |
|---|
| 1621 | | -}; |
|---|
| 1622 | | - |
|---|
| 1623 | | -static const struct rockchip_tsadc_chip px30s_tsadc_data = { |
|---|
| 1624 | | - .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1625 | | - .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ |
|---|
| 1626 | | - .chn_num = 2, /* 1 channels for tsadc */ |
|---|
| 1627 | 1728 | .conversion_time = 2100, /* us */ |
|---|
| 1729 | + |
|---|
| 1628 | 1730 | .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ |
|---|
| 1629 | 1731 | .tshut_temp = 95000, |
|---|
| 1630 | | - .initialize = rk_tsadcv9_initialize, |
|---|
| 1732 | + |
|---|
| 1733 | + .initialize = rk_tsadcv2_initialize, |
|---|
| 1631 | 1734 | .irq_ack = rk_tsadcv3_irq_ack, |
|---|
| 1632 | 1735 | .control = rk_tsadcv2_control, |
|---|
| 1633 | 1736 | .get_temp = rk_tsadcv2_get_temp, |
|---|
| .. | .. |
|---|
| 1635 | 1738 | .set_tshut_temp = rk_tsadcv2_tshut_temp, |
|---|
| 1636 | 1739 | .set_tshut_mode = rk_tsadcv2_tshut_mode, |
|---|
| 1637 | 1740 | .set_clk_rate = rk_tsadcv1_set_clk_rate, |
|---|
| 1741 | + |
|---|
| 1638 | 1742 | .table = { |
|---|
| 1639 | 1743 | .kNum = 2699, |
|---|
| 1640 | 1744 | .bNum = 2796, |
|---|
| .. | .. |
|---|
| 1765 | 1869 | }, |
|---|
| 1766 | 1870 | }; |
|---|
| 1767 | 1871 | |
|---|
| 1872 | +static const struct rockchip_tsadc_chip rk3562_tsadc_data = { |
|---|
| 1873 | + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1874 | + .chn_num = 1, /* one channels for tsadc */ |
|---|
| 1875 | + |
|---|
| 1876 | + .tshut_mode = TSHUT_MODE_OTP, /* default TSHUT via GPIO give PMIC */ |
|---|
| 1877 | + .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */ |
|---|
| 1878 | + .tshut_temp = 95000, |
|---|
| 1879 | + |
|---|
| 1880 | + .initialize = rk_tsadcv12_initialize, |
|---|
| 1881 | + .irq_ack = rk_tsadcv4_irq_ack, |
|---|
| 1882 | + .control = rk_tsadcv4_control, |
|---|
| 1883 | + .get_temp = rk_tsadcv4_get_temp, |
|---|
| 1884 | + .set_alarm_temp = rk_tsadcv3_alarm_temp, |
|---|
| 1885 | + .set_tshut_temp = rk_tsadcv3_tshut_temp, |
|---|
| 1886 | + .set_tshut_mode = rk_tsadcv4_tshut_mode, |
|---|
| 1887 | + |
|---|
| 1888 | + .table = { |
|---|
| 1889 | + .id = rk3562_code_table, |
|---|
| 1890 | + .length = ARRAY_SIZE(rk3562_code_table), |
|---|
| 1891 | + .data_mask = TSADCV2_DATA_MASK, |
|---|
| 1892 | + .mode = ADC_INCREMENT, |
|---|
| 1893 | + }, |
|---|
| 1894 | +}; |
|---|
| 1895 | + |
|---|
| 1768 | 1896 | static const struct rockchip_tsadc_chip rk3568_tsadc_data = { |
|---|
| 1769 | 1897 | .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ |
|---|
| 1770 | 1898 | .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ |
|---|
| .. | .. |
|---|
| 1815 | 1943 | }; |
|---|
| 1816 | 1944 | |
|---|
| 1817 | 1945 | static const struct of_device_id of_rockchip_thermal_match[] = { |
|---|
| 1818 | | -#ifdef CONFIG_CPU_RV110X |
|---|
| 1946 | +#ifdef CONFIG_CPU_PX30 |
|---|
| 1947 | + { .compatible = "rockchip,px30-tsadc", |
|---|
| 1948 | + .data = (void *)&px30_tsadc_data, |
|---|
| 1949 | + }, |
|---|
| 1950 | + { .compatible = "rockchip,px30s-tsadc", |
|---|
| 1951 | + .data = (void *)&px30s_tsadc_data, |
|---|
| 1952 | + }, |
|---|
| 1953 | +#endif |
|---|
| 1954 | +#ifdef CONFIG_CPU_RV1106 |
|---|
| 1955 | + { |
|---|
| 1956 | + .compatible = "rockchip,rv1106-tsadc", |
|---|
| 1957 | + .data = (void *)&rv1106_tsadc_data, |
|---|
| 1958 | + }, |
|---|
| 1959 | +#endif |
|---|
| 1960 | +#ifdef CONFIG_CPU_RV1108 |
|---|
| 1819 | 1961 | { |
|---|
| 1820 | 1962 | .compatible = "rockchip,rv1108-tsadc", |
|---|
| 1821 | 1963 | .data = (void *)&rv1108_tsadc_data, |
|---|
| .. | .. |
|---|
| 1825 | 1967 | { |
|---|
| 1826 | 1968 | .compatible = "rockchip,rv1126-tsadc", |
|---|
| 1827 | 1969 | .data = (void *)&rv1126_tsadc_data, |
|---|
| 1828 | | - }, |
|---|
| 1829 | | -#endif |
|---|
| 1830 | | -#ifdef CONFIG_CPU_PX30 |
|---|
| 1831 | | - { .compatible = "rockchip,px30-tsadc", |
|---|
| 1832 | | - .data = (void *)&px30_tsadc_data, |
|---|
| 1833 | | - }, |
|---|
| 1834 | | - { .compatible = "rockchip,px30s-tsadc", |
|---|
| 1835 | | - .data = (void *)&px30s_tsadc_data, |
|---|
| 1836 | 1970 | }, |
|---|
| 1837 | 1971 | #endif |
|---|
| 1838 | 1972 | #ifdef CONFIG_CPU_RK1808 |
|---|
| .. | .. |
|---|
| 1857 | 1991 | { |
|---|
| 1858 | 1992 | .compatible = "rockchip,rk3308-tsadc", |
|---|
| 1859 | 1993 | .data = (void *)&rk3308_tsadc_data, |
|---|
| 1994 | + }, |
|---|
| 1995 | + { |
|---|
| 1996 | + .compatible = "rockchip,rk3308bs-tsadc", |
|---|
| 1997 | + .data = (void *)&rk3308bs_tsadc_data, |
|---|
| 1860 | 1998 | }, |
|---|
| 1861 | 1999 | #endif |
|---|
| 1862 | 2000 | #ifdef CONFIG_CPU_RK3328 |
|---|
| .. | .. |
|---|
| 1889 | 2027 | .data = (void *)&rk3528_tsadc_data, |
|---|
| 1890 | 2028 | }, |
|---|
| 1891 | 2029 | #endif |
|---|
| 2030 | +#ifdef CONFIG_CPU_RK3562 |
|---|
| 2031 | + { |
|---|
| 2032 | + .compatible = "rockchip,rk3562-tsadc", |
|---|
| 2033 | + .data = (void *)&rk3562_tsadc_data, |
|---|
| 2034 | + }, |
|---|
| 2035 | +#endif |
|---|
| 1892 | 2036 | #ifdef CONFIG_CPU_RK3568 |
|---|
| 1893 | 2037 | { |
|---|
| 1894 | 2038 | .compatible = "rockchip,rk3568-tsadc", |
|---|
| .. | .. |
|---|
| 1910 | 2054 | { |
|---|
| 1911 | 2055 | struct thermal_zone_device *tzd = sensor->tzd; |
|---|
| 1912 | 2056 | |
|---|
| 1913 | | - tzd->ops->set_mode(tzd, |
|---|
| 1914 | | - on ? THERMAL_DEVICE_ENABLED : THERMAL_DEVICE_DISABLED); |
|---|
| 2057 | + if (on) |
|---|
| 2058 | + thermal_zone_device_enable(tzd); |
|---|
| 2059 | + else |
|---|
| 2060 | + thermal_zone_device_disable(tzd); |
|---|
| 1915 | 2061 | } |
|---|
| 1916 | 2062 | |
|---|
| 1917 | 2063 | static irqreturn_t rockchip_thermal_alarm_irq_thread(int irq, void *dev) |
|---|
| .. | .. |
|---|
| 2182 | 2328 | |
|---|
| 2183 | 2329 | /** |
|---|
| 2184 | 2330 | * Reset TSADC Controller, reset all tsadc registers. |
|---|
| 2331 | + * @reset: the reset controller of tsadc |
|---|
| 2185 | 2332 | */ |
|---|
| 2186 | 2333 | static void rockchip_thermal_reset_controller(struct reset_control *reset) |
|---|
| 2187 | 2334 | { |
|---|
| .. | .. |
|---|
| 2242 | 2389 | return -ENXIO; |
|---|
| 2243 | 2390 | |
|---|
| 2244 | 2391 | irq = platform_get_irq(pdev, 0); |
|---|
| 2245 | | - if (irq < 0) { |
|---|
| 2246 | | - dev_err(&pdev->dev, "no irq resource?\n"); |
|---|
| 2392 | + if (irq < 0) |
|---|
| 2247 | 2393 | return -EINVAL; |
|---|
| 2248 | | - } |
|---|
| 2249 | 2394 | |
|---|
| 2250 | 2395 | thermal = devm_kzalloc(&pdev->dev, sizeof(struct rockchip_thermal_data), |
|---|
| 2251 | 2396 | GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 2259 | 2404 | return -EINVAL; |
|---|
| 2260 | 2405 | if (soc_is_px30s()) |
|---|
| 2261 | 2406 | thermal->chip = &px30s_tsadc_data; |
|---|
| 2407 | + if (soc_is_rk3308bs()) |
|---|
| 2408 | + thermal->chip = &rk3308bs_tsadc_data; |
|---|
| 2262 | 2409 | |
|---|
| 2263 | 2410 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 2264 | 2411 | thermal->regs = devm_ioremap_resource(&pdev->dev, res); |
|---|
| .. | .. |
|---|
| 2346 | 2493 | usleep_range(thermal->chip->conversion_time, |
|---|
| 2347 | 2494 | thermal->chip->conversion_time + 50); |
|---|
| 2348 | 2495 | |
|---|
| 2349 | | - for (i = 0; i < thermal->chip->chn_num; i++) |
|---|
| 2496 | + for (i = 0; i < thermal->chip->chn_num; i++) { |
|---|
| 2350 | 2497 | rockchip_thermal_toggle_sensor(&thermal->sensors[i], true); |
|---|
| 2498 | + thermal->sensors[i].tzd->tzp->no_hwmon = false; |
|---|
| 2499 | + error = thermal_add_hwmon_sysfs(thermal->sensors[i].tzd); |
|---|
| 2500 | + if (error) |
|---|
| 2501 | + dev_warn(&pdev->dev, |
|---|
| 2502 | + "failed to register sensor %d with hwmon: %d\n", |
|---|
| 2503 | + i, error); |
|---|
| 2504 | + } |
|---|
| 2351 | 2505 | |
|---|
| 2352 | 2506 | thermal->panic_nb.notifier_call = rockchip_thermal_panic; |
|---|
| 2353 | 2507 | atomic_notifier_chain_register(&panic_notifier_list, |
|---|
| .. | .. |
|---|
| 2371 | 2525 | for (i = 0; i < thermal->chip->chn_num; i++) { |
|---|
| 2372 | 2526 | struct rockchip_thermal_sensor *sensor = &thermal->sensors[i]; |
|---|
| 2373 | 2527 | |
|---|
| 2528 | + thermal_remove_hwmon_sysfs(sensor->tzd); |
|---|
| 2374 | 2529 | rockchip_thermal_toggle_sensor(sensor, false); |
|---|
| 2375 | 2530 | } |
|---|
| 2376 | 2531 | |
|---|
| .. | .. |
|---|
| 2400 | 2555 | |
|---|
| 2401 | 2556 | static int __maybe_unused rockchip_thermal_suspend(struct device *dev) |
|---|
| 2402 | 2557 | { |
|---|
| 2403 | | - struct platform_device *pdev = to_platform_device(dev); |
|---|
| 2404 | | - struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev); |
|---|
| 2558 | + struct rockchip_thermal_data *thermal = dev_get_drvdata(dev); |
|---|
| 2405 | 2559 | int i; |
|---|
| 2406 | 2560 | |
|---|
| 2407 | 2561 | for (i = 0; i < thermal->chip->chn_num; i++) |
|---|
| .. | .. |
|---|
| 2419 | 2573 | |
|---|
| 2420 | 2574 | static int __maybe_unused rockchip_thermal_resume(struct device *dev) |
|---|
| 2421 | 2575 | { |
|---|
| 2422 | | - struct platform_device *pdev = to_platform_device(dev); |
|---|
| 2423 | | - struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev); |
|---|
| 2576 | + struct rockchip_thermal_data *thermal = dev_get_drvdata(dev); |
|---|
| 2424 | 2577 | int i; |
|---|
| 2425 | 2578 | int error; |
|---|
| 2426 | 2579 | |
|---|
| 2427 | 2580 | error = clk_bulk_enable(thermal->num_clks, thermal->clks); |
|---|
| 2428 | 2581 | if (error) { |
|---|
| 2429 | | - dev_err(&pdev->dev, "failed to enable tsadc bulk clks: %d\n", |
|---|
| 2582 | + dev_err(dev, "failed to enable tsadc bulk clks: %d\n", |
|---|
| 2430 | 2583 | error); |
|---|
| 2431 | 2584 | return error; |
|---|
| 2432 | 2585 | } |
|---|
| .. | .. |
|---|
| 2447 | 2600 | id, thermal->regs, |
|---|
| 2448 | 2601 | tshut_temp); |
|---|
| 2449 | 2602 | if (error) |
|---|
| 2450 | | - dev_err(&pdev->dev, "%s: invalid tshut=%d, error=%d\n", |
|---|
| 2603 | + dev_err(dev, "%s: invalid tshut=%d, error=%d\n", |
|---|
| 2451 | 2604 | __func__, tshut_temp, error); |
|---|
| 2452 | 2605 | } |
|---|
| 2453 | 2606 | |
|---|
| .. | .. |
|---|
| 2479 | 2632 | .shutdown = rockchip_thermal_shutdown, |
|---|
| 2480 | 2633 | }; |
|---|
| 2481 | 2634 | |
|---|
| 2482 | | -module_platform_driver(rockchip_thermal_driver); |
|---|
| 2635 | +static int __init rockchip_thermal_driver_init(void) |
|---|
| 2636 | +{ |
|---|
| 2637 | + return platform_driver_register(&rockchip_thermal_driver); |
|---|
| 2638 | +} |
|---|
| 2639 | +rootfs_initcall(rockchip_thermal_driver_init); |
|---|
| 2640 | + |
|---|
| 2641 | +static void __exit rockchip_thermal_driver_exit(void) |
|---|
| 2642 | +{ |
|---|
| 2643 | + platform_driver_unregister(&rockchip_thermal_driver); |
|---|
| 2644 | +} |
|---|
| 2645 | +module_exit(rockchip_thermal_driver_exit); |
|---|
| 2483 | 2646 | |
|---|
| 2484 | 2647 | MODULE_DESCRIPTION("ROCKCHIP THERMAL Driver"); |
|---|
| 2485 | 2648 | MODULE_AUTHOR("Rockchip, Inc."); |
|---|