011-v6.9-thermal-drivers-sun8i-Explain-unknown-H6-register-value.patch 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. From 14f118aa50fe7c7c7330f56d007ecacca487cea8 Mon Sep 17 00:00:00 2001
  2. From: Andre Przywara <[email protected]>
  3. Date: Mon, 19 Feb 2024 15:36:35 +0000
  4. Subject: [PATCH] thermal/drivers/sun8i: Explain unknown H6 register value
  5. So far we were ORing in some "unknown" value into the THS control
  6. register on the Allwinner H6. This part of the register is not explained
  7. in the H6 manual, but the H616 manual details those bits, and on closer
  8. inspection the THS IP blocks in both SoCs seem very close:
  9. - The BSP code for both SoCs writes the same values into THS_CTRL.
  10. - The reset values of at least the first three registers are the same.
  11. Replace the "unknown" value with its proper meaning: "acquire time",
  12. most probably the sample part of the sample & hold circuit of the ADC,
  13. according to its explanation in the H616 manual.
  14. No functional change, just a macro rename and adjustment.
  15. Signed-off-by: Andre Przywara <[email protected]>
  16. Reviewed-by: Jernej Skrabec <[email protected]>
  17. Acked-by: Vasily Khoruzhick <[email protected]>
  18. Signed-off-by: Daniel Lezcano <[email protected]>
  19. Link: https://lore.kernel.org/r/[email protected]
  20. ---
  21. drivers/thermal/sun8i_thermal.c | 29 ++++++++++++++++-------------
  22. 1 file changed, 16 insertions(+), 13 deletions(-)
  23. --- a/drivers/thermal/sun8i_thermal.c
  24. +++ b/drivers/thermal/sun8i_thermal.c
  25. @@ -50,7 +50,8 @@
  26. #define SUN8I_THS_CTRL2_T_ACQ1(x) ((GENMASK(15, 0) & (x)) << 16)
  27. #define SUN8I_THS_DATA_IRQ_STS(x) BIT(x + 8)
  28. -#define SUN50I_THS_CTRL0_T_ACQ(x) ((GENMASK(15, 0) & (x)) << 16)
  29. +#define SUN50I_THS_CTRL0_T_ACQ(x) (GENMASK(15, 0) & ((x) - 1))
  30. +#define SUN50I_THS_CTRL0_T_SAMPLE_PER(x) ((GENMASK(15, 0) & ((x) - 1)) << 16)
  31. #define SUN50I_THS_FILTER_EN BIT(2)
  32. #define SUN50I_THS_FILTER_TYPE(x) (GENMASK(1, 0) & (x))
  33. #define SUN50I_H6_THS_PC_TEMP_PERIOD(x) ((GENMASK(19, 0) & (x)) << 12)
  34. @@ -410,25 +411,27 @@ static int sun8i_h3_thermal_init(struct
  35. return 0;
  36. }
  37. -/*
  38. - * Without this undocumented value, the returned temperatures would
  39. - * be higher than real ones by about 20C.
  40. - */
  41. -#define SUN50I_H6_CTRL0_UNK 0x0000002f
  42. -
  43. static int sun50i_h6_thermal_init(struct ths_device *tmdev)
  44. {
  45. int val;
  46. /*
  47. - * T_acq = 20us
  48. - * clkin = 24MHz
  49. - *
  50. - * x = T_acq * clkin - 1
  51. - * = 479
  52. + * The manual recommends an overall sample frequency of 50 KHz (20us,
  53. + * 480 cycles at 24 MHz), which provides plenty of time for both the
  54. + * acquisition time (>24 cycles) and the actual conversion time
  55. + * (>14 cycles).
  56. + * The lower half of the CTRL register holds the "acquire time", in
  57. + * clock cycles, which the manual recommends to be 2us:
  58. + * 24MHz * 2us = 48 cycles.
  59. + * The high half of THS_CTRL encodes the sample frequency, in clock
  60. + * cycles: 24MHz * 20us = 480 cycles.
  61. + * This is explained in the H616 manual, but apparently wrongly
  62. + * described in the H6 manual, although the BSP code does the same
  63. + * for both SoCs.
  64. */
  65. regmap_write(tmdev->regmap, SUN50I_THS_CTRL0,
  66. - SUN50I_H6_CTRL0_UNK | SUN50I_THS_CTRL0_T_ACQ(479));
  67. + SUN50I_THS_CTRL0_T_ACQ(48) |
  68. + SUN50I_THS_CTRL0_T_SAMPLE_PER(480));
  69. /* average over 4 samples */
  70. regmap_write(tmdev->regmap, SUN50I_H6_THS_MFC,
  71. SUN50I_THS_FILTER_EN |