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

hwmon: (ads1015) Drop dynamic attribute group

It is cheaper to handle attributes individually.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Dirk Eibach <eibach@gdsys.de>

authored by

Jean Delvare and committed by
Jean Delvare
fdf241a8 8c22a8f5

+18 -32
+18 -32
drivers/hwmon/ads1015.c
··· 51 51 struct ads1015_data { 52 52 struct device *hwmon_dev; 53 53 struct mutex update_lock; /* mutex protect updates */ 54 - struct attribute *attr_table[ADS1015_CONFIG_CHANNELS + 1]; 55 - struct attribute_group attr_group; 56 54 }; 57 55 58 56 static s32 ads1015_read_reg(struct i2c_client *client, unsigned int reg) ··· 139 141 return (res < 0) ? res : sprintf(buf, "%d\n", in); 140 142 } 141 143 142 - #define in_reg(offset)\ 143 - static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in,\ 144 - NULL, offset) 145 - 146 - in_reg(0); 147 - in_reg(1); 148 - in_reg(2); 149 - in_reg(3); 150 - in_reg(4); 151 - in_reg(5); 152 - in_reg(6); 153 - in_reg(7); 154 - 155 - static struct attribute *all_attributes[] = { 156 - &sensor_dev_attr_in0_input.dev_attr.attr, 157 - &sensor_dev_attr_in1_input.dev_attr.attr, 158 - &sensor_dev_attr_in2_input.dev_attr.attr, 159 - &sensor_dev_attr_in3_input.dev_attr.attr, 160 - &sensor_dev_attr_in4_input.dev_attr.attr, 161 - &sensor_dev_attr_in5_input.dev_attr.attr, 162 - &sensor_dev_attr_in6_input.dev_attr.attr, 163 - &sensor_dev_attr_in7_input.dev_attr.attr, 144 + static const struct sensor_device_attribute ads1015_in[] = { 145 + SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0), 146 + SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), 147 + SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), 148 + SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), 149 + SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), 150 + SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), 151 + SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), 152 + SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), 164 153 }; 165 154 166 155 /* ··· 157 172 static int ads1015_remove(struct i2c_client *client) 158 173 { 159 174 struct ads1015_data *data = i2c_get_clientdata(client); 175 + int k; 176 + 160 177 hwmon_device_unregister(data->hwmon_dev); 161 - sysfs_remove_group(&client->dev.kobj, &data->attr_group); 178 + for (k = 0; k < ADS1015_CONFIG_CHANNELS; ++k) 179 + device_remove_file(&client->dev, &ads1015_in[k].dev_attr); 162 180 kfree(data); 163 181 return 0; 164 182 } ··· 198 210 int err; 199 211 unsigned int exported_channels; 200 212 unsigned int k; 201 - unsigned int n = 0; 202 213 203 214 data = kzalloc(sizeof(struct ads1015_data), GFP_KERNEL); 204 215 if (!data) { ··· 209 222 mutex_init(&data->update_lock); 210 223 211 224 /* build sysfs attribute group */ 212 - data->attr_group.attrs = data->attr_table; 213 225 exported_channels = ads1015_get_exported_channels(client); 214 226 for (k = 0; k < ADS1015_CONFIG_CHANNELS; ++k) { 215 227 if (!(exported_channels & (1<<k))) 216 228 continue; 217 - data->attr_table[n++] = all_attributes[k]; 229 + err = device_create_file(&client->dev, &ads1015_in[k].dev_attr); 230 + if (err) 231 + goto exit_free; 218 232 } 219 - err = sysfs_create_group(&client->dev.kobj, &data->attr_group); 220 - if (err) 221 - goto exit_free; 222 233 223 234 data->hwmon_dev = hwmon_device_register(&client->dev); 224 235 if (IS_ERR(data->hwmon_dev)) { ··· 227 242 return 0; 228 243 229 244 exit_remove: 230 - sysfs_remove_group(&client->dev.kobj, &data->attr_group); 245 + for (k = 0; k < ADS1015_CONFIG_CHANNELS; ++k) 246 + device_remove_file(&client->dev, &ads1015_in[k].dev_attr); 231 247 exit_free: 232 248 kfree(data); 233 249 exit: