aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2014-04-13 13:53:50 -0400
committerGuenter Roeck <linux@roeck-us.net>2014-05-21 19:02:26 -0400
commit1adf3a3e1cf2ceb30c32642ff35cb05467dc7a75 (patch)
tree6c85cd71b570d6e5b51fe86f49f6d4ed5e04c143 /drivers/hwmon
parent9711bcddde206047415b2eb42c545ad2b1ac8b76 (diff)
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: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/lm80.c148
1 files changed, 76 insertions, 72 deletions
diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c
index df6e07992baf..8a3fa9aa07f8 100644
--- a/drivers/hwmon/lm80.c
+++ b/drivers/hwmon/lm80.c
@@ -109,6 +109,13 @@ static const u8 temp_regs[t_num_temp] = {
109 [t_os_hyst] = LM80_REG_TEMP_OS_HYST, 109 [t_os_hyst] = LM80_REG_TEMP_OS_HYST,
110}; 110};
111 111
112enum in_index {
113 i_input = 0,
114 i_max,
115 i_min,
116 i_num_in
117};
118
112/* 119/*
113 * Client data (each client gets its own) 120 * Client data (each client gets its own)
114 */ 121 */
@@ -120,9 +127,7 @@ struct lm80_data {
120 char valid; /* !=0 if following fields are valid */ 127 char valid; /* !=0 if following fields are valid */
121 unsigned long last_updated; /* In jiffies */ 128 unsigned long last_updated; /* In jiffies */
122 129
123 u8 in[7]; /* Register value */ 130 u8 in[i_num_in][7]; /* Register value, 1st index is enum in_index */
124 u8 in_max[7]; /* Register value */
125 u8 in_min[7]; /* Register value */
126 u8 fan[2]; /* Register value */ 131 u8 fan[2]; /* Register value */
127 u8 fan_min[2]; /* Register value */ 132 u8 fan_min[2]; /* Register value */
128 u8 fan_div[2]; /* Register encoding, shifted right */ 133 u8 fan_div[2]; /* Register encoding, shifted right */
@@ -168,40 +173,39 @@ static struct i2c_driver lm80_driver = {
168 * Sysfs stuff 173 * Sysfs stuff
169 */ 174 */
170 175
171#define show_in(suffix, value) \ 176static ssize_t show_in(struct device *dev, struct device_attribute *attr,
172static ssize_t show_in_##suffix(struct device *dev, \ 177 char *buf)
173 struct device_attribute *attr, char *buf) \ 178{
174{ \ 179 struct lm80_data *data = lm80_update_device(dev);
175 int nr = to_sensor_dev_attr(attr)->index; \ 180 int index = to_sensor_dev_attr_2(attr)->index;
176 struct lm80_data *data = lm80_update_device(dev); \ 181 int nr = to_sensor_dev_attr_2(attr)->nr;
177 if (IS_ERR(data)) \ 182
178 return PTR_ERR(data); \ 183 if (IS_ERR(data))
179 return sprintf(buf, "%d\n", IN_FROM_REG(data->value[nr])); \ 184 return PTR_ERR(data);
185 return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr][index]));
180} 186}
181show_in(min, in_min)
182show_in(max, in_max)
183show_in(input, in)
184 187
185#define set_in(suffix, value, reg) \ 188static ssize_t set_in(struct device *dev, struct device_attribute *attr,
186static ssize_t set_in_##suffix(struct device *dev, \ 189 const char *buf, size_t count)
187 struct device_attribute *attr, const char *buf, size_t count) \ 190{
188{ \ 191 struct lm80_data *data = dev_get_drvdata(dev);
189 int nr = to_sensor_dev_attr(attr)->index; \ 192 struct i2c_client *client = data->client;
190 struct lm80_data *data = dev_get_drvdata(dev); \ 193 int index = to_sensor_dev_attr_2(attr)->index;
191 struct i2c_client *client = data->client; \ 194 int nr = to_sensor_dev_attr_2(attr)->nr;
192 long val; \ 195 long val;
193 int err = kstrtol(buf, 10, &val); \ 196 u8 reg;
194 if (err < 0) \ 197 int err = kstrtol(buf, 10, &val);
195 return err; \ 198 if (err < 0)
196\ 199 return err;
197 mutex_lock(&data->update_lock);\ 200
198 data->value[nr] = IN_TO_REG(val); \ 201 reg = nr == i_min ? LM80_REG_IN_MIN(index) : LM80_REG_IN_MAX(index);
199 lm80_write_value(client, reg(nr), data->value[nr]); \ 202
200 mutex_unlock(&data->update_lock);\ 203 mutex_lock(&data->update_lock);
201 return count; \ 204 data->in[nr][index] = IN_TO_REG(val);
205 lm80_write_value(client, reg, data->in[nr][index]);
206 mutex_unlock(&data->update_lock);
207 return count;
202} 208}
203set_in(min, in_min, LM80_REG_IN_MIN)
204set_in(max, in_max, LM80_REG_IN_MAX)
205 209
206#define show_fan(suffix, value) \ 210#define show_fan(suffix, value) \
207static ssize_t show_fan_##suffix(struct device *dev, \ 211static 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 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); 353 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
350} 354}
351 355
352static SENSOR_DEVICE_ATTR(in0_min, S_IWUSR | S_IRUGO, 356static SENSOR_DEVICE_ATTR_2(in0_min, S_IWUSR | S_IRUGO,
353 show_in_min, set_in_min, 0); 357 show_in, set_in, i_min, 0);
354static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO, 358static SENSOR_DEVICE_ATTR_2(in1_min, S_IWUSR | S_IRUGO,
355 show_in_min, set_in_min, 1); 359 show_in, set_in, i_min, 1);
356static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO, 360static SENSOR_DEVICE_ATTR_2(in2_min, S_IWUSR | S_IRUGO,
357 show_in_min, set_in_min, 2); 361 show_in, set_in, i_min, 2);
358static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO, 362static SENSOR_DEVICE_ATTR_2(in3_min, S_IWUSR | S_IRUGO,
359 show_in_min, set_in_min, 3); 363 show_in, set_in, i_min, 3);
360static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO, 364static SENSOR_DEVICE_ATTR_2(in4_min, S_IWUSR | S_IRUGO,
361 show_in_min, set_in_min, 4); 365 show_in, set_in, i_min, 4);
362static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO, 366static SENSOR_DEVICE_ATTR_2(in5_min, S_IWUSR | S_IRUGO,
363 show_in_min, set_in_min, 5); 367 show_in, set_in, i_min, 5);
364static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO, 368static SENSOR_DEVICE_ATTR_2(in6_min, S_IWUSR | S_IRUGO,
365 show_in_min, set_in_min, 6); 369 show_in, set_in, i_min, 6);
366static SENSOR_DEVICE_ATTR(in0_max, S_IWUSR | S_IRUGO, 370static SENSOR_DEVICE_ATTR_2(in0_max, S_IWUSR | S_IRUGO,
367 show_in_max, set_in_max, 0); 371 show_in, set_in, i_max, 0);
368static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO, 372static SENSOR_DEVICE_ATTR_2(in1_max, S_IWUSR | S_IRUGO,
369 show_in_max, set_in_max, 1); 373 show_in, set_in, i_max, 1);
370static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO, 374static SENSOR_DEVICE_ATTR_2(in2_max, S_IWUSR | S_IRUGO,
371 show_in_max, set_in_max, 2); 375 show_in, set_in, i_max, 2);
372static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO, 376static SENSOR_DEVICE_ATTR_2(in3_max, S_IWUSR | S_IRUGO,
373 show_in_max, set_in_max, 3); 377 show_in, set_in, i_max, 3);
374static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO, 378static SENSOR_DEVICE_ATTR_2(in4_max, S_IWUSR | S_IRUGO,
375 show_in_max, set_in_max, 4); 379 show_in, set_in, i_max, 4);
376static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO, 380static SENSOR_DEVICE_ATTR_2(in5_max, S_IWUSR | S_IRUGO,
377 show_in_max, set_in_max, 5); 381 show_in, set_in, i_max, 5);
378static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO, 382static SENSOR_DEVICE_ATTR_2(in6_max, S_IWUSR | S_IRUGO,
379 show_in_max, set_in_max, 6); 383 show_in, set_in, i_max, 6);
380static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in_input, NULL, 0); 384static SENSOR_DEVICE_ATTR_2(in0_input, S_IRUGO, show_in, NULL, i_input, 0);
381static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in_input, NULL, 1); 385static SENSOR_DEVICE_ATTR_2(in1_input, S_IRUGO, show_in, NULL, i_input, 1);
382static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in_input, NULL, 2); 386static SENSOR_DEVICE_ATTR_2(in2_input, S_IRUGO, show_in, NULL, i_input, 2);
383static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in_input, NULL, 3); 387static SENSOR_DEVICE_ATTR_2(in3_input, S_IRUGO, show_in, NULL, i_input, 3);
384static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in_input, NULL, 4); 388static SENSOR_DEVICE_ATTR_2(in4_input, S_IRUGO, show_in, NULL, i_input, 4);
385static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in_input, NULL, 5); 389static SENSOR_DEVICE_ATTR_2(in5_input, S_IRUGO, show_in, NULL, i_input, 5);
386static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in_input, NULL, 6); 390static SENSOR_DEVICE_ATTR_2(in6_input, S_IRUGO, show_in, NULL, i_input, 6);
387static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, 391static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
388 show_fan_min, set_fan_min, 0); 392 show_fan_min, set_fan_min, 0);
389static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO, 393static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
@@ -588,17 +592,17 @@ static struct lm80_data *lm80_update_device(struct device *dev)
588 rv = lm80_read_value(client, LM80_REG_IN(i)); 592 rv = lm80_read_value(client, LM80_REG_IN(i));
589 if (rv < 0) 593 if (rv < 0)
590 goto abort; 594 goto abort;
591 data->in[i] = rv; 595 data->in[i_input][i] = rv;
592 596
593 rv = lm80_read_value(client, LM80_REG_IN_MIN(i)); 597 rv = lm80_read_value(client, LM80_REG_IN_MIN(i));
594 if (rv < 0) 598 if (rv < 0)
595 goto abort; 599 goto abort;
596 data->in_min[i] = rv; 600 data->in[i_min][i] = rv;
597 601
598 rv = lm80_read_value(client, LM80_REG_IN_MAX(i)); 602 rv = lm80_read_value(client, LM80_REG_IN_MAX(i));
599 if (rv < 0) 603 if (rv < 0)
600 goto abort; 604 goto abort;
601 data->in_max[i] = rv; 605 data->in[i_max][i] = rv;
602 } 606 }
603 607
604 rv = lm80_read_value(client, LM80_REG_FAN1); 608 rv = lm80_read_value(client, LM80_REG_FAN1);