/* Return 0 for in4 and disallow writes if pin used for temp */ void sis5595_in(struct i2c_client *client, int operation, int ctl_name, int *nrels_mag, long *results) { struct sis5595_data *data = client->data; int nr = ctl_name - SIS5595_SYSCTL_IN0; if (operation == SENSORS_PROC_REAL_INFO) *nrels_mag = 2; else if (operation == SENSORS_PROC_REAL_READ) { if(nr <= 3 || data->maxins == 4) { sis5595_update_client(client); results[0] = IN_FROM_REG(data->in_min[nr]); results[1] = IN_FROM_REG(data->in_max[nr]); results[2] = IN_FROM_REG(data->in[nr]); } else { results[0] = 0; results[1] = 0; results[2] = 0; } *nrels_mag = 3; } else if (operation == SENSORS_PROC_REAL_WRITE) { if(nr <= 3 || data->maxins == 4) { if (*nrels_mag >= 1) { data->in_min[nr] = IN_TO_REG(results[0]); sis5595_write_value(client, SIS5595_REG_IN_MIN(nr), data->in_min[nr]); } if (*nrels_mag >= 2) { data->in_max[nr] = IN_TO_REG(results[1]); sis5595_write_value(client, SIS5595_REG_IN_MAX(nr), data->in_max[nr]); } } } }
/* The next few functions are the call-back functions of the /proc/sys and sysctl files. Which function is used is defined in the ctl_table in the extra1 field. Each function must return the magnitude (power of 10 to divide the date with) if it is called with operation==SENSORS_PROC_REAL_INFO. It must put a maximum of *nrels elements in results reflecting the data of this file, and set *nrels to the number it actually put in it, if operation== SENSORS_PROC_REAL_READ. Finally, it must get upto *nrels elements from results and write them to the chip, if operations==SENSORS_PROC_REAL_WRITE. Note that on SENSORS_PROC_REAL_READ, I do not check whether results is large enough (by checking the incoming value of *nrels). This is not very good practice, but as long as you put less than about 5 values in results, you can assume it is large enough. */ void adm1025_in(struct i2c_client *client, int operation, int ctl_name, int *nrels_mag, long *results) { int scales[6] = { 250, 225, 330, 500, 1200, 330 }; struct adm1025_data *data = client->data; int nr = ctl_name - ADM1025_SYSCTL_IN0; if (operation == SENSORS_PROC_REAL_INFO) *nrels_mag = 2; else if (operation == SENSORS_PROC_REAL_READ) { adm1025_update_client(client); results[0] = IN_FROM_REG(data->in_min[nr], nr) * scales[nr] / 192; results[1] = IN_FROM_REG(data->in_max[nr], nr) * scales[nr] / 192; results[2] = IN_FROM_REG(data->in[nr], nr) * scales[nr] / 192; *nrels_mag = 3; } else if (operation == SENSORS_PROC_REAL_WRITE) { if (*nrels_mag >= 1) { data->in_min[nr] = IN_TO_REG((results[0] * 192) / scales[nr], nr); adm1025_write_value(client, ADM1025_REG_IN_MIN(nr), data->in_min[nr]); } if (*nrels_mag >= 2) { data->in_max[nr] = IN_TO_REG((results[1] * 192) / scales[nr], nr); adm1025_write_value(client, ADM1025_REG_IN_MAX(nr), data->in_max[nr]); } } }
static ssize_t show_in_max(struct device *dev, struct device_attribute *da, char *buf) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct lm78_data *data = lm78_update_device(dev); return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[attr->index])); }
static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, char *buf) { int index = to_sensor_dev_attr(attr)->index; struct adm1025_data *data = adm1025_update_device(dev); return sprintf(buf, "%u\n", IN_FROM_REG(data->in_max[index], in_scale[index])); }
static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, char *buf) { struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); int nr = sensor_attr->index; struct smsc47m192_data *data = smsc47m192_update_device(dev); return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr], nr)); }
static ssize_t get_in_max(struct device *dev, struct device_attribute *attr, char *buf) { int n = to_sensor_dev_attr(attr)->index; struct gl520_data *data = gl520_update_device(dev); u8 r = data->in_max[n]; if (n == 0) return sprintf(buf, "%d\n", VDD_FROM_REG(r)); else return sprintf(buf, "%d\n", IN_FROM_REG(r)); }