static ssize_t show_fan(struct device *dev, struct device_attribute *da, char *buf) { struct g760a_data *data = g760a_update_client(dev); unsigned int rpm = 0; mutex_lock(&data->update_lock); if (!(data->fan_sta & G760A_REG_FAN_STA_RPM_LOW)) rpm = rpm_from_cnt(data->act_cnt, data->clk, data->fan_div); mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", rpm); }
/* * Read and write function for fan1_target sysfs file. Get/set the fan speed in * closed-loop mode. Speed is given as a RPM value; then the chip will regulate * the fan speed using pulses from fan tachometer. * * Refer to rpm_from_cnt() implementation above to get info about count number * calculation. * * Also note that due to rounding errors it is possible that you don't read * back exactly the value you have set. */ static ssize_t get_fan_target(struct device *dev, struct device_attribute *da, char *buf) { struct g762_data *data = g762_update_client(dev); unsigned int rpm; if (IS_ERR(data)) return PTR_ERR(data); mutex_lock(&data->update_lock); rpm = rpm_from_cnt(data->set_cnt, data->clk_freq, G762_PULSE_FROM_REG(data->fan_cmd1), G762_CLKDIV_FROM_REG(data->fan_cmd1), G762_GEARMULT_FROM_REG(data->fan_cmd2)); mutex_unlock(&data->update_lock); return sprintf(buf, "%u\n", rpm); }
/* * Read function for fan1_input sysfs file. Return current fan RPM value, or * 0 if fan is out of control. */ static ssize_t get_fan_rpm(struct device *dev, struct device_attribute *da, char *buf) { struct g762_data *data = g762_update_client(dev); unsigned int rpm = 0; if (IS_ERR(data)) return PTR_ERR(data); mutex_lock(&data->update_lock); /* reverse logic: fan out of control reporting is enabled low */ if (data->fan_sta & G762_REG_FAN_STA_OOC) { rpm = rpm_from_cnt(data->act_cnt, data->clk_freq, G762_PULSE_FROM_REG(data->fan_cmd1), G762_CLKDIV_FROM_REG(data->fan_cmd1), G762_GEARMULT_FROM_REG(data->fan_cmd2)); } mutex_unlock(&data->update_lock); return sprintf(buf, "%u\n", rpm); }