Commit 1adf3a3e authored by Guenter Roeck's avatar Guenter Roeck

hwmon: (lm80) Convert voltage display function macros into functions

Convert voltage display function macros into functions to reduce
code size and improve code readability.

Code size reduction is about 600 bytes on x86_64.
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 9711bcdd
...@@ -109,6 +109,13 @@ static const u8 temp_regs[t_num_temp] = { ...@@ -109,6 +109,13 @@ static const u8 temp_regs[t_num_temp] = {
[t_os_hyst] = LM80_REG_TEMP_OS_HYST, [t_os_hyst] = LM80_REG_TEMP_OS_HYST,
}; };
enum in_index {
i_input = 0,
i_max,
i_min,
i_num_in
};
/* /*
* Client data (each client gets its own) * Client data (each client gets its own)
*/ */
...@@ -120,9 +127,7 @@ struct lm80_data { ...@@ -120,9 +127,7 @@ struct lm80_data {
char valid; /* !=0 if following fields are valid */ char valid; /* !=0 if following fields are valid */
unsigned long last_updated; /* In jiffies */ unsigned long last_updated; /* In jiffies */
u8 in[7]; /* Register value */ u8 in[i_num_in][7]; /* Register value, 1st index is enum in_index */
u8 in_max[7]; /* Register value */
u8 in_min[7]; /* Register value */
u8 fan[2]; /* Register value */ u8 fan[2]; /* Register value */
u8 fan_min[2]; /* Register value */ u8 fan_min[2]; /* Register value */
u8 fan_div[2]; /* Register encoding, shifted right */ u8 fan_div[2]; /* Register encoding, shifted right */
...@@ -168,40 +173,39 @@ static struct i2c_driver lm80_driver = { ...@@ -168,40 +173,39 @@ static struct i2c_driver lm80_driver = {
* Sysfs stuff * Sysfs stuff
*/ */
#define show_in(suffix, value) \ static ssize_t show_in(struct device *dev, struct device_attribute *attr,
static ssize_t show_in_##suffix(struct device *dev, \ char *buf)
struct device_attribute *attr, char *buf) \ {
{ \ struct lm80_data *data = lm80_update_device(dev);
int nr = to_sensor_dev_attr(attr)->index; \ int index = to_sensor_dev_attr_2(attr)->index;
struct lm80_data *data = lm80_update_device(dev); \ int nr = to_sensor_dev_attr_2(attr)->nr;
if (IS_ERR(data)) \
return PTR_ERR(data); \ if (IS_ERR(data))
return sprintf(buf, "%d\n", IN_FROM_REG(data->value[nr])); \ return PTR_ERR(data);
return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr][index]));
} }
show_in(min, in_min)
show_in(max, in_max)
show_in(input, in)
#define set_in(suffix, value, reg) \ static ssize_t set_in(struct device *dev, struct device_attribute *attr,
static ssize_t set_in_##suffix(struct device *dev, \ const char *buf, size_t count)
struct device_attribute *attr, const char *buf, size_t count) \ {
{ \ struct lm80_data *data = dev_get_drvdata(dev);
int nr = to_sensor_dev_attr(attr)->index; \ struct i2c_client *client = data->client;
struct lm80_data *data = dev_get_drvdata(dev); \ int index = to_sensor_dev_attr_2(attr)->index;
struct i2c_client *client = data->client; \ int nr = to_sensor_dev_attr_2(attr)->nr;
long val; \ long val;
int err = kstrtol(buf, 10, &val); \ u8 reg;
if (err < 0) \ int err = kstrtol(buf, 10, &val);
return err; \ if (err < 0)
\ return err;
mutex_lock(&data->update_lock);\
data->value[nr] = IN_TO_REG(val); \ reg = nr == i_min ? LM80_REG_IN_MIN(index) : LM80_REG_IN_MAX(index);
lm80_write_value(client, reg(nr), data->value[nr]); \
mutex_unlock(&data->update_lock);\ mutex_lock(&data->update_lock);
return count; \ data->in[nr][index] = IN_TO_REG(val);
lm80_write_value(client, reg, data->in[nr][index]);
mutex_unlock(&data->update_lock);
return count;
} }
set_in(min, in_min, LM80_REG_IN_MIN)
set_in(max, in_max, LM80_REG_IN_MAX)
#define show_fan(suffix, value) \ #define show_fan(suffix, value) \
static ssize_t show_fan_##suffix(struct device *dev, \ static ssize_t show_fan_##suffix(struct device *dev, \
...@@ -349,41 +353,41 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, ...@@ -349,41 +353,41 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
} }
static SENSOR_DEVICE_ATTR(in0_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 0); show_in, set_in, i_min, 0);
static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in1_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 1); show_in, set_in, i_min, 1);
static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 2); show_in, set_in, i_min, 2);
static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 3); show_in, set_in, i_min, 3);
static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in4_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 4); show_in, set_in, i_min, 4);
static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in5_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 5); show_in, set_in, i_min, 5);
static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO,
show_in_min, set_in_min, 6); show_in, set_in, i_min, 6);
static SENSOR_DEVICE_ATTR(in0_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in0_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 0); show_in, set_in, i_max, 0);
static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in1_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 1); show_in, set_in, i_max, 1);
static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in2_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 2); show_in, set_in, i_max, 2);
static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in3_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 3); show_in, set_in, i_max, 3);
static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in4_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 4); show_in, set_in, i_max, 4);
static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in5_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 5); show_in, set_in, i_max, 5);
static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO,
show_in_max, set_in_max, 6); show_in, set_in, i_max, 6);
static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in_input, NULL, 0); static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in, NULL, i_input, 0);
static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in_input, NULL, 1); static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_in, NULL, i_input, 1);
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in_input, NULL, 2); static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, show_in, NULL, i_input, 2);
static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in_input, NULL, 3); static SENSOR_DEVICE_ATTR_2(in3_input, S_IRUGO, show_in, NULL, i_input, 3);
static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in_input, NULL, 4); static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, show_in, NULL, i_input, 4);
static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in_input, NULL, 5); static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, show_in, NULL, i_input, 5);
static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in_input, NULL, 6); static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, show_in, NULL, i_input, 6);
static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
show_fan_min, set_fan_min, 0); show_fan_min, set_fan_min, 0);
static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
...@@ -588,17 +592,17 @@ static struct lm80_data *lm80_update_device(struct device *dev) ...@@ -588,17 +592,17 @@ static struct lm80_data *lm80_update_device(struct device *dev)
rv = lm80_read_value(client, LM80_REG_IN(i)); rv = lm80_read_value(client, LM80_REG_IN(i));
if (rv < 0) if (rv < 0)
goto abort; goto abort;
data->in[i] = rv; data->in[i_input][i] = rv;
rv = lm80_read_value(client, LM80_REG_IN_MIN(i)); rv = lm80_read_value(client, LM80_REG_IN_MIN(i));
if (rv < 0) if (rv < 0)
goto abort; goto abort;
data->in_min[i] = rv; data->in[i_min][i] = rv;
rv = lm80_read_value(client, LM80_REG_IN_MAX(i)); rv = lm80_read_value(client, LM80_REG_IN_MAX(i));
if (rv < 0) if (rv < 0)
goto abort; goto abort;
data->in_max[i] = rv; data->in[i_max][i] = rv;
} }
rv = lm80_read_value(client, LM80_REG_FAN1); rv = lm80_read_value(client, LM80_REG_FAN1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment