From patchwork Wed Jan 30 15:07:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 10788767 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 42EE76C2 for ; Wed, 30 Jan 2019 15:08:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 31A532F272 for ; Wed, 30 Jan 2019 15:08:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2FC552F519; Wed, 30 Jan 2019 15:08:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B19E22F6AB for ; Wed, 30 Jan 2019 15:08:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728111AbfA3PIN (ORCPT ); Wed, 30 Jan 2019 10:08:13 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:39497 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731398AbfA3PII (ORCPT ); Wed, 30 Jan 2019 10:08:08 -0500 Received: from stefan-Vostro-260.fritz.box ([109.104.32.180]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MZCSt-1gbP4K00xd-00V5PO; Wed, 30 Jan 2019 16:07:37 +0100 From: Stefan Wahren To: Kamil Debski , Bartlomiej Zolnierkiewicz , Jean Delvare , Guenter Roeck , Rob Herring , Mark Rutland Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Stefan Wahren Subject: [PATCH RFC 1/3] dt-bindings: hwmon: Add tachometer interrupt to pwm-fan Date: Wed, 30 Jan 2019 16:07:05 +0100 Message-Id: <1548860827-29796-2-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> References: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K1:rpmX0OqnhUWw39eh95mqXLGvwhXBdHLqF9lnRb5QAST3LBzXHkj LSb+h/tXe+z/daqnLB1VWfnGdcm/8xHkf+m3SqSeo1AFtpLiIUmb+cVgqQBDSvoQkXnyWD4 TVthKb7siumaFPNJf1sBACCkWOuV9mn1uA54I6OLdQumESzjRkKcUSOruVSK0Kv9qbED9ij bxYEoiRU08vpA0sCZ0QiQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:z6IWSm/u2Fc=:M8nIZ9TnFr3rhR2vRkc6vO y4czcvB0OmQvoYrlY2kXAOZ6X7JCq+st67oITufgPT2iYnqRYV5DRhwfWc2yIO3Ki0VeB/eEj DjGy2KXC2WCW5w1hYqV4GlVQgTEUl2WIK0E+bu6uavShta3bPDfldokbkR8/lehFT4JFM+nxs VqeZePhanPkkrmG5jYxvkrei3tebuxZWl/zzb4nde+/WoHtCPLAdfpcYPNfQszq+WvixEpebT GOjwW/nAN5H0C41k3luw7y4D3nGx82f1hBDMvt2NOhjanDa1fOIARyxMBZi9YtOivzvEFm3Tb x6lDuiEoh1ehebyUvHeutZERc631EIGdQd3mcL9CteJJTlE/JwbIP6UfXWJSQ0zaZtLSf69/p swvzbesdJEzCzxL9bGcg8Uo90dGbRH6yMthXVa1V/kEZtlVez/lhz67kAA/7f8AppNelbgEOe 8GSzIijB4AhB4b7nMzXP2vPR8V1dJcFNqDvQGjOjNy3FLxCbGmKYIiivbdI7m63U7L/qYvdsC t8WtOHQZyifdRbUrHxvD3zMyHLU3Vl3/ecPLgQ3DliDaQ/hz4bgJ7w7eelRHa4wuDawjIjawJ iVeP7rDqBy/1+CNyZn1BrxrN4GEMuekPf7GPeoIBhCeMCgbWiYPyCAIUQD+F1JPy/arN34wU+ RvU0FH/HucZHJG5T37p9lWd2kFUWSBlfyWkvj6JaDLcaKa3WKyX/C2D4tk+IGMFzDG4ng9MbT sYaPXusPABIydO0k6eJgjcPYe7Spi0QhhkUxhdKfH3A84aRBObkWGsRjH/0= Sender: linux-hwmon-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This adds the tachometer interrupt to the pwm-fan binding, which is necessary for RPM support. Signed-off-by: Stefan Wahren --- Documentation/devicetree/bindings/hwmon/pwm-fan.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/pwm-fan.txt b/Documentation/devicetree/bindings/hwmon/pwm-fan.txt index 49ca5d8..7f69b0b 100644 --- a/Documentation/devicetree/bindings/hwmon/pwm-fan.txt +++ b/Documentation/devicetree/bindings/hwmon/pwm-fan.txt @@ -8,6 +8,9 @@ Required properties: Optional properties: - fan-supply : phandle to the regulator that provides power to the fan +- interrupts : contains a single interrupt specifier which describes the + tachometer pin output of a 2 pulse-per-revolution fan. + See interrupt-controller/interrupts.txt for the format. Example: fan0: pwm-fan { From patchwork Wed Jan 30 15:07:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 10788765 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AE7AC6C2 for ; Wed, 30 Jan 2019 15:08:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9AA952F683 for ; Wed, 30 Jan 2019 15:08:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9873E2F6A6; Wed, 30 Jan 2019 15:08:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 905EE2F6AB for ; Wed, 30 Jan 2019 15:08:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727356AbfA3PII (ORCPT ); Wed, 30 Jan 2019 10:08:08 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:46205 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727371AbfA3PIH (ORCPT ); Wed, 30 Jan 2019 10:08:07 -0500 Received: from stefan-Vostro-260.fritz.box ([109.104.32.180]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M6DSo-1gmdSz1Fai-006hqN; Wed, 30 Jan 2019 16:07:37 +0100 From: Stefan Wahren To: Kamil Debski , Bartlomiej Zolnierkiewicz , Jean Delvare , Guenter Roeck , Rob Herring , Mark Rutland Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Stefan Wahren Subject: [PATCH RFC 2/3] Documentation: pwm-fan: Add description for RPM support Date: Wed, 30 Jan 2019 16:07:06 +0100 Message-Id: <1548860827-29796-3-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> References: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K1:/YIqKdqgVDmYWEMiLNtyELC/NS1lKvJ0Jspw1LEnainiPq0TU80 aOfym8HojknQ5XmBInoMITqNHXkBdTupzva1jaoVRS3jGzd6i0B59WbgWTmTcwBKDhO8wjr 3t20HPdXrzajtTc3IRAW8LGfU8qilgIIG5lkf1xzVvBHjA5aU0ZgXOJTHWrexLXg0vfCH6t 9LKMRZSXMwsZ5IR893u1g== X-UI-Out-Filterresults: notjunk:1;V03:K0:3rWlNTitYmI=:j1cLP4tlq6KCZeJ5ltKeBC GtDSBTxSCpr4gTR8xRASzN7rAlljpStiU0MFvOBaDcSmKd+qGX3Oxvb31lyULMJLAAFYxGJ/l v/APg/bbe8O+ZLn3NNYWX2EpeaaJ9HRFtleYttwOa6t85IkXsm40TY8HVdAZtiS3CoFgraaKM 1u5+kOCS/e/PQkL5gUFGT4aSS5t9W20txGu0yJu1m56xWvFk+gFFQUkoOpMhd0jFSoUxhmNDK 8s8tymjJeqeikSCqmX2QlTLOJvL9ir2G1kKQLkN6QdWq33WmEj+2IOGLTbRSX1/xHIAGGrb4r xmN99EqAqsVwNNOe/346gMWzZyslauk/TqzeAt1Wdf6hYO1lEaZ5WPO6Ih1J9fVp78BXt2tLy LHoHKnUVeWmmVR+4oE7q9hlRk83P9vo+UAAx4PUhSMQnTGnmxiJQhKtTgGpQByarJsVjLZlR1 fvF/TmCk4cvgvL1C6oiIAbsB2DalKFuhBL8fkUc437E80DwZ92zJVSw0i2hBQHpJlqYVZNyZx eXTdnDmaXtS2Z/RhtuumGPb2K/bM2Hinp+ukOR65a741JdQiTxLG+4jYsCVuiY39lhOFIFWrx FtJgNHG/FRPZvq8otRgdC36o3AznOfJxUqyDIRkIbVM1aK71SKIMcS1hEGPEJ7YdhDhFm1Bam J0mR13mXMaySKb1LZbjCSRtwadfNx3pg564PKdsmglsRnJlQMo0p4kbscxWnlxztJw+zML5UX LWCl4XnuWZ3e0cge+fOpmUNjB0cD38j5VV2uv9z1isJF0MZeR//Tvwk1CDE= Sender: linux-hwmon-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This adds a short description for the new RPM support of the pwm-fan driver. Signed-off-by: Stefan Wahren --- Documentation/hwmon/pwm-fan | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/hwmon/pwm-fan b/Documentation/hwmon/pwm-fan index 18529d2..a1ba34c 100644 --- a/Documentation/hwmon/pwm-fan +++ b/Documentation/hwmon/pwm-fan @@ -15,3 +15,7 @@ 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 measured fan rotation speed returned via 'fan1_input' is derived +from the sampled interrupts from the tachometer signal by assuming +a 2 pulse-per-revolution fan. From patchwork Wed Jan 30 15:07:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 10788795 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0AF0613BF for ; Wed, 30 Jan 2019 15:09:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EDE502F6A4 for ; Wed, 30 Jan 2019 15:09:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E1E3F2F6B1; Wed, 30 Jan 2019 15:09:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 792B52F6A4 for ; Wed, 30 Jan 2019 15:09:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731006AbfA3PJZ (ORCPT ); Wed, 30 Jan 2019 10:09:25 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:41587 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728704AbfA3PIe (ORCPT ); Wed, 30 Jan 2019 10:08:34 -0500 Received: from stefan-Vostro-260.fritz.box ([109.104.32.180]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1Mt6x5-1h8J3Q2ZQ1-00tSws; Wed, 30 Jan 2019 16:07:37 +0100 From: Stefan Wahren To: Kamil Debski , Bartlomiej Zolnierkiewicz , Jean Delvare , Guenter Roeck , Rob Herring , Mark Rutland Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Stefan Wahren Subject: [PATCH RFC 3/3] hwmon: pwm-fan: Add RPM support via external interrupt Date: Wed, 30 Jan 2019 16:07:07 +0100 Message-Id: <1548860827-29796-4-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> References: <1548860827-29796-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K1:6PYVM5mOr+jBDqoqPfyVkKi+e0aGZeVm24bfzZGyzxFAih7gpae raII4Co9rIKaOdehU6cr+sKJGKFDK0+LdZ7ext2u1mV+deLQkPbemEULY/35iHFGKT+1YD9 94aJjLzqIID3Ss1/9a8YszSUHfuK8FZR0xqIo5CGkojiQrs/fwK3YOi7frm3nYgYHGW3SDC 15TQNyOBM5d8qcXUoXAKA== X-UI-Out-Filterresults: notjunk:1;V03:K0:ix9sLYOMfN0=:37umqU0jLHN7b4sJINs0Ud DSyUoEmuFZ1bxKaWUjHbstLKfIvQQ4scDwG/KrX1XRZ7SCCUQKeB3ugQzFhq994piG3qg0PEK cadW2OWd0jF9XTLPkCiWUUbBEY4T7Z+unaaaaiXFhCxgnFoLr/lQVl4GkLEO3/GfhVpNYFtcN 0Xn/ETEq1FH2sNb1+ITxgWNBZek2S+FtI7se5K95bmQ0CfDx15p1s+mdJkvjasChZUtuKzz0o ecrxEFCShzw0erB1Yzio1RSeiQamgPb6rpR9J4kuJG/TCWFCPapj2fMvTDJNxai5LXa+gAhDt xm4KNrvsek0tySzrHxPrh70P20DO/HL7U6oPX8ZLIakosi6ujZry1Ikii4B9eQnrjfWCf3AtC p4yAjdLk9mN4Utdxw1rMYB9DEmGW3Lds1dOhofcheJm2/m1wc9Ck00xvUvnp8c1y7bWndiJ5k waKevZR32KS1SBo9ZhbWczEULfespHMPhWYtWPwV0pQvZxJav8hnmnjaIOPhXG2UIxD7byMbO 8Y935Ps5SDEK+wTEhg+n9+MP5A4RPB3bizp19To5boVFReOz0xufsOn0Ejro9kS0dZ0yVA9TU k/RtcNHswm6MdtsRHYILdMa2XY7pe614U3FzJ1tipi1a3fLWz8KeoVyZS8eanLIXgfgdu0/cN PGZxXhzgtPSxh4oC6HedzyQ4Iyvv16jzTewOFJQkVlAX6GpbvyjDQvh8u1g1nKqI3fDEhP3ze 4A9i+Kc63MTey8UVxPOiyxWCYVHF+GhIYcpDgytNKjldZ8E+xkRYKmh7814= Sender: linux-hwmon-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This adds RPM support to the pwm-fan driver in order to use with fancontrol/pwmconfig. This feature is intended for 2 pulse-per-revolution fans which provides a tachometer output signal. Signed-off-by: Stefan Wahren --- drivers/hwmon/pwm-fan.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c index 9e0591e..731fdc6 100644 --- a/drivers/hwmon/pwm-fan.c +++ b/drivers/hwmon/pwm-fan.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -26,13 +27,22 @@ #include #include #include +#include #define MAX_PWM 255 +#define SAMPLE_TIME 1 /* seconds */ +#define PULSE_PER_REVOLUTION 2 struct pwm_fan_ctx { struct mutex lock; struct pwm_device *pwm; struct regulator *reg_en; + + int irq; + unsigned int pulses; + unsigned int rpm; + struct timer_list sample_timer; + unsigned int pwm_value; unsigned int pwm_fan_state; unsigned int pwm_fan_max_state; @@ -40,6 +50,27 @@ struct pwm_fan_ctx { struct thermal_cooling_device *cdev; }; +static irqreturn_t pulse_handler(int irq, void *dev_id) +{ + struct pwm_fan_ctx *ctx = dev_id; + + if (ctx->pulses < INT_MAX / 2) + ctx->pulses++; + + return IRQ_HANDLED; +} + +static void sample_timer(struct timer_list *t) +{ + struct pwm_fan_ctx *ctx = from_timer(ctx, t, sample_timer); + unsigned int pulses; + + pulses = ctx->pulses; + ctx->pulses -= pulses; + ctx->rpm = pulses * 60 / SAMPLE_TIME / PULSE_PER_REVOLUTION; + mod_timer(&ctx->sample_timer, jiffies + (HZ * SAMPLE_TIME)); +} + static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm) { unsigned long period; @@ -100,11 +131,20 @@ 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, }; @@ -263,6 +303,19 @@ static int pwm_fan_probe(struct platform_device *pdev) } } + timer_setup(&ctx->sample_timer, sample_timer, 0); + + ctx->irq = platform_get_irq(pdev, 0); + 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"); + return ret; + } + mod_timer(&ctx->sample_timer, jiffies + (HZ * SAMPLE_TIME)); + } + hwmon = devm_hwmon_device_register_with_groups(&pdev->dev, "pwmfan", ctx, pwm_fan_groups); if (IS_ERR(hwmon)) { @@ -304,6 +357,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->sample_timer); + if (ctx->pwm_value) pwm_disable(ctx->pwm);