static ssize_t for_vout_data(struct device *dev, struct device_attribute \ *dev_attr, char *buf) { struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); int exponent, mantissa; int multiplier = 1000; exponent = two_complement_to_int(data->vout_mode, 5, 0x1f); mantissa = data->v_out; return (exponent > 0) ? sprintf(buf, "%d\n", \ mantissa * (1 << exponent)) : \ sprintf(buf, "%d\n", mantissa / (1 << -exponent) * multiplier); }
int pmbus_parse_vout_format(unsigned char vout_mode, unsigned short val) { int exponent, mantissa; exponent = two_complement_to_int(vout_mode, 5, 0x1f); mantissa = val; if (exponent >= 0) { return (mantissa << exponent) * PMBUS_LITERAL_DATA_MULTIPLIER; } else { return (mantissa * PMBUS_LITERAL_DATA_MULTIPLIER) / (1 << -exponent); } }
int pmbus_parse_literal_format(unsigned short val) { int exponent, mantissa; exponent = two_complement_to_int(val >> 11, 5, 0x1f); mantissa = two_complement_to_int(val & 0x7ff, 11, 0x7ff); if (exponent >= 0) { return (mantissa << exponent) * PMBUS_LITERAL_DATA_MULTIPLIER; } else { return (mantissa * PMBUS_LITERAL_DATA_MULTIPLIER) / (1 << -exponent); } }
static ssize_t for_linear_data(struct device *dev, struct device_attribute \ *dev_attr, char *buf) { struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); u16 value = 0; int exponent, mantissa; int multiplier = 1000; switch (attr->index) { case PSU_V_IN: value = data->v_in; break; case PSU_I_IN: value = data->i_in; break; case PSU_I_OUT: value = data->i_out; break; case PSU_P_IN: value = data->p_in; break; case PSU_P_OUT: value = data->p_out; break; case PSU_TEMP1_INPUT: value = data->temp_input[0]; break; case PSU_FAN1_DUTY_CYCLE: multiplier = 1; value = data->fan_duty_cycle[0]; break; case PSU_FAN1_SPEED: multiplier = 1; value = data->fan_speed[0]; break; default: break; } exponent = two_complement_to_int(value >> 11, 5, 0x1f); mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); return (exponent >= 0) ? sprintf(buf, "%d\n", \ (mantissa << exponent) * multiplier) : \ sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); }
static ssize_t show_linear(struct device *dev, struct device_attribute *da, char *buf) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct ym2651y_data *data = ym2651y_update_device(dev); u16 value = 0; int exponent, mantissa; int multiplier = 1000; if (!data->valid) { return 0; } switch (attr->index) { case PSU_V_OUT: value = data->v_out; break; case PSU_I_OUT: value = data->i_out; break; case PSU_P_OUT: value = data->p_out; break; case PSU_TEMP1_INPUT: value = data->temp; break; case PSU_FAN1_SPEED: value = data->fan_speed; multiplier = 1; break; case PSU_FAN1_DUTY_CYCLE: value = data->fan_duty_cycle[0]; multiplier = 1; break; case PSU_MFR_VIN_MIN: value = data->mfr_vin_min; break; case PSU_MFR_VIN_MAX: value = data->mfr_vin_max; break; case PSU_MFR_VOUT_MIN: value = data->mfr_vout_min; break; case PSU_MFR_VOUT_MAX: value = data->mfr_vout_max; break; case PSU_MFR_PIN_MAX: value = data->mfr_pin_max; break; case PSU_MFR_POUT_MAX: value = data->mfr_pout_max; break; case PSU_MFR_IOUT_MAX: value = data->mfr_iout_max; break; case PSU_MFR_IIN_MAX: value = data->mfr_iin_max; break; } exponent = two_complement_to_int(value >> 11, 5, 0x1f); mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); return (exponent >= 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); }