OSDN Git Service

hwmon: pwm-fan: Refactor pwm_fan_probe
authorPaul Barker <pbarker@konsulko.com>
Thu, 26 Nov 2020 17:44:07 +0000 (17:44 +0000)
committerGuenter Roeck <linux@roeck-us.net>
Thu, 3 Dec 2020 01:42:24 +0000 (17:42 -0800)
Use platform_irq_count to determine the number of fan tachometer inputs
configured in the device tree. At this stage we support either 0 or 1
inputs.

Once we have this information we only need to read the
pulses-per-revolution value if a fan tachometer is actually configured
via an IRQ value.

Also add a debug print of the IRQ number and the pulses-per-revolution
value to aid in investigating issues.

Signed-off-by: Paul Barker <pbarker@konsulko.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20201126174408.755-2-pbarker@konsulko.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pwm-fan.c

index 1f63807..efe2764 100644 (file)
@@ -286,7 +286,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
        struct device *hwmon;
        int ret;
        struct pwm_state state = { };
-       u32 ppr = 2;
+       int tach_count;
 
        ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
@@ -300,10 +300,6 @@ static int pwm_fan_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, ctx);
 
-       ctx->irq = platform_get_irq_optional(pdev, 0);
-       if (ctx->irq == -EPROBE_DEFER)
-               return ctx->irq;
-
        ctx->reg_en = devm_regulator_get_optional(dev, "fan");
        if (IS_ERR(ctx->reg_en)) {
                if (PTR_ERR(ctx->reg_en) != -ENODEV)
@@ -339,20 +335,40 @@ static int pwm_fan_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       of_property_read_u32(dev->of_node, "pulses-per-revolution", &ppr);
-       ctx->pulses_per_revolution = ppr;
-       if (!ctx->pulses_per_revolution) {
-               dev_err(dev, "pulses-per-revolution can't be zero.\n");
-               return -EINVAL;
-       }
+       tach_count = platform_irq_count(pdev);
+       if (tach_count < 0)
+               return dev_err_probe(dev, tach_count,
+                                    "Could not get number of fan tachometer inputs\n");
+
+       if (tach_count > 0) {
+               u32 ppr = 2;
+
+               ctx->irq = platform_get_irq(pdev, 0);
+               if (ctx->irq == -EPROBE_DEFER)
+                       return ctx->irq;
+               if (ctx->irq > 0) {
+                       ret = devm_request_irq(dev, ctx->irq, pulse_handler, 0,
+                                              pdev->name, ctx);
+                       if (ret) {
+                               dev_err(dev,
+                                       "Failed to request interrupt: %d\n",
+                                       ret);
+                               return ret;
+                       }
+               }
 
-       if (ctx->irq > 0) {
-               ret = devm_request_irq(dev, ctx->irq, pulse_handler, 0,
-                                      pdev->name, ctx);
-               if (ret) {
-                       dev_err(dev, "Failed to request interrupt: %d\n", ret);
-                       return ret;
+               of_property_read_u32(dev->of_node,
+                                    "pulses-per-revolution",
+                                    &ppr);
+               ctx->pulses_per_revolution = ppr;
+               if (!ctx->pulses_per_revolution) {
+                       dev_err(dev, "pulses-per-revolution can't be zero.\n");
+                       return -EINVAL;
                }
+
+               dev_dbg(dev, "tach: irq=%d, pulses_per_revolution=%d\n",
+                       ctx->irq, ctx->pulses_per_revolution);
+
                ctx->sample_start = ktime_get();
                mod_timer(&ctx->rpm_timer, jiffies + HZ);
        }