Commit b5fcb8a4 authored by Paul Barker's avatar Paul Barker Committed by Guenter Roeck
Browse files

hwmon: pwm-fan: Refactor pwm_fan_probe



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: default avatarPaul Barker <pbarker@konsulko.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20201126174408.755-2-pbarker@konsulko.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 02c155cb
Loading
Loading
Loading
Loading
+33 −17
Original line number Diff line number Diff line
@@ -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);
				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);
	}