All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support
@ 2019-04-11 13:30 Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan Stefan Wahren
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Stefan Wahren @ 2019-04-11 13:30 UTC (permalink / raw)
  To: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Guenter Roeck, Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel, Stefan Wahren

Contrary to the gpio-fan the pwm-fan driver isn't easy to setup
with pwmconfig/fancontrol because of the missing hwmon sysfs entry
for actual revolutions per minute. This series adds this feature.

Changes in V5:
- address Guenter's and Robin's comments:
  - use of_property_read_u32 to get pulses-per-revolution
  - call platform_get_irq ealier to avoid glitches on the regulator
  - simplify pwm_fan_attrs_visible

Changes in V4:
- remove copy & paste artifact in dt-binding example
- switch to u64 for rpm calculation
- drop overflow handling and init atomic
- handle 0 not as valid irq
- reduce range of pulses_per_revolution
- handle probe defer of platform_get_irq
- delete timer properly in bail-out path

Changes in V3:
- rename property interrupt-ratio to pulses-per-revolution
  to avoid confusion with interrupt binding
- handle error case pulses-per-revolution = 0
- bail out properly in case we are unable to request the irq

Changes in V2:
- address Guenter's comments:
  - improve description of interrupts
  - use atomic_t to avoid races of the pulse counter
  - measure sample time to make rpm more reliable under load
  - make sysfs entry fan1_input conditional
- add dt-property to define interrupts per fan revolution
- example for fan with RPM support

Stefan Wahren (3):
  dt-bindings: hwmon: Add tachometer interrupt to pwm-fan
  Documentation: pwm-fan: Add description for RPM support
  hwmon: pwm-fan: Add RPM support via external interrupt

 .../devicetree/bindings/hwmon/pwm-fan.txt          |  21 +++-
 Documentation/hwmon/pwm-fan                        |   3 +
 drivers/hwmon/pwm-fan.c                            | 107 ++++++++++++++++++++-
 3 files changed, 126 insertions(+), 5 deletions(-)

-- 
2.7.4


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH V5 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan
  2019-04-11 13:30 [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Stefan Wahren
@ 2019-04-11 13:30 ` Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 2/3] Documentation: pwm-fan: Add description for RPM support Stefan Wahren
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 14+ messages in thread
From: Stefan Wahren @ 2019-04-11 13:30 UTC (permalink / raw)
  To: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Guenter Roeck, Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel, Stefan Wahren

This adds the tachometer interrupt to the pwm-fan binding, which is
necessary for RPM support.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: Rob Herring <robh@kernel.org>
---
 Documentation/devicetree/bindings/hwmon/pwm-fan.txt | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/hwmon/pwm-fan.txt b/Documentation/devicetree/bindings/hwmon/pwm-fan.txt
index 49ca5d8..6ced829b 100644
--- a/Documentation/devicetree/bindings/hwmon/pwm-fan.txt
+++ b/Documentation/devicetree/bindings/hwmon/pwm-fan.txt
@@ -7,7 +7,16 @@ Required properties:
 			which correspond to thermal cooling states
 
 Optional properties:
-- fan-supply    : phandle to the regulator that provides power to the fan
+- fan-supply		: phandle to the regulator that provides power to the fan
+- interrupts		: This contains a single interrupt specifier which
+			  describes the tachometer output of the fan as an
+			  interrupt source. The output signal must generate a
+			  defined number of interrupts per fan revolution, which
+			  require that it must be self resetting edge interrupts.
+			  See interrupt-controller/interrupts.txt for the format.
+- pulses-per-revolution : define the tachometer pulses per fan revolution as
+			  an integer (default is 2 interrupts per revolution).
+			  The value must be greater than zero.
 
 Example:
 	fan0: pwm-fan {
@@ -38,3 +47,13 @@ Example:
 					};
 			     };
 		};
+
+Example 2:
+	fan0: pwm-fan {
+		compatible = "pwm-fan";
+		pwms = <&pwm 0 40000 0>;
+		fan-supply = <&reg_fan>;
+		interrupt-parent = <&gpio5>;
+		interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
+		pulses-per-revolution = <2>;
+	};
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V5 2/3] Documentation: pwm-fan: Add description for RPM support
  2019-04-11 13:30 [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan Stefan Wahren
@ 2019-04-11 13:30 ` Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Stefan Wahren
  2019-04-12 17:35 ` [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Guenter Roeck
  3 siblings, 0 replies; 14+ messages in thread
From: Stefan Wahren @ 2019-04-11 13:30 UTC (permalink / raw)
  To: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Guenter Roeck, Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel, Stefan Wahren

This adds a short description for the new RPM support of the pwm-fan
driver.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
---
 Documentation/hwmon/pwm-fan | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/hwmon/pwm-fan b/Documentation/hwmon/pwm-fan
index 18529d2..82fe967 100644
--- a/Documentation/hwmon/pwm-fan
+++ b/Documentation/hwmon/pwm-fan
@@ -15,3 +15,6 @@ The driver implements a simple interface for driving a fan connected to
 a PWM output. It uses the generic PWM interface, thus it can be used with
 a range of SoCs. The driver exposes the fan to the user space through
 the hwmon's sysfs interface.
+
+The fan rotation speed returned via the optional 'fan1_input' is extrapolated
+from the sampled interrupts from the tachometer signal within 1 second.
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-11 13:30 [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan Stefan Wahren
  2019-04-11 13:30 ` [PATCH V5 2/3] Documentation: pwm-fan: Add description for RPM support Stefan Wahren
@ 2019-04-11 13:30 ` Stefan Wahren
  2019-04-11 16:57   ` Guenter Roeck
  2019-04-12 13:15   ` Enrico Weigelt, metux IT consult
  2019-04-12 17:35 ` [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Guenter Roeck
  3 siblings, 2 replies; 14+ messages in thread
From: Stefan Wahren @ 2019-04-11 13:30 UTC (permalink / raw)
  To: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Guenter Roeck, Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel, Stefan Wahren

This adds RPM support to the pwm-fan driver in order to use with
fancontrol/pwmconfig. This feature is intended for fans with a tachometer
output signal, which generate a defined number of pulses per revolution.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
---
 drivers/hwmon/pwm-fan.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 103 insertions(+), 4 deletions(-)

diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
index e4c5197..8c4c5ee 100644
--- a/drivers/hwmon/pwm-fan.c
+++ b/drivers/hwmon/pwm-fan.c
@@ -18,6 +18,7 @@
 
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
+#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/of.h>
@@ -26,6 +27,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/sysfs.h>
 #include <linux/thermal.h>
+#include <linux/timer.h>
 
 #define MAX_PWM 255
 
@@ -33,6 +35,14 @@ struct pwm_fan_ctx {
 	struct mutex lock;
 	struct pwm_device *pwm;
 	struct regulator *reg_en;
+
+	int irq;
+	atomic_t pulses;
+	unsigned int rpm;
+	u8 pulses_per_revolution;
+	ktime_t sample_start;
+	struct timer_list rpm_timer;
+
 	unsigned int pwm_value;
 	unsigned int pwm_fan_state;
 	unsigned int pwm_fan_max_state;
@@ -40,6 +50,32 @@ struct pwm_fan_ctx {
 	struct thermal_cooling_device *cdev;
 };
 
+/* This handler assumes self resetting edge triggered interrupt. */
+static irqreturn_t pulse_handler(int irq, void *dev_id)
+{
+	struct pwm_fan_ctx *ctx = dev_id;
+
+	atomic_inc(&ctx->pulses);
+
+	return IRQ_HANDLED;
+}
+
+static void sample_timer(struct timer_list *t)
+{
+	struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
+	int pulses;
+	u64 tmp;
+
+	pulses = atomic_read(&ctx->pulses);
+	atomic_sub(pulses, &ctx->pulses);
+	tmp = (u64)pulses * ktime_ms_delta(ktime_get(), ctx->sample_start) * 60;
+	do_div(tmp, ctx->pulses_per_revolution * 1000);
+	ctx->rpm = tmp;
+
+	ctx->sample_start = ktime_get();
+	mod_timer(&ctx->rpm_timer, jiffies + HZ);
+}
+
 static int  __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
 {
 	unsigned long period;
@@ -100,15 +136,47 @@ static ssize_t pwm_show(struct device *dev, struct device_attribute *attr,
 	return sprintf(buf, "%u\n", ctx->pwm_value);
 }
 
+static ssize_t rpm_show(struct device *dev,
+			struct device_attribute *attr, char *buf)
+{
+	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
+
+	return sprintf(buf, "%u\n", ctx->rpm);
+}
 
 static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
+static SENSOR_DEVICE_ATTR_RO(fan1_input, rpm, 0);
 
 static struct attribute *pwm_fan_attrs[] = {
 	&sensor_dev_attr_pwm1.dev_attr.attr,
+	&sensor_dev_attr_fan1_input.dev_attr.attr,
 	NULL,
 };
 
-ATTRIBUTE_GROUPS(pwm_fan);
+static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
+				     int n)
+{
+	struct device *dev = container_of(kobj, struct device, kobj);
+	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
+	struct device_attribute *devattr;
+
+	/* Hide fan_input in case no interrupt is available  */
+	devattr = container_of(a, struct device_attribute, attr);
+	if (n == 1 && ctx->irq <= 0)
+		return 0;
+
+	return a->mode;
+}
+
+static const struct attribute_group pwm_fan_group = {
+	.attrs = pwm_fan_attrs,
+	.is_visible = pwm_fan_attrs_visible,
+};
+
+static const struct attribute_group *pwm_fan_groups[] = {
+	&pwm_fan_group,
+	NULL,
+};
 
 /* thermal cooling device callbacks */
 static int pwm_fan_get_max_state(struct thermal_cooling_device *cdev,
@@ -214,6 +282,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
 	struct device *hwmon;
 	int ret;
 	struct pwm_state state = { };
+	u32 ppr = 2;
 
 	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
 	if (!ctx)
@@ -233,6 +302,10 @@ static int pwm_fan_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, ctx);
 
+	ctx->irq = platform_get_irq(pdev, 0);
+	if (ctx->irq == -EPROBE_DEFER)
+		return ctx->irq;
+
 	ctx->reg_en = devm_regulator_get_optional(&pdev->dev, "fan");
 	if (IS_ERR(ctx->reg_en)) {
 		if (PTR_ERR(ctx->reg_en) != -ENODEV)
@@ -261,17 +334,38 @@ static int pwm_fan_probe(struct platform_device *pdev)
 		goto err_reg_disable;
 	}
 
+	timer_setup(&ctx->rpm_timer, sample_timer, 0);
+
+	of_property_read_u32(pdev->dev.of_node, "pulses-per-revolution", &ppr);
+	ctx->pulses_per_revolution = ppr;
+	if (!ctx->pulses_per_revolution) {
+		dev_err(&pdev->dev, "pulses-per-revolution can't be zero.\n");
+		ret = -EINVAL;
+		goto err_pwm_disable;
+	}
+
+	if (ctx->irq > 0) {
+		ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
+				       pdev->name, ctx);
+		if (ret) {
+			dev_err(&pdev->dev, "Can't get interrupt working.\n");
+			goto err_pwm_disable;
+		}
+		ctx->sample_start = ktime_get();
+		mod_timer(&ctx->rpm_timer, jiffies + HZ);
+	}
+
 	hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
 						       ctx, pwm_fan_groups);
 	if (IS_ERR(hwmon)) {
 		dev_err(&pdev->dev, "Failed to register hwmon device\n");
 		ret = PTR_ERR(hwmon);
-		goto err_pwm_disable;
+		goto err_del_timer;
 	}
 
 	ret = pwm_fan_of_get_cooling_data(&pdev->dev, ctx);
 	if (ret)
-		goto err_pwm_disable;
+		goto err_del_timer;
 
 	ctx->pwm_fan_state = ctx->pwm_fan_max_state;
 	if (IS_ENABLED(CONFIG_THERMAL)) {
@@ -282,7 +376,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
 			dev_err(&pdev->dev,
 				"Failed to register pwm-fan as cooling device");
 			ret = PTR_ERR(cdev);
-			goto err_pwm_disable;
+			goto err_del_timer;
 		}
 		ctx->cdev = cdev;
 		thermal_cdev_update(cdev);
@@ -290,6 +384,9 @@ static int pwm_fan_probe(struct platform_device *pdev)
 
 	return 0;
 
+err_del_timer:
+	del_timer_sync(&ctx->rpm_timer);
+
 err_pwm_disable:
 	state.enabled = false;
 	pwm_apply_state(ctx->pwm, &state);
@@ -306,6 +403,8 @@ static int pwm_fan_remove(struct platform_device *pdev)
 	struct pwm_fan_ctx *ctx = platform_get_drvdata(pdev);
 
 	thermal_cooling_device_unregister(ctx->cdev);
+	del_timer_sync(&ctx->rpm_timer);
+
 	if (ctx->pwm_value)
 		pwm_disable(ctx->pwm);
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-11 13:30 ` [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Stefan Wahren
@ 2019-04-11 16:57   ` Guenter Roeck
  2019-04-12 11:07     ` Stefan Wahren
  2019-04-12 13:15   ` Enrico Weigelt, metux IT consult
  1 sibling, 1 reply; 14+ messages in thread
From: Guenter Roeck @ 2019-04-11 16:57 UTC (permalink / raw)
  To: Stefan Wahren
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, Robin Murphy, linux-hwmon, devicetree,
	linux-kernel

On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
> This adds RPM support to the pwm-fan driver in order to use with
> fancontrol/pwmconfig. This feature is intended for fans with a tachometer
> output signal, which generate a defined number of pulses per revolution.
> 
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
> ---
>  drivers/hwmon/pwm-fan.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 103 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
> index e4c5197..8c4c5ee 100644
> --- a/drivers/hwmon/pwm-fan.c
> +++ b/drivers/hwmon/pwm-fan.c
> @@ -18,6 +18,7 @@
>  
>  #include <linux/hwmon.h>
>  #include <linux/hwmon-sysfs.h>
> +#include <linux/interrupt.h>
>  #include <linux/module.h>
>  #include <linux/mutex.h>
>  #include <linux/of.h>
> @@ -26,6 +27,7 @@
>  #include <linux/regulator/consumer.h>
>  #include <linux/sysfs.h>
>  #include <linux/thermal.h>
> +#include <linux/timer.h>
>  
>  #define MAX_PWM 255
>  
> @@ -33,6 +35,14 @@ struct pwm_fan_ctx {
>  	struct mutex lock;
>  	struct pwm_device *pwm;
>  	struct regulator *reg_en;
> +
> +	int irq;
> +	atomic_t pulses;
> +	unsigned int rpm;
> +	u8 pulses_per_revolution;
> +	ktime_t sample_start;
> +	struct timer_list rpm_timer;
> +
>  	unsigned int pwm_value;
>  	unsigned int pwm_fan_state;
>  	unsigned int pwm_fan_max_state;
> @@ -40,6 +50,32 @@ struct pwm_fan_ctx {
>  	struct thermal_cooling_device *cdev;
>  };
>  
> +/* This handler assumes self resetting edge triggered interrupt. */
> +static irqreturn_t pulse_handler(int irq, void *dev_id)
> +{
> +	struct pwm_fan_ctx *ctx = dev_id;
> +
> +	atomic_inc(&ctx->pulses);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static void sample_timer(struct timer_list *t)
> +{
> +	struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
> +	int pulses;
> +	u64 tmp;
> +
> +	pulses = atomic_read(&ctx->pulses);
> +	atomic_sub(pulses, &ctx->pulses);
> +	tmp = (u64)pulses * ktime_ms_delta(ktime_get(), ctx->sample_start) * 60;
> +	do_div(tmp, ctx->pulses_per_revolution * 1000);
> +	ctx->rpm = tmp;
> +
> +	ctx->sample_start = ktime_get();
> +	mod_timer(&ctx->rpm_timer, jiffies + HZ);
> +}
> +
>  static int  __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
>  {
>  	unsigned long period;
> @@ -100,15 +136,47 @@ static ssize_t pwm_show(struct device *dev, struct device_attribute *attr,
>  	return sprintf(buf, "%u\n", ctx->pwm_value);
>  }
>  
> +static ssize_t rpm_show(struct device *dev,
> +			struct device_attribute *attr, char *buf)
> +{
> +	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
> +
> +	return sprintf(buf, "%u\n", ctx->rpm);
> +}
>  
>  static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
> +static SENSOR_DEVICE_ATTR_RO(fan1_input, rpm, 0);
>  
>  static struct attribute *pwm_fan_attrs[] = {
>  	&sensor_dev_attr_pwm1.dev_attr.attr,
> +	&sensor_dev_attr_fan1_input.dev_attr.attr,
>  	NULL,
>  };
>  
> -ATTRIBUTE_GROUPS(pwm_fan);
> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
> +				     int n)
> +{
> +	struct device *dev = container_of(kobj, struct device, kobj);
> +	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
> +	struct device_attribute *devattr;
> +
> +	/* Hide fan_input in case no interrupt is available  */
> +	devattr = container_of(a, struct device_attribute, attr);

Field day for static analyzers - devattr is no longer used.
No need to resend. I'll let the series rest for a couple of days
and then apply to hwmon-next (after removing devattr) unless there are
additional comments.

> +	if (n == 1 && ctx->irq <= 0)
> +		return 0;
> +
> +	return a->mode;
> +}
> +
> +static const struct attribute_group pwm_fan_group = {
> +	.attrs = pwm_fan_attrs,
> +	.is_visible = pwm_fan_attrs_visible,
> +};
> +
> +static const struct attribute_group *pwm_fan_groups[] = {
> +	&pwm_fan_group,
> +	NULL,
> +};
>  
>  /* thermal cooling device callbacks */
>  static int pwm_fan_get_max_state(struct thermal_cooling_device *cdev,
> @@ -214,6 +282,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
>  	struct device *hwmon;
>  	int ret;
>  	struct pwm_state state = { };
> +	u32 ppr = 2;
>  
>  	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
>  	if (!ctx)
> @@ -233,6 +302,10 @@ static int pwm_fan_probe(struct platform_device *pdev)
>  
>  	platform_set_drvdata(pdev, ctx);
>  
> +	ctx->irq = platform_get_irq(pdev, 0);
> +	if (ctx->irq == -EPROBE_DEFER)
> +		return ctx->irq;
> +
>  	ctx->reg_en = devm_regulator_get_optional(&pdev->dev, "fan");
>  	if (IS_ERR(ctx->reg_en)) {
>  		if (PTR_ERR(ctx->reg_en) != -ENODEV)
> @@ -261,17 +334,38 @@ static int pwm_fan_probe(struct platform_device *pdev)
>  		goto err_reg_disable;
>  	}
>  
> +	timer_setup(&ctx->rpm_timer, sample_timer, 0);
> +
> +	of_property_read_u32(pdev->dev.of_node, "pulses-per-revolution", &ppr);
> +	ctx->pulses_per_revolution = ppr;
> +	if (!ctx->pulses_per_revolution) {
> +		dev_err(&pdev->dev, "pulses-per-revolution can't be zero.\n");
> +		ret = -EINVAL;
> +		goto err_pwm_disable;
> +	}
> +
> +	if (ctx->irq > 0) {
> +		ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
> +				       pdev->name, ctx);
> +		if (ret) {
> +			dev_err(&pdev->dev, "Can't get interrupt working.\n");
> +			goto err_pwm_disable;
> +		}
> +		ctx->sample_start = ktime_get();
> +		mod_timer(&ctx->rpm_timer, jiffies + HZ);
> +	}
> +
>  	hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
>  						       ctx, pwm_fan_groups);
>  	if (IS_ERR(hwmon)) {
>  		dev_err(&pdev->dev, "Failed to register hwmon device\n");
>  		ret = PTR_ERR(hwmon);
> -		goto err_pwm_disable;
> +		goto err_del_timer;
>  	}
>  
>  	ret = pwm_fan_of_get_cooling_data(&pdev->dev, ctx);
>  	if (ret)
> -		goto err_pwm_disable;
> +		goto err_del_timer;
>  
>  	ctx->pwm_fan_state = ctx->pwm_fan_max_state;
>  	if (IS_ENABLED(CONFIG_THERMAL)) {
> @@ -282,7 +376,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
>  			dev_err(&pdev->dev,
>  				"Failed to register pwm-fan as cooling device");
>  			ret = PTR_ERR(cdev);
> -			goto err_pwm_disable;
> +			goto err_del_timer;
>  		}
>  		ctx->cdev = cdev;
>  		thermal_cdev_update(cdev);
> @@ -290,6 +384,9 @@ static int pwm_fan_probe(struct platform_device *pdev)
>  
>  	return 0;
>  
> +err_del_timer:
> +	del_timer_sync(&ctx->rpm_timer);
> +
>  err_pwm_disable:
>  	state.enabled = false;
>  	pwm_apply_state(ctx->pwm, &state);
> @@ -306,6 +403,8 @@ static int pwm_fan_remove(struct platform_device *pdev)
>  	struct pwm_fan_ctx *ctx = platform_get_drvdata(pdev);
>  
>  	thermal_cooling_device_unregister(ctx->cdev);
> +	del_timer_sync(&ctx->rpm_timer);
> +
>  	if (ctx->pwm_value)
>  		pwm_disable(ctx->pwm);
>  
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-11 16:57   ` Guenter Roeck
@ 2019-04-12 11:07     ` Stefan Wahren
  2019-04-12 11:50       ` Robin Murphy
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Wahren @ 2019-04-12 11:07 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, Robin Murphy, linux-hwmon, devicetree,
	linux-kernel

On 11.04.19 18:57, Guenter Roeck wrote:
> On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
>>  
>> -ATTRIBUTE_GROUPS(pwm_fan);
>> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
>> +				     int n)
>> +{
>> +	struct device *dev = container_of(kobj, struct device, kobj);
>> +	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
>> +	struct device_attribute *devattr;
>> +
>> +	/* Hide fan_input in case no interrupt is available  */
>> +	devattr = container_of(a, struct device_attribute, attr);
> Field day for static analyzers - devattr is no longer used.
> No need to resend. I'll let the series rest for a couple of days
> and then apply to hwmon-next (after removing devattr) unless there are
> additional comments.
>
Thank you

Stefan


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 11:07     ` Stefan Wahren
@ 2019-04-12 11:50       ` Robin Murphy
  2019-04-12 13:50         ` Guenter Roeck
  0 siblings, 1 reply; 14+ messages in thread
From: Robin Murphy @ 2019-04-12 11:50 UTC (permalink / raw)
  To: Stefan Wahren, Guenter Roeck
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, linux-hwmon, devicetree, linux-kernel

On 12/04/2019 12:07, Stefan Wahren wrote:
> On 11.04.19 18:57, Guenter Roeck wrote:
>> On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
>>>   
>>> -ATTRIBUTE_GROUPS(pwm_fan);
>>> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
>>> +				     int n)
>>> +{
>>> +	struct device *dev = container_of(kobj, struct device, kobj);
>>> +	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
>>> +	struct device_attribute *devattr;
>>> +
>>> +	/* Hide fan_input in case no interrupt is available  */
>>> +	devattr = container_of(a, struct device_attribute, attr);
>> Field day for static analyzers - devattr is no longer used.
>> No need to resend. I'll let the series rest for a couple of days
>> and then apply to hwmon-next (after removing devattr) unless there are
>> additional comments.
>>
> Thank you

FWIW you can have a

Reviewed-by: Robin Murphy <robin.murphy@arm.com>

for the whole series. The only minor comment that springs to mind
isn't actually specific to this patch, so is probably best made as
the follow-up below.

Robin.

----->8-----
From: Robin Murphy <robin.murphy@arm.com>
Subject: [PATCH] hwmon: pwm-fan: Report probe errors consistently

Printing the error code for a failure provides a head-start for
debugging, since it's often sufficient to pinpoint the origin of the
failure. We already do this for some probe-failure messages, so let's
make the rest of them consistent.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
 drivers/hwmon/pwm-fan.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
index 8c4c5eefd4ca..556db4bef743 100644
--- a/drivers/hwmon/pwm-fan.c
+++ b/drivers/hwmon/pwm-fan.c
@@ -330,7 +330,7 @@ static int pwm_fan_probe(struct platform_device *pdev)

 	ret = pwm_apply_state(ctx->pwm, &state);
 	if (ret) {
-		dev_err(&pdev->dev, "Failed to configure PWM\n");
+		dev_err(&pdev->dev, "Failed to configure PWM: %d\n", ret);
 		goto err_reg_disable;
 	}

@@ -348,7 +348,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
 		ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
 				       pdev->name, ctx);
 		if (ret) {
-			dev_err(&pdev->dev, "Can't get interrupt working.\n");
+			dev_err(&pdev->dev,
+				"Failed to request interrupt: %d\n", ret);
 			goto err_pwm_disable;
 		}
 		ctx->sample_start = ktime_get();
@@ -358,8 +359,9 @@ static int pwm_fan_probe(struct platform_device *pdev)
 	hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
 						       ctx, pwm_fan_groups);
 	if (IS_ERR(hwmon)) {
-		dev_err(&pdev->dev, "Failed to register hwmon device\n");
 		ret = PTR_ERR(hwmon);
+		dev_err(&pdev->dev,
+			"Failed to register hwmon device: %d\n", ret);
 		goto err_del_timer;
 	}

@@ -373,9 +375,10 @@ static int pwm_fan_probe(struct platform_device *pdev)
 							  "pwm-fan", ctx,
 							  &pwm_fan_cooling_ops);
 		if (IS_ERR(cdev)) {
-			dev_err(&pdev->dev,
-				"Failed to register pwm-fan as cooling device");
 			ret = PTR_ERR(cdev);
+			dev_err(&pdev->dev,
+				"Failed to register pwm-fan as cooling device: %d\n",
+				ret);
 			goto err_del_timer;
 		}
 		ctx->cdev = cdev;

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-11 13:30 ` [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Stefan Wahren
  2019-04-11 16:57   ` Guenter Roeck
@ 2019-04-12 13:15   ` Enrico Weigelt, metux IT consult
  2019-04-12 13:35     ` Stefan Wahren
  1 sibling, 1 reply; 14+ messages in thread
From: Enrico Weigelt, metux IT consult @ 2019-04-12 13:15 UTC (permalink / raw)
  To: Stefan Wahren, Kamil Debski, Bartlomiej Zolnierkiewicz,
	Jean Delvare, Guenter Roeck, Rob Herring, Mark Rutland,
	Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel

On 11.04.19 15:30, Stefan Wahren wrote:
> This adds RPM support to the pwm-fan driver in order to use with
> fancontrol/pwmconfig. This feature is intended for fans with a tachometer
> output signal, which generate a defined number of pulses per revolution.

Wouldn't it be better to have a CONFIG_* flag for keeping the kernel
image size smaller when this feature isn't needed ?


--mtx

-- 
Enrico Weigelt, metux IT consult
Free software and Linux embedded engineering
info@metux.net -- +49-151-27565287

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 13:15   ` Enrico Weigelt, metux IT consult
@ 2019-04-12 13:35     ` Stefan Wahren
  2019-04-12 13:47       ` Guenter Roeck
  0 siblings, 1 reply; 14+ messages in thread
From: Stefan Wahren @ 2019-04-12 13:35 UTC (permalink / raw)
  To: Enrico Weigelt, metux IT consult, Kamil Debski,
	Bartlomiej Zolnierkiewicz, Jean Delvare, Guenter Roeck,
	Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel

Hi Enrico,

On 12.04.19 15:15, Enrico Weigelt, metux IT consult wrote:
> On 11.04.19 15:30, Stefan Wahren wrote:
>> This adds RPM support to the pwm-fan driver in order to use with
>> fancontrol/pwmconfig. This feature is intended for fans with a tachometer
>> output signal, which generate a defined number of pulses per revolution.
> Wouldn't it be better to have a CONFIG_* flag for keeping the kernel
> image size smaller when this feature isn't needed ?

i compared the kernel module size in linux-next for ARM without and with
this patch:
without patch: 12088 bytes
with patch: 14292 bytes

I don't think it is worth the trouble.

Stefan

>
>
> --mtx
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 13:35     ` Stefan Wahren
@ 2019-04-12 13:47       ` Guenter Roeck
  0 siblings, 0 replies; 14+ messages in thread
From: Guenter Roeck @ 2019-04-12 13:47 UTC (permalink / raw)
  To: Stefan Wahren, Enrico Weigelt, metux IT consult, Kamil Debski,
	Bartlomiej Zolnierkiewicz, Jean Delvare, Rob Herring,
	Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel

On 4/12/19 6:35 AM, Stefan Wahren wrote:
> Hi Enrico,
> 
> On 12.04.19 15:15, Enrico Weigelt, metux IT consult wrote:
>> On 11.04.19 15:30, Stefan Wahren wrote:
>>> This adds RPM support to the pwm-fan driver in order to use with
>>> fancontrol/pwmconfig. This feature is intended for fans with a tachometer
>>> output signal, which generate a defined number of pulses per revolution.
>> Wouldn't it be better to have a CONFIG_* flag for keeping the kernel
>> image size smaller when this feature isn't needed ?
> 
> i compared the kernel module size in linux-next for ARM without and with
> this patch:
> without patch: 12088 bytes
> with patch: 14292 bytes
> 
> I don't think it is worth the trouble.
> 

Agreed. This would end up being a mess, with lots of configuration options
in various drivers. Please don't start it.

Guenter

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 11:50       ` Robin Murphy
@ 2019-04-12 13:50         ` Guenter Roeck
  2019-04-12 13:54           ` Robin Murphy
  0 siblings, 1 reply; 14+ messages in thread
From: Guenter Roeck @ 2019-04-12 13:50 UTC (permalink / raw)
  To: Robin Murphy, Stefan Wahren
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, linux-hwmon, devicetree, linux-kernel

On 4/12/19 4:50 AM, Robin Murphy wrote:
> On 12/04/2019 12:07, Stefan Wahren wrote:
>> On 11.04.19 18:57, Guenter Roeck wrote:
>>> On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
>>>>    
>>>> -ATTRIBUTE_GROUPS(pwm_fan);
>>>> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
>>>> +				     int n)
>>>> +{
>>>> +	struct device *dev = container_of(kobj, struct device, kobj);
>>>> +	struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
>>>> +	struct device_attribute *devattr;
>>>> +
>>>> +	/* Hide fan_input in case no interrupt is available  */
>>>> +	devattr = container_of(a, struct device_attribute, attr);
>>> Field day for static analyzers - devattr is no longer used.
>>> No need to resend. I'll let the series rest for a couple of days
>>> and then apply to hwmon-next (after removing devattr) unless there are
>>> additional comments.
>>>
>> Thank you
> 
> FWIW you can have a
> 
> Reviewed-by: Robin Murphy <robin.murphy@arm.com>
> 
> for the whole series. The only minor comment that springs to mind
> isn't actually specific to this patch, so is probably best made as
> the follow-up below.
> 
> Robin.
> 

Any chance you can send the patch below as separate patch ? I track patches
using patchwork, and attachments don't show up there.

Thanks,
Guenter

> ----->8-----
> From: Robin Murphy <robin.murphy@arm.com>
> Subject: [PATCH] hwmon: pwm-fan: Report probe errors consistently
> 
> Printing the error code for a failure provides a head-start for
> debugging, since it's often sufficient to pinpoint the origin of the
> failure. We already do this for some probe-failure messages, so let's
> make the rest of them consistent.
> 
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> ---
>   drivers/hwmon/pwm-fan.c | 13 ++++++++-----
>   1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
> index 8c4c5eefd4ca..556db4bef743 100644
> --- a/drivers/hwmon/pwm-fan.c
> +++ b/drivers/hwmon/pwm-fan.c
> @@ -330,7 +330,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
> 
>   	ret = pwm_apply_state(ctx->pwm, &state);
>   	if (ret) {
> -		dev_err(&pdev->dev, "Failed to configure PWM\n");
> +		dev_err(&pdev->dev, "Failed to configure PWM: %d\n", ret);
>   		goto err_reg_disable;
>   	}
> 
> @@ -348,7 +348,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
>   		ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
>   				       pdev->name, ctx);
>   		if (ret) {
> -			dev_err(&pdev->dev, "Can't get interrupt working.\n");
> +			dev_err(&pdev->dev,
> +				"Failed to request interrupt: %d\n", ret);
>   			goto err_pwm_disable;
>   		}
>   		ctx->sample_start = ktime_get();
> @@ -358,8 +359,9 @@ static int pwm_fan_probe(struct platform_device *pdev)
>   	hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
>   						       ctx, pwm_fan_groups);
>   	if (IS_ERR(hwmon)) {
> -		dev_err(&pdev->dev, "Failed to register hwmon device\n");
>   		ret = PTR_ERR(hwmon);
> +		dev_err(&pdev->dev,
> +			"Failed to register hwmon device: %d\n", ret);
>   		goto err_del_timer;
>   	}
> 
> @@ -373,9 +375,10 @@ static int pwm_fan_probe(struct platform_device *pdev)
>   							  "pwm-fan", ctx,
>   							  &pwm_fan_cooling_ops);
>   		if (IS_ERR(cdev)) {
> -			dev_err(&pdev->dev,
> -				"Failed to register pwm-fan as cooling device");
>   			ret = PTR_ERR(cdev);
> +			dev_err(&pdev->dev,
> +				"Failed to register pwm-fan as cooling device: %d\n",
> +				ret);
>   			goto err_del_timer;
>   		}
>   		ctx->cdev = cdev;
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 13:50         ` Guenter Roeck
@ 2019-04-12 13:54           ` Robin Murphy
  2019-04-12 14:29             ` Guenter Roeck
  0 siblings, 1 reply; 14+ messages in thread
From: Robin Murphy @ 2019-04-12 13:54 UTC (permalink / raw)
  To: Guenter Roeck, Stefan Wahren
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, linux-hwmon, devicetree, linux-kernel

On 12/04/2019 14:50, Guenter Roeck wrote:
> On 4/12/19 4:50 AM, Robin Murphy wrote:
>> On 12/04/2019 12:07, Stefan Wahren wrote:
>>> On 11.04.19 18:57, Guenter Roeck wrote:
>>>> On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
>>>>> -ATTRIBUTE_GROUPS(pwm_fan);
>>>>> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct 
>>>>> attribute *a,
>>>>> +                     int n)
>>>>> +{
>>>>> +    struct device *dev = container_of(kobj, struct device, kobj);
>>>>> +    struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
>>>>> +    struct device_attribute *devattr;
>>>>> +
>>>>> +    /* Hide fan_input in case no interrupt is available  */
>>>>> +    devattr = container_of(a, struct device_attribute, attr);
>>>> Field day for static analyzers - devattr is no longer used.
>>>> No need to resend. I'll let the series rest for a couple of days
>>>> and then apply to hwmon-next (after removing devattr) unless there are
>>>> additional comments.
>>>>
>>> Thank you
>>
>> FWIW you can have a
>>
>> Reviewed-by: Robin Murphy <robin.murphy@arm.com>
>>
>> for the whole series. The only minor comment that springs to mind
>> isn't actually specific to this patch, so is probably best made as
>> the follow-up below.
>>
>> Robin.
>>
> 
> Any chance you can send the patch below as separate patch ? I track patches
> using patchwork, and attachments don't show up there.

Sure, can do - would you like an explicit R-b on #1 and #2 here for 
patchwork to pick up as well?

Robin.

> 
> Thanks,
> Guenter
> 
>> ----->8-----
>> From: Robin Murphy <robin.murphy@arm.com>
>> Subject: [PATCH] hwmon: pwm-fan: Report probe errors consistently
>>
>> Printing the error code for a failure provides a head-start for
>> debugging, since it's often sufficient to pinpoint the origin of the
>> failure. We already do this for some probe-failure messages, so let's
>> make the rest of them consistent.
>>
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>> ---
>>   drivers/hwmon/pwm-fan.c | 13 ++++++++-----
>>   1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
>> index 8c4c5eefd4ca..556db4bef743 100644
>> --- a/drivers/hwmon/pwm-fan.c
>> +++ b/drivers/hwmon/pwm-fan.c
>> @@ -330,7 +330,7 @@ static int pwm_fan_probe(struct platform_device 
>> *pdev)
>>
>>       ret = pwm_apply_state(ctx->pwm, &state);
>>       if (ret) {
>> -        dev_err(&pdev->dev, "Failed to configure PWM\n");
>> +        dev_err(&pdev->dev, "Failed to configure PWM: %d\n", ret);
>>           goto err_reg_disable;
>>       }
>>
>> @@ -348,7 +348,8 @@ static int pwm_fan_probe(struct platform_device 
>> *pdev)
>>           ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
>>                          pdev->name, ctx);
>>           if (ret) {
>> -            dev_err(&pdev->dev, "Can't get interrupt working.\n");
>> +            dev_err(&pdev->dev,
>> +                "Failed to request interrupt: %d\n", ret);
>>               goto err_pwm_disable;
>>           }
>>           ctx->sample_start = ktime_get();
>> @@ -358,8 +359,9 @@ static int pwm_fan_probe(struct platform_device 
>> *pdev)
>>       hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, 
>> "pwmfan",
>>                                  ctx, pwm_fan_groups);
>>       if (IS_ERR(hwmon)) {
>> -        dev_err(&pdev->dev, "Failed to register hwmon device\n");
>>           ret = PTR_ERR(hwmon);
>> +        dev_err(&pdev->dev,
>> +            "Failed to register hwmon device: %d\n", ret);
>>           goto err_del_timer;
>>       }
>>
>> @@ -373,9 +375,10 @@ static int pwm_fan_probe(struct platform_device 
>> *pdev)
>>                                 "pwm-fan", ctx,
>>                                 &pwm_fan_cooling_ops);
>>           if (IS_ERR(cdev)) {
>> -            dev_err(&pdev->dev,
>> -                "Failed to register pwm-fan as cooling device");
>>               ret = PTR_ERR(cdev);
>> +            dev_err(&pdev->dev,
>> +                "Failed to register pwm-fan as cooling device: %d\n",
>> +                ret);
>>               goto err_del_timer;
>>           }
>>           ctx->cdev = cdev;
>>
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt
  2019-04-12 13:54           ` Robin Murphy
@ 2019-04-12 14:29             ` Guenter Roeck
  0 siblings, 0 replies; 14+ messages in thread
From: Guenter Roeck @ 2019-04-12 14:29 UTC (permalink / raw)
  To: Robin Murphy, Stefan Wahren
  Cc: Kamil Debski, Bartlomiej Zolnierkiewicz, Jean Delvare,
	Rob Herring, Mark Rutland, linux-hwmon, devicetree, linux-kernel

On 4/12/19 6:54 AM, Robin Murphy wrote:
> On 12/04/2019 14:50, Guenter Roeck wrote:
>> On 4/12/19 4:50 AM, Robin Murphy wrote:
>>> On 12/04/2019 12:07, Stefan Wahren wrote:
>>>> On 11.04.19 18:57, Guenter Roeck wrote:
>>>>> On Thu, Apr 11, 2019 at 03:30:11PM +0200, Stefan Wahren wrote:
>>>>>> -ATTRIBUTE_GROUPS(pwm_fan);
>>>>>> +static umode_t pwm_fan_attrs_visible(struct kobject *kobj, struct attribute *a,
>>>>>> +                     int n)
>>>>>> +{
>>>>>> +    struct device *dev = container_of(kobj, struct device, kobj);
>>>>>> +    struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
>>>>>> +    struct device_attribute *devattr;
>>>>>> +
>>>>>> +    /* Hide fan_input in case no interrupt is available  */
>>>>>> +    devattr = container_of(a, struct device_attribute, attr);
>>>>> Field day for static analyzers - devattr is no longer used.
>>>>> No need to resend. I'll let the series rest for a couple of days
>>>>> and then apply to hwmon-next (after removing devattr) unless there are
>>>>> additional comments.
>>>>>
>>>> Thank you
>>>
>>> FWIW you can have a
>>>
>>> Reviewed-by: Robin Murphy <robin.murphy@arm.com>
>>>
>>> for the whole series. The only minor comment that springs to mind
>>> isn't actually specific to this patch, so is probably best made as
>>> the follow-up below.
>>>
>>> Robin.
>>>
>>
>> Any chance you can send the patch below as separate patch ? I track patches
>> using patchwork, and attachments don't show up there.
> 
> Sure, can do - would you like an explicit R-b on #1 and #2 here for patchwork to pick up as well?
> That would simplify my life a bit, but I can add that part myself to the patches.
I primarily like to have the patches in patchwork to make sure they don't get lost
and that I can pick them up again later if needed.

Thanks,
Guenter

> Robin.
> 
>>
>> Thanks,
>> Guenter
>>
>>> ----->8-----
>>> From: Robin Murphy <robin.murphy@arm.com>
>>> Subject: [PATCH] hwmon: pwm-fan: Report probe errors consistently
>>>
>>> Printing the error code for a failure provides a head-start for
>>> debugging, since it's often sufficient to pinpoint the origin of the
>>> failure. We already do this for some probe-failure messages, so let's
>>> make the rest of them consistent.
>>>
>>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>>> ---
>>>   drivers/hwmon/pwm-fan.c | 13 ++++++++-----
>>>   1 file changed, 8 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
>>> index 8c4c5eefd4ca..556db4bef743 100644
>>> --- a/drivers/hwmon/pwm-fan.c
>>> +++ b/drivers/hwmon/pwm-fan.c
>>> @@ -330,7 +330,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
>>>
>>>       ret = pwm_apply_state(ctx->pwm, &state);
>>>       if (ret) {
>>> -        dev_err(&pdev->dev, "Failed to configure PWM\n");
>>> +        dev_err(&pdev->dev, "Failed to configure PWM: %d\n", ret);
>>>           goto err_reg_disable;
>>>       }
>>>
>>> @@ -348,7 +348,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
>>>           ret = devm_request_irq(&pdev->dev, ctx->irq, pulse_handler, 0,
>>>                          pdev->name, ctx);
>>>           if (ret) {
>>> -            dev_err(&pdev->dev, "Can't get interrupt working.\n");
>>> +            dev_err(&pdev->dev,
>>> +                "Failed to request interrupt: %d\n", ret);
>>>               goto err_pwm_disable;
>>>           }
>>>           ctx->sample_start = ktime_get();
>>> @@ -358,8 +359,9 @@ static int pwm_fan_probe(struct platform_device *pdev)
>>>       hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan",
>>>                                  ctx, pwm_fan_groups);
>>>       if (IS_ERR(hwmon)) {
>>> -        dev_err(&pdev->dev, "Failed to register hwmon device\n");
>>>           ret = PTR_ERR(hwmon);
>>> +        dev_err(&pdev->dev,
>>> +            "Failed to register hwmon device: %d\n", ret);
>>>           goto err_del_timer;
>>>       }
>>>
>>> @@ -373,9 +375,10 @@ static int pwm_fan_probe(struct platform_device *pdev)
>>>                                 "pwm-fan", ctx,
>>>                                 &pwm_fan_cooling_ops);
>>>           if (IS_ERR(cdev)) {
>>> -            dev_err(&pdev->dev,
>>> -                "Failed to register pwm-fan as cooling device");
>>>               ret = PTR_ERR(cdev);
>>> +            dev_err(&pdev->dev,
>>> +                "Failed to register pwm-fan as cooling device: %d\n",
>>> +                ret);
>>>               goto err_del_timer;
>>>           }
>>>           ctx->cdev = cdev;
>>>
>>
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support
  2019-04-11 13:30 [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Stefan Wahren
                   ` (2 preceding siblings ...)
  2019-04-11 13:30 ` [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Stefan Wahren
@ 2019-04-12 17:35 ` Guenter Roeck
  3 siblings, 0 replies; 14+ messages in thread
From: Guenter Roeck @ 2019-04-12 17:35 UTC (permalink / raw)
  To: Stefan Wahren, Kamil Debski, Bartlomiej Zolnierkiewicz,
	Jean Delvare, Rob Herring, Mark Rutland, Robin Murphy
  Cc: linux-hwmon, devicetree, linux-kernel

On 4/11/19 6:30 AM, Stefan Wahren wrote:
> Contrary to the gpio-fan the pwm-fan driver isn't easy to setup
> with pwmconfig/fancontrol because of the missing hwmon sysfs entry
> for actual revolutions per minute. This series adds this feature.
> 

Series applied to hwmon-next.

Thanks,
Guenter

> Changes in V5:
> - address Guenter's and Robin's comments:
>    - use of_property_read_u32 to get pulses-per-revolution
>    - call platform_get_irq ealier to avoid glitches on the regulator
>    - simplify pwm_fan_attrs_visible
> 
> Changes in V4:
> - remove copy & paste artifact in dt-binding example
> - switch to u64 for rpm calculation
> - drop overflow handling and init atomic
> - handle 0 not as valid irq
> - reduce range of pulses_per_revolution
> - handle probe defer of platform_get_irq
> - delete timer properly in bail-out path
> 
> Changes in V3:
> - rename property interrupt-ratio to pulses-per-revolution
>    to avoid confusion with interrupt binding
> - handle error case pulses-per-revolution = 0
> - bail out properly in case we are unable to request the irq
> 
> Changes in V2:
> - address Guenter's comments:
>    - improve description of interrupts
>    - use atomic_t to avoid races of the pulse counter
>    - measure sample time to make rpm more reliable under load
>    - make sysfs entry fan1_input conditional
> - add dt-property to define interrupts per fan revolution
> - example for fan with RPM support
> 
> Stefan Wahren (3):
>    dt-bindings: hwmon: Add tachometer interrupt to pwm-fan
>    Documentation: pwm-fan: Add description for RPM support
>    hwmon: pwm-fan: Add RPM support via external interrupt
> 
>   .../devicetree/bindings/hwmon/pwm-fan.txt          |  21 +++-
>   Documentation/hwmon/pwm-fan                        |   3 +
>   drivers/hwmon/pwm-fan.c                            | 107 ++++++++++++++++++++-
>   3 files changed, 126 insertions(+), 5 deletions(-)
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-04-12 17:35 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-11 13:30 [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Stefan Wahren
2019-04-11 13:30 ` [PATCH V5 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan Stefan Wahren
2019-04-11 13:30 ` [PATCH V5 2/3] Documentation: pwm-fan: Add description for RPM support Stefan Wahren
2019-04-11 13:30 ` [PATCH V5 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Stefan Wahren
2019-04-11 16:57   ` Guenter Roeck
2019-04-12 11:07     ` Stefan Wahren
2019-04-12 11:50       ` Robin Murphy
2019-04-12 13:50         ` Guenter Roeck
2019-04-12 13:54           ` Robin Murphy
2019-04-12 14:29             ` Guenter Roeck
2019-04-12 13:15   ` Enrico Weigelt, metux IT consult
2019-04-12 13:35     ` Stefan Wahren
2019-04-12 13:47       ` Guenter Roeck
2019-04-12 17:35 ` [PATCH V5 0/3] hwmon: pwm-fan: Add RPM support Guenter Roeck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.