Lines Matching +full:per +full:- +full:channel
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>
28 /* The MAX6639 registers, valid channel numbers: 0, 1 */
81 u8 ppr[MAX6639_NUM_CHANNELS]; /* Pulses per rotation 0..3 for 1..4 ppr */
88 static int max6639_temp_read_input(struct device *dev, int channel, long *temp) in max6639_temp_read_input() argument
90 u32 regs[2] = { MAX6639_REG_TEMP_EXT(channel), MAX6639_REG_TEMP(channel) }; in max6639_temp_read_input()
95 res = regmap_multi_reg_read(data->regmap, regs, regvals, 2); in max6639_temp_read_input()
104 static int max6639_temp_read_fault(struct device *dev, int channel, long *fault) in max6639_temp_read_fault() argument
110 res = regmap_read(data->regmap, MAX6639_REG_TEMP_EXT(channel), &val); in max6639_temp_read_fault()
119 static int max6639_temp_read_max(struct device *dev, int channel, long *max) in max6639_temp_read_max() argument
125 res = regmap_read(data->regmap, MAX6639_REG_THERM_LIMIT(channel), &val); in max6639_temp_read_max()
134 static int max6639_temp_read_crit(struct device *dev, int channel, long *crit) in max6639_temp_read_crit() argument
140 res = regmap_read(data->regmap, MAX6639_REG_ALERT_LIMIT(channel), &val); in max6639_temp_read_crit()
149 static int max6639_temp_read_emergency(struct device *dev, int channel, long *emerg) in max6639_temp_read_emergency() argument
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()
179 static int max6639_temp_set_max(struct max6639_data *data, int channel, long val) in max6639_temp_set_max() argument
183 res = regmap_write(data->regmap, MAX6639_REG_THERM_LIMIT(channel), in max6639_temp_set_max()
188 static int max6639_temp_set_crit(struct max6639_data *data, int channel, long val) in max6639_temp_set_crit() argument
192 res = regmap_write(data->regmap, MAX6639_REG_ALERT_LIMIT(channel), TEMP_LIMIT_TO_REG(val)); in max6639_temp_set_crit()
197 static int max6639_temp_set_emergency(struct max6639_data *data, int channel, long val) in max6639_temp_set_emergency() argument
201 res = regmap_write(data->regmap, MAX6639_REG_OT_LIMIT(channel), TEMP_LIMIT_TO_REG(val)); in max6639_temp_set_emergency()
206 static int max6639_read_fan(struct device *dev, u32 attr, int channel, in max6639_read_fan() argument
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()
234 static int max6639_set_ppr(struct max6639_data *data, int channel, u8 ppr) in max6639_set_ppr() argument
237 return regmap_write(data->regmap, MAX6639_REG_FAN_PPR(channel), ppr-- << 6); in max6639_set_ppr()
240 static int max6639_write_fan(struct device *dev, u32 attr, int channel, in max6639_write_fan() argument
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()
253 err = max6639_set_ppr(data, channel, val); 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()
267 static umode_t max6639_fan_is_visible(const void *_data, u32 attr, int channel) in max6639_fan_is_visible() argument
280 static int max6639_read_pwm(struct device *dev, u32 attr, int channel, in max6639_read_pwm() argument
283 u32 regs[2] = { MAX6639_REG_FAN_CONFIG3(channel), MAX6639_REG_GCONFIG }; in max6639_read_pwm()
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()
311 static int max6639_write_pwm(struct device *dev, u32 attr, int channel, in max6639_write_pwm() argument
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()
352 static umode_t max6639_pwm_is_visible(const void *_data, u32 attr, int channel) in max6639_pwm_is_visible() argument
363 static int max6639_read_temp(struct device *dev, u32 attr, int channel, in max6639_read_temp() argument
371 res = max6639_temp_read_input(dev, channel, val); in max6639_read_temp()
374 res = max6639_temp_read_fault(dev, channel, val); in max6639_read_temp()
377 res = max6639_temp_read_max(dev, channel, val); in max6639_read_temp()
380 res = max6639_temp_read_crit(dev, channel, val); in max6639_read_temp()
383 res = max6639_temp_read_emergency(dev, channel, val); in max6639_read_temp()
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()
408 static int max6639_write_temp(struct device *dev, u32 attr, int channel, in max6639_write_temp() argument
415 return max6639_temp_set_max(data, channel, val); in max6639_write_temp()
417 return max6639_temp_set_crit(data, channel, val); in max6639_write_temp()
419 return max6639_temp_set_emergency(data, channel, val); in max6639_write_temp()
421 return -EOPNOTSUPP; in max6639_write_temp()
425 static umode_t max6639_temp_is_visible(const void *_data, u32 attr, int channel) in max6639_temp_is_visible() argument
444 u32 attr, int channel, long *val) in max6639_read() argument
448 return max6639_read_fan(dev, attr, channel, val); in max6639_read()
450 return max6639_read_pwm(dev, attr, channel, val); in max6639_read()
452 return max6639_read_temp(dev, attr, channel, val); in max6639_read()
454 return -EOPNOTSUPP; in max6639_read()
459 u32 attr, int channel, long val) in max6639_write() argument
463 return max6639_write_fan(dev, attr, channel, val); in max6639_write()
465 return max6639_write_pwm(dev, attr, channel, val); in max6639_write()
467 return max6639_write_temp(dev, attr, channel, val); in max6639_write()
469 return -EOPNOTSUPP; in max6639_write()
475 u32 attr, int channel) in max6639_is_visible() argument
479 return max6639_fan_is_visible(data, attr, channel); in max6639_is_visible()
481 return max6639_pwm_is_visible(data, attr, channel); in max6639_is_visible()
483 return max6639_temp_is_visible(data, attr, channel); in max6639_is_visible()
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()