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 8
50 #define NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE 4
51 #define NPCM7XX_PWM_MAX_MODULES 2
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 npcm7xx_fan_dev
{
181 struct npcm7xx_cooling_device
{
182 char name
[THERMAL_NAME_LENGTH
];
183 struct npcm7xx_pwm_fan_data
*data
;
184 struct thermal_cooling_device
*tcdev
;
191 struct npcm7xx_pwm_fan_data
{
192 void __iomem
*pwm_base
;
193 void __iomem
*fan_base
;
194 unsigned long pwm_clk_freq
;
195 unsigned long fan_clk_freq
;
198 struct mutex pwm_lock
[NPCM7XX_PWM_MAX_MODULES
];
199 spinlock_t fan_lock
[NPCM7XX_FAN_MAX_MODULE
];
200 int fan_irq
[NPCM7XX_FAN_MAX_MODULE
];
201 bool pwm_present
[NPCM7XX_PWM_MAX_CHN_NUM
];
202 bool fan_present
[NPCM7XX_FAN_MAX_CHN_NUM
];
204 struct timer_list fan_timer
;
205 struct npcm7xx_fan_dev fan_dev
[NPCM7XX_FAN_MAX_CHN_NUM
];
206 struct npcm7xx_cooling_device
*cdev
[NPCM7XX_PWM_MAX_CHN_NUM
];
210 static int npcm7xx_pwm_config_set(struct npcm7xx_pwm_fan_data
*data
,
211 int channel
, u16 val
)
213 u32 pwm_ch
= (channel
% NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
214 u32 module
= (channel
/ NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
215 u32 tmp_buf
, ctrl_en_bit
, env_bit
;
218 * Config PWM Comparator register for setting duty cycle
220 mutex_lock(&data
->pwm_lock
[module
]);
222 /* write new CMR value */
223 iowrite32(val
, NPCM7XX_PWM_REG_CMRx(data
->pwm_base
, module
, pwm_ch
));
224 tmp_buf
= ioread32(NPCM7XX_PWM_REG_CR(data
->pwm_base
, module
));
228 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH0_EN_BIT
;
229 env_bit
= NPCM7XX_PWM_CTRL_CH0_INV_BIT
;
232 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH1_EN_BIT
;
233 env_bit
= NPCM7XX_PWM_CTRL_CH1_INV_BIT
;
236 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH2_EN_BIT
;
237 env_bit
= NPCM7XX_PWM_CTRL_CH2_INV_BIT
;
240 ctrl_en_bit
= NPCM7XX_PWM_CTRL_CH3_EN_BIT
;
241 env_bit
= NPCM7XX_PWM_CTRL_CH3_INV_BIT
;
244 mutex_unlock(&data
->pwm_lock
[module
]);
250 tmp_buf
&= ~ctrl_en_bit
;
254 tmp_buf
|= ctrl_en_bit
;
258 iowrite32(tmp_buf
, NPCM7XX_PWM_REG_CR(data
->pwm_base
, module
));
259 mutex_unlock(&data
->pwm_lock
[module
]);
264 static inline void npcm7xx_fan_start_capture(struct npcm7xx_pwm_fan_data
*data
,
272 fan_id
= NPCM7XX_FAN_INPUT(fan
, cmp
);
274 /* to check whether any fan tach is enable */
275 if (data
->fan_dev
[fan_id
].fan_st_flg
!= FAN_DISABLE
) {
277 spin_lock_irqsave(&data
->fan_lock
[fan
], flags
);
279 data
->fan_dev
[fan_id
].fan_st_flg
= FAN_INIT
;
280 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
283 * the interrupt enable bits do not need to be cleared before
284 * it sets, the interrupt enable bits are cleared only on reset.
285 * the clock unit control register is behaving in the same
286 * manner that the interrupt enable register behave.
288 if (cmp
== NPCM7XX_FAN_CMPA
) {
289 /* enable interrupt */
290 iowrite8(reg_int
| (NPCM7XX_FAN_TIEN_TAIEN
|
291 NPCM7XX_FAN_TIEN_TEIEN
),
292 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
294 reg_mode
= NPCM7XX_FAN_TCKC_CLK1_APB
295 | ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
298 /* start to Capture */
299 iowrite8(reg_mode
, NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
302 /* enable interrupt */
303 iowrite8(reg_int
| (NPCM7XX_FAN_TIEN_TBIEN
|
304 NPCM7XX_FAN_TIEN_TFIEN
),
305 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
308 NPCM7XX_FAN_TCKC_CLK2_APB
309 | ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
,
312 /* start to Capture */
314 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
317 spin_unlock_irqrestore(&data
->fan_lock
[fan
], flags
);
322 * Enable a background timer to poll fan tach value, (200ms * 4)
325 static void npcm7xx_fan_polling(struct timer_list
*t
)
327 struct npcm7xx_pwm_fan_data
*data
;
330 data
= from_timer(data
, t
, fan_timer
);
333 * Polling two module per one round,
334 * FAN01 & FAN89 / FAN23 & FAN1011 / FAN45 & FAN1213 / FAN67 & FAN1415
336 for (i
= data
->fan_select
; i
< NPCM7XX_FAN_MAX_MODULE
;
338 /* clear the flag and reset the counter (TCNT) */
339 iowrite8(NPCM7XX_FAN_TICLR_CLEAR_ALL
,
340 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, i
));
342 if (data
->fan_present
[i
* 2]) {
343 iowrite16(NPCM7XX_FAN_TCNT
,
344 NPCM7XX_FAN_REG_TCNT1(data
->fan_base
, i
));
345 npcm7xx_fan_start_capture(data
, i
, NPCM7XX_FAN_CMPA
);
347 if (data
->fan_present
[(i
* 2) + 1]) {
348 iowrite16(NPCM7XX_FAN_TCNT
,
349 NPCM7XX_FAN_REG_TCNT2(data
->fan_base
, i
));
350 npcm7xx_fan_start_capture(data
, i
, NPCM7XX_FAN_CMPB
);
355 data
->fan_select
&= 0x3;
357 /* reset the timer interval */
358 data
->fan_timer
.expires
= jiffies
+
359 msecs_to_jiffies(NPCM7XX_FAN_POLL_TIMER_200MS
);
360 add_timer(&data
->fan_timer
);
363 static inline void npcm7xx_fan_compute(struct npcm7xx_pwm_fan_data
*data
,
364 u8 fan
, u8 cmp
, u8 fan_id
, u8 flag_int
,
365 u8 flag_mode
, u8 flag_clear
)
371 if (cmp
== NPCM7XX_FAN_CMPA
)
372 fan_cap
= ioread16(NPCM7XX_FAN_REG_TCRA(data
->fan_base
, fan
));
374 fan_cap
= ioread16(NPCM7XX_FAN_REG_TCRB(data
->fan_base
, fan
));
376 /* clear capature flag, H/W will auto reset the NPCM7XX_FAN_TCNTx */
377 iowrite8(flag_clear
, NPCM7XX_FAN_REG_TICLR(data
->fan_base
, fan
));
379 if (data
->fan_dev
[fan_id
].fan_st_flg
== FAN_INIT
) {
380 /* First capture, drop it */
381 data
->fan_dev
[fan_id
].fan_st_flg
=
382 FAN_PREPARE_TO_GET_FIRST_CAPTURE
;
385 data
->fan_dev
[fan_id
].fan_cnt_tmp
= 0;
386 } else if (data
->fan_dev
[fan_id
].fan_st_flg
< FAN_ENOUGH_SAMPLE
) {
388 * collect the enough sample,
389 * (ex: 2 pulse fan need to get 2 sample)
391 data
->fan_dev
[fan_id
].fan_cnt_tmp
+=
392 (NPCM7XX_FAN_TCNT
- fan_cap
);
394 data
->fan_dev
[fan_id
].fan_st_flg
++;
396 /* get enough sample or fan disable */
397 if (data
->fan_dev
[fan_id
].fan_st_flg
== FAN_ENOUGH_SAMPLE
) {
398 data
->fan_dev
[fan_id
].fan_cnt_tmp
+=
399 (NPCM7XX_FAN_TCNT
- fan_cap
);
401 /* compute finial average cnt per pulse */
402 data
->fan_dev
[fan_id
].fan_cnt
=
403 data
->fan_dev
[fan_id
].fan_cnt_tmp
/
406 data
->fan_dev
[fan_id
].fan_st_flg
= FAN_INIT
;
409 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
411 /* disable interrupt */
412 iowrite8((reg_int
& ~flag_int
),
413 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
414 reg_mode
= ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
417 iowrite8((reg_mode
& ~flag_mode
),
418 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
422 static inline void npcm7xx_check_cmp(struct npcm7xx_pwm_fan_data
*data
,
423 u8 fan
, u8 cmp
, u8 flag
)
434 fan_id
= NPCM7XX_FAN_INPUT(fan
, cmp
);
436 if (cmp
== NPCM7XX_FAN_CMPA
) {
437 flag_cap
= NPCM7XX_FAN_TICTRL_TAPND
;
438 flag_timeout
= NPCM7XX_FAN_TICTRL_TEPND
;
439 flag_int
= NPCM7XX_FAN_TIEN_TAIEN
| NPCM7XX_FAN_TIEN_TEIEN
;
440 flag_mode
= NPCM7XX_FAN_TCKC_CLK1_APB
;
441 flag_clear
= NPCM7XX_FAN_TICLR_TACLR
| NPCM7XX_FAN_TICLR_TECLR
;
443 flag_cap
= NPCM7XX_FAN_TICTRL_TBPND
;
444 flag_timeout
= NPCM7XX_FAN_TICTRL_TFPND
;
445 flag_int
= NPCM7XX_FAN_TIEN_TBIEN
| NPCM7XX_FAN_TIEN_TFIEN
;
446 flag_mode
= NPCM7XX_FAN_TCKC_CLK2_APB
;
447 flag_clear
= NPCM7XX_FAN_TICLR_TBCLR
| NPCM7XX_FAN_TICLR_TFCLR
;
450 if (flag
& flag_timeout
) {
451 reg_int
= ioread8(NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
453 /* disable interrupt */
454 iowrite8((reg_int
& ~flag_int
),
455 NPCM7XX_FAN_REG_TIEN(data
->fan_base
, fan
));
457 /* clear interrupt flag */
459 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, fan
));
461 reg_mode
= ioread8(NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
464 iowrite8((reg_mode
& ~flag_mode
),
465 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, fan
));
468 * If timeout occurs (NPCM7XX_FAN_TIMEOUT), the fan doesn't
469 * connect or speed is lower than 10.6Hz (320RPM/pulse2).
470 * In these situation, the RPM output should be zero.
472 data
->fan_dev
[fan_id
].fan_cnt
= 0;
474 /* input capture is occurred */
476 npcm7xx_fan_compute(data
, fan
, cmp
, fan_id
, flag_int
,
477 flag_mode
, flag_clear
);
481 static irqreturn_t
npcm7xx_fan_isr(int irq
, void *dev_id
)
483 struct npcm7xx_pwm_fan_data
*data
= dev_id
;
488 module
= irq
- data
->fan_irq
[0];
489 spin_lock_irqsave(&data
->fan_lock
[module
], flags
);
491 flag
= ioread8(NPCM7XX_FAN_REG_TICTRL(data
->fan_base
, module
));
493 npcm7xx_check_cmp(data
, module
, NPCM7XX_FAN_CMPA
, flag
);
494 npcm7xx_check_cmp(data
, module
, NPCM7XX_FAN_CMPB
, flag
);
495 spin_unlock_irqrestore(&data
->fan_lock
[module
], flags
);
499 spin_unlock_irqrestore(&data
->fan_lock
[module
], flags
);
504 static int npcm7xx_read_pwm(struct device
*dev
, u32 attr
, int channel
,
507 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
508 u32 pmw_ch
= (channel
% NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
509 u32 module
= (channel
/ NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
);
512 case hwmon_pwm_input
:
514 (NPCM7XX_PWM_REG_CMRx(data
->pwm_base
, module
, pmw_ch
));
521 static int npcm7xx_write_pwm(struct device
*dev
, u32 attr
, int channel
,
524 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
528 case hwmon_pwm_input
:
529 if (val
< 0 || val
> NPCM7XX_PWM_CMR_MAX
)
531 err
= npcm7xx_pwm_config_set(data
, channel
, (u16
)val
);
541 static umode_t
npcm7xx_pwm_is_visible(const void *_data
, u32 attr
, int channel
)
543 const struct npcm7xx_pwm_fan_data
*data
= _data
;
545 if (!data
->pwm_present
[channel
])
549 case hwmon_pwm_input
:
556 static int npcm7xx_read_fan(struct device
*dev
, u32 attr
, int channel
,
559 struct npcm7xx_pwm_fan_data
*data
= dev_get_drvdata(dev
);
562 case hwmon_fan_input
:
564 if (data
->fan_dev
[channel
].fan_cnt
<= 0)
565 return data
->fan_dev
[channel
].fan_cnt
;
567 /* Convert the raw reading to RPM */
568 if (data
->fan_dev
[channel
].fan_cnt
> 0 &&
569 data
->fan_dev
[channel
].fan_pls_per_rev
> 0)
570 *val
= ((data
->input_clk_freq
* 60) /
571 (data
->fan_dev
[channel
].fan_cnt
*
572 data
->fan_dev
[channel
].fan_pls_per_rev
));
579 static umode_t
npcm7xx_fan_is_visible(const void *_data
, u32 attr
, int channel
)
581 const struct npcm7xx_pwm_fan_data
*data
= _data
;
583 if (!data
->fan_present
[channel
])
587 case hwmon_fan_input
:
594 static int npcm7xx_read(struct device
*dev
, enum hwmon_sensor_types type
,
595 u32 attr
, int channel
, long *val
)
599 return npcm7xx_read_pwm(dev
, attr
, channel
, val
);
601 return npcm7xx_read_fan(dev
, attr
, channel
, val
);
607 static int npcm7xx_write(struct device
*dev
, enum hwmon_sensor_types type
,
608 u32 attr
, int channel
, long val
)
612 return npcm7xx_write_pwm(dev
, attr
, channel
, val
);
618 static umode_t
npcm7xx_is_visible(const void *data
,
619 enum hwmon_sensor_types type
,
620 u32 attr
, int channel
)
624 return npcm7xx_pwm_is_visible(data
, attr
, channel
);
626 return npcm7xx_fan_is_visible(data
, attr
, channel
);
632 static const u32 npcm7xx_pwm_config
[] = {
644 static const struct hwmon_channel_info npcm7xx_pwm
= {
646 .config
= npcm7xx_pwm_config
,
649 static const u32 npcm7xx_fan_config
[] = {
669 static const struct hwmon_channel_info npcm7xx_fan
= {
671 .config
= npcm7xx_fan_config
,
674 static const struct hwmon_channel_info
*npcm7xx_info
[] = {
680 static const struct hwmon_ops npcm7xx_hwmon_ops
= {
681 .is_visible
= npcm7xx_is_visible
,
682 .read
= npcm7xx_read
,
683 .write
= npcm7xx_write
,
686 static const struct hwmon_chip_info npcm7xx_chip_info
= {
687 .ops
= &npcm7xx_hwmon_ops
,
688 .info
= npcm7xx_info
,
691 static u32
npcm7xx_pwm_init(struct npcm7xx_pwm_fan_data
*data
)
694 u32 prescale_val
, output_freq
;
696 data
->pwm_clk_freq
= clk_get_rate(data
->pwm_clk
);
698 /* Adjust NPCM7xx PWMs output frequency to ~25Khz */
699 output_freq
= data
->pwm_clk_freq
/ PWN_CNT_DEFAULT
;
700 prescale_val
= DIV_ROUND_CLOSEST(output_freq
, PWM_OUTPUT_FREQ_25KHZ
);
702 /* If prescale_val = 0, then the prescale output clock is stopped */
703 if (prescale_val
< MIN_PRESCALE1
)
704 prescale_val
= MIN_PRESCALE1
;
706 * prescale_val need to decrement in one because in the PWM Prescale
707 * register the Prescale value increment by one
711 /* Setting PWM Prescale Register value register to both modules */
712 prescale_val
|= (prescale_val
<< NPCM7XX_PWM_PRESCALE_SHIFT_CH01
);
714 for (m
= 0; m
< NPCM7XX_PWM_MAX_MODULES
; m
++) {
715 iowrite32(prescale_val
, NPCM7XX_PWM_REG_PR(data
->pwm_base
, m
));
716 iowrite32(NPCM7XX_PWM_PRESCALE2_DEFAULT
,
717 NPCM7XX_PWM_REG_CSR(data
->pwm_base
, m
));
718 iowrite32(NPCM7XX_PWM_CTRL_MODE_DEFAULT
,
719 NPCM7XX_PWM_REG_CR(data
->pwm_base
, m
));
721 for (ch
= 0; ch
< NPCM7XX_PWM_MAX_CHN_NUM_IN_A_MODULE
; ch
++) {
722 iowrite32(NPCM7XX_PWM_COUNTER_DEFAULT_NUM
,
723 NPCM7XX_PWM_REG_CNRx(data
->pwm_base
, m
, ch
));
727 return output_freq
/ ((prescale_val
& 0xf) + 1);
730 static void npcm7xx_fan_init(struct npcm7xx_pwm_fan_data
*data
)
737 for (md
= 0; md
< NPCM7XX_FAN_MAX_MODULE
; md
++) {
738 /* stop FAN0~7 clock */
739 iowrite8(NPCM7XX_FAN_TCKC_CLKX_NONE
,
740 NPCM7XX_FAN_REG_TCKC(data
->fan_base
, md
));
742 /* disable all interrupt */
743 iowrite8(0x00, NPCM7XX_FAN_REG_TIEN(data
->fan_base
, md
));
745 /* clear all interrupt */
746 iowrite8(NPCM7XX_FAN_TICLR_CLEAR_ALL
,
747 NPCM7XX_FAN_REG_TICLR(data
->fan_base
, md
));
749 /* set FAN0~7 clock prescaler */
750 iowrite8(NPCM7XX_FAN_CLK_PRESCALE
,
751 NPCM7XX_FAN_REG_TPRSC(data
->fan_base
, md
));
753 /* set FAN0~7 mode (high-to-low transition) */
754 iowrite8((NPCM7XX_FAN_TMCTRL_MODE_5
| NPCM7XX_FAN_TMCTRL_TBEN
|
755 NPCM7XX_FAN_TMCTRL_TAEN
),
756 NPCM7XX_FAN_REG_TMCTRL(data
->fan_base
, md
));
758 /* set FAN0~7 Initial Count/Cap */
759 iowrite16(NPCM7XX_FAN_TCNT
,
760 NPCM7XX_FAN_REG_TCNT1(data
->fan_base
, md
));
761 iowrite16(NPCM7XX_FAN_TCNT
,
762 NPCM7XX_FAN_REG_TCNT2(data
->fan_base
, md
));
764 /* set FAN0~7 compare (equal to count) */
765 iowrite8((NPCM7XX_FAN_TCPCFG_EQAEN
| NPCM7XX_FAN_TCPCFG_EQBEN
),
766 NPCM7XX_FAN_REG_TCPCFG(data
->fan_base
, md
));
768 /* set FAN0~7 compare value */
769 iowrite16(NPCM7XX_FAN_TCPA
,
770 NPCM7XX_FAN_REG_TCPA(data
->fan_base
, md
));
771 iowrite16(NPCM7XX_FAN_TCPB
,
772 NPCM7XX_FAN_REG_TCPB(data
->fan_base
, md
));
774 /* set FAN0~7 fan input FANIN 0~15 */
775 iowrite8(NPCM7XX_FAN_TINASEL_FANIN_DEFAULT
,
776 NPCM7XX_FAN_REG_TINASEL(data
->fan_base
, md
));
777 iowrite8(NPCM7XX_FAN_TINASEL_FANIN_DEFAULT
,
778 NPCM7XX_FAN_REG_TINBSEL(data
->fan_base
, md
));
780 for (i
= 0; i
< NPCM7XX_FAN_MAX_CHN_NUM_IN_A_MODULE
; i
++) {
781 ch
= md
* NPCM7XX_FAN_MAX_CHN_NUM_IN_A_MODULE
+ i
;
782 data
->fan_dev
[ch
].fan_st_flg
= FAN_DISABLE
;
783 data
->fan_dev
[ch
].fan_pls_per_rev
=
784 NPCM7XX_FAN_DEFAULT_PULSE_PER_REVOLUTION
;
785 data
->fan_dev
[ch
].fan_cnt
= 0;
789 apb_clk_freq
= clk_get_rate(data
->fan_clk
);
791 /* Fan tach input clock = APB clock / prescalar, default is 255. */
792 data
->input_clk_freq
= apb_clk_freq
/ (NPCM7XX_FAN_CLK_PRESCALE
+ 1);
796 npcm7xx_pwm_cz_get_max_state(struct thermal_cooling_device
*tcdev
,
797 unsigned long *state
)
799 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
801 *state
= cdev
->max_state
;
807 npcm7xx_pwm_cz_get_cur_state(struct thermal_cooling_device
*tcdev
,
808 unsigned long *state
)
810 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
812 *state
= cdev
->cur_state
;
818 npcm7xx_pwm_cz_set_cur_state(struct thermal_cooling_device
*tcdev
,
821 struct npcm7xx_cooling_device
*cdev
= tcdev
->devdata
;
824 if (state
> cdev
->max_state
)
827 cdev
->cur_state
= state
;
828 ret
= npcm7xx_pwm_config_set(cdev
->data
, cdev
->pwm_port
,
829 cdev
->cooling_levels
[cdev
->cur_state
]);
834 static const struct thermal_cooling_device_ops npcm7xx_pwm_cool_ops
= {
835 .get_max_state
= npcm7xx_pwm_cz_get_max_state
,
836 .get_cur_state
= npcm7xx_pwm_cz_get_cur_state
,
837 .set_cur_state
= npcm7xx_pwm_cz_set_cur_state
,
840 static int npcm7xx_create_pwm_cooling(struct device
*dev
,
841 struct device_node
*child
,
842 struct npcm7xx_pwm_fan_data
*data
,
843 u32 pwm_port
, u8 num_levels
)
846 struct npcm7xx_cooling_device
*cdev
;
848 cdev
= devm_kzalloc(dev
, sizeof(*cdev
), GFP_KERNEL
);
852 cdev
->cooling_levels
= devm_kzalloc(dev
, num_levels
, GFP_KERNEL
);
853 if (!cdev
->cooling_levels
)
856 cdev
->max_state
= num_levels
- 1;
857 ret
= of_property_read_u8_array(child
, "cooling-levels",
858 cdev
->cooling_levels
,
861 dev_err(dev
, "Property 'cooling-levels' cannot be read.\n");
864 snprintf(cdev
->name
, THERMAL_NAME_LENGTH
, "%s%d", child
->name
,
867 cdev
->tcdev
= thermal_of_cooling_device_register(child
,
870 &npcm7xx_pwm_cool_ops
);
871 if (IS_ERR(cdev
->tcdev
))
872 return PTR_ERR(cdev
->tcdev
);
875 cdev
->pwm_port
= pwm_port
;
877 data
->cdev
[pwm_port
] = cdev
;
882 static int npcm7xx_en_pwm_fan(struct device
*dev
,
883 struct device_node
*child
,
884 struct npcm7xx_pwm_fan_data
*data
)
891 ret
= of_property_read_u32(child
, "reg", &pwm_port
);
895 data
->pwm_present
[pwm_port
] = true;
896 ret
= npcm7xx_pwm_config_set(data
, pwm_port
,
897 NPCM7XX_PWM_CMR_DEFAULT_NUM
);
899 ret
= of_property_count_u8_elems(child
, "cooling-levels");
901 ret
= npcm7xx_create_pwm_cooling(dev
, child
, data
, pwm_port
,
907 fan_cnt
= of_property_count_u8_elems(child
, "fan-tach-ch");
911 fan_ch
= devm_kcalloc(dev
, fan_cnt
, sizeof(*fan_ch
), GFP_KERNEL
);
915 ret
= of_property_read_u8_array(child
, "fan-tach-ch", fan_ch
, fan_cnt
);
919 for (ch
= 0; ch
< fan_cnt
; ch
++) {
921 data
->fan_present
[index
] = true;
922 data
->fan_dev
[index
].fan_st_flg
= FAN_INIT
;
928 static int npcm7xx_pwm_fan_probe(struct platform_device
*pdev
)
930 struct device
*dev
= &pdev
->dev
;
931 struct device_node
*np
, *child
;
932 struct npcm7xx_pwm_fan_data
*data
;
933 struct resource
*res
;
934 struct device
*hwmon
;
942 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
946 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "pwm");
948 dev_err(dev
, "pwm resource not found\n");
952 data
->pwm_base
= devm_ioremap_resource(dev
, res
);
953 dev_dbg(dev
, "pwm base resource is %pR\n", res
);
954 if (IS_ERR(data
->pwm_base
))
955 return PTR_ERR(data
->pwm_base
);
957 data
->pwm_clk
= devm_clk_get(dev
, "pwm");
958 if (IS_ERR(data
->pwm_clk
)) {
959 dev_err(dev
, "couldn't get pwm clock\n");
960 return PTR_ERR(data
->pwm_clk
);
963 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "fan");
965 dev_err(dev
, "fan resource not found\n");
969 data
->fan_base
= devm_ioremap_resource(dev
, res
);
970 dev_dbg(dev
, "fan base resource is %pR\n", res
);
971 if (IS_ERR(data
->fan_base
))
972 return PTR_ERR(data
->fan_base
);
974 data
->fan_clk
= devm_clk_get(dev
, "fan");
975 if (IS_ERR(data
->fan_clk
)) {
976 dev_err(dev
, "couldn't get fan clock\n");
977 return PTR_ERR(data
->fan_clk
);
980 output_freq
= npcm7xx_pwm_init(data
);
981 npcm7xx_fan_init(data
);
983 for (cnt
= 0; cnt
< NPCM7XX_PWM_MAX_MODULES
; cnt
++)
984 mutex_init(&data
->pwm_lock
[cnt
]);
986 for (i
= 0; i
< NPCM7XX_FAN_MAX_MODULE
; i
++) {
987 spin_lock_init(&data
->fan_lock
[i
]);
989 data
->fan_irq
[i
] = platform_get_irq(pdev
, i
);
990 if (data
->fan_irq
[i
] < 0) {
991 dev_err(dev
, "get IRQ fan%d failed\n", i
);
992 return data
->fan_irq
[i
];
995 sprintf(name
, "NPCM7XX-FAN-MD%d", i
);
996 ret
= devm_request_irq(dev
, data
->fan_irq
[i
], npcm7xx_fan_isr
,
997 0, name
, (void *)data
);
999 dev_err(dev
, "register IRQ fan%d failed\n", i
);
1004 for_each_child_of_node(np
, child
) {
1005 ret
= npcm7xx_en_pwm_fan(dev
, child
, data
);
1007 dev_err(dev
, "enable pwm and fan failed\n");
1013 hwmon
= devm_hwmon_device_register_with_info(dev
, "npcm7xx_pwm_fan",
1014 data
, &npcm7xx_chip_info
,
1016 if (IS_ERR(hwmon
)) {
1017 dev_err(dev
, "unable to register hwmon device\n");
1018 return PTR_ERR(hwmon
);
1021 for (i
= 0; i
< NPCM7XX_FAN_MAX_CHN_NUM
; i
++) {
1022 if (data
->fan_present
[i
]) {
1023 /* fan timer initialization */
1024 data
->fan_timer
.expires
= jiffies
+
1025 msecs_to_jiffies(NPCM7XX_FAN_POLL_TIMER_200MS
);
1026 timer_setup(&data
->fan_timer
,
1027 npcm7xx_fan_polling
, 0);
1028 add_timer(&data
->fan_timer
);
1033 pr_info("NPCM7XX PWM-FAN Driver probed, output Freq %dHz[PWM], input Freq %dHz[FAN]\n",
1034 output_freq
, data
->input_clk_freq
);
1039 static const struct of_device_id of_pwm_fan_match_table
[] = {
1040 { .compatible
= "nuvoton,npcm750-pwm-fan", },
1043 MODULE_DEVICE_TABLE(of
, of_pwm_fan_match_table
);
1045 static struct platform_driver npcm7xx_pwm_fan_driver
= {
1046 .probe
= npcm7xx_pwm_fan_probe
,
1048 .name
= "npcm7xx_pwm_fan",
1049 .of_match_table
= of_pwm_fan_match_table
,
1053 module_platform_driver(npcm7xx_pwm_fan_driver
);
1055 MODULE_DESCRIPTION("Nuvoton NPCM7XX PWM and Fan Tacho driver");
1056 MODULE_AUTHOR("Tomer Maimon <tomer.maimon@nuvoton.com>");
1057 MODULE_LICENSE("GPL v2");