From patchwork Thu Sep 7 05:26:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13376164 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A0BCEE14D3 for ; Thu, 7 Sep 2023 05:27:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234910AbjIGF1I (ORCPT ); Thu, 7 Sep 2023 01:27:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233055AbjIGF1I (ORCPT ); Thu, 7 Sep 2023 01:27:08 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0B4A19BD; Wed, 6 Sep 2023 22:27:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694064406; x=1694669206; i=w_armin@gmx.de; bh=ZE1f7vvKf+kQRkldYDJVyR1PVo0LRUHCu1/yqa0+JUk=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=uLNzU/EVrbsgCk89xlVgQ79e4xRsJPcnMnaWOKrW+vSh6RDv5+8wSTOBXueGdI4iZfv7Stb /MBn1BAoISpUssA6nKTTdc1H5EPyaFZ80fSah5TG0b2VBKYxA0n8OVkfcoNnalcExIi7j65yI rJVg9k0qXyzoMbFPJeSuyobibOuRoL7UjwIFyGiYcaYEkP6/j5oHW2QASZmGpRdihkNZFelPg mhquI6aMKUogdEAicJoblaiZZbX/G5BS5z5O/s76oux3G/jmMtQU6ww6rSIgxojl1Y/99rhEa RWW6N/oNgEpdJ5dkbHE5CYciEac5QS32b7vpox5GRCPVhql79MLQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MmDEm-1pwIPV407E-00i8hv; Thu, 07 Sep 2023 07:26:46 +0200 From: Armin Wolf To: hdegoede@redhat.com Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/5] hwmon: (sch5627) Use bit macros when accessing the control register Date: Thu, 7 Sep 2023 07:26:35 +0200 Message-Id: <20230907052639.16491-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230907052639.16491-1-W_Armin@gmx.de> References: <20230907052639.16491-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:XJZKdDFPrkwWi3gzEE3ykk5sc9pNH+jwZy9evoepTPk54k3vmfc X3PNqxCHGlr6dVX3ZjGsfwVwDW6/GH3PkOyhriCOR41Ks5oUrJpfPdKOl4KnkG8Z2Xnj4G5 uOaRqF6N4/yB1y+LOw4bZ0xQyM5pcjWYhLNhoXMJqYh3dtJrUS8J0gAUb+JgHkwMkxbBhMV b8Zdqy9KH4dJvijYZGzgg== UI-OutboundReport: notjunk:1;M01:P0:C4qCTuLlA4w=;bwcYVqlziBQ+03jN2bcDA8HxFni t6IiaJr63sCwKPo1JCh13WZ9ubS6xCWcQwDLxRGVnBnYdYPPnWchQsFmbevs6noLr3WP8fmUV BvACB9JbP58UHj9+olKl243LcWLqjm/gkggZYEY0jbXkmfgvVEoGH1l8ySxABs2VMX0hgTvEo dZWItdHZu7nLOvWzB1rt/04IrwRA8PePMQWsshAtD2F5TY/33z57+bayDvhEr4FTKsZALDbUL jllooKBVMxqZq8Q2/H2ktp/E34bZXj3ud1ZEZaLEQqel31DV4Ze2c5S1VbEWapsVfL0ci509R sY2LmKunOq9JBnEGaFEEIVciHHR7AWrTPCVvPXnnibNnDXQ6xNXhp+wnkz9iBN1Ta2ZRyVygh aLQU1hC6vN9VfReMywV9Bh8ZuDM7fSQJvu4N1cGy9y2ybBKhVZmr5p9JQBM1qlqDY0Slh4IXe OJeMWHdehkNYrXUJX1tOu3U3jeYlcDtBk1tJJ0dcZld+uhBVhlAo4IxBbx8uqUEIGG4NOWt8v 8ae5QVWGd3HO4az+oj6ThXoMcuixBlC5upEo8KDCfkarqhA5jYXIZmX9o55FEn9hDamVqU5wx ODefp0Mo2tDboY7bZPSpl5g0Cw6uJDDsxqzGR81tjlREWgEu/mAqbx+lTyc8c54KaVU5Alp4X iulWI3ksEB/Yuixym/nd9TmpPhgzQMKYZkDqikz8Pa7tUWYn+RebE1XKYwxBUVfRu13b3qChL 9RGHZGjWMTdGDV09E0Jsl/pOlKykzHwLMWDMZjzHgo/owrRYcXDBILCgiJbiXQXcocZ7pPWfy N2BnJnL5dQ8fXyVhFx89QgPB7T6l0YBt3iHKxLo7ZYHc7xslpom6hn5fgp9T/x3Ww29G4qXVz 9h/ltlKxcb0t438V8kjFGALPYYC8yknm02uCooiEc+83TnQLxoNRQWdKjKePjmy2w7TCvCnKE qZRjA63suZQqRqAVwgPb/j3C8tc= Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org Use bit macros then accessing SCH5627_REG_CTRL, so that people do not need to look at the datasheet to find out what each bit does. Tested on a Fujitsu Esprimo P720. Signed-off-by: Armin Wolf --- drivers/hwmon/sch5627.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) -- 2.39.2 diff --git a/drivers/hwmon/sch5627.c b/drivers/hwmon/sch5627.c index 1bbda3b05532..0eefb8c0aef2 100644 --- a/drivers/hwmon/sch5627.c +++ b/drivers/hwmon/sch5627.c @@ -6,6 +6,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include #include #include #include @@ -32,6 +33,9 @@ #define SCH5627_REG_PRIMARY_ID 0x3f #define SCH5627_REG_CTRL 0x40 +#define SCH5627_CTRL_START BIT(0) +#define SCH5627_CTRL_VBAT BIT(4) + #define SCH5627_NO_TEMPS 8 #define SCH5627_NO_FANS 4 #define SCH5627_NO_IN 5 @@ -147,7 +151,8 @@ static int sch5627_update_in(struct sch5627_data *data) /* Trigger a Vbat voltage measurement every 5 minutes */ if (time_after(jiffies, data->last_battery + 300 * HZ)) { - sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, data->control | 0x10); + sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, + data->control | SCH5627_CTRL_VBAT); data->last_battery = jiffies; } @@ -483,14 +488,13 @@ static int sch5627_probe(struct platform_device *pdev) return val; data->control = val; - if (!(data->control & 0x01)) { + if (!(data->control & SCH5627_CTRL_START)) { pr_err("hardware monitoring not enabled\n"); return -ENODEV; } /* Trigger a Vbat voltage measurement, so that we get a valid reading the first time we read Vbat */ - sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, - data->control | 0x10); + sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, data->control | SCH5627_CTRL_VBAT); data->last_battery = jiffies; /* From patchwork Thu Sep 7 05:26:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13376165 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4DD96EE14DA for ; Thu, 7 Sep 2023 05:27:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229536AbjIGF1J (ORCPT ); Thu, 7 Sep 2023 01:27:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234725AbjIGF1I (ORCPT ); Thu, 7 Sep 2023 01:27:08 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14D2A1BC1; Wed, 6 Sep 2023 22:27:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694064407; x=1694669207; i=w_armin@gmx.de; bh=VL89bgwCVumbjJHekcMuzXVA40kQqHLT81C/Fqe5Plk=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=nN1ugWyyYXysS8jjEXB6WbZ6GtnkT1A8PS4GPjrzRG/PFYfwd5wrZOYWcOANtmnUip1RFuv mDt0vSm9elSNU9pWCuBA93AJGK3YLgJ7H59iTV2tdlBRdympka7FOdtlre/kXNx5INUd25gk2 RzYX2bD7zams2OoTyf1qm0I3ysR4bgPOcTotxAdZO7qNLhyvBKncC5LS47TQNS+1YezzW4U4H OrIsXTu7Dk2mBXEdicV7xvnWxMODiSf8rR4gLVbeVqs+Jc0EVgpW5TP4Q0msaCwUjeK5UKP9K cidOL4gvsPqrPPkZLW2DilHyUv8lo0rsFRI06r/dn0D0r7H3W0Qg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MVeI2-1qEmfL17x6-00RVa4; Thu, 07 Sep 2023 07:26:47 +0200 From: Armin Wolf To: hdegoede@redhat.com Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/5] hwmon: (sch5627) Disallow write access if virtual registers are locked Date: Thu, 7 Sep 2023 07:26:36 +0200 Message-Id: <20230907052639.16491-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230907052639.16491-1-W_Armin@gmx.de> References: <20230907052639.16491-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:V2fE8OIZE8d2olKNcZEIJ3FsaigRDSkLapPtWqWI5T7ks7ZZlfC CflLr5/epONeoXjuu1e7GPSs9X6B2gQ3T1W3NzRe0v6DyrTsf8XnmEfm+4S0Xg52nNwyMmk SZ0GnMLwWKItjZ6aeB/FyKgAh5R8auRR/IsBbBvle1ymkhPlNqcMs+VwovmQow912/UYoXN xVUFfRv/QYcgBA0YWJtzQ== UI-OutboundReport: notjunk:1;M01:P0:xtplv7GNq3A=;gK9d4wS87xn8uR7BHOhEMkiHTlP HtxR7FG7SPQ4tL1KwpRG93dbkh0rpeMSQRC5kRIGmnlHoT2giktz01RvSTIXAPBqS0yqhd1cl xETPvlaTVIiqUjew5PoQmNxD5gOzs6l8uk8qAdSbGliN2mDVJqniEjv2WqHvKRXO/OkSpPl/b dQLmKWvn24ggUnPZs2i4ewSrGZc14Hdiw05oA5r/HNNjpWdW3SRBJKjg7jzVRW+rFeqDvoxQx kJGZL/8XfPFUUD/Mw5IbwXu9H37voZLoNQkGl0ggg82FksOuZzc0ukd+DBICgVUSjBDQwpBk7 HzOQR7hkiOjZCtHh2O8SewFJId3naeGw7R3saPXVTFg6NVBnVx2NWWD4d70hfq3Bk3aOfBoSF YMSbjl6JFOzrT8+3BCC1qP5cr6j2AxF2+nAQBfoP64Ywwh2LwxENVxqmobLnKS5kA+NY9hxnA auYrm+YA1/MmsM0IPUGihHBZwXfXDjYDfZHEPom1DWxbWyX3WZM2B7HIVBUt1Y4ojWiwbOK8Q la7RsOZJ4u//joezE9tW6hXeJSZaNH7mqPoLCr51z4HDjwFmtfcSRcU448Dv5FwqLixlx4pJn JrRsLiv9r4o1LjqMUqkyyvGdUgP9GX60/8GrZMitZrwRTfM+4qqVOw3iCT3xAZPGnr+nOLNF9 PmAtdNp59cg31VonvNDEpE4PPmx0IaJ93RbGsmOYEfPxR0s8b4m+gbDdlXYFJC7a9uYhfq/Xt sk8t1UXGVgn48Hzw+nBe1ArcaVaz2FhwC4cF2nLUlUNGTFVO9HNxveI8cYm9LUbHnFNUAIvSC iTcIz8HC51GaI7nzAfpeyX9aLEM0SS3OCk6zMGKiTmQz5CwRZcRxpT2+Cpdt785XHfyLA6mJq r+okl8lmMOboT6gJBUDDRjmMBqqjdb5/+KHvvWPDKVuvqgjnQEzWtk9UatF8+cCx9aGI4Pxn7 SV2aa6KBCkl5d347TEPChDcW9Nk= Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org When the lock bit inside SCH5627_REG_CTRL is set, then the virtual registers become read-only until the next power cycle. Disallow write access to those registers in such a case. Tested on a Fujitsu Esprimo P720. Fixes: aa9f833dfc12 ("hwmon: (sch5627) Add pwmX_auto_channels_temp support") Signed-off-by: Armin Wolf --- drivers/hwmon/sch5627.c | 9 +++++++++ 1 file changed, 9 insertions(+) -- 2.39.2 diff --git a/drivers/hwmon/sch5627.c b/drivers/hwmon/sch5627.c index 0eefb8c0aef2..bf408e35e2c3 100644 --- a/drivers/hwmon/sch5627.c +++ b/drivers/hwmon/sch5627.c @@ -34,6 +34,7 @@ #define SCH5627_REG_CTRL 0x40 #define SCH5627_CTRL_START BIT(0) +#define SCH5627_CTRL_LOCK BIT(1) #define SCH5627_CTRL_VBAT BIT(4) #define SCH5627_NO_TEMPS 8 @@ -231,6 +232,14 @@ static int reg_to_rpm(u16 reg) static umode_t sch5627_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) { + const struct sch5627_data *data = drvdata; + + /* Once the lock bit is set, the virtual registers become read-only + * until the next power cycle. + */ + if (data->control & SCH5627_CTRL_LOCK) + return 0444; + if (type == hwmon_pwm && attr == hwmon_pwm_auto_channels_temp) return 0644; From patchwork Thu Sep 7 05:26:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13376166 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CFC98EE14D3 for ; Thu, 7 Sep 2023 05:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237021AbjIGF1K (ORCPT ); Thu, 7 Sep 2023 01:27:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235843AbjIGF1J (ORCPT ); Thu, 7 Sep 2023 01:27:09 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58EC119A5; Wed, 6 Sep 2023 22:27:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694064408; x=1694669208; i=w_armin@gmx.de; bh=HBQIPXlFsmWvlVKIzZw0COze2AuYo9xUc/mY/PUIOA8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=gBoITLXD/DgIqUg5gmxdvEfsZ89puU0UgRg0eFkKZbiEU4bRgUhWAhZpRz4/flbbx6b1vd6 D1kO+8DF9xRUTBvMirEmZl4HgmMx1OMaN2UrJIUdRZ3lTWgOUssRlzt7DW/8b33GK1CH0VyFd a3iy39M6cTfODdQI4LVuVZZOReldBljCrcsIV2nBwqN1suz8KyucwRoK65a+UFff703Gy26gd z23Fk0lfJHzJMw2LT2SDXuvSN5Vs28tZwenhVvO82GDUxT8/f0mRImNsBR+hbJgGNcoxzVhey C/LWo0LSXa6hmZhOcWKezLrStLaorCKOyK9WpPE10XcoK1ScbRMw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mg6Zw-1q04xC2lnK-00hi4d; Thu, 07 Sep 2023 07:26:48 +0200 From: Armin Wolf To: hdegoede@redhat.com Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/5] hwmon: (sch5627) Use regmap for pwm map register caching Date: Thu, 7 Sep 2023 07:26:37 +0200 Message-Id: <20230907052639.16491-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230907052639.16491-1-W_Armin@gmx.de> References: <20230907052639.16491-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:H5lbivJ4Y/njBPLw1JtYYcaz8XiywCbrQK5WqQfcjplBWBAUQji DLIE2ugi65c3BmzCsGCZxQIFQoBX+Ur3623qLiRorKevMekB+cwziq6XblVvYPABiBIR9Nf omM8UetVfYdKG73k2evQXqvNc/FUUh0M1wvHfJC9A/zdB5Nm+vySdOuHYpPFLcAC0A7ND2m z1cOlOxPyI6UXNyxFCYQg== UI-OutboundReport: notjunk:1;M01:P0:H7S92kz38Rk=;KexKrBP0gxdY2awkSiOe1OGqTX7 g4h2ebJnwCuBmCW69HJYr+i+38Sr4DftA5R9eVHr55XHmHizh4j85T9vy9sEuaCKHvzt1ygYI KDcIYRgWMc1XVrY+MD6Wlk9W33d1rvxA+N4jtud2gMnZXPLHHM38Qo5dq4DISEdjY/6Ch5sD9 ADaBjbHKB3wIzNlK9SdaHnW1kBPEcJV/H2UYeak1LnC3q29JJSmQ+1+bIuMzaAJFPbvqn/dEp pXyAOHO2DjiwWx0ZCvADjV5YrjJ+y2sTLRgMT8SHGYn94wDDtWVu4BnwbbJfgelXME4Cka3Vn uyXcU+RL01qDNB+DjLoaoVuQ/risIQ8wKf3VYO7UZgp7Frkdv6zMgH888giagZ6l9X4aUNWZc vnKL8XGwh6iNAMXFi2mFVHFWZxw4KL8A/82vUpOMKq+ZWAJdiqCMTJJUQSPGC+dG+eZog05Iw evKnGVBKvIiouU/hzz5ph5xXj2nD9776prW/zUD31eVlT5fzuxXPfwcydv1Mhi8MI1t7URYpW mqp1v8G327k7IViLVGTEtwEh6UP8zOK0kwRFOHTbQZIi4P2n/6Dpp6kOozWT17H50VMNhpNFp kzHNEuJlGJ/Oecy61F02ab3WPYCVzMWo1DEormIqX7QHrLcdPKhPXRIO2+h1KC6+U4M4CLhR7 Rf4qJ6qYn8pSdv2bHKKK+RB8uhVzViD6UA2MRXsierCXsM+RfrciGAFWK04Q/xhZycH+K5heH U4LJ2BgYgBFpL4cyR48TLY3VGBISz9YPdLTYujQrM6Ui2iw8moMd6KScnkva71vhVdHowrkJ2 65mp4DLHVByE6nFkhq6ml6kfhHYLcCwntV+naEUrYwwMWsIk4/W+4wLrJqvWcSWgdrB3id908 6h/AqrBZO4gOJNkSUEuXFSKYjWJC7o1kZqBSWLaET2ZjVr/kbAAB7JxjGZ3u/Hxy4FDyYO6F8 nApavVYp7UlHDrNKrC2kXg/Gqvk= Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org Accessing virtual registers is very inefficient, so pwm map values should be cached when possible, else userspace could effectively do a DOS attack by reading pwm map values in a while loop. Use the regmap cache to cache those values. Tested on a Fujitsu Esprimo P720. Signed-off-by: Armin Wolf --- drivers/hwmon/Kconfig | 1 + drivers/hwmon/sch5627.c | 72 +++++++++++++++++++++++++------- drivers/hwmon/sch56xx-common.c | 76 ++++++++++++++++++++++++++++++++++ drivers/hwmon/sch56xx-common.h | 3 ++ 4 files changed, 138 insertions(+), 14 deletions(-) -- 2.39.2 diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index ec38c8892158..1c672195b5b3 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1909,6 +1909,7 @@ config SENSORS_SMSC47B397 config SENSORS_SCH56XX_COMMON tristate + select REGMAP config SENSORS_SCH5627 tristate "SMSC SCH5627" diff --git a/drivers/hwmon/sch5627.c b/drivers/hwmon/sch5627.c index bf408e35e2c3..85f8352cb3cf 100644 --- a/drivers/hwmon/sch5627.c +++ b/drivers/hwmon/sch5627.c @@ -9,7 +9,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -72,6 +74,7 @@ static const char * const SCH5627_IN_LABELS[SCH5627_NO_IN] = { "VCC", "VTT", "VBAT", "VTR", "V_IN" }; struct sch5627_data { + struct regmap *regmap; unsigned short addr; u8 control; u8 temp_max[SCH5627_NO_TEMPS]; @@ -91,6 +94,26 @@ struct sch5627_data { u16 in[SCH5627_NO_IN]; }; +static const struct regmap_range sch5627_tunables_ranges[] = { + regmap_reg_range(0xA0, 0xA3), +}; + +static const struct regmap_access_table sch5627_tunables_table = { + .yes_ranges = sch5627_tunables_ranges, + .n_yes_ranges = ARRAY_SIZE(sch5627_tunables_ranges), +}; + +static const struct regmap_config sch5627_regmap_config = { + .reg_bits = 16, + .val_bits = 8, + .wr_table = &sch5627_tunables_table, + .rd_table = &sch5627_tunables_table, + .cache_type = REGCACHE_RBTREE, + .use_single_read = true, + .use_single_write = true, + .can_sleep = true, +}; + static int sch5627_update_temp(struct sch5627_data *data) { int ret = 0; @@ -250,7 +273,7 @@ static int sch5627_read(struct device *dev, enum hwmon_sensor_types type, u32 at long *val) { struct sch5627_data *data = dev_get_drvdata(dev); - int ret; + int ret, value; switch (type) { case hwmon_temp: @@ -301,15 +324,11 @@ static int sch5627_read(struct device *dev, enum hwmon_sensor_types type, u32 at case hwmon_pwm: switch (attr) { case hwmon_pwm_auto_channels_temp: - mutex_lock(&data->update_lock); - ret = sch56xx_read_virtual_reg(data->addr, SCH5627_REG_PWM_MAP[channel]); - mutex_unlock(&data->update_lock); - + ret = regmap_read(data->regmap, SCH5627_REG_PWM_MAP[channel], &value); if (ret < 0) return ret; - *val = ret; - + *val = value; return 0; default: break; @@ -359,7 +378,6 @@ static int sch5627_write(struct device *dev, enum hwmon_sensor_types type, u32 a long val) { struct sch5627_data *data = dev_get_drvdata(dev); - int ret; switch (type) { case hwmon_pwm: @@ -369,12 +387,7 @@ static int sch5627_write(struct device *dev, enum hwmon_sensor_types type, u32 a if (val > U8_MAX || val < 0) return -EINVAL; - mutex_lock(&data->update_lock); - ret = sch56xx_write_virtual_reg(data->addr, SCH5627_REG_PWM_MAP[channel], - val); - mutex_unlock(&data->update_lock); - - return ret; + return regmap_write(data->regmap, SCH5627_REG_PWM_MAP[channel], val); default: break; } @@ -501,6 +514,12 @@ static int sch5627_probe(struct platform_device *pdev) pr_err("hardware monitoring not enabled\n"); return -ENODEV; } + + data->regmap = devm_regmap_init_sch56xx(&pdev->dev, &data->update_lock, data->addr, + &sch5627_regmap_config); + if (IS_ERR(data->regmap)) + return PTR_ERR(data->regmap); + /* Trigger a Vbat voltage measurement, so that we get a valid reading the first time we read Vbat */ sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, data->control | SCH5627_CTRL_VBAT); @@ -531,6 +550,30 @@ static int sch5627_probe(struct platform_device *pdev) return 0; } +static int sch5627_suspend(struct device *dev) +{ + struct sch5627_data *data = dev_get_drvdata(dev); + + regcache_cache_only(data->regmap, true); + regcache_mark_dirty(data->regmap); + + return 0; +} + +static int sch5627_resume(struct device *dev) +{ + struct sch5627_data *data = dev_get_drvdata(dev); + + regcache_cache_only(data->regmap, false); + /* We must not access the virtual registers when the lock bit is set */ + if (data->control & SCH5627_CTRL_LOCK) + return regcache_drop_region(data->regmap, 0, U16_MAX); + + return regcache_sync(data->regmap); +} + +static DEFINE_SIMPLE_DEV_PM_OPS(sch5627_dev_pm_ops, sch5627_suspend, sch5627_resume); + static const struct platform_device_id sch5627_device_id[] = { { .name = "sch5627", @@ -542,6 +585,7 @@ MODULE_DEVICE_TABLE(platform, sch5627_device_id); static struct platform_driver sch5627_driver = { .driver = { .name = DRVNAME, + .pm = pm_sleep_ptr(&sch5627_dev_pm_ops), }, .probe = sch5627_probe, .id_table = sch5627_device_id, diff --git a/drivers/hwmon/sch56xx-common.c b/drivers/hwmon/sch56xx-common.c index de3a0886c2f7..a3abafdaa3e6 100644 --- a/drivers/hwmon/sch56xx-common.c +++ b/drivers/hwmon/sch56xx-common.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -64,6 +65,11 @@ struct sch56xx_watchdog_data { u8 watchdog_output_enable; }; +struct sch56xx_bus_context { + struct mutex *lock; /* Used to serialize access to the mailbox registers */ + u16 addr; +}; + static struct platform_device *sch56xx_pdev; /* Super I/O functions */ @@ -243,6 +249,76 @@ int sch56xx_read_virtual_reg12(u16 addr, u16 msb_reg, u16 lsn_reg, } EXPORT_SYMBOL(sch56xx_read_virtual_reg12); +/* + * Regmap support + */ + +static int sch56xx_reg_write(void *context, unsigned int reg, unsigned int val) +{ + struct sch56xx_bus_context *bus = context; + int ret; + + mutex_lock(bus->lock); + ret = sch56xx_write_virtual_reg(bus->addr, (u16)reg, (u8)val); + mutex_unlock(bus->lock); + + return ret; +} + +static int sch56xx_reg_read(void *context, unsigned int reg, unsigned int *val) +{ + struct sch56xx_bus_context *bus = context; + int ret; + + mutex_lock(bus->lock); + ret = sch56xx_read_virtual_reg(bus->addr, (u16)reg); + mutex_unlock(bus->lock); + + if (ret < 0) + return ret; + + *val = ret; + + return 0; +} + +static void sch56xx_free_context(void *context) +{ + kfree(context); +} + +static const struct regmap_bus sch56xx_bus = { + .reg_write = sch56xx_reg_write, + .reg_read = sch56xx_reg_read, + .free_context = sch56xx_free_context, + .reg_format_endian_default = REGMAP_ENDIAN_LITTLE, + .val_format_endian_default = REGMAP_ENDIAN_LITTLE, +}; + +struct regmap *devm_regmap_init_sch56xx(struct device *dev, struct mutex *lock, u16 addr, + const struct regmap_config *config) +{ + struct sch56xx_bus_context *context; + struct regmap *map; + + if (config->reg_bits != 16 && config->val_bits != 8) + return ERR_PTR(-EOPNOTSUPP); + + context = kzalloc(sizeof(*context), GFP_KERNEL); + if (!context) + return ERR_PTR(-ENOMEM); + + context->lock = lock; + context->addr = addr; + + map = devm_regmap_init(dev, &sch56xx_bus, context, config); + if (IS_ERR(map)) + kfree(context); + + return map; +} +EXPORT_SYMBOL(devm_regmap_init_sch56xx); + /* * Watchdog routines */ diff --git a/drivers/hwmon/sch56xx-common.h b/drivers/hwmon/sch56xx-common.h index e907d9da0dd5..3fb1cddbf977 100644 --- a/drivers/hwmon/sch56xx-common.h +++ b/drivers/hwmon/sch56xx-common.h @@ -5,9 +5,12 @@ ***************************************************************************/ #include +#include struct sch56xx_watchdog_data; +struct regmap *devm_regmap_init_sch56xx(struct device *dev, struct mutex *lock, u16 addr, + const struct regmap_config *config); int sch56xx_read_virtual_reg(u16 addr, u16 reg); int sch56xx_write_virtual_reg(u16 addr, u16 reg, u8 val); int sch56xx_read_virtual_reg16(u16 addr, u16 reg); From patchwork Thu Sep 7 05:26:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13376167 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6733EE14D6 for ; Thu, 7 Sep 2023 05:27:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242081AbjIGF1P (ORCPT ); Thu, 7 Sep 2023 01:27:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240124AbjIGF1O (ORCPT ); Thu, 7 Sep 2023 01:27:14 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 310CE19BD; Wed, 6 Sep 2023 22:27:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694064410; x=1694669210; i=w_armin@gmx.de; bh=Bd7Jv8IQ6Bj8YdBWcXJYUXfXEz4MZnDbXV7P6IqE1GM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=iV5Mz/Xj25IUk2xdr9DOKlGqT3qQXyCL7AUhUeSrGsySfuR4BjcJ2cg2w8FsiV3xsxWFSrN SihuPukRgFdgDFnNEdH+LFQwJM1dTIuo0t3wx8HcXhh2hQzazQqh8U/BhwwmcTmS5IZZkukuT RFJNItOY+ZPTGnTPuWgwPMg5YEwzhgWFi/O4PctIBIKqiGAlb1MmvrAofbDnErcrpUDWVo6us x/T6P8RLFqVMdgEK9oFPhxNzGp+nx4YVSd742oL6/JJ7TwNvdOEmBOyrx4+kJruFDp+fZEFaS mb/5SSQK3QQOLCzeMEkee+z5IKnFogElYFR3ENMOS7uK9S11u5Hw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MlNp7-1puuIh2f4X-00lo5Q; Thu, 07 Sep 2023 07:26:50 +0200 From: Armin Wolf To: hdegoede@redhat.com Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 4/5] hwmon: (sch5627) Add support for writing limit registers Date: Thu, 7 Sep 2023 07:26:38 +0200 Message-Id: <20230907052639.16491-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230907052639.16491-1-W_Armin@gmx.de> References: <20230907052639.16491-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:bO/fm+gtn/wHOYl6rtDRSHs30LhPVSrgZkWjTXnmv8tu/7FujYz 6rNsicYDQdr+AHoIksAMAAZZak5QAOGv+gKY1uoifIVx/xzH73cFckxOtnXRnJehbXlCzUG CHvifCOFHuzrtbmP1v7lkGoC/uD6DOPQHn8LIMeUdSfyTZU/SRo5t053dzthn+IbWaZYQY5 OTDJb9j0Liew2lYc16lmg== UI-OutboundReport: notjunk:1;M01:P0:tqSn9Z+iWdo=;BMUPFO7s16sflGbvmlsyfbvo8kz /PAsNlVutt27IXznm85h12+R5j6VWrFNCnDHqKwqnrLJWMqRnCH/p5KzrgXXepSxZNLR/rz5z bKWLNn9ZjAOPssAQqu5noL9GsAuG/NtCBBIy5wyT9uhZca//DKTE9/D2GNWJ30n38BkcrXMxP GdHTlZcyVzTsJ7rpYEeMwuTGyHNTBj9N6DTUtoTybQAO+zeW0pPY7af74bhlTl7rJoJ2UTKCM DRYHBxdMUbth7FOSOOHnx/bnpBsu6Z0x/x26OXXmS7kfg3e9EaIlsuKZXKpUDyO98GA6Yabwe 11DkaoPo8o5TrVqZsxOJYSxlCqKJnlWvTwJHT/NdNX+zLAw7fpEfAiowq+c3NS5m7QvG56gaW 8gviMIHw40+RqjEKIfgftG+Z/HgarFQd3DScXFmGQDGBY48ikpCHySE2T2FSWG2bTDVDiiwhu kDhTH6Kx4pbAWLWMmNC415w4XQp6BvAojmP3GIYiJ6huq8IXdAjilOtz3lTasbLjx99IdYtrk Ia24MjBB3r2kzyZU14cvuwKlPJA/zVYFTI3WQOfNTZjPJUy8GCh93/Foprr1RffUGcMXMjyrT yeE8vmcv4O58G8EbVQVBbqOeZdncoUZW9JKgI4fJW2w/tCtD+htRpcfxN8YohgjZbzfgbICco IqpJk2GG4yLezFUHspr0vgOvmHv5DhqRZ2qCtagTu70U0lXq9brGN1J3qc9NqyalUYfhXCD+/ 30C5As5pR3ZvsQI08Lf3D5Thyfh9HnrmelbJtNptqUHhMQpJSSONYfuCZVx2XyHqYdg16bKLS bwfdGJyomIk2obCGrUCLCMq5aBXypKzR9sVBgLIRlR49LfeX4jK6k3mZhPDa4TgRcr5ajH9UP UNiKOJ924JwqsqiWm78mv/s7Uw12yQgfGAx7T4dJ4HYm7Rg5P6PEZrq/MsieOG+XAz+xthTZB CiR0IfclX9cygNvkI6znEipDfqw= Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org After some testing on a Fujitsu Esprimo P720, it turned out that the limit registers are indeed writable and affect the fan control algorithm. This is supported by the datasheet, which says that the fan control functions are based on the limit and parameter registers. Since accessing those registers is very inefficient, the existing regmap cache is used to cache those registers values. Tested on a Fujitsu Esprimo P720. Signed-off-by: Armin Wolf --- drivers/hwmon/sch5627.c | 174 ++++++++++++++++++++++----------- drivers/hwmon/sch56xx-common.c | 31 ++++++ drivers/hwmon/sch56xx-common.h | 3 + 3 files changed, 153 insertions(+), 55 deletions(-) -- 2.39.2 diff --git a/drivers/hwmon/sch5627.c b/drivers/hwmon/sch5627.c index 85f8352cb3cf..1891d4d75aa9 100644 --- a/drivers/hwmon/sch5627.c +++ b/drivers/hwmon/sch5627.c @@ -7,6 +7,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include #include #include @@ -77,9 +78,6 @@ struct sch5627_data { struct regmap *regmap; unsigned short addr; u8 control; - u8 temp_max[SCH5627_NO_TEMPS]; - u8 temp_crit[SCH5627_NO_TEMPS]; - u16 fan_min[SCH5627_NO_FANS]; struct mutex update_lock; unsigned long last_battery; /* In jiffies */ @@ -95,7 +93,17 @@ struct sch5627_data { }; static const struct regmap_range sch5627_tunables_ranges[] = { + regmap_reg_range(0x57, 0x57), + regmap_reg_range(0x59, 0x59), + regmap_reg_range(0x5B, 0x5B), + regmap_reg_range(0x5D, 0x5D), + regmap_reg_range(0x5F, 0x5F), + regmap_reg_range(0x61, 0x69), + regmap_reg_range(0x96, 0x9B), regmap_reg_range(0xA0, 0xA3), + regmap_reg_range(0x184, 0x184), + regmap_reg_range(0x186, 0x186), + regmap_reg_range(0x1A8, 0x1A9), }; static const struct regmap_access_table sch5627_tunables_table = { @@ -200,38 +208,6 @@ static int sch5627_update_in(struct sch5627_data *data) return ret; } -static int sch5627_read_limits(struct sch5627_data *data) -{ - int i, val; - - for (i = 0; i < SCH5627_NO_TEMPS; i++) { - /* - * Note what SMSC calls ABS, is what lm_sensors calls max - * (aka high), and HIGH is what lm_sensors calls crit. - */ - val = sch56xx_read_virtual_reg(data->addr, - SCH5627_REG_TEMP_ABS[i]); - if (val < 0) - return val; - data->temp_max[i] = val; - - val = sch56xx_read_virtual_reg(data->addr, - SCH5627_REG_TEMP_HIGH[i]); - if (val < 0) - return val; - data->temp_crit[i] = val; - } - for (i = 0; i < SCH5627_NO_FANS; i++) { - val = sch56xx_read_virtual_reg16(data->addr, - SCH5627_REG_FAN_MIN[i]); - if (val < 0) - return val; - data->fan_min[i] = val; - } - - return 0; -} - static int reg_to_temp(u16 reg) { return (reg * 625) / 10 - 64000; @@ -252,6 +228,25 @@ static int reg_to_rpm(u16 reg) return 5400540 / reg; } +static u8 sch5627_temp_limit_to_reg(long value) +{ + long limit = (value / 1000) + 64; + + return clamp_val(limit, 0, U8_MAX); +} + +static u16 sch5627_rpm_to_reg(long value) +{ + long pulses; + + if (value <= 0) + return U16_MAX - 1; + + pulses = 5400540 / value; + + return clamp_val(pulses, 1, U16_MAX - 1); +} + static umode_t sch5627_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) { @@ -263,8 +258,35 @@ static umode_t sch5627_is_visible(const void *drvdata, enum hwmon_sensor_types t if (data->control & SCH5627_CTRL_LOCK) return 0444; - if (type == hwmon_pwm && attr == hwmon_pwm_auto_channels_temp) - return 0644; + switch (type) { + case hwmon_temp: + switch (attr) { + case hwmon_temp_max: + case hwmon_temp_crit: + return 0644; + default: + break; + } + break; + case hwmon_fan: + switch (attr) { + case hwmon_fan_min: + return 0644; + default: + break; + } + break; + case hwmon_pwm: + switch (attr) { + case hwmon_pwm_auto_channels_temp: + return 0644; + default: + break; + } + break; + default: + break; + } return 0444; } @@ -277,20 +299,33 @@ static int sch5627_read(struct device *dev, enum hwmon_sensor_types type, u32 at switch (type) { case hwmon_temp: - ret = sch5627_update_temp(data); - if (ret < 0) - return ret; switch (attr) { case hwmon_temp_input: + ret = sch5627_update_temp(data); + if (ret < 0) + return ret; + *val = reg_to_temp(data->temp[channel]); return 0; case hwmon_temp_max: - *val = reg_to_temp_limit(data->temp_max[channel]); + ret = regmap_read(data->regmap, SCH5627_REG_TEMP_ABS[channel], &value); + if (ret < 0) + return ret; + + *val = reg_to_temp_limit((u8)value); return 0; case hwmon_temp_crit: - *val = reg_to_temp_limit(data->temp_crit[channel]); + ret = regmap_read(data->regmap, SCH5627_REG_TEMP_HIGH[channel], &value); + if (ret < 0) + return ret; + + *val = reg_to_temp_limit((u8)value); return 0; case hwmon_temp_fault: + ret = sch5627_update_temp(data); + if (ret < 0) + return ret; + *val = (data->temp[channel] == 0); return 0; default: @@ -298,23 +333,35 @@ static int sch5627_read(struct device *dev, enum hwmon_sensor_types type, u32 at } break; case hwmon_fan: - ret = sch5627_update_fan(data); - if (ret < 0) - return ret; switch (attr) { case hwmon_fan_input: + ret = sch5627_update_fan(data); + if (ret < 0) + return ret; + ret = reg_to_rpm(data->fan[channel]); if (ret < 0) return ret; + *val = ret; return 0; case hwmon_fan_min: - ret = reg_to_rpm(data->fan_min[channel]); + ret = sch56xx_regmap_read16(data->regmap, SCH5627_REG_FAN_MIN[channel], + &value); if (ret < 0) return ret; + + ret = reg_to_rpm((u16)value); + if (ret < 0) + return ret; + *val = ret; return 0; case hwmon_fan_fault: + ret = sch5627_update_fan(data); + if (ret < 0) + return ret; + *val = (data->fan[channel] == 0xffff); return 0; default: @@ -378,8 +425,33 @@ static int sch5627_write(struct device *dev, enum hwmon_sensor_types type, u32 a long val) { struct sch5627_data *data = dev_get_drvdata(dev); + u16 fan; + u8 temp; switch (type) { + case hwmon_temp: + temp = sch5627_temp_limit_to_reg(val); + + switch (attr) { + case hwmon_temp_max: + return regmap_write(data->regmap, SCH5627_REG_TEMP_ABS[channel], temp); + case hwmon_temp_crit: + return regmap_write(data->regmap, SCH5627_REG_TEMP_HIGH[channel], temp); + default: + break; + } + break; + case hwmon_fan: + switch (attr) { + case hwmon_fan_min: + fan = sch5627_rpm_to_reg(val); + + return sch56xx_regmap_write16(data->regmap, SCH5627_REG_FAN_MIN[channel], + fan); + default: + break; + } + break; case hwmon_pwm: switch (attr) { case hwmon_pwm_auto_channels_temp: @@ -449,7 +521,7 @@ static int sch5627_probe(struct platform_device *pdev) { struct sch5627_data *data; struct device *hwmon_dev; - int err, build_code, build_id, hwmon_rev, val; + int build_code, build_id, hwmon_rev, val; data = devm_kzalloc(&pdev->dev, sizeof(struct sch5627_data), GFP_KERNEL); @@ -525,14 +597,6 @@ static int sch5627_probe(struct platform_device *pdev) sch56xx_write_virtual_reg(data->addr, SCH5627_REG_CTRL, data->control | SCH5627_CTRL_VBAT); data->last_battery = jiffies; - /* - * Read limits, we do this only once as reading a register on - * the sch5627 is quite expensive (and they don't change). - */ - err = sch5627_read_limits(data); - if (err) - return err; - pr_info("found %s chip at %#hx\n", DEVNAME, data->addr); pr_info("firmware build: code 0x%02X, id 0x%04X, hwmon: rev 0x%02X\n", build_code, build_id, hwmon_rev); diff --git a/drivers/hwmon/sch56xx-common.c b/drivers/hwmon/sch56xx-common.c index a3abafdaa3e6..36b38626dcdf 100644 --- a/drivers/hwmon/sch56xx-common.c +++ b/drivers/hwmon/sch56xx-common.c @@ -253,6 +253,37 @@ EXPORT_SYMBOL(sch56xx_read_virtual_reg12); * Regmap support */ +int sch56xx_regmap_read16(struct regmap *map, unsigned int reg, unsigned int *val) +{ + int lsb, msb, ret; + + /* See sch56xx_read_virtual_reg16() */ + ret = regmap_read(map, reg, &lsb); + if (ret < 0) + return ret; + + ret = regmap_read(map, reg + 1, &msb); + if (ret < 0) + return ret; + + *val = lsb | (msb << 8); + + return 0; +} +EXPORT_SYMBOL(sch56xx_regmap_read16); + +int sch56xx_regmap_write16(struct regmap *map, unsigned int reg, unsigned int val) +{ + int ret; + + ret = regmap_write(map, reg, val & 0xff); + if (ret < 0) + return ret; + + return regmap_write(map, reg + 1, (val >> 8) & 0xff); +} +EXPORT_SYMBOL(sch56xx_regmap_write16); + static int sch56xx_reg_write(void *context, unsigned int reg, unsigned int val) { struct sch56xx_bus_context *bus = context; diff --git a/drivers/hwmon/sch56xx-common.h b/drivers/hwmon/sch56xx-common.h index 3fb1cddbf977..7479a549a026 100644 --- a/drivers/hwmon/sch56xx-common.h +++ b/drivers/hwmon/sch56xx-common.h @@ -11,6 +11,9 @@ struct sch56xx_watchdog_data; struct regmap *devm_regmap_init_sch56xx(struct device *dev, struct mutex *lock, u16 addr, const struct regmap_config *config); +int sch56xx_regmap_read16(struct regmap *map, unsigned int reg, unsigned int *val); +int sch56xx_regmap_write16(struct regmap *map, unsigned int reg, unsigned int val); + int sch56xx_read_virtual_reg(u16 addr, u16 reg); int sch56xx_write_virtual_reg(u16 addr, u16 reg, u8 val); int sch56xx_read_virtual_reg16(u16 addr, u16 reg); From patchwork Thu Sep 7 05:26:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 13376168 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 56F5EEE14D9 for ; Thu, 7 Sep 2023 05:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244767AbjIGF1Q (ORCPT ); Thu, 7 Sep 2023 01:27:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240385AbjIGF1O (ORCPT ); Thu, 7 Sep 2023 01:27:14 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 322C51BC6; Wed, 6 Sep 2023 22:27:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1694064412; x=1694669212; i=w_armin@gmx.de; bh=SDoJ1qMnGGCF705mx2danL58jWUrhbUadtlO+JoIdEg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=PDDWwnf0seZYJElIw75lF/kUOmMKVt10AhhpSrnhITidM+DAYyOVogvgol+NXWNj7iHbk85 FJVYmhh7PZCLO3JGg3MDS7bBHsgs89lS+L3t+5FRqM0BE/9rXAJdxQmhinNv3hriMEfUg4ANH 8L1fOGvQwUBNKHBp7ibWesxNtSYxTi2h4i2RhiA45arvAeXd244NKpJQA8IFEz9vpP6cIhh1z W6WDR9Qpccdzka6pPKKs7c0vMLjJG5qDJHhrio3YbQl0MG2NvegL9FBmOmXgG+i7EJ3xuYhXr CHfw1HJDCv+yh+5xgtO8q7R0oWJ1yMpvBHtCIvvoFVgT9lmvFwGQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M2O6Y-1qdYVW2D7u-003yhB; Thu, 07 Sep 2023 07:26:52 +0200 From: Armin Wolf To: hdegoede@redhat.com Cc: jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/5] hwmon: (sch5627) Document behaviour of limit registers Date: Thu, 7 Sep 2023 07:26:39 +0200 Message-Id: <20230907052639.16491-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230907052639.16491-1-W_Armin@gmx.de> References: <20230907052639.16491-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:MediO2xoNHuYZ+J2gpFvJo5Yw3HQt7z9lo3eGzlWwPV0L/tDwYr d5DNXYjIRdAQmg3KNeEEKSjBjD5Yj/4e4kzTXbwIxLboyYi6Yp4gSDfeNZlqd25yEwyizAw da/U4RBJAPjMfypfk3aNZfKN0831a3GW3Yq3JPCK/r1V2xVRkRjT+A5z2TSxP9IT4zVZGXQ 81Rrh3twPrseMpxpV4hNw== UI-OutboundReport: notjunk:1;M01:P0:0CYJA/7Oxe0=;szh2cPWMDtxCBza8+eBbie74N2g qo1q/xGRFJjv8bVE9PdyT2aMSE4aUEZliud5ECymbhtBVkfUlPINfFV4OwhkHG714znuyUuvU E5gEswzc8F2kDZhE+I7LGq+3AzzJMJhFTeiUkHQkqMRrcX7mWwMqinu454UWpoBBc3bb8+dv2 RIO7sC6WcDYAsRqxWkre4J0U9azsD7P6T2khafrirLKgNrIQPZ4yaHAN71g8ZTcF4+9jbwxGn CObACG9X37Aj+gGB2R/qJk0DGr56MngLhbIcJqt079Qt4oENWIc2/PzL2ozbM4wuFucDBaSvK praTHqcOUgOSyxNvu1h5NAkhVO+21YIpCPw1F1Qo2YkXhImQV9L45p0ceTwC2CVVzzPw+1S4U CRyE9TkIsnZ6fjYdRYBeEkzNq64u8CvHSu0J/BvwFbtHEqGZGdtmoNT6f95ZYA4tsBMd+Q/iY AoswUPU9se+Zv0RIQPn6Zi9uX+CGNugNvpDzpkwj8+8cFIUrpb4aYt/tk7/zjHRS8pWgB28U2 3glaU81cbFr+mPdyVpdYrpdK/3FVFLX9U/jcRvXPJ+gi46NN+GMckRTHCh4yRnIrbpLeqpH8l HpkCwZwtpJ/A5rXmG9sjPvBkFeDowyM7DvT/N135o6p7clmvem6AmFLtejyjEhKnbcdRCfI5j lir9s6roAcYL/+Poi+1itEDDiGL0dp7I3/MbUV3SAhnp2qxA54ZbIEffrLo75CGBrdA48DNje Os4I++492rUj62J7WiQOanY0TyeRzfmfGFOG7CE32DS3xFIwWXAtwAodAKuVQbH2Kzd/JQWz4 JcGzRPXpbkfOBEOML44t4R2KXksw+p44uBQajftERcOcxPaput3XkBKw3vEc4Z1wevQPbmp1M wOQYjCREFRt/M+wpqfldJyvY6Wf+CfM77A38HdpKSqPjKYGVjjvZa2IA8fk/AkgQsRF1m+Cl4 j4+r3KVDHvcSrCqvA+0X+B8RBP4= Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org The values of the limit registers affect the fan speed in a particular way. Document this behaviour so that future users can exploit it if required. Signed-off-by: Armin Wolf --- Documentation/hwmon/sch5627.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) -- 2.39.2 diff --git a/Documentation/hwmon/sch5627.rst b/Documentation/hwmon/sch5627.rst index ecb4fc84d045..8639dff234fc 100644 --- a/Documentation/hwmon/sch5627.rst +++ b/Documentation/hwmon/sch5627.rst @@ -33,3 +33,13 @@ The hardware monitoring part of the SMSC SCH5627 is accessed by talking through an embedded microcontroller. An application note describing the protocol for communicating with the microcontroller is available upon request. Please mail me if you want a copy. + + +Controlling fan speed +--------------------- + +The SCH5627 allows for partially controlling the fan speed. If a temperature +channel excedes tempX_max, all fans are forced to maximum speed. The same is not +true for tempX_crit, presumably some other measures to cool down the system are +take in this case. +In which way the value of fanX_min affects the fan speed is currently unknown.