Lines Matching +full:pulses +full:- +full:per +full:- +full:revolution
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * max6639.c - Support for Maxim MAX6639
5 * 2-Channel Temperature Monitor with Dual PWM Fan-Speed Controller
19 #include <linux/hwmon-sysfs.h>
81 u8 ppr[MAX6639_NUM_CHANNELS]; /* Pulses per rotation 0..3 for 1..4 ppr */
95 res = regmap_multi_reg_read(data->regmap, regs, regvals, 2); in max6639_temp_read_input()
110 res = regmap_read(data->regmap, MAX6639_REG_TEMP_EXT(channel), &val); in max6639_temp_read_fault()
125 res = regmap_read(data->regmap, MAX6639_REG_THERM_LIMIT(channel), &val); in max6639_temp_read_max()
140 res = regmap_read(data->regmap, MAX6639_REG_ALERT_LIMIT(channel), &val); in max6639_temp_read_crit()
155 res = regmap_read(data->regmap, MAX6639_REG_OT_LIMIT(channel), &val); in max6639_temp_read_emergency()
170 res = regmap_read(data->regmap, MAX6639_REG_STATUS, &val); in max6639_get_status()
183 res = regmap_write(data->regmap, MAX6639_REG_THERM_LIMIT(channel), in max6639_temp_set_max()
192 res = regmap_write(data->regmap, MAX6639_REG_ALERT_LIMIT(channel), TEMP_LIMIT_TO_REG(val)); in max6639_temp_set_crit()
201 res = regmap_write(data->regmap, MAX6639_REG_OT_LIMIT(channel), TEMP_LIMIT_TO_REG(val)); in max6639_temp_set_emergency()
215 res = regmap_read(data->regmap, MAX6639_REG_FAN_CNT(channel), &val); in max6639_read_fan()
218 *fan_val = FAN_FROM_REG(val, data->rpm_range[channel]); in max6639_read_fan()
224 *fan_val = !!(val & BIT(1 - channel)); in max6639_read_fan()
227 *fan_val = data->ppr[channel]; in max6639_read_fan()
230 return -EOPNOTSUPP; in max6639_read_fan()
237 return regmap_write(data->regmap, MAX6639_REG_FAN_PPR(channel), ppr-- << 6); in max6639_set_ppr()
249 return -EINVAL; in max6639_write_fan()
251 mutex_lock(&data->update_lock); in max6639_write_fan()
252 /* Set Fan pulse per revolution */ in max6639_write_fan()
255 mutex_unlock(&data->update_lock); in max6639_write_fan()
258 data->ppr[channel] = val; in max6639_write_fan()
260 mutex_unlock(&data->update_lock); in max6639_write_fan()
263 return -EOPNOTSUPP; in max6639_write_fan()
292 res = regmap_read(data->regmap, MAX6639_REG_TARGTDUTY(channel), &val); in max6639_read_pwm()
298 res = regmap_multi_reg_read(data->regmap, regs, regvals, 2); in max6639_read_pwm()
307 return -EOPNOTSUPP; in max6639_read_pwm()
321 return -EINVAL; in max6639_write_pwm()
322 err = regmap_write(data->regmap, MAX6639_REG_TARGTDUTY(channel), in max6639_write_pwm()
330 mutex_lock(&data->update_lock); in max6639_write_pwm()
331 err = regmap_update_bits(data->regmap, MAX6639_REG_FAN_CONFIG3(channel), in max6639_write_pwm()
334 mutex_unlock(&data->update_lock); in max6639_write_pwm()
339 err = regmap_set_bits(data->regmap, MAX6639_REG_GCONFIG, in max6639_write_pwm()
342 err = regmap_clear_bits(data->regmap, MAX6639_REG_GCONFIG, in max6639_write_pwm()
345 mutex_unlock(&data->update_lock); in max6639_write_pwm()
348 return -EOPNOTSUPP; in max6639_write_pwm()
389 *val = !!(status & BIT(3 - channel)); in max6639_read_temp()
395 *val = !!(status & BIT(7 - channel)); in max6639_read_temp()
401 *val = !!(status & BIT(5 - channel)); in max6639_read_temp()
404 return -EOPNOTSUPP; in max6639_read_temp()
421 return -EOPNOTSUPP; in max6639_write_temp()
454 return -EOPNOTSUPP; in max6639_read()
469 return -EOPNOTSUPP; in max6639_write()
538 struct device *dev = &client->dev; in max6639_probe_child_from_dt()
550 return -EINVAL; in max6639_probe_child_from_dt()
553 err = of_property_read_u32(child, "pulses-per-revolution", &val); in max6639_probe_child_from_dt()
556 dev_err(dev, "invalid pulses-per-revolution %d of %pOFn\n", val, child); in max6639_probe_child_from_dt()
557 return -EINVAL; in max6639_probe_child_from_dt()
559 data->ppr[i] = val; in max6639_probe_child_from_dt()
562 err = of_property_read_u32(child, "max-rpm", &val); in max6639_probe_child_from_dt()
564 data->rpm_range[i] = rpm_range_to_reg(val); in max6639_probe_child_from_dt()
572 struct device *dev = &client->dev; in max6639_init_client()
573 const struct device_node *np = dev->of_node; in max6639_init_client()
578 err = regmap_write(data->regmap, MAX6639_REG_GCONFIG, MAX6639_GCONFIG_POR); in max6639_init_client()
582 /* Fans pulse per revolution is 2 by default */ in max6639_init_client()
583 data->ppr[0] = 2; in max6639_init_client()
584 data->ppr[1] = 2; in max6639_init_client()
587 data->rpm_range[0] = 1; in max6639_init_client()
588 data->rpm_range[1] = 1; in max6639_init_client()
591 if (strcmp(child->name, "fan")) in max6639_init_client()
602 err = regmap_set_bits(data->regmap, MAX6639_REG_OUTPUT_MASK, BIT(1 - i)); in max6639_init_client()
606 /* Set Fan pulse per revolution */ in max6639_init_client()
607 err = max6639_set_ppr(data, i, data->ppr[i]); in max6639_init_client()
612 err = regmap_write(data->regmap, MAX6639_REG_FAN_CONFIG1(i), in max6639_init_client()
613 MAX6639_FAN_CONFIG1_PWM | data->rpm_range[i]); in max6639_init_client()
618 err = regmap_write(data->regmap, MAX6639_REG_FAN_CONFIG2a(i), 0x00); in max6639_init_client()
626 err = regmap_write(data->regmap, MAX6639_REG_FAN_CONFIG3(i), in max6639_init_client()
632 err = regmap_write(data->regmap, MAX6639_REG_THERM_LIMIT(i), 80); in max6639_init_client()
635 err = regmap_write(data->regmap, MAX6639_REG_ALERT_LIMIT(i), 90); in max6639_init_client()
638 err = regmap_write(data->regmap, MAX6639_REG_OT_LIMIT(i), 100); in max6639_init_client()
643 err = regmap_write(data->regmap, MAX6639_REG_TARGTDUTY(i), 120); in max6639_init_client()
648 return regmap_write(data->regmap, MAX6639_REG_GCONFIG, in max6639_init_client()
654 /* Return 0 if detection is successful, -ENODEV otherwise */
658 struct i2c_adapter *adapter = client->adapter; in max6639_detect()
662 return -ENODEV; in max6639_detect()
668 return -ENODEV; in max6639_detect()
670 strscpy(info->type, "max6639", I2C_NAME_SIZE); in max6639_detect()
708 struct device *dev = &client->dev; in max6639_probe()
715 return -ENOMEM; in max6639_probe()
717 data->regmap = devm_regmap_init_i2c(client, &max6639_regmap_config); in max6639_probe()
718 if (IS_ERR(data->regmap)) in max6639_probe()
720 PTR_ERR(data->regmap), in max6639_probe()
723 data->reg = devm_regulator_get_optional(dev, "fan"); in max6639_probe()
724 if (IS_ERR(data->reg)) { in max6639_probe()
725 if (PTR_ERR(data->reg) != -ENODEV) in max6639_probe()
726 return PTR_ERR(data->reg); in max6639_probe()
728 data->reg = NULL; in max6639_probe()
731 err = regulator_enable(data->reg); in max6639_probe()
737 data->reg); in max6639_probe()
744 mutex_init(&data->update_lock); in max6639_probe()
751 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in max6639_probe()
762 if (data->reg) in max6639_suspend()
763 regulator_disable(data->reg); in max6639_suspend()
765 return regmap_write_bits(data->regmap, MAX6639_REG_GCONFIG, MAX6639_GCONFIG_STANDBY, in max6639_suspend()
774 if (data->reg) { in max6639_resume()
775 ret = regulator_enable(data->reg); in max6639_resume()
782 return regmap_write_bits(data->regmap, MAX6639_REG_GCONFIG, MAX6639_GCONFIG_STANDBY, in max6639_resume()