Lines Matching +full:npcm750 +full:- +full:reset
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2014-2018 Nuvoton Technology corporation.
7 #include <linux/hwmon-sysfs.h>
150 * 320RPM/pulse 2, ...-- 10.6Hz)
154 #define NPCM7XX_FAN_TCPA (NPCM7XX_FAN_TCNT - NPCM7XX_FAN_TIMEOUT)
155 #define NPCM7XX_FAN_TCPB (NPCM7XX_FAN_TCNT - NPCM7XX_FAN_TIMEOUT)
220 mutex_lock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
223 iowrite32(val, NPCM7XX_PWM_REG_CMRx(data->pwm_base, module, pwm_ch)); in npcm7xx_pwm_config_set()
224 tmp_buf = ioread32(NPCM7XX_PWM_REG_CR(data->pwm_base, module)); in npcm7xx_pwm_config_set()
244 mutex_unlock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
245 return -ENODEV; in npcm7xx_pwm_config_set()
258 iowrite32(tmp_buf, NPCM7XX_PWM_REG_CR(data->pwm_base, module)); in npcm7xx_pwm_config_set()
259 mutex_unlock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
275 if (data->fan_dev[fan_id].fan_st_flg != FAN_DISABLE) { in npcm7xx_fan_start_capture()
276 /* reset status */ in npcm7xx_fan_start_capture()
277 spin_lock_irqsave(&data->fan_lock[fan], flags); in npcm7xx_fan_start_capture()
279 data->fan_dev[fan_id].fan_st_flg = FAN_INIT; in npcm7xx_fan_start_capture()
280 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
284 * it sets, the interrupt enable bits are cleared only on reset. in npcm7xx_fan_start_capture()
292 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
295 | ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
299 iowrite8(reg_mode, NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
305 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
309 | ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
314 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_start_capture()
317 spin_unlock_irqrestore(&data->fan_lock[fan], flags); in npcm7xx_fan_start_capture()
336 for (i = data->fan_select; i < NPCM7XX_FAN_MAX_MODULE; in npcm7xx_fan_polling()
338 /* clear the flag and reset the counter (TCNT) */ in npcm7xx_fan_polling()
340 NPCM7XX_FAN_REG_TICLR(data->fan_base, i)); in npcm7xx_fan_polling()
342 if (data->fan_present[i * 2]) { in npcm7xx_fan_polling()
344 NPCM7XX_FAN_REG_TCNT1(data->fan_base, i)); in npcm7xx_fan_polling()
347 if (data->fan_present[(i * 2) + 1]) { in npcm7xx_fan_polling()
349 NPCM7XX_FAN_REG_TCNT2(data->fan_base, i)); in npcm7xx_fan_polling()
354 data->fan_select++; in npcm7xx_fan_polling()
355 data->fan_select &= 0x3; in npcm7xx_fan_polling()
357 /* reset the timer interval */ in npcm7xx_fan_polling()
358 data->fan_timer.expires = jiffies + in npcm7xx_fan_polling()
360 add_timer(&data->fan_timer); in npcm7xx_fan_polling()
372 fan_cap = ioread16(NPCM7XX_FAN_REG_TCRA(data->fan_base, fan)); in npcm7xx_fan_compute()
374 fan_cap = ioread16(NPCM7XX_FAN_REG_TCRB(data->fan_base, fan)); in npcm7xx_fan_compute()
376 /* clear capature flag, H/W will auto reset the NPCM7XX_FAN_TCNTx */ in npcm7xx_fan_compute()
377 iowrite8(flag_clear, NPCM7XX_FAN_REG_TICLR(data->fan_base, fan)); in npcm7xx_fan_compute()
379 if (data->fan_dev[fan_id].fan_st_flg == FAN_INIT) { in npcm7xx_fan_compute()
381 data->fan_dev[fan_id].fan_st_flg = in npcm7xx_fan_compute()
384 /* reset counter */ in npcm7xx_fan_compute()
385 data->fan_dev[fan_id].fan_cnt_tmp = 0; in npcm7xx_fan_compute()
386 } else if (data->fan_dev[fan_id].fan_st_flg < FAN_ENOUGH_SAMPLE) { in npcm7xx_fan_compute()
391 data->fan_dev[fan_id].fan_cnt_tmp += in npcm7xx_fan_compute()
392 (NPCM7XX_FAN_TCNT - fan_cap); in npcm7xx_fan_compute()
394 data->fan_dev[fan_id].fan_st_flg++; in npcm7xx_fan_compute()
397 if (data->fan_dev[fan_id].fan_st_flg == FAN_ENOUGH_SAMPLE) { in npcm7xx_fan_compute()
398 data->fan_dev[fan_id].fan_cnt_tmp += in npcm7xx_fan_compute()
399 (NPCM7XX_FAN_TCNT - fan_cap); in npcm7xx_fan_compute()
402 data->fan_dev[fan_id].fan_cnt = in npcm7xx_fan_compute()
403 data->fan_dev[fan_id].fan_cnt_tmp / in npcm7xx_fan_compute()
406 data->fan_dev[fan_id].fan_st_flg = FAN_INIT; in npcm7xx_fan_compute()
409 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_compute()
413 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_compute()
414 reg_mode = ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_compute()
418 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_compute()
451 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_check_cmp()
455 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_check_cmp()
459 NPCM7XX_FAN_REG_TICLR(data->fan_base, fan)); in npcm7xx_check_cmp()
461 reg_mode = ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_check_cmp()
465 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_check_cmp()
472 data->fan_dev[fan_id].fan_cnt = 0; in npcm7xx_check_cmp()
488 module = irq - data->fan_irq[0]; in npcm7xx_fan_isr()
489 spin_lock_irqsave(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
491 flag = ioread8(NPCM7XX_FAN_REG_TICTRL(data->fan_base, module)); in npcm7xx_fan_isr()
495 spin_unlock_irqrestore(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
499 spin_unlock_irqrestore(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
514 (NPCM7XX_PWM_REG_CMRx(data->pwm_base, module, pmw_ch)); in npcm7xx_read_pwm()
517 return -EOPNOTSUPP; in npcm7xx_read_pwm()
530 return -EINVAL; in npcm7xx_write_pwm()
534 err = -EOPNOTSUPP; in npcm7xx_write_pwm()
545 if (!data->pwm_present[channel]) in npcm7xx_pwm_is_visible()
564 if (data->fan_dev[channel].fan_cnt <= 0) in npcm7xx_read_fan()
565 return data->fan_dev[channel].fan_cnt; in npcm7xx_read_fan()
568 if (data->fan_dev[channel].fan_cnt > 0 && in npcm7xx_read_fan()
569 data->fan_dev[channel].fan_pls_per_rev > 0) in npcm7xx_read_fan()
570 *val = ((data->input_clk_freq * 60) / in npcm7xx_read_fan()
571 (data->fan_dev[channel].fan_cnt * in npcm7xx_read_fan()
572 data->fan_dev[channel].fan_pls_per_rev)); in npcm7xx_read_fan()
575 return -EOPNOTSUPP; in npcm7xx_read_fan()
583 if (!data->fan_present[channel]) in npcm7xx_fan_is_visible()
603 return -EOPNOTSUPP; in npcm7xx_read()
614 return -EOPNOTSUPP; in npcm7xx_write()
678 data->pwm_clk_freq = clk_get_rate(data->pwm_clk); in npcm7xx_pwm_init()
681 output_freq = data->pwm_clk_freq / PWN_CNT_DEFAULT; in npcm7xx_pwm_init()
691 prescale_val--; in npcm7xx_pwm_init()
697 iowrite32(prescale_val, NPCM7XX_PWM_REG_PR(data->pwm_base, m)); in npcm7xx_pwm_init()
699 NPCM7XX_PWM_REG_CSR(data->pwm_base, m)); in npcm7xx_pwm_init()
701 NPCM7XX_PWM_REG_CR(data->pwm_base, m)); in npcm7xx_pwm_init()
705 NPCM7XX_PWM_REG_CNRx(data->pwm_base, m, ch)); in npcm7xx_pwm_init()
722 NPCM7XX_FAN_REG_TCKC(data->fan_base, md)); in npcm7xx_fan_init()
725 iowrite8(0x00, NPCM7XX_FAN_REG_TIEN(data->fan_base, md)); in npcm7xx_fan_init()
729 NPCM7XX_FAN_REG_TICLR(data->fan_base, md)); in npcm7xx_fan_init()
733 NPCM7XX_FAN_REG_TPRSC(data->fan_base, md)); in npcm7xx_fan_init()
735 /* set FAN0~7 mode (high-to-low transition) */ in npcm7xx_fan_init()
738 NPCM7XX_FAN_REG_TMCTRL(data->fan_base, md)); in npcm7xx_fan_init()
742 NPCM7XX_FAN_REG_TCNT1(data->fan_base, md)); in npcm7xx_fan_init()
744 NPCM7XX_FAN_REG_TCNT2(data->fan_base, md)); in npcm7xx_fan_init()
748 NPCM7XX_FAN_REG_TCPCFG(data->fan_base, md)); in npcm7xx_fan_init()
752 NPCM7XX_FAN_REG_TCPA(data->fan_base, md)); in npcm7xx_fan_init()
754 NPCM7XX_FAN_REG_TCPB(data->fan_base, md)); in npcm7xx_fan_init()
758 NPCM7XX_FAN_REG_TINASEL(data->fan_base, md)); in npcm7xx_fan_init()
760 NPCM7XX_FAN_REG_TINBSEL(data->fan_base, md)); in npcm7xx_fan_init()
764 data->fan_dev[ch].fan_st_flg = FAN_DISABLE; in npcm7xx_fan_init()
765 data->fan_dev[ch].fan_pls_per_rev = in npcm7xx_fan_init()
767 data->fan_dev[ch].fan_cnt = 0; in npcm7xx_fan_init()
771 apb_clk_freq = clk_get_rate(data->fan_clk); in npcm7xx_fan_init()
774 data->input_clk_freq = apb_clk_freq / (NPCM7XX_FAN_CLK_PRESCALE + 1); in npcm7xx_fan_init()
781 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_get_max_state()
783 *state = cdev->max_state; in npcm7xx_pwm_cz_get_max_state()
792 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_get_cur_state()
794 *state = cdev->cur_state; in npcm7xx_pwm_cz_get_cur_state()
803 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_set_cur_state()
806 if (state > cdev->max_state) in npcm7xx_pwm_cz_set_cur_state()
807 return -EINVAL; in npcm7xx_pwm_cz_set_cur_state()
809 cdev->cur_state = state; in npcm7xx_pwm_cz_set_cur_state()
810 ret = npcm7xx_pwm_config_set(cdev->data, cdev->pwm_port, in npcm7xx_pwm_cz_set_cur_state()
811 cdev->cooling_levels[cdev->cur_state]); in npcm7xx_pwm_cz_set_cur_state()
832 return -ENOMEM; in npcm7xx_create_pwm_cooling()
834 cdev->cooling_levels = devm_kzalloc(dev, num_levels, GFP_KERNEL); in npcm7xx_create_pwm_cooling()
835 if (!cdev->cooling_levels) in npcm7xx_create_pwm_cooling()
836 return -ENOMEM; in npcm7xx_create_pwm_cooling()
838 cdev->max_state = num_levels - 1; in npcm7xx_create_pwm_cooling()
839 ret = of_property_read_u8_array(child, "cooling-levels", in npcm7xx_create_pwm_cooling()
840 cdev->cooling_levels, in npcm7xx_create_pwm_cooling()
843 dev_err(dev, "Property 'cooling-levels' cannot be read.\n"); in npcm7xx_create_pwm_cooling()
846 snprintf(cdev->name, THERMAL_NAME_LENGTH, "%pOFn%d", child, in npcm7xx_create_pwm_cooling()
849 cdev->tcdev = devm_thermal_of_cooling_device_register(dev, child, in npcm7xx_create_pwm_cooling()
850 cdev->name, cdev, &npcm7xx_pwm_cool_ops); in npcm7xx_create_pwm_cooling()
851 if (IS_ERR(cdev->tcdev)) in npcm7xx_create_pwm_cooling()
852 return PTR_ERR(cdev->tcdev); in npcm7xx_create_pwm_cooling()
854 cdev->data = data; in npcm7xx_create_pwm_cooling()
855 cdev->pwm_port = pwm_port; in npcm7xx_create_pwm_cooling()
857 data->cdev[pwm_port] = cdev; in npcm7xx_create_pwm_cooling()
875 data->pwm_present[pwm_port] = true; in npcm7xx_en_pwm_fan()
879 ret = of_property_count_u8_elems(child, "cooling-levels"); in npcm7xx_en_pwm_fan()
887 fan_cnt = of_property_count_u8_elems(child, "fan-tach-ch"); in npcm7xx_en_pwm_fan()
889 return -EINVAL; in npcm7xx_en_pwm_fan()
893 return -ENOMEM; in npcm7xx_en_pwm_fan()
895 ret = of_property_read_u8_array(child, "fan-tach-ch", fan_ch, fan_cnt); in npcm7xx_en_pwm_fan()
901 data->fan_present[index] = true; in npcm7xx_en_pwm_fan()
902 data->fan_dev[index].fan_st_flg = FAN_INIT; in npcm7xx_en_pwm_fan()
910 struct device *dev = &pdev->dev; in npcm7xx_pwm_fan_probe()
920 np = dev->of_node; in npcm7xx_pwm_fan_probe()
924 return -ENOMEM; in npcm7xx_pwm_fan_probe()
929 return -ENODEV; in npcm7xx_pwm_fan_probe()
932 data->pwm_base = devm_ioremap_resource(dev, res); in npcm7xx_pwm_fan_probe()
934 if (IS_ERR(data->pwm_base)) in npcm7xx_pwm_fan_probe()
935 return PTR_ERR(data->pwm_base); in npcm7xx_pwm_fan_probe()
937 data->pwm_clk = devm_clk_get(dev, "pwm"); in npcm7xx_pwm_fan_probe()
938 if (IS_ERR(data->pwm_clk)) { in npcm7xx_pwm_fan_probe()
940 return PTR_ERR(data->pwm_clk); in npcm7xx_pwm_fan_probe()
946 return -ENODEV; in npcm7xx_pwm_fan_probe()
949 data->fan_base = devm_ioremap_resource(dev, res); in npcm7xx_pwm_fan_probe()
951 if (IS_ERR(data->fan_base)) in npcm7xx_pwm_fan_probe()
952 return PTR_ERR(data->fan_base); in npcm7xx_pwm_fan_probe()
954 data->fan_clk = devm_clk_get(dev, "fan"); in npcm7xx_pwm_fan_probe()
955 if (IS_ERR(data->fan_clk)) { in npcm7xx_pwm_fan_probe()
957 return PTR_ERR(data->fan_clk); in npcm7xx_pwm_fan_probe()
964 mutex_init(&data->pwm_lock[cnt]); in npcm7xx_pwm_fan_probe()
967 spin_lock_init(&data->fan_lock[i]); in npcm7xx_pwm_fan_probe()
969 data->fan_irq[i] = platform_get_irq(pdev, i); in npcm7xx_pwm_fan_probe()
970 if (data->fan_irq[i] < 0) in npcm7xx_pwm_fan_probe()
971 return data->fan_irq[i]; in npcm7xx_pwm_fan_probe()
973 sprintf(name, "NPCM7XX-FAN-MD%d", i); in npcm7xx_pwm_fan_probe()
974 ret = devm_request_irq(dev, data->fan_irq[i], npcm7xx_fan_isr, in npcm7xx_pwm_fan_probe()
1000 if (data->fan_present[i]) { in npcm7xx_pwm_fan_probe()
1002 data->fan_timer.expires = jiffies + in npcm7xx_pwm_fan_probe()
1004 timer_setup(&data->fan_timer, in npcm7xx_pwm_fan_probe()
1006 add_timer(&data->fan_timer); in npcm7xx_pwm_fan_probe()
1011 pr_info("NPCM7XX PWM-FAN Driver probed, output Freq %dHz[PWM], input Freq %dHz[FAN]\n", in npcm7xx_pwm_fan_probe()
1012 output_freq, data->input_clk_freq); in npcm7xx_pwm_fan_probe()
1018 { .compatible = "nuvoton,npcm750-pwm-fan", },