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>
83 u8 temp_therm[2]; /* THERM Temperature, 0..255 C (->_max) */
84 u8 temp_alert[2]; /* ALERT Temperature, 0..255 C (->_crit) */
85 u8 temp_ot[2]; /* OT Temperature, 0..255 C (->_emergency) */
88 u8 ppr; /* Pulses per rotation 0..3 for 1..4 ppr */
98 struct i2c_client *client = data->client; in max6639_update_device()
103 mutex_lock(&data->update_lock); in max6639_update_device()
105 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { in max6639_update_device()
108 dev_dbg(&client->dev, "Starting max6639 update\n"); in max6639_update_device()
117 data->status = status_reg; in max6639_update_device()
126 data->fan[i] = res; in max6639_update_device()
134 data->temp[i] = res >> 5; in max6639_update_device()
135 data->temp_fault[i] = res & 0x01; in max6639_update_device()
143 data->temp[i] |= res << 3; in max6639_update_device()
146 data->last_updated = jiffies; in max6639_update_device()
147 data->valid = true; in max6639_update_device()
150 mutex_unlock(&data->update_lock); in max6639_update_device()
165 temp = data->temp[attr->index] * 125; in temp_input_show()
178 return sprintf(buf, "%d\n", data->temp_fault[attr->index]); in temp_fault_show()
187 return sprintf(buf, "%d\n", (data->temp_therm[attr->index] * 1000)); in temp_max_show()
196 struct i2c_client *client = data->client; in temp_max_store()
204 mutex_lock(&data->update_lock); in temp_max_store()
205 data->temp_therm[attr->index] = TEMP_LIMIT_TO_REG(val); in temp_max_store()
207 MAX6639_REG_THERM_LIMIT(attr->index), in temp_max_store()
208 data->temp_therm[attr->index]); in temp_max_store()
209 mutex_unlock(&data->update_lock); in temp_max_store()
219 return sprintf(buf, "%d\n", (data->temp_alert[attr->index] * 1000)); in temp_crit_show()
228 struct i2c_client *client = data->client; in temp_crit_store()
236 mutex_lock(&data->update_lock); in temp_crit_store()
237 data->temp_alert[attr->index] = TEMP_LIMIT_TO_REG(val); in temp_crit_store()
239 MAX6639_REG_ALERT_LIMIT(attr->index), in temp_crit_store()
240 data->temp_alert[attr->index]); in temp_crit_store()
241 mutex_unlock(&data->update_lock); in temp_crit_store()
252 return sprintf(buf, "%d\n", (data->temp_ot[attr->index] * 1000)); in temp_emergency_show()
261 struct i2c_client *client = data->client; in temp_emergency_store()
269 mutex_lock(&data->update_lock); in temp_emergency_store()
270 data->temp_ot[attr->index] = TEMP_LIMIT_TO_REG(val); in temp_emergency_store()
272 MAX6639_REG_OT_LIMIT(attr->index), in temp_emergency_store()
273 data->temp_ot[attr->index]); in temp_emergency_store()
274 mutex_unlock(&data->update_lock); in temp_emergency_store()
284 return sprintf(buf, "%d\n", data->pwm[attr->index] * 255 / 120); in pwm_show()
293 struct i2c_client *client = data->client; in pwm_store()
303 mutex_lock(&data->update_lock); in pwm_store()
304 data->pwm[attr->index] = (u8)(val * 120 / 255); in pwm_store()
306 MAX6639_REG_TARGTDUTY(attr->index), in pwm_store()
307 data->pwm[attr->index]); in pwm_store()
308 mutex_unlock(&data->update_lock); in pwm_store()
321 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[attr->index], in fan_input_show()
322 data->rpm_range)); in fan_input_show()
334 return sprintf(buf, "%d\n", !!(data->status & (1 << attr->index))); in alarm_show()
408 dev_get_platdata(&client->dev); in max6639_init_client()
419 /* Fans pulse per revolution is 2 by default */ in max6639_init_client()
420 if (max6639_info && max6639_info->ppr > 0 && in max6639_init_client()
421 max6639_info->ppr < 5) in max6639_init_client()
422 data->ppr = max6639_info->ppr; in max6639_init_client()
424 data->ppr = 2; in max6639_init_client()
425 data->ppr -= 1; in max6639_init_client()
428 rpm_range = rpm_range_to_reg(max6639_info->rpm_range); in max6639_init_client()
429 data->rpm_range = rpm_range; in max6639_init_client()
433 /* Set Fan pulse per revolution */ in max6639_init_client()
436 data->ppr << 6); in max6639_init_client()
448 if (max6639_info && max6639_info->pwm_polarity == 0) in max6639_init_client()
468 data->temp_therm[i] = 80; in max6639_init_client()
469 data->temp_alert[i] = 90; in max6639_init_client()
470 data->temp_ot[i] = 100; in max6639_init_client()
473 data->temp_therm[i]); in max6639_init_client()
478 data->temp_alert[i]); in max6639_init_client()
482 MAX6639_REG_OT_LIMIT(i), data->temp_ot[i]); in max6639_init_client()
487 data->pwm[i] = 120; in max6639_init_client()
489 MAX6639_REG_TARGTDUTY(i), data->pwm[i]); in max6639_init_client()
501 /* Return 0 if detection is successful, -ENODEV otherwise */
505 struct i2c_adapter *adapter = client->adapter; in max6639_detect()
509 return -ENODEV; in max6639_detect()
515 return -ENODEV; in max6639_detect()
517 strscpy(info->type, "max6639", I2C_NAME_SIZE); in max6639_detect()
529 struct device *dev = &client->dev; in max6639_probe()
536 return -ENOMEM; in max6639_probe()
538 data->client = client; in max6639_probe()
540 data->reg = devm_regulator_get_optional(dev, "fan"); in max6639_probe()
541 if (IS_ERR(data->reg)) { in max6639_probe()
542 if (PTR_ERR(data->reg) != -ENODEV) in max6639_probe()
543 return PTR_ERR(data->reg); in max6639_probe()
545 data->reg = NULL; in max6639_probe()
548 err = regulator_enable(data->reg); in max6639_probe()
554 data->reg); in max6639_probe()
561 mutex_init(&data->update_lock); in max6639_probe()
568 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, in max6639_probe()
583 if (data->reg) in max6639_suspend()
584 regulator_disable(data->reg); in max6639_suspend()
596 if (data->reg) { in max6639_resume()
597 ret = regulator_enable(data->reg); in max6639_resume()