diff options
author | Guenter Roeck <linux@roeck-us.net> | 2013-03-30 12:09:39 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2013-04-08 00:16:42 -0400 |
commit | c81cc5a4c14d8d7cc5c891ddf6cb8e7750a44dee (patch) | |
tree | 80193205375b90498e3a64bf69a2abe8ee709313 /drivers/hwmon/gpio-fan.c | |
parent | 4ce5b1fe317b4c5e4e3c8b977b95c00182179352 (diff) |
hwmon: (gpio-fan) Use is_visible to determine if attributes should be created
Simplify code and reduce object size by more than 300 bytes (x86_64).
Cc: Jamie Lentin <jm@lentin.co.uk>
Cc: Simon Guinot <simon.guinot@sequanux.org>
Tested-by: Simon Guinot <simon.guinot@sequanux.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/gpio-fan.c')
-rw-r--r-- | drivers/hwmon/gpio-fan.c | 104 |
1 files changed, 39 insertions, 65 deletions
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c index 4e02480b456a..3104149795c5 100644 --- a/drivers/hwmon/gpio-fan.c +++ b/drivers/hwmon/gpio-fan.c | |||
@@ -105,10 +105,6 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data, | |||
105 | if (err) | 105 | if (err) |
106 | return err; | 106 | return err; |
107 | 107 | ||
108 | err = device_create_file(&pdev->dev, &dev_attr_fan1_alarm); | ||
109 | if (err) | ||
110 | return err; | ||
111 | |||
112 | /* | 108 | /* |
113 | * If the alarm GPIO don't support interrupts, just leave | 109 | * If the alarm GPIO don't support interrupts, just leave |
114 | * without initializing the fail notification support. | 110 | * without initializing the fail notification support. |
@@ -121,23 +117,9 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data, | |||
121 | irq_set_irq_type(alarm_irq, IRQ_TYPE_EDGE_BOTH); | 117 | irq_set_irq_type(alarm_irq, IRQ_TYPE_EDGE_BOTH); |
122 | err = devm_request_irq(&pdev->dev, alarm_irq, fan_alarm_irq_handler, | 118 | err = devm_request_irq(&pdev->dev, alarm_irq, fan_alarm_irq_handler, |
123 | IRQF_SHARED, "GPIO fan alarm", fan_data); | 119 | IRQF_SHARED, "GPIO fan alarm", fan_data); |
124 | if (err) | ||
125 | goto err_free_sysfs; | ||
126 | |||
127 | return 0; | ||
128 | |||
129 | err_free_sysfs: | ||
130 | device_remove_file(&pdev->dev, &dev_attr_fan1_alarm); | ||
131 | return err; | 120 | return err; |
132 | } | 121 | } |
133 | 122 | ||
134 | static void fan_alarm_free(struct gpio_fan_data *fan_data) | ||
135 | { | ||
136 | struct platform_device *pdev = fan_data->pdev; | ||
137 | |||
138 | device_remove_file(&pdev->dev, &dev_attr_fan1_alarm); | ||
139 | } | ||
140 | |||
141 | /* | 123 | /* |
142 | * Control GPIOs. | 124 | * Control GPIOs. |
143 | */ | 125 | */ |
@@ -327,6 +309,12 @@ exit_unlock: | |||
327 | return ret; | 309 | return ret; |
328 | } | 310 | } |
329 | 311 | ||
312 | static ssize_t show_name(struct device *dev, | ||
313 | struct device_attribute *attr, char *buf) | ||
314 | { | ||
315 | return sprintf(buf, "gpio-fan\n"); | ||
316 | } | ||
317 | |||
330 | static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm); | 318 | static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm); |
331 | static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, | 319 | static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, |
332 | show_pwm_enable, set_pwm_enable); | 320 | show_pwm_enable, set_pwm_enable); |
@@ -336,8 +324,26 @@ static DEVICE_ATTR(fan1_max, S_IRUGO, show_rpm_max, NULL); | |||
336 | static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL); | 324 | static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL); |
337 | static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm); | 325 | static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm); |
338 | 326 | ||
339 | static struct attribute *gpio_fan_ctrl_attributes[] = { | 327 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); |
340 | &dev_attr_pwm1.attr, | 328 | |
329 | static umode_t gpio_fan_is_visible(struct kobject *kobj, | ||
330 | struct attribute *attr, int index) | ||
331 | { | ||
332 | struct device *dev = container_of(kobj, struct device, kobj); | ||
333 | struct gpio_fan_data *data = dev_get_drvdata(dev); | ||
334 | |||
335 | if (index == 1 && !data->alarm) | ||
336 | return 0; | ||
337 | if (index > 1 && !data->ctrl) | ||
338 | return 0; | ||
339 | |||
340 | return attr->mode; | ||
341 | } | ||
342 | |||
343 | static struct attribute *gpio_fan_attributes[] = { | ||
344 | &dev_attr_name.attr, | ||
345 | &dev_attr_fan1_alarm.attr, /* 1 */ | ||
346 | &dev_attr_pwm1.attr, /* 2 */ | ||
341 | &dev_attr_pwm1_enable.attr, | 347 | &dev_attr_pwm1_enable.attr, |
342 | &dev_attr_pwm1_mode.attr, | 348 | &dev_attr_pwm1_mode.attr, |
343 | &dev_attr_fan1_input.attr, | 349 | &dev_attr_fan1_input.attr, |
@@ -347,8 +353,9 @@ static struct attribute *gpio_fan_ctrl_attributes[] = { | |||
347 | NULL | 353 | NULL |
348 | }; | 354 | }; |
349 | 355 | ||
350 | static const struct attribute_group gpio_fan_ctrl_group = { | 356 | static const struct attribute_group gpio_fan_group = { |
351 | .attrs = gpio_fan_ctrl_attributes, | 357 | .attrs = gpio_fan_attributes, |
358 | .is_visible = gpio_fan_is_visible, | ||
352 | }; | 359 | }; |
353 | 360 | ||
354 | static int fan_ctrl_init(struct gpio_fan_data *fan_data, | 361 | static int fan_ctrl_init(struct gpio_fan_data *fan_data, |
@@ -379,30 +386,9 @@ static int fan_ctrl_init(struct gpio_fan_data *fan_data, | |||
379 | if (fan_data->speed_index < 0) | 386 | if (fan_data->speed_index < 0) |
380 | return -ENODEV; | 387 | return -ENODEV; |
381 | 388 | ||
382 | err = sysfs_create_group(&pdev->dev.kobj, &gpio_fan_ctrl_group); | 389 | return 0; |
383 | return err; | ||
384 | } | ||
385 | |||
386 | static void fan_ctrl_free(struct gpio_fan_data *fan_data) | ||
387 | { | ||
388 | struct platform_device *pdev = fan_data->pdev; | ||
389 | |||
390 | sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_ctrl_group); | ||
391 | } | ||
392 | |||
393 | /* | ||
394 | * Platform driver. | ||
395 | */ | ||
396 | |||
397 | static ssize_t show_name(struct device *dev, | ||
398 | struct device_attribute *attr, char *buf) | ||
399 | { | ||
400 | return sprintf(buf, "gpio-fan\n"); | ||
401 | } | 390 | } |
402 | 391 | ||
403 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); | ||
404 | |||
405 | |||
406 | #ifdef CONFIG_OF_GPIO | 392 | #ifdef CONFIG_OF_GPIO |
407 | /* | 393 | /* |
408 | * Translate OpenFirmware node properties into platform_data | 394 | * Translate OpenFirmware node properties into platform_data |
@@ -546,38 +532,30 @@ static int gpio_fan_probe(struct platform_device *pdev) | |||
546 | 532 | ||
547 | /* Configure control GPIOs if available. */ | 533 | /* Configure control GPIOs if available. */ |
548 | if (pdata->ctrl && pdata->num_ctrl > 0) { | 534 | if (pdata->ctrl && pdata->num_ctrl > 0) { |
549 | if (!pdata->speed || pdata->num_speed <= 1) { | 535 | if (!pdata->speed || pdata->num_speed <= 1) |
550 | err = -EINVAL; | 536 | return -EINVAL; |
551 | goto err_free_alarm; | ||
552 | } | ||
553 | err = fan_ctrl_init(fan_data, pdata); | 537 | err = fan_ctrl_init(fan_data, pdata); |
554 | if (err) | 538 | if (err) |
555 | goto err_free_alarm; | 539 | return err; |
556 | } | 540 | } |
557 | 541 | ||
558 | err = device_create_file(&pdev->dev, &dev_attr_name); | 542 | err = sysfs_create_group(&pdev->dev.kobj, &gpio_fan_group); |
559 | if (err) | 543 | if (err) |
560 | goto err_free_ctrl; | 544 | return err; |
561 | 545 | ||
562 | /* Make this driver part of hwmon class. */ | 546 | /* Make this driver part of hwmon class. */ |
563 | fan_data->hwmon_dev = hwmon_device_register(&pdev->dev); | 547 | fan_data->hwmon_dev = hwmon_device_register(&pdev->dev); |
564 | if (IS_ERR(fan_data->hwmon_dev)) { | 548 | if (IS_ERR(fan_data->hwmon_dev)) { |
565 | err = PTR_ERR(fan_data->hwmon_dev); | 549 | err = PTR_ERR(fan_data->hwmon_dev); |
566 | goto err_remove_name; | 550 | goto err_remove; |
567 | } | 551 | } |
568 | 552 | ||
569 | dev_info(&pdev->dev, "GPIO fan initialized\n"); | 553 | dev_info(&pdev->dev, "GPIO fan initialized\n"); |
570 | 554 | ||
571 | return 0; | 555 | return 0; |
572 | 556 | ||
573 | err_remove_name: | 557 | err_remove: |
574 | device_remove_file(&pdev->dev, &dev_attr_name); | 558 | sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_group); |
575 | err_free_ctrl: | ||
576 | if (fan_data->ctrl) | ||
577 | fan_ctrl_free(fan_data); | ||
578 | err_free_alarm: | ||
579 | if (fan_data->alarm) | ||
580 | fan_alarm_free(fan_data); | ||
581 | return err; | 559 | return err; |
582 | } | 560 | } |
583 | 561 | ||
@@ -586,11 +564,7 @@ static int gpio_fan_remove(struct platform_device *pdev) | |||
586 | struct gpio_fan_data *fan_data = platform_get_drvdata(pdev); | 564 | struct gpio_fan_data *fan_data = platform_get_drvdata(pdev); |
587 | 565 | ||
588 | hwmon_device_unregister(fan_data->hwmon_dev); | 566 | hwmon_device_unregister(fan_data->hwmon_dev); |
589 | device_remove_file(&pdev->dev, &dev_attr_name); | 567 | sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_group); |
590 | if (fan_data->alarm) | ||
591 | fan_alarm_free(fan_data); | ||
592 | if (fan_data->ctrl) | ||
593 | fan_ctrl_free(fan_data); | ||
594 | 568 | ||
595 | return 0; | 569 | return 0; |
596 | } | 570 | } |