Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

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