aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/gpio-fan.c
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2013-03-30 12:09:39 -0400
committerGuenter Roeck <linux@roeck-us.net>2013-04-08 00:16:42 -0400
commitc81cc5a4c14d8d7cc5c891ddf6cb8e7750a44dee (patch)
tree80193205375b90498e3a64bf69a2abe8ee709313 /drivers/hwmon/gpio-fan.c
parent4ce5b1fe317b4c5e4e3c8b977b95c00182179352 (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.c104
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
129err_free_sysfs:
130 device_remove_file(&pdev->dev, &dev_attr_fan1_alarm);
131 return err; 120 return err;
132} 121}
133 122
134static 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
312static ssize_t show_name(struct device *dev,
313 struct device_attribute *attr, char *buf)
314{
315 return sprintf(buf, "gpio-fan\n");
316}
317
330static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm); 318static DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
331static DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, 319static 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);
336static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL); 324static DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, NULL);
337static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm); 325static DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, show_rpm, set_rpm);
338 326
339static struct attribute *gpio_fan_ctrl_attributes[] = { 327static DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
340 &dev_attr_pwm1.attr, 328
329static 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
343static 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
350static const struct attribute_group gpio_fan_ctrl_group = { 356static 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
354static int fan_ctrl_init(struct gpio_fan_data *fan_data, 361static 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
386static 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
397static 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
403static 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
573err_remove_name: 557err_remove:
574 device_remove_file(&pdev->dev, &dev_attr_name); 558 sysfs_remove_group(&pdev->dev.kobj, &gpio_fan_group);
575err_free_ctrl:
576 if (fan_data->ctrl)
577 fan_ctrl_free(fan_data);
578err_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}