diff options
Diffstat (limited to 'drivers/hwmon/gpio-fan.c')
-rw-r--r-- | drivers/hwmon/gpio-fan.c | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/drivers/hwmon/gpio-fan.c b/drivers/hwmon/gpio-fan.c index 000c8d2e0987..568ce4b25a9e 100644 --- a/drivers/hwmon/gpio-fan.c +++ b/drivers/hwmon/gpio-fan.c | |||
@@ -35,11 +35,6 @@ | |||
35 | #include <linux/of_gpio.h> | 35 | #include <linux/of_gpio.h> |
36 | #include <linux/thermal.h> | 36 | #include <linux/thermal.h> |
37 | 37 | ||
38 | struct gpio_fan_alarm { | ||
39 | unsigned int gpio; | ||
40 | unsigned int active_low; | ||
41 | }; | ||
42 | |||
43 | struct gpio_fan_speed { | 38 | struct gpio_fan_speed { |
44 | int rpm; | 39 | int rpm; |
45 | int ctrl_val; | 40 | int ctrl_val; |
@@ -60,7 +55,8 @@ struct gpio_fan_data { | |||
60 | int resume_speed; | 55 | int resume_speed; |
61 | #endif | 56 | #endif |
62 | bool pwm_enable; | 57 | bool pwm_enable; |
63 | struct gpio_fan_alarm *alarm; | 58 | unsigned int alarm_gpio; |
59 | unsigned int alarm_gpio_active_low; | ||
64 | struct work_struct alarm_work; | 60 | struct work_struct alarm_work; |
65 | }; | 61 | }; |
66 | 62 | ||
@@ -90,10 +86,9 @@ static ssize_t fan1_alarm_show(struct device *dev, | |||
90 | struct device_attribute *attr, char *buf) | 86 | struct device_attribute *attr, char *buf) |
91 | { | 87 | { |
92 | struct gpio_fan_data *fan_data = dev_get_drvdata(dev); | 88 | struct gpio_fan_data *fan_data = dev_get_drvdata(dev); |
93 | struct gpio_fan_alarm *alarm = fan_data->alarm; | 89 | int value = gpio_get_value_cansleep(fan_data->alarm_gpio); |
94 | int value = gpio_get_value_cansleep(alarm->gpio); | ||
95 | 90 | ||
96 | if (alarm->active_low) | 91 | if (fan_data->alarm_gpio_active_low) |
97 | value = !value; | 92 | value = !value; |
98 | 93 | ||
99 | return sprintf(buf, "%d\n", value); | 94 | return sprintf(buf, "%d\n", value); |
@@ -106,13 +101,12 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data) | |||
106 | int err; | 101 | int err; |
107 | int alarm_irq; | 102 | int alarm_irq; |
108 | struct device *dev = fan_data->dev; | 103 | struct device *dev = fan_data->dev; |
109 | struct gpio_fan_alarm *alarm = fan_data->alarm; | ||
110 | 104 | ||
111 | err = devm_gpio_request(dev, alarm->gpio, "GPIO fan alarm"); | 105 | err = devm_gpio_request(dev, fan_data->alarm_gpio, "GPIO fan alarm"); |
112 | if (err) | 106 | if (err) |
113 | return err; | 107 | return err; |
114 | 108 | ||
115 | err = gpio_direction_input(alarm->gpio); | 109 | err = gpio_direction_input(fan_data->alarm_gpio); |
116 | if (err) | 110 | if (err) |
117 | return err; | 111 | return err; |
118 | 112 | ||
@@ -120,7 +114,7 @@ static int fan_alarm_init(struct gpio_fan_data *fan_data) | |||
120 | * If the alarm GPIO don't support interrupts, just leave | 114 | * If the alarm GPIO don't support interrupts, just leave |
121 | * without initializing the fail notification support. | 115 | * without initializing the fail notification support. |
122 | */ | 116 | */ |
123 | alarm_irq = gpio_to_irq(alarm->gpio); | 117 | alarm_irq = gpio_to_irq(fan_data->alarm_gpio); |
124 | if (alarm_irq < 0) | 118 | if (alarm_irq < 0) |
125 | return 0; | 119 | return 0; |
126 | 120 | ||
@@ -335,7 +329,7 @@ static umode_t gpio_fan_is_visible(struct kobject *kobj, | |||
335 | struct device *dev = container_of(kobj, struct device, kobj); | 329 | struct device *dev = container_of(kobj, struct device, kobj); |
336 | struct gpio_fan_data *data = dev_get_drvdata(dev); | 330 | struct gpio_fan_data *data = dev_get_drvdata(dev); |
337 | 331 | ||
338 | if (index == 0 && !data->alarm) | 332 | if (index == 0 && !data->alarm_gpio) |
339 | return 0; | 333 | return 0; |
340 | if (index > 0 && !data->ctrl) | 334 | if (index > 0 && !data->ctrl) |
341 | return 0; | 335 | return 0; |
@@ -450,28 +444,20 @@ static int gpio_fan_get_of_data(struct gpio_fan_data *fan_data) | |||
450 | 444 | ||
451 | /* Alarm GPIO if one exists */ | 445 | /* Alarm GPIO if one exists */ |
452 | if (of_gpio_named_count(np, "alarm-gpios") > 0) { | 446 | if (of_gpio_named_count(np, "alarm-gpios") > 0) { |
453 | struct gpio_fan_alarm *alarm; | ||
454 | int val; | 447 | int val; |
455 | enum of_gpio_flags flags; | 448 | enum of_gpio_flags flags; |
456 | 449 | ||
457 | alarm = devm_kzalloc(dev, sizeof(struct gpio_fan_alarm), | ||
458 | GFP_KERNEL); | ||
459 | if (!alarm) | ||
460 | return -ENOMEM; | ||
461 | |||
462 | val = of_get_named_gpio_flags(np, "alarm-gpios", 0, &flags); | 450 | val = of_get_named_gpio_flags(np, "alarm-gpios", 0, &flags); |
463 | if (val < 0) | 451 | if (val < 0) |
464 | return val; | 452 | return val; |
465 | alarm->gpio = val; | 453 | fan_data->alarm_gpio = val; |
466 | alarm->active_low = flags & OF_GPIO_ACTIVE_LOW; | 454 | fan_data->alarm_gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; |
467 | |||
468 | fan_data->alarm = alarm; | ||
469 | } | 455 | } |
470 | 456 | ||
471 | /* Fill GPIO pin array */ | 457 | /* Fill GPIO pin array */ |
472 | fan_data->num_ctrl = of_gpio_count(np); | 458 | fan_data->num_ctrl = of_gpio_count(np); |
473 | if (fan_data->num_ctrl <= 0) { | 459 | if (fan_data->num_ctrl <= 0) { |
474 | if (fan_data->alarm) | 460 | if (fan_data->alarm_gpio) |
475 | return 0; | 461 | return 0; |
476 | dev_err(dev, "DT properties empty / missing"); | 462 | dev_err(dev, "DT properties empty / missing"); |
477 | return -ENODEV; | 463 | return -ENODEV; |
@@ -556,7 +542,7 @@ static int gpio_fan_probe(struct platform_device *pdev) | |||
556 | mutex_init(&fan_data->lock); | 542 | mutex_init(&fan_data->lock); |
557 | 543 | ||
558 | /* Configure alarm GPIO if available. */ | 544 | /* Configure alarm GPIO if available. */ |
559 | if (fan_data->alarm) { | 545 | if (fan_data->alarm_gpio) { |
560 | err = fan_alarm_init(fan_data); | 546 | err = fan_alarm_init(fan_data); |
561 | if (err) | 547 | if (err) |
562 | return err; | 548 | return err; |