1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2014-2018 Nuvoton Technology corporation.
5 #include <linux/device.h>
6 #include <linux/hwmon.h>
7 #include <linux/hwmon-sysfs.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/of_address.h>
12 #include <linux/of_irq.h>
13 #include <linux/platform_device.h>
14 #include <linux/spinlock.h>
15 #include <linux/sysfs.h>
16 #include <linux/thermal.h>
18 /* NPCM7XX PWM registers */
19 #define NPCM7XX_PWM_REG_BASE(base, n) ((base) + ((n) * 0x1000L))
21 #define NPCM7XX_PWM_REG_PR(base, n) (NPCM7XX_PWM_REG_BASE(base, n) + 0x00)
22 #define NPCM7XX_PWM_REG_CSR(base, n) (NPCM7XX_PWM_REG_BASE(base, n) + 0x04)
23 #define NPCM7XX_PWM_REG_CR(base, n) (NPCM7XX_PWM_REG_BASE(base, n) + 0x08)
24 #define NPCM7XX_PWM_REG_CNRx(base, n, ch) \
25 (NPCM7XX_PWM_REG_BASE(base, n) + 0x0C + (12 * (ch)))
26 #define NPCM7XX_PWM_REG_CMRx(base, n, ch) \
27 (NPCM7XX_PWM_REG_BASE(base, n) + 0x10 + (12 * (ch)))
28 #define NPCM7XX_PWM_REG_PDRx(base, n, ch) \
29 (NPCM7XX_PWM_REG_BASE(base, n) + 0x14 + (12 * (ch)))
30 #define NPCM7XX_PWM_REG_PIER(base, n) (NPCM7XX_PWM_REG_BASE(base, n) + 0x3C)
31 #define NPCM7XX_PWM_REG_PIIR(base, n) (NPCM7XX_PWM_REG_BASE(base, n) + 0x40)
33 #define NPCM7XX_PWM_CTRL_CH0_MODE_BIT BIT(3)
34 #define NPCM7XX_PWM_CTRL_CH1_MODE_BIT BIT(11)
35 #define NPCM7XX_PWM_CTRL_CH2_MODE_BIT BIT(15)
36 #define NPCM7XX_PWM_CTRL_CH3_MODE_BIT BIT(19)
38 #define NPCM7XX_PWM_CTRL_CH0_INV_BIT BIT(2)
39 #define NPCM7XX_PWM_CTRL_CH1_INV_BIT BIT(10)
40 #define NPCM7XX_PWM_CTRL_CH2_INV_BIT BIT(14)
41 #define NPCM7XX_PWM_CTRL_CH3_INV_BIT BIT(18)
43 #define NPCM7XX_PWM_CTRL_CH0_EN_BIT BIT(0)
44 #define NPCM7XX_PWM_CTRL_CH1_EN_BIT BIT(8)
45 #define NPCM7XX_PWM_CTRL_CH2_EN_BIT BIT(12)
46 #define NPCM7XX_PWM_CTRL_CH3_EN_BIT BIT(16)
48 /* Define the maximum PWM channel number */
49 #define NPCM7XX_PWM_MAX_CHN_NUM 12
50 #define NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE 4
51 #define NPCM7XX_PWM_MAX_MODULES 3
53 /* Define the Counter Register, value = 100 for match 100% */
54 #define NPCM7XX_PWM_COUNTER_DEFAULT_NUM 255
55 #define NPCM7XX_PWM_CMR_DEFAULT_NUM 255
56 #define NPCM7XX_PWM_CMR_MAX 255
58 /* default all PWM channels PRESCALE2 = 1 */
59 #define NPCM7XX_PWM_PRESCALE2_DEFAULT_CH0 0x4
60 #define NPCM7XX_PWM_PRESCALE2_DEFAULT_CH1 0x40
61 #define NPCM7XX_PWM_PRESCALE2_DEFAULT_CH2 0x400
62 #define NPCM7XX_PWM_PRESCALE2_DEFAULT_CH3 0x4000
64 #define PWM_OUTPUT_FREQ_25KHZ 25000
65 #define PWN_CNT_DEFAULT 256
66 #define MIN_PRESCALE1 2
67 #define NPCM7XX_PWM_PRESCALE_SHIFT_CH01 8
69 #define NPCM7XX_PWM_PRESCALE2_DEFAULT (NPCM7XX_PWM_PRESCALE2_DEFAULT_CH0 | \
70 NPCM7XX_PWM_PRESCALE2_DEFAULT_CH1 | \
71 NPCM7XX_PWM_PRESCALE2_DEFAULT_CH2 | \
72 NPCM7XX_PWM_PRESCALE2_DEFAULT_CH3)
74 #define NPCM7XX_PWM_CTRL_MODE_DEFAULT (NPCM7XX_PWM_CTRL_CH0_MODE_BIT | \
75 NPCM7XX_PWM_CTRL_CH1_MODE_BIT | \
76 NPCM7XX_PWM_CTRL_CH2_MODE_BIT | \
77 NPCM7XX_PWM_CTRL_CH3_MODE_BIT)
79 /* NPCM7XX FAN Tacho registers */
80 #define NPCM7XX_FAN_REG_BASE(base, n) ((base) + ((n) * 0x1000L))
82 #define NPCM7XX_FAN_REG_TCNT1(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x00)
83 #define NPCM7XX_FAN_REG_TCRA(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x02)
84 #define NPCM7XX_FAN_REG_TCRB(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x04)
85 #define NPCM7XX_FAN_REG_TCNT2(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x06)
86 #define NPCM7XX_FAN_REG_TPRSC(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x08)
87 #define NPCM7XX_FAN_REG_TCKC(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x0A)
88 #define NPCM7XX_FAN_REG_TMCTRL(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x0C)
89 #define NPCM7XX_FAN_REG_TICTRL(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x0E)
90 #define NPCM7XX_FAN_REG_TICLR(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x10)
91 #define NPCM7XX_FAN_REG_TIEN(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x12)
92 #define NPCM7XX_FAN_REG_TCPA(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x14)
93 #define NPCM7XX_FAN_REG_TCPB(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x16)
94 #define NPCM7XX_FAN_REG_TCPCFG(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x18)
95 #define NPCM7XX_FAN_REG_TINASEL(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x1A)
96 #define NPCM7XX_FAN_REG_TINBSEL(base, n) (NPCM7XX_FAN_REG_BASE(base, n) + 0x1C)
98 #define NPCM7XX_FAN_TCKC_CLKX_NONE 0
99 #define NPCM7XX_FAN_TCKC_CLK1_APB BIT(0)
100 #define NPCM7XX_FAN_TCKC_CLK2_APB BIT(3)
102 #define NPCM7XX_FAN_TMCTRL_TBEN BIT(6)
103 #define NPCM7XX_FAN_TMCTRL_TAEN BIT(5)
104 #define NPCM7XX_FAN_TMCTRL_TBEDG BIT(4)
105 #define NPCM7XX_FAN_TMCTRL_TAEDG BIT(3)
106 #define NPCM7XX_FAN_TMCTRL_MODE_5 BIT(2)
108 #define NPCM7XX_FAN_TICLR_CLEAR_ALL GENMASK(5, 0)
109 #define NPCM7XX_FAN_TICLR_TFCLR BIT(5)
110 #define NPCM7XX_FAN_TICLR_TECLR BIT(4)
111 #define NPCM7XX_FAN_TICLR_TDCLR BIT(3)
112 #define NPCM7XX_FAN_TICLR_TCCLR BIT(2)
113 #define NPCM7XX_FAN_TICLR_TBCLR BIT(1)
114 #define NPCM7XX_FAN_TICLR_TACLR BIT(0)
116 #define NPCM7XX_FAN_TIEN_ENABLE_ALL GENMASK(5, 0)
117 #define NPCM7XX_FAN_TIEN_TFIEN BIT(5)
118 #define NPCM7XX_FAN_TIEN_TEIEN BIT(4)
119 #define NPCM7XX_FAN_TIEN_TDIEN BIT(3)
120 #define NPCM7XX_FAN_TIEN_TCIEN BIT(2)
121 #define NPCM7XX_FAN_TIEN_TBIEN BIT(1)
122 #define NPCM7XX_FAN_TIEN_TAIEN BIT(0)
124 #define NPCM7XX_FAN_TICTRL_TFPND BIT(5)
125 #define NPCM7XX_FAN_TICTRL_TEPND BIT(4)
126 #define NPCM7XX_FAN_TICTRL_TDPND BIT(3)
127 #define NPCM7XX_FAN_TICTRL_TCPND BIT(2)
128 #define NPCM7XX_FAN_TICTRL_TBPND BIT(1)
129 #define NPCM7XX_FAN_TICTRL_TAPND BIT(0)
131 #define NPCM7XX_FAN_TCPCFG_HIBEN BIT(7)
132 #define NPCM7XX_FAN_TCPCFG_EQBEN BIT(6)
133 #define NPCM7XX_FAN_TCPCFG_LOBEN BIT(5)
134 #define NPCM7XX_FAN_TCPCFG_CPBSEL BIT(4)
135 #define NPCM7XX_FAN_TCPCFG_HIAEN BIT(3)
136 #define NPCM7XX_FAN_TCPCFG_EQAEN BIT(2)
137 #define NPCM7XX_FAN_TCPCFG_LOAEN BIT(1)
138 #define NPCM7XX_FAN_TCPCFG_CPASEL BIT(0)
140 /* FAN General Definition */
141 /* Define the maximum FAN channel number */
142 #define NPCM7XX_FAN_MAX_MODULE 8
143 #define NPCM7XX_FAN_MAX_CHN_NUM_IN_A_MODULE 2
144 #define NPCM7XX_FAN_MAX_CHN_NUM 16
147 * Get Fan Tach Timeout (base on clock 214843.75Hz, 1 cnt = 4.654us)
148 * Timeout 94ms ~= 0x5000
149 * (The minimum FAN speed could to support ~640RPM/pulse 1,
150 * 320RPM/pulse 2, ...-- 10.6Hz)
152 #define NPCM7XX_FAN_TIMEOUT 0x5000
153 #define NPCM7XX_FAN_TCNT 0xFFFF
154 #define NPCM7XX_FAN_TCPA (NPCM7XX_FAN_TCNT - NPCM7XX_FAN_TIMEOUT)
155 #define NPCM7XX_FAN_TCPB (NPCM7XX_FAN_TCNT - NPCM7XX_FAN_TIMEOUT)
157 #define NPCM7XX_FAN_POLL_TIMER_200MS 200
158 #define NPCM7XX_FAN_DEFAULT_PULSE_PER_REVOLUTION 2
159 #define NPCM7XX_FAN_TINASEL_FANIN_DEFAULT 0
160 #define NPCM7XX_FAN_CLK_PRESCALE 255
162 #define NPCM7XX_FAN_CMPA 0
163 #define NPCM7XX_FAN_CMPB 1
165 /* Obtain the fan number */
166 #define NPCM7XX_FAN_INPUT(fan, cmp) (((fan) << 1) + (cmp))
168 /* fan sample status */
169 #define FAN_DISABLE 0xFF
170 #define FAN_INIT 0x00
171 #define FAN_PREPARE_TO_GET_FIRST_CAPTURE 0x01
172 #define FAN_ENOUGH_SAMPLE 0x02
174 struct npcm_hwmon_info
{
178 struct npcm7xx_fan_dev
{
185 struct npcm7xx_cooling_device
{
186 char name
[THERMAL_NAME_LENGTH
];
187 struct npcm7xx_pwm_fan_data
*data
;
188 struct thermal_cooling_device
*tcdev
;
195 struct npcm7xx_pwm_fan_data
{
196 void __iomem
*pwm_base
;
197 void __iomem
*fan_base
;
201 struct mutex pwm_lock
[NPCM7XX_PWM_MAX_MODULES
];
202 spinlock_t fan_lock
[NPCM7XX_FAN_MAX_MODULE
];
203 int fan_irq
[NPCM7XX_FAN_MAX_MODULE
];
204 bool pwm_present
[NPCM7XX_PWM_MAX_CHN_NUM
];
205 bool fan_present
[NPCM7XX_FAN_MAX_CHN_NUM
];
207 struct timer_list fan_timer
;
208 struct npcm7xx_fan_dev fan_dev
[NPCM7XX_FAN_MAX_CHN_NUM
];
209 struct npcm7xx_cooling_device
*cdev
[NPCM7XX_PWM_MAX_CHN_NUM
];
210 const struct npcm_hwmon_info
*info
;
214 static int npcm7xx_pwm_config_set(struct npcm7xx_pwm_fan_data
*data
,
215 int channel
, u16 val
)
217 u32 pwm_ch
= (channel
% NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
218 u32 module
= (channel
/ NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
219 u32 tmp_buf
, ctrl_en_bit
, env_bit
;
222 * Config PWM Comparator register for setting duty cycle
224 mutex_lock(&data
->pwm_lock
[module
]);
226 /* write new CMR value */
227 iowrite32(val
, NPCM7XX_PWM_REG_CMRx(data
->pwm_base
, module
, pwm_ch
));
228 tmp_buf
= ioread32(NPCM7XX_PWM_REG_CR(data
->pwm_base
, module
));
232 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH0_EN_BIT
;
233 env_bit
= NPCM7XX_PWM_CTRL_CH0_INV_BIT
;
236 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH1_EN_BIT
;
237 env_bit
= NPCM7XX_PWM_CTRL_CH1_INV_BIT
;
240 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH2_EN_BIT
;
241 env_bit
= NPCM7XX_PWM_CTRL_CH2_INV_BIT
;
244 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH3_EN_BIT
;
245 env_bit
= NPCM7XX_PWM_CTRL_CH3_INV_BIT
;
248 mutex_unlock(&data
->pwm_lock
[module
]);
254 tmp_buf
&= ~ctrl_en_bit
;
258 tmp_buf
|= ctrl_en_bit
;
262 iowrite32(tmp_buf
, NPCM7XX_PWM_REG_CR(data
->pwm_base
, module
));
263 mutex_unlock(&data
->pwm_lock
[module
]);
268 static inline void npcm7xx_fan_start_capture(struct npcm7xx_pwm_fan_data
*data
,
276 fan_id
= NPCM7XX_FAN_INPUT(fan
, cmp
);
278 /* to check whether any fan tach is enable */
279 if (data
->fan_dev
[fan_id
].fan_st_flg
!= FAN_DISABLE
) {
281 spin_lock_irqsave(&data
->fan_lock
[fan
], flags
);
283 data
->fan_dev
[fan_id
].fan_st_flg
= FAN_INIT
;
284 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
287 * the interrupt enable bits do not need to be cleared before
288 * it sets, the interrupt enable bits are cleared only on reset.
289 * the clock unit control register is behaving in the same
290 * manner that the interrupt enable register behave.
292 if (cmp
== NPCM7XX_FAN_CMPA
) {
293 /* enable interrupt */
294 iowrite8(reg_int
| (NPCM7XX_FAN_TIEN_TAIEN
|
295 NPCM7XX_FAN_TIEN_TEIEN
),
296 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
298 reg_mode
= NPCM7XX_FAN_TCKC_CLK1_APB
299 | ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
302 /* start to Capture */
303 iowrite8(reg_mode
, NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
306 /* enable interrupt */
307 iowrite8(reg_int
| (NPCM7XX_FAN_TIEN_TBIEN
|
308 NPCM7XX_FAN_TIEN_TFIEN
),
309 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
312 NPCM7XX_FAN_TCKC_CLK2_APB
313 | ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
316 /* start to Capture */
318 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
321 spin_unlock_irqrestore(&data
->fan_lock
[fan
], flags
);
326 * Enable a background timer to poll fan tach value, (200ms * 4)
329 static void npcm7xx_fan_polling(struct timer_list
*t
)
331 struct npcm7xx_pwm_fan_data
*data
;
334 data
= from_timer(data
, t
, fan_timer
);
337 * Polling two module per one round,
338 * FAN01 & FAN89 / FAN23 & FAN1011 / FAN45 & FAN1213 / FAN67 & FAN1415
340 for (i
= data
->fan_select
; i
< NPCM7XX_FAN_MAX_MODULE
;
342 /* clear the flag and reset the counter (TCNT) */
343 iowrite8(NPCM7XX_FAN_TICLR_CLEAR_ALL
,
344 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, i
));
346 if (data
->fan_present
[i
* 2]) {
347 iowrite16(NPCM7XX_FAN_TCNT
,
348 NPCM7XX_FAN_REG_TCNT1(data
->fan_base
, i
));
349 npcm7xx_fan_start_capture(data
, i
, NPCM7XX_FAN_CMPA
);
351 if (data
->fan_present
[(i
* 2) + 1]) {
352 iowrite16(NPCM7XX_FAN_TCNT
,
353 NPCM7XX_FAN_REG_TCNT2(data
->fan_base
, i
));
354 npcm7xx_fan_start_capture(data
, i
, NPCM7XX_FAN_CMPB
);
359 data
->fan_select
&= 0x3;
361 /* reset the timer interval */
362 data
->fan_timer
.expires
= jiffies
+
363 msecs_to_jiffies(NPCM7XX_FAN_POLL_TIMER_200MS
);
364 add_timer(&data
->fan_timer
);
367 static inline void npcm7xx_fan_compute(struct npcm7xx_pwm_fan_data
*data
,
368 u8 fan
, u8 cmp
, u8 fan_id
, u8 flag_int
,
369 u8 flag_mode
, u8 flag_clear
)
375 if (cmp
== NPCM7XX_FAN_CMPA
)
376 fan_cap
= ioread16(NPCM7XX_FAN_REG_TCRA(data
->fan_base
, fan
));
378 fan_cap
= ioread16(NPCM7XX_FAN_REG_TCRB(data
->fan_base
, fan
));
380 /* clear capature flag, H/W will auto reset the NPCM7XX_FAN_TCNTx */
381 iowrite8(flag_clear
, NPCM7XX_FAN_REG_TICLR(data
->fan_base
, fan
));
383 if (data
->fan_dev
[fan_id
].fan_st_flg
== FAN_INIT
) {
384 /* First capture, drop it */
385 data
->fan_dev
[fan_id
].fan_st_flg
=
386 FAN_PREPARE_TO_GET_FIRST_CAPTURE
;
389 data
->fan_dev
[fan_id
].fan_cnt_tmp
= 0;
390 } else if (data
->fan_dev
[fan_id
].fan_st_flg
< FAN_ENOUGH_SAMPLE
) {
392 * collect the enough sample,
393 * (ex: 2 pulse fan need to get 2 sample)
395 data
->fan_dev
[fan_id
].fan_cnt_tmp
+=
396 (NPCM7XX_FAN_TCNT
- fan_cap
);
398 data
->fan_dev
[fan_id
].fan_st_flg
++;
400 /* get enough sample or fan disable */
401 if (data
->fan_dev
[fan_id
].fan_st_flg
== FAN_ENOUGH_SAMPLE
) {
402 data
->fan_dev
[fan_id
].fan_cnt_tmp
+=
403 (NPCM7XX_FAN_TCNT
- fan_cap
);
405 /* compute finial average cnt per pulse */
406 data
->fan_dev
[fan_id
].fan_cnt
=
407 data
->fan_dev
[fan_id
].fan_cnt_tmp
/
410 data
->fan_dev
[fan_id
].fan_st_flg
= FAN_INIT
;
413 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
415 /* disable interrupt */
416 iowrite8((reg_int
& ~flag_int
),
417 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
418 reg_mode
= ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
421 iowrite8((reg_mode
& ~flag_mode
),
422 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
426 static inline void npcm7xx_check_cmp(struct npcm7xx_pwm_fan_data
*data
,
427 u8 fan
, u8 cmp
, u8 flag
)
438 fan_id
= NPCM7XX_FAN_INPUT(fan
, cmp
);
440 if (cmp
== NPCM7XX_FAN_CMPA
) {
441 flag_cap
= NPCM7XX_FAN_TICTRL_TAPND
;
442 flag_timeout
= NPCM7XX_FAN_TICTRL_TEPND
;
443 flag_int
= NPCM7XX_FAN_TIEN_TAIEN
| NPCM7XX_FAN_TIEN_TEIEN
;
444 flag_mode
= NPCM7XX_FAN_TCKC_CLK1_APB
;
445 flag_clear
= NPCM7XX_FAN_TICLR_TACLR
| NPCM7XX_FAN_TICLR_TECLR
;
447 flag_cap
= NPCM7XX_FAN_TICTRL_TBPND
;
448 flag_timeout
= NPCM7XX_FAN_TICTRL_TFPND
;
449 flag_int
= NPCM7XX_FAN_TIEN_TBIEN
| NPCM7XX_FAN_TIEN_TFIEN
;
450 flag_mode
= NPCM7XX_FAN_TCKC_CLK2_APB
;
451 flag_clear
= NPCM7XX_FAN_TICLR_TBCLR
| NPCM7XX_FAN_TICLR_TFCLR
;
454 if (flag
& flag_timeout
) {
455 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
457 /* disable interrupt */
458 iowrite8((reg_int
& ~flag_int
),
459 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
461 /* clear interrupt flag */
463 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, fan
));
465 reg_mode
= ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
468 iowrite8((reg_mode
& ~flag_mode
),
469 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
472 * If timeout occurs (NPCM7XX_FAN_TIMEOUT), the fan doesn't
473 * connect or speed is lower than 10.6Hz (320RPM/pulse2).
474 * In these situation, the RPM output should be zero.
476 data
->fan_dev
[fan_id
].fan_cnt
= 0;
478 /* input capture is occurred */
480 npcm7xx_fan_compute(data
, fan
, cmp
, fan_id
, flag_int
,
481 flag_mode
, flag_clear
);
485 static irqreturn_t
npcm7xx_fan_isr(int irq
, void *dev_id
)
487 struct npcm7xx_pwm_fan_data
*data
= dev_id
;
492 module
= irq
- data
->fan_irq
[0];
493 spin_lock_irqsave(&data
->fan_lock
[module
], flags
);
495 flag
= ioread8(NPCM7XX_FAN_REG_TICTRL(data
->fan_base
, module
));
497 npcm7xx_check_cmp(data
, module
, NPCM7XX_FAN_CMPA
, flag
);
498 npcm7xx_check_cmp(data
, module
, NPCM7XX_FAN_CMPB
, flag
);
499 spin_unlock_irqrestore(&data
->fan_lock
[module
], flags
);
503 spin_unlock_irqrestore(&data
->fan_lock
[module
], flags
);
508 static int npcm7xx_read_pwm(struct device
*dev
, u32 attr
, int channel
,
511 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
512 u32 pmw_ch
= (channel
% NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
513 u32 module
= (channel
/ NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
516 case hwmon_pwm_input
:
518 (NPCM7XX_PWM_REG_CMRx(data
->pwm_base
, module
, pmw_ch
));
525 static int npcm7xx_write_pwm(struct device
*dev
, u32 attr
, int channel
,
528 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
532 case hwmon_pwm_input
:
533 if (val
< 0 || val
> NPCM7XX_PWM_CMR_MAX
)
535 err
= npcm7xx_pwm_config_set(data
, channel
, (u16
)val
);
545 static umode_t
npcm7xx_pwm_is_visible(const void *_data
, u32 attr
, int channel
)
547 const struct npcm7xx_pwm_fan_data
*data
= _data
;
549 if (!data
->pwm_present
[channel
] || channel
>= data
->info
->pwm_max_channel
)
553 case hwmon_pwm_input
:
560 static int npcm7xx_read_fan(struct device
*dev
, u32 attr
, int channel
,
563 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
566 case hwmon_fan_input
:
568 if (data
->fan_dev
[channel
].fan_cnt
<= 0)
569 return data
->fan_dev
[channel
].fan_cnt
;
571 /* Convert the raw reading to RPM */
572 if (data
->fan_dev
[channel
].fan_cnt
> 0 &&
573 data
->fan_dev
[channel
].fan_pls_per_rev
> 0)
574 *val
= ((data
->input_clk_freq
* 60) /
575 (data
->fan_dev
[channel
].fan_cnt
*
576 data
->fan_dev
[channel
].fan_pls_per_rev
));
583 static umode_t
npcm7xx_fan_is_visible(const void *_data
, u32 attr
, int channel
)
585 const struct npcm7xx_pwm_fan_data
*data
= _data
;
587 if (!data
->fan_present
[channel
])
591 case hwmon_fan_input
:
598 static int npcm7xx_read(struct device
*dev
, enum hwmon_sensor_types type
,
599 u32 attr
, int channel
, long *val
)
603 return npcm7xx_read_pwm(dev
, attr
, channel
, val
);
605 return npcm7xx_read_fan(dev
, attr
, channel
, val
);
611 static int npcm7xx_write(struct device
*dev
, enum hwmon_sensor_types type
,
612 u32 attr
, int channel
, long val
)
616 return npcm7xx_write_pwm(dev
, attr
, channel
, val
);
622 static umode_t
npcm7xx_is_visible(const void *data
,
623 enum hwmon_sensor_types type
,
624 u32 attr
, int channel
)
628 return npcm7xx_pwm_is_visible(data
, attr
, channel
);
630 return npcm7xx_fan_is_visible(data
, attr
, channel
);
636 static const struct hwmon_channel_info
* const npcm7xx_info
[] = {
637 HWMON_CHANNEL_INFO(pwm
,
650 HWMON_CHANNEL_INFO(fan
,
670 static const struct hwmon_ops npcm7xx_hwmon_ops
= {
671 .is_visible
= npcm7xx_is_visible
,
672 .read
= npcm7xx_read
,
673 .write
= npcm7xx_write
,
676 static const struct hwmon_chip_info npcm7xx_chip_info
= {
677 .ops
= &npcm7xx_hwmon_ops
,
678 .info
= npcm7xx_info
,
681 static const struct npcm_hwmon_info npxm7xx_hwmon_info
= {
682 .pwm_max_channel
= 8,
685 static const struct npcm_hwmon_info npxm8xx_hwmon_info
= {
686 .pwm_max_channel
= 12,
689 static u32
npcm7xx_pwm_init(struct npcm7xx_pwm_fan_data
*data
)
692 u32 prescale_val
, output_freq
;
693 unsigned long pwm_clk_freq
;
695 pwm_clk_freq
= clk_get_rate(data
->pwm_clk
);
697 /* Adjust NPCM7xx PWMs output frequency to ~25Khz */
698 output_freq
= pwm_clk_freq
/ PWN_CNT_DEFAULT
;
699 prescale_val
= DIV_ROUND_CLOSEST(output_freq
, PWM_OUTPUT_FREQ_25KHZ
);
701 /* If prescale_val = 0, then the prescale output clock is stopped */
702 if (prescale_val
< MIN_PRESCALE1
)
703 prescale_val
= MIN_PRESCALE1
;
705 * prescale_val need to decrement in one because in the PWM Prescale
706 * register the Prescale value increment by one
710 /* Setting PWM Prescale Register value register to both modules */
711 prescale_val
|= (prescale_val
<< NPCM7XX_PWM_PRESCALE_SHIFT_CH01
);
713 for (m
= 0; m
< data
->pwm_modules
; m
++) {
714 iowrite32(prescale_val
, NPCM7XX_PWM_REG_PR(data
->pwm_base
, m
));
715 iowrite32(NPCM7XX_PWM_PRESCALE2_DEFAULT
,
716 NPCM7XX_PWM_REG_CSR(data
->pwm_base
, m
));
717 iowrite32(NPCM7XX_PWM_CTRL_MODE_DEFAULT
,
718 NPCM7XX_PWM_REG_CR(data
->pwm_base
, m
));
720 for (ch
= 0; ch
< NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
; ch
++) {
721 iowrite32(NPCM7XX_PWM_COUNTER_DEFAULT_NUM
,
722 NPCM7XX_PWM_REG_CNRx(data
->pwm_base
, m
, ch
));
726 return output_freq
/ ((prescale_val
& 0xf) + 1);
729 static void npcm7xx_fan_init(struct npcm7xx_pwm_fan_data
*data
)
736 for (md
= 0; md
< NPCM7XX_FAN_MAX_MODULE
; md
++) {
737 /* stop FAN0~7 clock */
738 iowrite8(NPCM7XX_FAN_TCKC_CLKX_NONE
,
739 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, md
));
741 /* disable all interrupt */
742 iowrite8(0x00, NPCM7XX_FAN_REG_TIEN(data
->fan_base
, md
));
744 /* clear all interrupt */
745 iowrite8(NPCM7XX_FAN_TICLR_CLEAR_ALL
,
746 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, md
));
748 /* set FAN0~7 clock prescaler */
749 iowrite8(NPCM7XX_FAN_CLK_PRESCALE
,
750 NPCM7XX_FAN_REG_TPRSC(data
->fan_base
, md
));
752 /* set FAN0~7 mode (high-to-low transition) */
753 iowrite8((NPCM7XX_FAN_TMCTRL_MODE_5
| NPCM7XX_FAN_TMCTRL_TBEN
|
754 NPCM7XX_FAN_TMCTRL_TAEN
),
755 NPCM7XX_FAN_REG_TMCTRL(data
->fan_base
, md
));
757 /* set FAN0~7 Initial Count/Cap */
758 iowrite16(NPCM7XX_FAN_TCNT
,
759 NPCM7XX_FAN_REG_TCNT1(data
->fan_base
, md
));
760 iowrite16(NPCM7XX_FAN_TCNT
,
761 NPCM7XX_FAN_REG_TCNT2(data
->fan_base
, md
));
763 /* set FAN0~7 compare (equal to count) */
764 iowrite8((NPCM7XX_FAN_TCPCFG_EQAEN
| NPCM7XX_FAN_TCPCFG_EQBEN
),
765 NPCM7XX_FAN_REG_TCPCFG(data
->fan_base
, md
));
767 /* set FAN0~7 compare value */
768 iowrite16(NPCM7XX_FAN_TCPA
,
769 NPCM7XX_FAN_REG_TCPA(data
->fan_base
, md
));
770 iowrite16(NPCM7XX_FAN_TCPB
,
771 NPCM7XX_FAN_REG_TCPB(data
->fan_base
, md
));
773 /* set FAN0~7 fan input FANIN 0~15 */
774 iowrite8(NPCM7XX_FAN_TINASEL_FANIN_DEFAULT
,
775 NPCM7XX_FAN_REG_TINASEL(data
->fan_base
, md
));
776 iowrite8(NPCM7XX_FAN_TINASEL_FANIN_DEFAULT
,
777 NPCM7XX_FAN_REG_TINBSEL(data
->fan_base
, md
));
779 for (i
= 0; i
< NPCM7XX_FAN_MAX_CHN_NUM_IN_A_MODULE
; i
++) {
780 ch
= md
* NPCM7XX_FAN_MAX_CHN_NUM_IN_A_MODULE
+ i
;
781 data
->fan_dev
[ch
].fan_st_flg
= FAN_DISABLE
;
782 data
->fan_dev
[ch
].fan_pls_per_rev
=
783 NPCM7XX_FAN_DEFAULT_PULSE_PER_REVOLUTION
;
784 data
->fan_dev
[ch
].fan_cnt
= 0;
788 apb_clk_freq
= clk_get_rate(data
->fan_clk
);
790 /* Fan tach input clock = APB clock / prescalar, default is 255. */
791 data
->input_clk_freq
= apb_clk_freq
/ (NPCM7XX_FAN_CLK_PRESCALE
+ 1);
795 npcm7xx_pwm_cz_get_max_state(struct thermal_cooling_device
*tcdev
,
796 unsigned long *state
)
798 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
800 *state
= cdev
->max_state
;
806 npcm7xx_pwm_cz_get_cur_state(struct thermal_cooling_device
*tcdev
,
807 unsigned long *state
)
809 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
811 *state
= cdev
->cur_state
;
817 npcm7xx_pwm_cz_set_cur_state(struct thermal_cooling_device
*tcdev
,
820 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
823 if (state
> cdev
->max_state
)
826 cdev
->cur_state
= state
;
827 ret
= npcm7xx_pwm_config_set(cdev
->data
, cdev
->pwm_port
,
828 cdev
->cooling_levels
[cdev
->cur_state
]);
833 static const struct thermal_cooling_device_ops npcm7xx_pwm_cool_ops
= {
834 .get_max_state
= npcm7xx_pwm_cz_get_max_state
,
835 .get_cur_state
= npcm7xx_pwm_cz_get_cur_state
,
836 .set_cur_state
= npcm7xx_pwm_cz_set_cur_state
,
839 static int npcm7xx_create_pwm_cooling(struct device
*dev
,
840 struct device_node
*child
,
841 struct npcm7xx_pwm_fan_data
*data
,
842 u32 pwm_port
, u8 num_levels
)
845 struct npcm7xx_cooling_device
*cdev
;
847 cdev
= devm_kzalloc(dev
, sizeof(*cdev
), GFP_KERNEL
);
851 cdev
->cooling_levels
= devm_kzalloc(dev
, num_levels
, GFP_KERNEL
);
852 if (!cdev
->cooling_levels
)
855 cdev
->max_state
= num_levels
- 1;
856 ret
= of_property_read_u8_array(child
, "cooling-levels",
857 cdev
->cooling_levels
,
860 dev_err(dev
, "Property 'cooling-levels' cannot be read.\n");
863 snprintf(cdev
->name
, THERMAL_NAME_LENGTH
, "%pOFn%d", child
,
866 cdev
->tcdev
= devm_thermal_of_cooling_device_register(dev
, child
,
867 cdev
->name
, cdev
, &npcm7xx_pwm_cool_ops
);
868 if (IS_ERR(cdev
->tcdev
))
869 return PTR_ERR(cdev
->tcdev
);
872 cdev
->pwm_port
= pwm_port
;
874 data
->cdev
[pwm_port
] = cdev
;
879 static int npcm7xx_en_pwm_fan(struct device
*dev
,
880 struct device_node
*child
,
881 struct npcm7xx_pwm_fan_data
*data
)
888 ret
= of_property_read_u32(child
, "reg", &pwm_port
);
892 data
->pwm_present
[pwm_port
] = true;
893 ret
= npcm7xx_pwm_config_set(data
, pwm_port
,
894 NPCM7XX_PWM_CMR_DEFAULT_NUM
);
898 ret
= of_property_count_u8_elems(child
, "cooling-levels");
900 ret
= npcm7xx_create_pwm_cooling(dev
, child
, data
, pwm_port
,
906 fan_cnt
= of_property_count_u8_elems(child
, "fan-tach-ch");
910 fan_ch
= devm_kcalloc(dev
, fan_cnt
, sizeof(*fan_ch
), GFP_KERNEL
);
914 ret
= of_property_read_u8_array(child
, "fan-tach-ch", fan_ch
, fan_cnt
);
918 for (ch
= 0; ch
< fan_cnt
; ch
++) {
920 data
->fan_present
[index
] = true;
921 data
->fan_dev
[index
].fan_st_flg
= FAN_INIT
;
927 static int npcm7xx_pwm_fan_probe(struct platform_device
*pdev
)
929 struct device
*dev
= &pdev
->dev
;
930 struct device_node
*np
;
931 struct npcm7xx_pwm_fan_data
*data
;
932 struct resource
*res
;
933 struct device
*hwmon
;
941 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
945 data
->info
= device_get_match_data(dev
);
949 data
->pwm_modules
= data
->info
->pwm_max_channel
/ NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
;
951 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "pwm");
953 dev_err(dev
, "pwm resource not found\n");
957 data
->pwm_base
= devm_ioremap_resource(dev
, res
);
958 dev_dbg(dev
, "pwm base resource is %pR\n", res
);
959 if (IS_ERR(data
->pwm_base
))
960 return PTR_ERR(data
->pwm_base
);
962 data
->pwm_clk
= devm_clk_get(dev
, "pwm");
963 if (IS_ERR(data
->pwm_clk
)) {
964 dev_err(dev
, "couldn't get pwm clock\n");
965 return PTR_ERR(data
->pwm_clk
);
968 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "fan");
970 dev_err(dev
, "fan resource not found\n");
974 data
->fan_base
= devm_ioremap_resource(dev
, res
);
975 dev_dbg(dev
, "fan base resource is %pR\n", res
);
976 if (IS_ERR(data
->fan_base
))
977 return PTR_ERR(data
->fan_base
);
979 data
->fan_clk
= devm_clk_get(dev
, "fan");
980 if (IS_ERR(data
->fan_clk
)) {
981 dev_err(dev
, "couldn't get fan clock\n");
982 return PTR_ERR(data
->fan_clk
);
985 output_freq
= npcm7xx_pwm_init(data
);
986 npcm7xx_fan_init(data
);
988 for (cnt
= 0; cnt
< data
->pwm_modules
; cnt
++)
989 mutex_init(&data
->pwm_lock
[cnt
]);
991 for (i
= 0; i
< NPCM7XX_FAN_MAX_MODULE
; i
++) {
992 spin_lock_init(&data
->fan_lock
[i
]);
994 data
->fan_irq
[i
] = platform_get_irq(pdev
, i
);
995 if (data
->fan_irq
[i
] < 0)
996 return data
->fan_irq
[i
];
998 sprintf(name
, "NPCM7XX-FAN-MD%d", i
);
999 ret
= devm_request_irq(dev
, data
->fan_irq
[i
], npcm7xx_fan_isr
,
1000 0, name
, (void *)data
);
1002 dev_err(dev
, "register IRQ fan%d failed\n", i
);
1007 for_each_child_of_node_scoped(np
, child
) {
1008 ret
= npcm7xx_en_pwm_fan(dev
, child
, data
);
1010 dev_err(dev
, "enable pwm and fan failed\n");
1015 hwmon
= devm_hwmon_device_register_with_info(dev
, "npcm7xx_pwm_fan",
1016 data
, &npcm7xx_chip_info
,
1018 if (IS_ERR(hwmon
)) {
1019 dev_err(dev
, "unable to register hwmon device\n");
1020 return PTR_ERR(hwmon
);
1023 for (i
= 0; i
< NPCM7XX_FAN_MAX_CHN_NUM
; i
++) {
1024 if (data
->fan_present
[i
]) {
1025 /* fan timer initialization */
1026 data
->fan_timer
.expires
= jiffies
+
1027 msecs_to_jiffies(NPCM7XX_FAN_POLL_TIMER_200MS
);
1028 timer_setup(&data
->fan_timer
,
1029 npcm7xx_fan_polling
, 0);
1030 add_timer(&data
->fan_timer
);
1035 pr_info("NPCM7XX PWM-FAN Driver probed, output Freq %dHz[PWM], input Freq %dHz[FAN]\n",
1036 output_freq
, data
->input_clk_freq
);
1041 static const struct of_device_id of_pwm_fan_match_table
[] = {
1042 { .compatible
= "nuvoton,npcm750-pwm-fan", .data
= &npxm7xx_hwmon_info
},
1043 { .compatible
= "nuvoton,npcm845-pwm-fan", .data
= &npxm8xx_hwmon_info
},
1046 MODULE_DEVICE_TABLE(of
, of_pwm_fan_match_table
);
1048 static struct platform_driver npcm7xx_pwm_fan_driver
= {
1049 .probe
= npcm7xx_pwm_fan_probe
,
1051 .name
= "npcm7xx_pwm_fan",
1052 .of_match_table
= of_pwm_fan_match_table
,
1056 module_platform_driver(npcm7xx_pwm_fan_driver
);
1058 MODULE_DESCRIPTION("Nuvoton NPCM7XX PWM and Fan Tacho driver");
1059 MODULE_AUTHOR("Tomer Maimon <tomer.maimon@nuvoton.com>");
1060 MODULE_LICENSE("GPL v2");