aspeed-pwm-tacho.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. /*
  2. * Copyright (c) 2016 Google, Inc
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 or later as
  6. * published by the Free Software Foundation.
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/errno.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/delay.h>
  12. #include <linux/hwmon.h>
  13. #include <linux/hwmon-sysfs.h>
  14. #include <linux/io.h>
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/of_platform.h>
  18. #include <linux/of_device.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/sysfs.h>
  21. #include <linux/regmap.h>
  22. /* ASPEED PWM & FAN Tach Register Definition */
  23. #define ASPEED_PTCR_CTRL 0x00
  24. #define ASPEED_PTCR_CLK_CTRL 0x04
  25. #define ASPEED_PTCR_DUTY0_CTRL 0x08
  26. #define ASPEED_PTCR_DUTY1_CTRL 0x0c
  27. #define ASPEED_PTCR_TYPEM_CTRL 0x10
  28. #define ASPEED_PTCR_TYPEM_CTRL1 0x14
  29. #define ASPEED_PTCR_TYPEN_CTRL 0x18
  30. #define ASPEED_PTCR_TYPEN_CTRL1 0x1c
  31. #define ASPEED_PTCR_TACH_SOURCE 0x20
  32. #define ASPEED_PTCR_TRIGGER 0x28
  33. #define ASPEED_PTCR_RESULT 0x2c
  34. #define ASPEED_PTCR_INTR_CTRL 0x30
  35. #define ASPEED_PTCR_INTR_STS 0x34
  36. #define ASPEED_PTCR_TYPEM_LIMIT 0x38
  37. #define ASPEED_PTCR_TYPEN_LIMIT 0x3C
  38. #define ASPEED_PTCR_CTRL_EXT 0x40
  39. #define ASPEED_PTCR_CLK_CTRL_EXT 0x44
  40. #define ASPEED_PTCR_DUTY2_CTRL 0x48
  41. #define ASPEED_PTCR_DUTY3_CTRL 0x4c
  42. #define ASPEED_PTCR_TYPEO_CTRL 0x50
  43. #define ASPEED_PTCR_TYPEO_CTRL1 0x54
  44. #define ASPEED_PTCR_TACH_SOURCE_EXT 0x60
  45. #define ASPEED_PTCR_TYPEO_LIMIT 0x78
  46. /* ASPEED_PTCR_CTRL : 0x00 - General Control Register */
  47. #define ASPEED_PTCR_CTRL_SET_PWMD_TYPE_PART1 15
  48. #define ASPEED_PTCR_CTRL_SET_PWMD_TYPE_PART2 6
  49. #define ASPEED_PTCR_CTRL_SET_PWMD_TYPE_MASK (BIT(7) | BIT(15))
  50. #define ASPEED_PTCR_CTRL_SET_PWMC_TYPE_PART1 14
  51. #define ASPEED_PTCR_CTRL_SET_PWMC_TYPE_PART2 5
  52. #define ASPEED_PTCR_CTRL_SET_PWMC_TYPE_MASK (BIT(6) | BIT(14))
  53. #define ASPEED_PTCR_CTRL_SET_PWMB_TYPE_PART1 13
  54. #define ASPEED_PTCR_CTRL_SET_PWMB_TYPE_PART2 4
  55. #define ASPEED_PTCR_CTRL_SET_PWMB_TYPE_MASK (BIT(5) | BIT(13))
  56. #define ASPEED_PTCR_CTRL_SET_PWMA_TYPE_PART1 12
  57. #define ASPEED_PTCR_CTRL_SET_PWMA_TYPE_PART2 3
  58. #define ASPEED_PTCR_CTRL_SET_PWMA_TYPE_MASK (BIT(4) | BIT(12))
  59. #define ASPEED_PTCR_CTRL_FAN_NUM_EN(x) BIT(16 + (x))
  60. #define ASPEED_PTCR_CTRL_PWMD_EN BIT(11)
  61. #define ASPEED_PTCR_CTRL_PWMC_EN BIT(10)
  62. #define ASPEED_PTCR_CTRL_PWMB_EN BIT(9)
  63. #define ASPEED_PTCR_CTRL_PWMA_EN BIT(8)
  64. #define ASPEED_PTCR_CTRL_CLK_SRC BIT(1)
  65. #define ASPEED_PTCR_CTRL_CLK_EN BIT(0)
  66. /* ASPEED_PTCR_CLK_CTRL : 0x04 - Clock Control Register */
  67. /* TYPE N */
  68. #define ASPEED_PTCR_CLK_CTRL_TYPEN_MASK GENMASK(31, 16)
  69. #define ASPEED_PTCR_CLK_CTRL_TYPEN_UNIT 24
  70. #define ASPEED_PTCR_CLK_CTRL_TYPEN_H 20
  71. #define ASPEED_PTCR_CLK_CTRL_TYPEN_L 16
  72. /* TYPE M */
  73. #define ASPEED_PTCR_CLK_CTRL_TYPEM_MASK GENMASK(15, 0)
  74. #define ASPEED_PTCR_CLK_CTRL_TYPEM_UNIT 8
  75. #define ASPEED_PTCR_CLK_CTRL_TYPEM_H 4
  76. #define ASPEED_PTCR_CLK_CTRL_TYPEM_L 0
  77. /*
  78. * ASPEED_PTCR_DUTY_CTRL/1/2/3 : 0x08/0x0C/0x48/0x4C - PWM-FAN duty control
  79. * 0/1/2/3 register
  80. */
  81. #define DUTY_CTRL_PWM2_FALL_POINT 24
  82. #define DUTY_CTRL_PWM2_RISE_POINT 16
  83. #define DUTY_CTRL_PWM2_RISE_FALL_MASK GENMASK(31, 16)
  84. #define DUTY_CTRL_PWM1_FALL_POINT 8
  85. #define DUTY_CTRL_PWM1_RISE_POINT 0
  86. #define DUTY_CTRL_PWM1_RISE_FALL_MASK GENMASK(15, 0)
  87. /* ASPEED_PTCR_TYPEM_CTRL : 0x10/0x18/0x50 - Type M/N/O Ctrl 0 Register */
  88. #define TYPE_CTRL_FAN_MASK (GENMASK(5, 1) | GENMASK(31, 16))
  89. #define TYPE_CTRL_FAN1_MASK GENMASK(31, 0)
  90. #define TYPE_CTRL_FAN_PERIOD 16
  91. #define TYPE_CTRL_FAN_MODE 4
  92. #define TYPE_CTRL_FAN_DIVISION 1
  93. #define TYPE_CTRL_FAN_TYPE_EN 1
  94. /* ASPEED_PTCR_TACH_SOURCE : 0x20/0x60 - Tach Source Register */
  95. /* bit [0,1] at 0x20, bit [2] at 0x60 */
  96. #define TACH_PWM_SOURCE_BIT01(x) ((x) * 2)
  97. #define TACH_PWM_SOURCE_BIT2(x) ((x) * 2)
  98. #define TACH_PWM_SOURCE_MASK_BIT01(x) (0x3 << ((x) * 2))
  99. #define TACH_PWM_SOURCE_MASK_BIT2(x) BIT((x) * 2)
  100. /* ASPEED_PTCR_RESULT : 0x2c - Result Register */
  101. #define RESULT_STATUS_MASK BIT(31)
  102. #define RESULT_VALUE_MASK 0xfffff
  103. /* ASPEED_PTCR_CTRL_EXT : 0x40 - General Control Extension #1 Register */
  104. #define ASPEED_PTCR_CTRL_SET_PWMH_TYPE_PART1 15
  105. #define ASPEED_PTCR_CTRL_SET_PWMH_TYPE_PART2 6
  106. #define ASPEED_PTCR_CTRL_SET_PWMH_TYPE_MASK (BIT(7) | BIT(15))
  107. #define ASPEED_PTCR_CTRL_SET_PWMG_TYPE_PART1 14
  108. #define ASPEED_PTCR_CTRL_SET_PWMG_TYPE_PART2 5
  109. #define ASPEED_PTCR_CTRL_SET_PWMG_TYPE_MASK (BIT(6) | BIT(14))
  110. #define ASPEED_PTCR_CTRL_SET_PWMF_TYPE_PART1 13
  111. #define ASPEED_PTCR_CTRL_SET_PWMF_TYPE_PART2 4
  112. #define ASPEED_PTCR_CTRL_SET_PWMF_TYPE_MASK (BIT(5) | BIT(13))
  113. #define ASPEED_PTCR_CTRL_SET_PWME_TYPE_PART1 12
  114. #define ASPEED_PTCR_CTRL_SET_PWME_TYPE_PART2 3
  115. #define ASPEED_PTCR_CTRL_SET_PWME_TYPE_MASK (BIT(4) | BIT(12))
  116. #define ASPEED_PTCR_CTRL_PWMH_EN BIT(11)
  117. #define ASPEED_PTCR_CTRL_PWMG_EN BIT(10)
  118. #define ASPEED_PTCR_CTRL_PWMF_EN BIT(9)
  119. #define ASPEED_PTCR_CTRL_PWME_EN BIT(8)
  120. /* ASPEED_PTCR_CLK_EXT_CTRL : 0x44 - Clock Control Extension #1 Register */
  121. /* TYPE O */
  122. #define ASPEED_PTCR_CLK_CTRL_TYPEO_MASK GENMASK(15, 0)
  123. #define ASPEED_PTCR_CLK_CTRL_TYPEO_UNIT 8
  124. #define ASPEED_PTCR_CLK_CTRL_TYPEO_H 4
  125. #define ASPEED_PTCR_CLK_CTRL_TYPEO_L 0
  126. #define PWM_MAX 255
  127. #define BOTH_EDGES 0x02 /* 10b */
  128. #define M_PWM_DIV_H 0x00
  129. #define M_PWM_DIV_L 0x05
  130. #define M_PWM_PERIOD 0x5F
  131. #define M_TACH_CLK_DIV 0x00
  132. /*
  133. * 5:4 Type N fan tach mode selection bit:
  134. * 00: falling
  135. * 01: rising
  136. * 10: both
  137. * 11: reserved.
  138. */
  139. #define M_TACH_MODE 0x02 /* 10b */
  140. #define M_TACH_UNIT 0x00c0
  141. #define INIT_FAN_CTRL 0xFF
  142. struct aspeed_pwm_tacho_data {
  143. struct regmap *regmap;
  144. unsigned long clk_freq;
  145. bool pwm_present[8];
  146. bool fan_tach_present[16];
  147. u8 type_pwm_clock_unit[3];
  148. u8 type_pwm_clock_division_h[3];
  149. u8 type_pwm_clock_division_l[3];
  150. u8 type_fan_tach_clock_division[3];
  151. u8 type_fan_tach_mode[3];
  152. u16 type_fan_tach_unit[3];
  153. u8 pwm_port_type[8];
  154. u8 pwm_port_fan_ctrl[8];
  155. u8 fan_tach_ch_source[16];
  156. const struct attribute_group *groups[3];
  157. };
  158. enum type { TYPEM, TYPEN, TYPEO };
  159. struct type_params {
  160. u32 l_value;
  161. u32 h_value;
  162. u32 unit_value;
  163. u32 clk_ctrl_mask;
  164. u32 clk_ctrl_reg;
  165. u32 ctrl_reg;
  166. u32 ctrl_reg1;
  167. };
  168. static const struct type_params type_params[] = {
  169. [TYPEM] = {
  170. .l_value = ASPEED_PTCR_CLK_CTRL_TYPEM_L,
  171. .h_value = ASPEED_PTCR_CLK_CTRL_TYPEM_H,
  172. .unit_value = ASPEED_PTCR_CLK_CTRL_TYPEM_UNIT,
  173. .clk_ctrl_mask = ASPEED_PTCR_CLK_CTRL_TYPEM_MASK,
  174. .clk_ctrl_reg = ASPEED_PTCR_CLK_CTRL,
  175. .ctrl_reg = ASPEED_PTCR_TYPEM_CTRL,
  176. .ctrl_reg1 = ASPEED_PTCR_TYPEM_CTRL1,
  177. },
  178. [TYPEN] = {
  179. .l_value = ASPEED_PTCR_CLK_CTRL_TYPEN_L,
  180. .h_value = ASPEED_PTCR_CLK_CTRL_TYPEN_H,
  181. .unit_value = ASPEED_PTCR_CLK_CTRL_TYPEN_UNIT,
  182. .clk_ctrl_mask = ASPEED_PTCR_CLK_CTRL_TYPEN_MASK,
  183. .clk_ctrl_reg = ASPEED_PTCR_CLK_CTRL,
  184. .ctrl_reg = ASPEED_PTCR_TYPEN_CTRL,
  185. .ctrl_reg1 = ASPEED_PTCR_TYPEN_CTRL1,
  186. },
  187. [TYPEO] = {
  188. .l_value = ASPEED_PTCR_CLK_CTRL_TYPEO_L,
  189. .h_value = ASPEED_PTCR_CLK_CTRL_TYPEO_H,
  190. .unit_value = ASPEED_PTCR_CLK_CTRL_TYPEO_UNIT,
  191. .clk_ctrl_mask = ASPEED_PTCR_CLK_CTRL_TYPEO_MASK,
  192. .clk_ctrl_reg = ASPEED_PTCR_CLK_CTRL_EXT,
  193. .ctrl_reg = ASPEED_PTCR_TYPEO_CTRL,
  194. .ctrl_reg1 = ASPEED_PTCR_TYPEO_CTRL1,
  195. }
  196. };
  197. enum pwm_port { PWMA, PWMB, PWMC, PWMD, PWME, PWMF, PWMG, PWMH };
  198. struct pwm_port_params {
  199. u32 pwm_en;
  200. u32 ctrl_reg;
  201. u32 type_part1;
  202. u32 type_part2;
  203. u32 type_mask;
  204. u32 duty_ctrl_rise_point;
  205. u32 duty_ctrl_fall_point;
  206. u32 duty_ctrl_reg;
  207. u32 duty_ctrl_rise_fall_mask;
  208. };
  209. static const struct pwm_port_params pwm_port_params[] = {
  210. [PWMA] = {
  211. .pwm_en = ASPEED_PTCR_CTRL_PWMA_EN,
  212. .ctrl_reg = ASPEED_PTCR_CTRL,
  213. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMA_TYPE_PART1,
  214. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMA_TYPE_PART2,
  215. .type_mask = ASPEED_PTCR_CTRL_SET_PWMA_TYPE_MASK,
  216. .duty_ctrl_rise_point = DUTY_CTRL_PWM1_RISE_POINT,
  217. .duty_ctrl_fall_point = DUTY_CTRL_PWM1_FALL_POINT,
  218. .duty_ctrl_reg = ASPEED_PTCR_DUTY0_CTRL,
  219. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM1_RISE_FALL_MASK,
  220. },
  221. [PWMB] = {
  222. .pwm_en = ASPEED_PTCR_CTRL_PWMB_EN,
  223. .ctrl_reg = ASPEED_PTCR_CTRL,
  224. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMB_TYPE_PART1,
  225. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMB_TYPE_PART2,
  226. .type_mask = ASPEED_PTCR_CTRL_SET_PWMB_TYPE_MASK,
  227. .duty_ctrl_rise_point = DUTY_CTRL_PWM2_RISE_POINT,
  228. .duty_ctrl_fall_point = DUTY_CTRL_PWM2_FALL_POINT,
  229. .duty_ctrl_reg = ASPEED_PTCR_DUTY0_CTRL,
  230. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM2_RISE_FALL_MASK,
  231. },
  232. [PWMC] = {
  233. .pwm_en = ASPEED_PTCR_CTRL_PWMC_EN,
  234. .ctrl_reg = ASPEED_PTCR_CTRL,
  235. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMC_TYPE_PART1,
  236. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMC_TYPE_PART2,
  237. .type_mask = ASPEED_PTCR_CTRL_SET_PWMC_TYPE_MASK,
  238. .duty_ctrl_rise_point = DUTY_CTRL_PWM1_RISE_POINT,
  239. .duty_ctrl_fall_point = DUTY_CTRL_PWM1_FALL_POINT,
  240. .duty_ctrl_reg = ASPEED_PTCR_DUTY1_CTRL,
  241. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM1_RISE_FALL_MASK,
  242. },
  243. [PWMD] = {
  244. .pwm_en = ASPEED_PTCR_CTRL_PWMD_EN,
  245. .ctrl_reg = ASPEED_PTCR_CTRL,
  246. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMD_TYPE_PART1,
  247. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMD_TYPE_PART2,
  248. .type_mask = ASPEED_PTCR_CTRL_SET_PWMD_TYPE_MASK,
  249. .duty_ctrl_rise_point = DUTY_CTRL_PWM2_RISE_POINT,
  250. .duty_ctrl_fall_point = DUTY_CTRL_PWM2_FALL_POINT,
  251. .duty_ctrl_reg = ASPEED_PTCR_DUTY1_CTRL,
  252. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM2_RISE_FALL_MASK,
  253. },
  254. [PWME] = {
  255. .pwm_en = ASPEED_PTCR_CTRL_PWME_EN,
  256. .ctrl_reg = ASPEED_PTCR_CTRL_EXT,
  257. .type_part1 = ASPEED_PTCR_CTRL_SET_PWME_TYPE_PART1,
  258. .type_part2 = ASPEED_PTCR_CTRL_SET_PWME_TYPE_PART2,
  259. .type_mask = ASPEED_PTCR_CTRL_SET_PWME_TYPE_MASK,
  260. .duty_ctrl_rise_point = DUTY_CTRL_PWM1_RISE_POINT,
  261. .duty_ctrl_fall_point = DUTY_CTRL_PWM1_FALL_POINT,
  262. .duty_ctrl_reg = ASPEED_PTCR_DUTY2_CTRL,
  263. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM1_RISE_FALL_MASK,
  264. },
  265. [PWMF] = {
  266. .pwm_en = ASPEED_PTCR_CTRL_PWMF_EN,
  267. .ctrl_reg = ASPEED_PTCR_CTRL_EXT,
  268. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMF_TYPE_PART1,
  269. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMF_TYPE_PART2,
  270. .type_mask = ASPEED_PTCR_CTRL_SET_PWMF_TYPE_MASK,
  271. .duty_ctrl_rise_point = DUTY_CTRL_PWM2_RISE_POINT,
  272. .duty_ctrl_fall_point = DUTY_CTRL_PWM2_FALL_POINT,
  273. .duty_ctrl_reg = ASPEED_PTCR_DUTY2_CTRL,
  274. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM2_RISE_FALL_MASK,
  275. },
  276. [PWMG] = {
  277. .pwm_en = ASPEED_PTCR_CTRL_PWMG_EN,
  278. .ctrl_reg = ASPEED_PTCR_CTRL_EXT,
  279. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMG_TYPE_PART1,
  280. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMG_TYPE_PART2,
  281. .type_mask = ASPEED_PTCR_CTRL_SET_PWMG_TYPE_MASK,
  282. .duty_ctrl_rise_point = DUTY_CTRL_PWM1_RISE_POINT,
  283. .duty_ctrl_fall_point = DUTY_CTRL_PWM1_FALL_POINT,
  284. .duty_ctrl_reg = ASPEED_PTCR_DUTY3_CTRL,
  285. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM1_RISE_FALL_MASK,
  286. },
  287. [PWMH] = {
  288. .pwm_en = ASPEED_PTCR_CTRL_PWMH_EN,
  289. .ctrl_reg = ASPEED_PTCR_CTRL_EXT,
  290. .type_part1 = ASPEED_PTCR_CTRL_SET_PWMH_TYPE_PART1,
  291. .type_part2 = ASPEED_PTCR_CTRL_SET_PWMH_TYPE_PART2,
  292. .type_mask = ASPEED_PTCR_CTRL_SET_PWMH_TYPE_MASK,
  293. .duty_ctrl_rise_point = DUTY_CTRL_PWM2_RISE_POINT,
  294. .duty_ctrl_fall_point = DUTY_CTRL_PWM2_FALL_POINT,
  295. .duty_ctrl_reg = ASPEED_PTCR_DUTY3_CTRL,
  296. .duty_ctrl_rise_fall_mask = DUTY_CTRL_PWM2_RISE_FALL_MASK,
  297. }
  298. };
  299. static int regmap_aspeed_pwm_tacho_reg_write(void *context, unsigned int reg,
  300. unsigned int val)
  301. {
  302. void __iomem *regs = (void __iomem *)context;
  303. writel(val, regs + reg);
  304. return 0;
  305. }
  306. static int regmap_aspeed_pwm_tacho_reg_read(void *context, unsigned int reg,
  307. unsigned int *val)
  308. {
  309. void __iomem *regs = (void __iomem *)context;
  310. *val = readl(regs + reg);
  311. return 0;
  312. }
  313. static const struct regmap_config aspeed_pwm_tacho_regmap_config = {
  314. .reg_bits = 32,
  315. .val_bits = 32,
  316. .reg_stride = 4,
  317. .max_register = ASPEED_PTCR_TYPEO_LIMIT,
  318. .reg_write = regmap_aspeed_pwm_tacho_reg_write,
  319. .reg_read = regmap_aspeed_pwm_tacho_reg_read,
  320. .fast_io = true,
  321. };
  322. static void aspeed_set_clock_enable(struct regmap *regmap, bool val)
  323. {
  324. regmap_update_bits(regmap, ASPEED_PTCR_CTRL,
  325. ASPEED_PTCR_CTRL_CLK_EN,
  326. val ? ASPEED_PTCR_CTRL_CLK_EN : 0);
  327. }
  328. static void aspeed_set_clock_source(struct regmap *regmap, int val)
  329. {
  330. regmap_update_bits(regmap, ASPEED_PTCR_CTRL,
  331. ASPEED_PTCR_CTRL_CLK_SRC,
  332. val ? ASPEED_PTCR_CTRL_CLK_SRC : 0);
  333. }
  334. static void aspeed_set_pwm_clock_values(struct regmap *regmap, u8 type,
  335. u8 div_high, u8 div_low, u8 unit)
  336. {
  337. u32 reg_value = ((div_high << type_params[type].h_value) |
  338. (div_low << type_params[type].l_value) |
  339. (unit << type_params[type].unit_value));
  340. regmap_update_bits(regmap, type_params[type].clk_ctrl_reg,
  341. type_params[type].clk_ctrl_mask, reg_value);
  342. }
  343. static void aspeed_set_pwm_port_enable(struct regmap *regmap, u8 pwm_port,
  344. bool enable)
  345. {
  346. regmap_update_bits(regmap, pwm_port_params[pwm_port].ctrl_reg,
  347. pwm_port_params[pwm_port].pwm_en,
  348. enable ? pwm_port_params[pwm_port].pwm_en : 0);
  349. }
  350. static void aspeed_set_pwm_port_type(struct regmap *regmap,
  351. u8 pwm_port, u8 type)
  352. {
  353. u32 reg_value = (type & 0x1) << pwm_port_params[pwm_port].type_part1;
  354. reg_value |= (type & 0x2) << pwm_port_params[pwm_port].type_part2;
  355. regmap_update_bits(regmap, pwm_port_params[pwm_port].ctrl_reg,
  356. pwm_port_params[pwm_port].type_mask, reg_value);
  357. }
  358. static void aspeed_set_pwm_port_duty_rising_falling(struct regmap *regmap,
  359. u8 pwm_port, u8 rising,
  360. u8 falling)
  361. {
  362. u32 reg_value = (rising <<
  363. pwm_port_params[pwm_port].duty_ctrl_rise_point);
  364. reg_value |= (falling <<
  365. pwm_port_params[pwm_port].duty_ctrl_fall_point);
  366. regmap_update_bits(regmap, pwm_port_params[pwm_port].duty_ctrl_reg,
  367. pwm_port_params[pwm_port].duty_ctrl_rise_fall_mask,
  368. reg_value);
  369. }
  370. static void aspeed_set_tacho_type_enable(struct regmap *regmap, u8 type,
  371. bool enable)
  372. {
  373. regmap_update_bits(regmap, type_params[type].ctrl_reg,
  374. TYPE_CTRL_FAN_TYPE_EN,
  375. enable ? TYPE_CTRL_FAN_TYPE_EN : 0);
  376. }
  377. static void aspeed_set_tacho_type_values(struct regmap *regmap, u8 type,
  378. u8 mode, u16 unit, u8 division)
  379. {
  380. u32 reg_value = ((mode << TYPE_CTRL_FAN_MODE) |
  381. (unit << TYPE_CTRL_FAN_PERIOD) |
  382. (division << TYPE_CTRL_FAN_DIVISION));
  383. regmap_update_bits(regmap, type_params[type].ctrl_reg,
  384. TYPE_CTRL_FAN_MASK, reg_value);
  385. regmap_update_bits(regmap, type_params[type].ctrl_reg1,
  386. TYPE_CTRL_FAN1_MASK, unit << 16);
  387. }
  388. static void aspeed_set_fan_tach_ch_enable(struct regmap *regmap, u8 fan_tach_ch,
  389. bool enable)
  390. {
  391. regmap_update_bits(regmap, ASPEED_PTCR_CTRL,
  392. ASPEED_PTCR_CTRL_FAN_NUM_EN(fan_tach_ch),
  393. enable ?
  394. ASPEED_PTCR_CTRL_FAN_NUM_EN(fan_tach_ch) : 0);
  395. }
  396. static void aspeed_set_fan_tach_ch_source(struct regmap *regmap, u8 fan_tach_ch,
  397. u8 fan_tach_ch_source)
  398. {
  399. u32 reg_value1 = ((fan_tach_ch_source & 0x3) <<
  400. TACH_PWM_SOURCE_BIT01(fan_tach_ch));
  401. u32 reg_value2 = (((fan_tach_ch_source & 0x4) >> 2) <<
  402. TACH_PWM_SOURCE_BIT2(fan_tach_ch));
  403. regmap_update_bits(regmap, ASPEED_PTCR_TACH_SOURCE,
  404. TACH_PWM_SOURCE_MASK_BIT01(fan_tach_ch),
  405. reg_value1);
  406. regmap_update_bits(regmap, ASPEED_PTCR_TACH_SOURCE_EXT,
  407. TACH_PWM_SOURCE_MASK_BIT2(fan_tach_ch),
  408. reg_value2);
  409. }
  410. static void aspeed_set_pwm_port_fan_ctrl(struct aspeed_pwm_tacho_data *priv,
  411. u8 index, u8 fan_ctrl)
  412. {
  413. u16 period, dc_time_on;
  414. period = priv->type_pwm_clock_unit[priv->pwm_port_type[index]];
  415. period += 1;
  416. dc_time_on = (fan_ctrl * period) / PWM_MAX;
  417. if (dc_time_on == 0) {
  418. aspeed_set_pwm_port_enable(priv->regmap, index, false);
  419. } else {
  420. if (dc_time_on == period)
  421. dc_time_on = 0;
  422. aspeed_set_pwm_port_duty_rising_falling(priv->regmap, index, 0,
  423. dc_time_on);
  424. aspeed_set_pwm_port_enable(priv->regmap, index, true);
  425. }
  426. }
  427. static u32 aspeed_get_fan_tach_ch_measure_period(struct aspeed_pwm_tacho_data
  428. *priv, u8 type)
  429. {
  430. u32 clk;
  431. u16 tacho_unit;
  432. u8 clk_unit, div_h, div_l, tacho_div;
  433. clk = priv->clk_freq;
  434. clk_unit = priv->type_pwm_clock_unit[type];
  435. div_h = priv->type_pwm_clock_division_h[type];
  436. div_h = 0x1 << div_h;
  437. div_l = priv->type_pwm_clock_division_l[type];
  438. if (div_l == 0)
  439. div_l = 1;
  440. else
  441. div_l = div_l * 2;
  442. tacho_unit = priv->type_fan_tach_unit[type];
  443. tacho_div = priv->type_fan_tach_clock_division[type];
  444. tacho_div = 0x4 << (tacho_div * 2);
  445. return clk / (clk_unit * div_h * div_l * tacho_div * tacho_unit);
  446. }
  447. static int aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
  448. u8 fan_tach_ch)
  449. {
  450. u32 raw_data, tach_div, clk_source, sec, val;
  451. u8 fan_tach_ch_source, type, mode, both;
  452. regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0);
  453. regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0x1 << fan_tach_ch);
  454. fan_tach_ch_source = priv->fan_tach_ch_source[fan_tach_ch];
  455. type = priv->pwm_port_type[fan_tach_ch_source];
  456. sec = (1000 / aspeed_get_fan_tach_ch_measure_period(priv, type));
  457. msleep(sec);
  458. regmap_read(priv->regmap, ASPEED_PTCR_RESULT, &val);
  459. if (!(val & RESULT_STATUS_MASK))
  460. return -ETIMEDOUT;
  461. raw_data = val & RESULT_VALUE_MASK;
  462. tach_div = priv->type_fan_tach_clock_division[type];
  463. /*
  464. * We need the mode to determine if the raw_data is double (from
  465. * counting both edges).
  466. */
  467. mode = priv->type_fan_tach_mode[type];
  468. both = (mode & BOTH_EDGES) ? 1 : 0;
  469. tach_div = (0x4 << both) << (tach_div * 2);
  470. clk_source = priv->clk_freq;
  471. if (raw_data == 0)
  472. return 0;
  473. return (clk_source * 60) / (2 * raw_data * tach_div);
  474. }
  475. static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
  476. const char *buf, size_t count)
  477. {
  478. struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
  479. int index = sensor_attr->index;
  480. int ret;
  481. struct aspeed_pwm_tacho_data *priv = dev_get_drvdata(dev);
  482. long fan_ctrl;
  483. ret = kstrtol(buf, 10, &fan_ctrl);
  484. if (ret != 0)
  485. return ret;
  486. if (fan_ctrl < 0 || fan_ctrl > PWM_MAX)
  487. return -EINVAL;
  488. if (priv->pwm_port_fan_ctrl[index] == fan_ctrl)
  489. return count;
  490. priv->pwm_port_fan_ctrl[index] = fan_ctrl;
  491. aspeed_set_pwm_port_fan_ctrl(priv, index, fan_ctrl);
  492. return count;
  493. }
  494. static ssize_t show_pwm(struct device *dev, struct device_attribute *attr,
  495. char *buf)
  496. {
  497. struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
  498. int index = sensor_attr->index;
  499. struct aspeed_pwm_tacho_data *priv = dev_get_drvdata(dev);
  500. return sprintf(buf, "%u\n", priv->pwm_port_fan_ctrl[index]);
  501. }
  502. static ssize_t show_rpm(struct device *dev, struct device_attribute *attr,
  503. char *buf)
  504. {
  505. struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
  506. int index = sensor_attr->index;
  507. int rpm;
  508. struct aspeed_pwm_tacho_data *priv = dev_get_drvdata(dev);
  509. rpm = aspeed_get_fan_tach_ch_rpm(priv, index);
  510. if (rpm < 0)
  511. return rpm;
  512. return sprintf(buf, "%d\n", rpm);
  513. }
  514. static umode_t pwm_is_visible(struct kobject *kobj,
  515. struct attribute *a, int index)
  516. {
  517. struct device *dev = container_of(kobj, struct device, kobj);
  518. struct aspeed_pwm_tacho_data *priv = dev_get_drvdata(dev);
  519. if (!priv->pwm_present[index])
  520. return 0;
  521. return a->mode;
  522. }
  523. static umode_t fan_dev_is_visible(struct kobject *kobj,
  524. struct attribute *a, int index)
  525. {
  526. struct device *dev = container_of(kobj, struct device, kobj);
  527. struct aspeed_pwm_tacho_data *priv = dev_get_drvdata(dev);
  528. if (!priv->fan_tach_present[index])
  529. return 0;
  530. return a->mode;
  531. }
  532. static SENSOR_DEVICE_ATTR(pwm1, 0644,
  533. show_pwm, set_pwm, 0);
  534. static SENSOR_DEVICE_ATTR(pwm2, 0644,
  535. show_pwm, set_pwm, 1);
  536. static SENSOR_DEVICE_ATTR(pwm3, 0644,
  537. show_pwm, set_pwm, 2);
  538. static SENSOR_DEVICE_ATTR(pwm4, 0644,
  539. show_pwm, set_pwm, 3);
  540. static SENSOR_DEVICE_ATTR(pwm5, 0644,
  541. show_pwm, set_pwm, 4);
  542. static SENSOR_DEVICE_ATTR(pwm6, 0644,
  543. show_pwm, set_pwm, 5);
  544. static SENSOR_DEVICE_ATTR(pwm7, 0644,
  545. show_pwm, set_pwm, 6);
  546. static SENSOR_DEVICE_ATTR(pwm8, 0644,
  547. show_pwm, set_pwm, 7);
  548. static struct attribute *pwm_dev_attrs[] = {
  549. &sensor_dev_attr_pwm1.dev_attr.attr,
  550. &sensor_dev_attr_pwm2.dev_attr.attr,
  551. &sensor_dev_attr_pwm3.dev_attr.attr,
  552. &sensor_dev_attr_pwm4.dev_attr.attr,
  553. &sensor_dev_attr_pwm5.dev_attr.attr,
  554. &sensor_dev_attr_pwm6.dev_attr.attr,
  555. &sensor_dev_attr_pwm7.dev_attr.attr,
  556. &sensor_dev_attr_pwm8.dev_attr.attr,
  557. NULL,
  558. };
  559. static const struct attribute_group pwm_dev_group = {
  560. .attrs = pwm_dev_attrs,
  561. .is_visible = pwm_is_visible,
  562. };
  563. static SENSOR_DEVICE_ATTR(fan1_input, 0444,
  564. show_rpm, NULL, 0);
  565. static SENSOR_DEVICE_ATTR(fan2_input, 0444,
  566. show_rpm, NULL, 1);
  567. static SENSOR_DEVICE_ATTR(fan3_input, 0444,
  568. show_rpm, NULL, 2);
  569. static SENSOR_DEVICE_ATTR(fan4_input, 0444,
  570. show_rpm, NULL, 3);
  571. static SENSOR_DEVICE_ATTR(fan5_input, 0444,
  572. show_rpm, NULL, 4);
  573. static SENSOR_DEVICE_ATTR(fan6_input, 0444,
  574. show_rpm, NULL, 5);
  575. static SENSOR_DEVICE_ATTR(fan7_input, 0444,
  576. show_rpm, NULL, 6);
  577. static SENSOR_DEVICE_ATTR(fan8_input, 0444,
  578. show_rpm, NULL, 7);
  579. static SENSOR_DEVICE_ATTR(fan9_input, 0444,
  580. show_rpm, NULL, 8);
  581. static SENSOR_DEVICE_ATTR(fan10_input, 0444,
  582. show_rpm, NULL, 9);
  583. static SENSOR_DEVICE_ATTR(fan11_input, 0444,
  584. show_rpm, NULL, 10);
  585. static SENSOR_DEVICE_ATTR(fan12_input, 0444,
  586. show_rpm, NULL, 11);
  587. static SENSOR_DEVICE_ATTR(fan13_input, 0444,
  588. show_rpm, NULL, 12);
  589. static SENSOR_DEVICE_ATTR(fan14_input, 0444,
  590. show_rpm, NULL, 13);
  591. static SENSOR_DEVICE_ATTR(fan15_input, 0444,
  592. show_rpm, NULL, 14);
  593. static SENSOR_DEVICE_ATTR(fan16_input, 0444,
  594. show_rpm, NULL, 15);
  595. static struct attribute *fan_dev_attrs[] = {
  596. &sensor_dev_attr_fan1_input.dev_attr.attr,
  597. &sensor_dev_attr_fan2_input.dev_attr.attr,
  598. &sensor_dev_attr_fan3_input.dev_attr.attr,
  599. &sensor_dev_attr_fan4_input.dev_attr.attr,
  600. &sensor_dev_attr_fan5_input.dev_attr.attr,
  601. &sensor_dev_attr_fan6_input.dev_attr.attr,
  602. &sensor_dev_attr_fan7_input.dev_attr.attr,
  603. &sensor_dev_attr_fan8_input.dev_attr.attr,
  604. &sensor_dev_attr_fan9_input.dev_attr.attr,
  605. &sensor_dev_attr_fan10_input.dev_attr.attr,
  606. &sensor_dev_attr_fan11_input.dev_attr.attr,
  607. &sensor_dev_attr_fan12_input.dev_attr.attr,
  608. &sensor_dev_attr_fan13_input.dev_attr.attr,
  609. &sensor_dev_attr_fan14_input.dev_attr.attr,
  610. &sensor_dev_attr_fan15_input.dev_attr.attr,
  611. &sensor_dev_attr_fan16_input.dev_attr.attr,
  612. NULL
  613. };
  614. static const struct attribute_group fan_dev_group = {
  615. .attrs = fan_dev_attrs,
  616. .is_visible = fan_dev_is_visible,
  617. };
  618. /*
  619. * The clock type is type M :
  620. * The PWM frequency = 24MHz / (type M clock division L bit *
  621. * type M clock division H bit * (type M PWM period bit + 1))
  622. */
  623. static void aspeed_create_type(struct aspeed_pwm_tacho_data *priv)
  624. {
  625. priv->type_pwm_clock_division_h[TYPEM] = M_PWM_DIV_H;
  626. priv->type_pwm_clock_division_l[TYPEM] = M_PWM_DIV_L;
  627. priv->type_pwm_clock_unit[TYPEM] = M_PWM_PERIOD;
  628. aspeed_set_pwm_clock_values(priv->regmap, TYPEM, M_PWM_DIV_H,
  629. M_PWM_DIV_L, M_PWM_PERIOD);
  630. aspeed_set_tacho_type_enable(priv->regmap, TYPEM, true);
  631. priv->type_fan_tach_clock_division[TYPEM] = M_TACH_CLK_DIV;
  632. priv->type_fan_tach_unit[TYPEM] = M_TACH_UNIT;
  633. priv->type_fan_tach_mode[TYPEM] = M_TACH_MODE;
  634. aspeed_set_tacho_type_values(priv->regmap, TYPEM, M_TACH_MODE,
  635. M_TACH_UNIT, M_TACH_CLK_DIV);
  636. }
  637. static void aspeed_create_pwm_port(struct aspeed_pwm_tacho_data *priv,
  638. u8 pwm_port)
  639. {
  640. aspeed_set_pwm_port_enable(priv->regmap, pwm_port, true);
  641. priv->pwm_present[pwm_port] = true;
  642. priv->pwm_port_type[pwm_port] = TYPEM;
  643. aspeed_set_pwm_port_type(priv->regmap, pwm_port, TYPEM);
  644. priv->pwm_port_fan_ctrl[pwm_port] = INIT_FAN_CTRL;
  645. aspeed_set_pwm_port_fan_ctrl(priv, pwm_port, INIT_FAN_CTRL);
  646. }
  647. static void aspeed_create_fan_tach_channel(struct aspeed_pwm_tacho_data *priv,
  648. u8 *fan_tach_ch,
  649. int count,
  650. u8 pwm_source)
  651. {
  652. u8 val, index;
  653. for (val = 0; val < count; val++) {
  654. index = fan_tach_ch[val];
  655. aspeed_set_fan_tach_ch_enable(priv->regmap, index, true);
  656. priv->fan_tach_present[index] = true;
  657. priv->fan_tach_ch_source[index] = pwm_source;
  658. aspeed_set_fan_tach_ch_source(priv->regmap, index, pwm_source);
  659. }
  660. }
  661. static int aspeed_create_fan(struct device *dev,
  662. struct device_node *child,
  663. struct aspeed_pwm_tacho_data *priv)
  664. {
  665. u8 *fan_tach_ch;
  666. u32 pwm_port;
  667. int ret, count;
  668. ret = of_property_read_u32(child, "reg", &pwm_port);
  669. if (ret)
  670. return ret;
  671. aspeed_create_pwm_port(priv, (u8)pwm_port);
  672. count = of_property_count_u8_elems(child, "aspeed,fan-tach-ch");
  673. if (count < 1)
  674. return -EINVAL;
  675. fan_tach_ch = devm_kzalloc(dev, sizeof(*fan_tach_ch) * count,
  676. GFP_KERNEL);
  677. if (!fan_tach_ch)
  678. return -ENOMEM;
  679. ret = of_property_read_u8_array(child, "aspeed,fan-tach-ch",
  680. fan_tach_ch, count);
  681. if (ret)
  682. return ret;
  683. aspeed_create_fan_tach_channel(priv, fan_tach_ch, count, pwm_port);
  684. return 0;
  685. }
  686. static int aspeed_pwm_tacho_probe(struct platform_device *pdev)
  687. {
  688. struct device *dev = &pdev->dev;
  689. struct device_node *np, *child;
  690. struct aspeed_pwm_tacho_data *priv;
  691. void __iomem *regs;
  692. struct resource *res;
  693. struct device *hwmon;
  694. struct clk *clk;
  695. int ret;
  696. np = dev->of_node;
  697. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  698. if (!res)
  699. return -ENOENT;
  700. regs = devm_ioremap_resource(dev, res);
  701. if (IS_ERR(regs))
  702. return PTR_ERR(regs);
  703. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  704. if (!priv)
  705. return -ENOMEM;
  706. priv->regmap = devm_regmap_init(dev, NULL, (__force void *)regs,
  707. &aspeed_pwm_tacho_regmap_config);
  708. if (IS_ERR(priv->regmap))
  709. return PTR_ERR(priv->regmap);
  710. regmap_write(priv->regmap, ASPEED_PTCR_TACH_SOURCE, 0);
  711. regmap_write(priv->regmap, ASPEED_PTCR_TACH_SOURCE_EXT, 0);
  712. clk = devm_clk_get(dev, NULL);
  713. if (IS_ERR(clk))
  714. return -ENODEV;
  715. priv->clk_freq = clk_get_rate(clk);
  716. aspeed_set_clock_enable(priv->regmap, true);
  717. aspeed_set_clock_source(priv->regmap, 0);
  718. aspeed_create_type(priv);
  719. for_each_child_of_node(np, child) {
  720. ret = aspeed_create_fan(dev, child, priv);
  721. of_node_put(child);
  722. if (ret)
  723. return ret;
  724. }
  725. priv->groups[0] = &pwm_dev_group;
  726. priv->groups[1] = &fan_dev_group;
  727. priv->groups[2] = NULL;
  728. hwmon = devm_hwmon_device_register_with_groups(dev,
  729. "aspeed_pwm_tacho",
  730. priv, priv->groups);
  731. return PTR_ERR_OR_ZERO(hwmon);
  732. }
  733. static const struct of_device_id of_pwm_tacho_match_table[] = {
  734. { .compatible = "aspeed,ast2400-pwm-tacho", },
  735. { .compatible = "aspeed,ast2500-pwm-tacho", },
  736. {},
  737. };
  738. MODULE_DEVICE_TABLE(of, of_pwm_tacho_match_table);
  739. static struct platform_driver aspeed_pwm_tacho_driver = {
  740. .probe = aspeed_pwm_tacho_probe,
  741. .driver = {
  742. .name = "aspeed_pwm_tacho",
  743. .of_match_table = of_pwm_tacho_match_table,
  744. },
  745. };
  746. module_platform_driver(aspeed_pwm_tacho_driver);
  747. MODULE_AUTHOR("Jaghathiswari Rankappagounder Natarajan <jaghu@google.com>");
  748. MODULE_DESCRIPTION("ASPEED PWM and Fan Tacho device driver");
  749. MODULE_LICENSE("GPL");