Lines Matching +full:attr +full:- +full:cnt +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2014-2018 Nuvoton Technology corporation.
7 #include <linux/hwmon-sysfs.h>
147 * Get Fan Tach Timeout (base on clock 214843.75Hz, 1 cnt = 4.654us)
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)
186 char name[THERMAL_NAME_LENGTH]; member
225 mutex_lock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
228 iowrite32(val, NPCM7XX_PWM_REG_CMRx(data->pwm_base, module, pwm_ch)); in npcm7xx_pwm_config_set()
229 tmp_buf = ioread32(NPCM7XX_PWM_REG_CR(data->pwm_base, module)); in npcm7xx_pwm_config_set()
249 mutex_unlock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
250 return -ENODEV; in npcm7xx_pwm_config_set()
263 iowrite32(tmp_buf, NPCM7XX_PWM_REG_CR(data->pwm_base, module)); in npcm7xx_pwm_config_set()
264 mutex_unlock(&data->pwm_lock[module]); in npcm7xx_pwm_config_set()
280 if (data->fan_dev[fan_id].fan_st_flg != FAN_DISABLE) { in npcm7xx_fan_start_capture()
282 spin_lock_irqsave(&data->fan_lock[fan], flags); in npcm7xx_fan_start_capture()
284 data->fan_dev[fan_id].fan_st_flg = FAN_INIT; in npcm7xx_fan_start_capture()
285 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
297 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
300 | ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
304 iowrite8(reg_mode, NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
310 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_start_capture()
314 | ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, in npcm7xx_fan_start_capture()
319 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_start_capture()
322 spin_unlock_irqrestore(&data->fan_lock[fan], flags); in npcm7xx_fan_start_capture()
341 for (i = data->fan_select; i < NPCM7XX_FAN_MAX_MODULE; in npcm7xx_fan_polling()
345 NPCM7XX_FAN_REG_TICLR(data->fan_base, i)); in npcm7xx_fan_polling()
347 if (data->fan_present[i * 2]) { in npcm7xx_fan_polling()
349 NPCM7XX_FAN_REG_TCNT1(data->fan_base, i)); in npcm7xx_fan_polling()
352 if (data->fan_present[(i * 2) + 1]) { in npcm7xx_fan_polling()
354 NPCM7XX_FAN_REG_TCNT2(data->fan_base, i)); in npcm7xx_fan_polling()
359 data->fan_select++; in npcm7xx_fan_polling()
360 data->fan_select &= 0x3; in npcm7xx_fan_polling()
363 data->fan_timer.expires = jiffies + in npcm7xx_fan_polling()
365 add_timer(&data->fan_timer); in npcm7xx_fan_polling()
377 fan_cap = ioread16(NPCM7XX_FAN_REG_TCRA(data->fan_base, fan)); in npcm7xx_fan_compute()
379 fan_cap = ioread16(NPCM7XX_FAN_REG_TCRB(data->fan_base, fan)); in npcm7xx_fan_compute()
382 iowrite8(flag_clear, NPCM7XX_FAN_REG_TICLR(data->fan_base, fan)); in npcm7xx_fan_compute()
384 if (data->fan_dev[fan_id].fan_st_flg == FAN_INIT) { in npcm7xx_fan_compute()
386 data->fan_dev[fan_id].fan_st_flg = in npcm7xx_fan_compute()
390 data->fan_dev[fan_id].fan_cnt_tmp = 0; in npcm7xx_fan_compute()
391 } else if (data->fan_dev[fan_id].fan_st_flg < FAN_ENOUGH_SAMPLE) { in npcm7xx_fan_compute()
396 data->fan_dev[fan_id].fan_cnt_tmp += in npcm7xx_fan_compute()
397 (NPCM7XX_FAN_TCNT - fan_cap); in npcm7xx_fan_compute()
399 data->fan_dev[fan_id].fan_st_flg++; in npcm7xx_fan_compute()
402 if (data->fan_dev[fan_id].fan_st_flg == FAN_ENOUGH_SAMPLE) { in npcm7xx_fan_compute()
403 data->fan_dev[fan_id].fan_cnt_tmp += in npcm7xx_fan_compute()
404 (NPCM7XX_FAN_TCNT - fan_cap); in npcm7xx_fan_compute()
406 /* compute finial average cnt per pulse */ in npcm7xx_fan_compute()
407 data->fan_dev[fan_id].fan_cnt = in npcm7xx_fan_compute()
408 data->fan_dev[fan_id].fan_cnt_tmp / in npcm7xx_fan_compute()
411 data->fan_dev[fan_id].fan_st_flg = FAN_INIT; in npcm7xx_fan_compute()
414 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_compute()
418 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_fan_compute()
419 reg_mode = ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_compute()
423 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_fan_compute()
456 reg_int = ioread8(NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_check_cmp()
460 NPCM7XX_FAN_REG_TIEN(data->fan_base, fan)); in npcm7xx_check_cmp()
464 NPCM7XX_FAN_REG_TICLR(data->fan_base, fan)); in npcm7xx_check_cmp()
466 reg_mode = ioread8(NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_check_cmp()
470 NPCM7XX_FAN_REG_TCKC(data->fan_base, fan)); in npcm7xx_check_cmp()
477 data->fan_dev[fan_id].fan_cnt = 0; in npcm7xx_check_cmp()
493 module = irq - data->fan_irq[0]; in npcm7xx_fan_isr()
494 spin_lock_irqsave(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
496 flag = ioread8(NPCM7XX_FAN_REG_TICTRL(data->fan_base, module)); in npcm7xx_fan_isr()
500 spin_unlock_irqrestore(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
504 spin_unlock_irqrestore(&data->fan_lock[module], flags); in npcm7xx_fan_isr()
509 static int npcm7xx_read_pwm(struct device *dev, u32 attr, int channel, in npcm7xx_read_pwm() argument
516 switch (attr) { in npcm7xx_read_pwm()
519 (NPCM7XX_PWM_REG_CMRx(data->pwm_base, module, pmw_ch)); in npcm7xx_read_pwm()
522 return -EOPNOTSUPP; in npcm7xx_read_pwm()
526 static int npcm7xx_write_pwm(struct device *dev, u32 attr, int channel, in npcm7xx_write_pwm() argument
532 switch (attr) { in npcm7xx_write_pwm()
535 return -EINVAL; in npcm7xx_write_pwm()
539 err = -EOPNOTSUPP; in npcm7xx_write_pwm()
546 static umode_t npcm7xx_pwm_is_visible(const void *_data, u32 attr, int channel) in npcm7xx_pwm_is_visible() argument
550 if (!data->pwm_present[channel] || channel >= data->info->pwm_max_channel) in npcm7xx_pwm_is_visible()
553 switch (attr) { in npcm7xx_pwm_is_visible()
561 static int npcm7xx_read_fan(struct device *dev, u32 attr, int channel, in npcm7xx_read_fan() argument
566 switch (attr) { in npcm7xx_read_fan()
569 if (data->fan_dev[channel].fan_cnt <= 0) in npcm7xx_read_fan()
570 return data->fan_dev[channel].fan_cnt; in npcm7xx_read_fan()
573 if (data->fan_dev[channel].fan_cnt > 0 && in npcm7xx_read_fan()
574 data->fan_dev[channel].fan_pls_per_rev > 0) in npcm7xx_read_fan()
575 *val = ((data->input_clk_freq * 60) / in npcm7xx_read_fan()
576 (data->fan_dev[channel].fan_cnt * in npcm7xx_read_fan()
577 data->fan_dev[channel].fan_pls_per_rev)); in npcm7xx_read_fan()
580 return -EOPNOTSUPP; in npcm7xx_read_fan()
584 static umode_t npcm7xx_fan_is_visible(const void *_data, u32 attr, int channel) in npcm7xx_fan_is_visible() argument
588 if (!data->fan_present[channel]) in npcm7xx_fan_is_visible()
591 switch (attr) { in npcm7xx_fan_is_visible()
600 u32 attr, int channel, long *val) in npcm7xx_read() argument
604 return npcm7xx_read_pwm(dev, attr, channel, val); in npcm7xx_read()
606 return npcm7xx_read_fan(dev, attr, channel, val); in npcm7xx_read()
608 return -EOPNOTSUPP; in npcm7xx_read()
613 u32 attr, int channel, long val) in npcm7xx_write() argument
617 return npcm7xx_write_pwm(dev, attr, channel, val); in npcm7xx_write()
619 return -EOPNOTSUPP; in npcm7xx_write()
625 u32 attr, int channel) in npcm7xx_is_visible() argument
629 return npcm7xx_pwm_is_visible(data, attr, channel); in npcm7xx_is_visible()
631 return npcm7xx_fan_is_visible(data, attr, channel); in npcm7xx_is_visible()
695 data->pwm_clk_freq = clk_get_rate(data->pwm_clk); in npcm7xx_pwm_init()
698 output_freq = data->pwm_clk_freq / PWN_CNT_DEFAULT; in npcm7xx_pwm_init()
708 prescale_val--; in npcm7xx_pwm_init()
714 iowrite32(prescale_val, NPCM7XX_PWM_REG_PR(data->pwm_base, m)); in npcm7xx_pwm_init()
716 NPCM7XX_PWM_REG_CSR(data->pwm_base, m)); in npcm7xx_pwm_init()
718 NPCM7XX_PWM_REG_CR(data->pwm_base, m)); in npcm7xx_pwm_init()
722 NPCM7XX_PWM_REG_CNRx(data->pwm_base, m, ch)); in npcm7xx_pwm_init()
739 NPCM7XX_FAN_REG_TCKC(data->fan_base, md)); in npcm7xx_fan_init()
742 iowrite8(0x00, NPCM7XX_FAN_REG_TIEN(data->fan_base, md)); in npcm7xx_fan_init()
746 NPCM7XX_FAN_REG_TICLR(data->fan_base, md)); in npcm7xx_fan_init()
750 NPCM7XX_FAN_REG_TPRSC(data->fan_base, md)); in npcm7xx_fan_init()
752 /* set FAN0~7 mode (high-to-low transition) */ in npcm7xx_fan_init()
755 NPCM7XX_FAN_REG_TMCTRL(data->fan_base, md)); in npcm7xx_fan_init()
759 NPCM7XX_FAN_REG_TCNT1(data->fan_base, md)); in npcm7xx_fan_init()
761 NPCM7XX_FAN_REG_TCNT2(data->fan_base, md)); in npcm7xx_fan_init()
765 NPCM7XX_FAN_REG_TCPCFG(data->fan_base, md)); in npcm7xx_fan_init()
769 NPCM7XX_FAN_REG_TCPA(data->fan_base, md)); in npcm7xx_fan_init()
771 NPCM7XX_FAN_REG_TCPB(data->fan_base, md)); in npcm7xx_fan_init()
775 NPCM7XX_FAN_REG_TINASEL(data->fan_base, md)); in npcm7xx_fan_init()
777 NPCM7XX_FAN_REG_TINBSEL(data->fan_base, md)); in npcm7xx_fan_init()
781 data->fan_dev[ch].fan_st_flg = FAN_DISABLE; in npcm7xx_fan_init()
782 data->fan_dev[ch].fan_pls_per_rev = in npcm7xx_fan_init()
784 data->fan_dev[ch].fan_cnt = 0; in npcm7xx_fan_init()
788 apb_clk_freq = clk_get_rate(data->fan_clk); in npcm7xx_fan_init()
791 data->input_clk_freq = apb_clk_freq / (NPCM7XX_FAN_CLK_PRESCALE + 1); in npcm7xx_fan_init()
798 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_get_max_state()
800 *state = cdev->max_state; in npcm7xx_pwm_cz_get_max_state()
809 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_get_cur_state()
811 *state = cdev->cur_state; in npcm7xx_pwm_cz_get_cur_state()
820 struct npcm7xx_cooling_device *cdev = tcdev->devdata; in npcm7xx_pwm_cz_set_cur_state()
823 if (state > cdev->max_state) in npcm7xx_pwm_cz_set_cur_state()
824 return -EINVAL; in npcm7xx_pwm_cz_set_cur_state()
826 cdev->cur_state = state; in npcm7xx_pwm_cz_set_cur_state()
827 ret = npcm7xx_pwm_config_set(cdev->data, cdev->pwm_port, in npcm7xx_pwm_cz_set_cur_state()
828 cdev->cooling_levels[cdev->cur_state]); in npcm7xx_pwm_cz_set_cur_state()
849 return -ENOMEM; in npcm7xx_create_pwm_cooling()
851 cdev->cooling_levels = devm_kzalloc(dev, num_levels, GFP_KERNEL); in npcm7xx_create_pwm_cooling()
852 if (!cdev->cooling_levels) in npcm7xx_create_pwm_cooling()
853 return -ENOMEM; in npcm7xx_create_pwm_cooling()
855 cdev->max_state = num_levels - 1; in npcm7xx_create_pwm_cooling()
856 ret = of_property_read_u8_array(child, "cooling-levels", in npcm7xx_create_pwm_cooling()
857 cdev->cooling_levels, in npcm7xx_create_pwm_cooling()
860 dev_err(dev, "Property 'cooling-levels' cannot be read.\n"); in npcm7xx_create_pwm_cooling()
863 snprintf(cdev->name, THERMAL_NAME_LENGTH, "%pOFn%d", child, in npcm7xx_create_pwm_cooling()
866 cdev->tcdev = devm_thermal_of_cooling_device_register(dev, child, in npcm7xx_create_pwm_cooling()
867 cdev->name, cdev, &npcm7xx_pwm_cool_ops); in npcm7xx_create_pwm_cooling()
868 if (IS_ERR(cdev->tcdev)) in npcm7xx_create_pwm_cooling()
869 return PTR_ERR(cdev->tcdev); in npcm7xx_create_pwm_cooling()
871 cdev->data = data; in npcm7xx_create_pwm_cooling()
872 cdev->pwm_port = pwm_port; in npcm7xx_create_pwm_cooling()
874 data->cdev[pwm_port] = cdev; in npcm7xx_create_pwm_cooling()
892 data->pwm_present[pwm_port] = true; in npcm7xx_en_pwm_fan()
896 ret = of_property_count_u8_elems(child, "cooling-levels"); in npcm7xx_en_pwm_fan()
904 fan_cnt = of_property_count_u8_elems(child, "fan-tach-ch"); in npcm7xx_en_pwm_fan()
906 return -EINVAL; in npcm7xx_en_pwm_fan()
910 return -ENOMEM; in npcm7xx_en_pwm_fan()
912 ret = of_property_read_u8_array(child, "fan-tach-ch", fan_ch, fan_cnt); in npcm7xx_en_pwm_fan()
918 data->fan_present[index] = true; in npcm7xx_en_pwm_fan()
919 data->fan_dev[index].fan_st_flg = FAN_INIT; in npcm7xx_en_pwm_fan()
927 struct device *dev = &pdev->dev; in npcm7xx_pwm_fan_probe()
932 char name[20]; in npcm7xx_pwm_fan_probe() local
933 int ret, cnt; in npcm7xx_pwm_fan_probe() local
937 np = dev->of_node; in npcm7xx_pwm_fan_probe()
941 return -ENOMEM; in npcm7xx_pwm_fan_probe()
943 data->info = device_get_match_data(dev); in npcm7xx_pwm_fan_probe()
944 if (!data->info) in npcm7xx_pwm_fan_probe()
945 return -EINVAL; in npcm7xx_pwm_fan_probe()
950 return -ENODEV; in npcm7xx_pwm_fan_probe()
953 data->pwm_base = devm_ioremap_resource(dev, res); in npcm7xx_pwm_fan_probe()
955 if (IS_ERR(data->pwm_base)) in npcm7xx_pwm_fan_probe()
956 return PTR_ERR(data->pwm_base); in npcm7xx_pwm_fan_probe()
958 data->pwm_clk = devm_clk_get(dev, "pwm"); in npcm7xx_pwm_fan_probe()
959 if (IS_ERR(data->pwm_clk)) { in npcm7xx_pwm_fan_probe()
961 return PTR_ERR(data->pwm_clk); in npcm7xx_pwm_fan_probe()
967 return -ENODEV; in npcm7xx_pwm_fan_probe()
970 data->fan_base = devm_ioremap_resource(dev, res); in npcm7xx_pwm_fan_probe()
972 if (IS_ERR(data->fan_base)) in npcm7xx_pwm_fan_probe()
973 return PTR_ERR(data->fan_base); in npcm7xx_pwm_fan_probe()
975 data->fan_clk = devm_clk_get(dev, "fan"); in npcm7xx_pwm_fan_probe()
976 if (IS_ERR(data->fan_clk)) { in npcm7xx_pwm_fan_probe()
978 return PTR_ERR(data->fan_clk); in npcm7xx_pwm_fan_probe()
984 for (cnt = 0; cnt < NPCM7XX_PWM_MAX_MODULES ; cnt++) in npcm7xx_pwm_fan_probe()
985 mutex_init(&data->pwm_lock[cnt]); in npcm7xx_pwm_fan_probe()
988 spin_lock_init(&data->fan_lock[i]); in npcm7xx_pwm_fan_probe()
990 data->fan_irq[i] = platform_get_irq(pdev, i); in npcm7xx_pwm_fan_probe()
991 if (data->fan_irq[i] < 0) in npcm7xx_pwm_fan_probe()
992 return data->fan_irq[i]; in npcm7xx_pwm_fan_probe()
994 sprintf(name, "NPCM7XX-FAN-MD%d", i); in npcm7xx_pwm_fan_probe()
995 ret = devm_request_irq(dev, data->fan_irq[i], npcm7xx_fan_isr, in npcm7xx_pwm_fan_probe()
996 0, name, (void *)data); in npcm7xx_pwm_fan_probe()
1021 if (data->fan_present[i]) { in npcm7xx_pwm_fan_probe()
1023 data->fan_timer.expires = jiffies + in npcm7xx_pwm_fan_probe()
1025 timer_setup(&data->fan_timer, in npcm7xx_pwm_fan_probe()
1027 add_timer(&data->fan_timer); in npcm7xx_pwm_fan_probe()
1032 pr_info("NPCM7XX PWM-FAN Driver probed, output Freq %dHz[PWM], input Freq %dHz[FAN]\n", in npcm7xx_pwm_fan_probe()
1033 output_freq, data->input_clk_freq); in npcm7xx_pwm_fan_probe()
1039 { .compatible = "nuvoton,npcm750-pwm-fan", .data = &npxm7xx_hwmon_info},
1040 { .compatible = "nuvoton,npcm845-pwm-fan", .data = &npxm8xx_hwmon_info},
1048 .name = "npcm7xx_pwm_fan",