From patchwork Fri Sep 14 16:51:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 10601087 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 0F67213AD for ; Fri, 14 Sep 2018 16:51:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EB2152BA89 for ; Fri, 14 Sep 2018 16:51:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DF9E12BA8D; Fri, 14 Sep 2018 16:51:10 +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=-6.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID,URIBL_SBL 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 71F282BA89 for ; Fri, 14 Sep 2018 16:51:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728167AbeINWG2 (ORCPT ); Fri, 14 Sep 2018 18:06:28 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:35775 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728162AbeINWG2 (ORCPT ); Fri, 14 Sep 2018 18:06:28 -0400 Received: by mail-pg1-f193.google.com with SMTP id 7-v6so4673788pgf.2 for ; Fri, 14 Sep 2018 09:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=9BPUFbfkVchWNmeMwPCibI2oxqdV+ne4kOilPdwPUgQ=; b=aureGZuIrAtxA4uZlseqvzMFFtxs8DgbJlbqr4AMLWjTBhUmMIQqh7lq0MoZqT/1ju kY+QL78Ikha7GTBeDMw1ynXS16M5qfdF+U5o0HiQAzPi20zmac6Gqt7tKaVUmjO1gBmN WX4KDDhlvSEdpvfgifSdJQGUwwvhSjtqKQGpIkmDdSviiIv7Fqrvf6kAx7icFIdlnZWf DnikWmSxgoHV5wdBpVqVsf5blPPr396UC3PghYNff86uTe1Jg9gsH4bfrLcw4e5uImZN NK5RU4E9bi7JnZ/jrjRso5bp/Ssi83RbjARX4g92CcWtVGq00p7D3k+WX0xGcAEIEp5s LrVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=9BPUFbfkVchWNmeMwPCibI2oxqdV+ne4kOilPdwPUgQ=; b=ha1XjeYAmWZStbJZRQm8cuxSotxU4ZVv73c1Bg8ALF1m6LdM8eURE/Il8gvG7XrscY KnSiJSd4/KYD6gSL+TsE0BNcWN7+Cupse/tefCbeNsO9i2yEwBm8NKd9/5H8HqiYHWQI mIt9XWgAXzqIrmSSDaVy7LEtNpbxHr3IXBh1RzjU8sC6l4ICZ/VjMFSYpMCxhXO9Ljnw BLwH/sOhzjWpnFFAyNhW3PkFO40n57/uXd0nlWSfmbjjTwsYn442YLSfXnB8yd5D9854 1OJAwAi3en7K+32IQZrSAw3FKztYfGkpo1rilXVBoJyLEvqeElo3Eg8LFp1n2d3Yg61+ OybA== X-Gm-Message-State: APzg51CqIs+WDac3kwxonOJdiGwezK39XOHeD+3atH6KlgJPABQLT8LP BSDvMlUrRvBeav26P257/KbBS0WJ X-Google-Smtp-Source: ANB0VdaYZZ9Vgz51qXYBuJJ8KEZytMmRkUyLhi1DWV4Kb2jS9Im/2nExuuVnsciBRbqwkprn89iZ2A== X-Received: by 2002:a63:380d:: with SMTP id f13-v6mr12770053pga.124.1536943868946; Fri, 14 Sep 2018 09:51:08 -0700 (PDT) Received: from localhost (108-223-40-66.lightspeed.sntcca.sbcglobal.net. [108.223.40.66]) by smtp.gmail.com with ESMTPSA id r17-v6sm9953945pgu.83.2018.09.14.09.51.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 14 Sep 2018 09:51:07 -0700 (PDT) From: Guenter Roeck To: Hardware Monitoring Cc: Jean Delvare , Guenter Roeck , Robert Kern Subject: [PATCH v2 2/2] hwmon: (nct6775) Fix RPM output for fan7 on NCT6796D Date: Fri, 14 Sep 2018 09:51:05 -0700 Message-Id: <1536943865-25699-1-git-send-email-linux@roeck-us.net> X-Mailer: git-send-email 2.7.4 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 fan7 on NCT6796D does not have a fan count register; it only has an RPM register. Switch to using RPM registers to read the fan speed for all chips supporting it to solve the problem for good. Reported-by: Robert Kern Cc: Robert Kern Fixes: 81820059a428 ("hwmon: (nct6775) Add support for NCT6796D") Signed-off-by: Guenter Roeck --- v2: NCT6795D/NCT6796D still have the old RPM registers, only the register at 0x660 is new and has to be used. Minimize required changes by using the 'old' RPM registers where possible. drivers/hwmon/nct6775.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c index 1e6f0e6ba740..b36c7b4ba227 100644 --- a/drivers/hwmon/nct6775.c +++ b/drivers/hwmon/nct6775.c @@ -501,8 +501,8 @@ static const s8 NCT6779_BEEP_BITS[] = { 16, 17, -1, -1, -1, -1, /* temp1..temp6 */ 30, 31 }; /* intrusion0, intrusion1 */ -static const u16 NCT6779_REG_FAN[] = { - 0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x660 }; +static const u16 NCT6779_REG_FAN_RPM[] = { + 0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x660 }; static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = { 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 }; @@ -984,6 +984,7 @@ struct nct6775_data { const u16 *REG_TARGET; const u16 *REG_FAN; + const u16 *REG_FAN_RPM; const u16 *REG_FAN_MODE; const u16 *REG_FAN_MIN; const u16 *REG_FAN_PULSES; @@ -1277,7 +1278,7 @@ static bool is_word_sized(struct nct6775_data *data, u16 reg) case nct6795: case nct6796: return reg == 0x150 || reg == 0x153 || reg == 0x155 || - ((reg & 0xfff0) == 0x4b0 && (reg & 0x000f) < 0x0b) || + (reg & 0xfff0) == 0x4c0 || reg == 0x402 || reg == 0x63a || reg == 0x63c || reg == 0x63e || reg == 0x640 || reg == 0x642 || reg == 0x64a || @@ -1676,10 +1677,6 @@ static struct nct6775_data *nct6775_update_device(struct device *dev) if (!(data->has_fan & BIT(i))) continue; - reg = nct6775_read_value(data, data->REG_FAN[i]); - data->rpm[i] = data->fan_from_reg(reg, - data->fan_div[i]); - if (data->has_fan_min & BIT(i)) data->fan_min[i] = nct6775_read_value(data, data->REG_FAN_MIN[i]); @@ -1691,7 +1688,16 @@ static struct nct6775_data *nct6775_update_device(struct device *dev) >> data->FAN_PULSE_SHIFT[i]) & 0x03; } - nct6775_select_fan_div(dev, data, i, reg); + if (data->REG_FAN) { + reg = nct6775_read_value(data, + data->REG_FAN[i]); + data->rpm[i] = data->fan_from_reg(reg, + data->fan_div[i]); + nct6775_select_fan_div(dev, data, i, reg); + } else { + data->rpm[i] = nct6775_read_value(data, + data->REG_FAN_RPM[i]); + } } nct6775_update_pwm(dev); @@ -3875,7 +3881,7 @@ static int nct6775_probe(struct platform_device *pdev) data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; data->REG_TARGET = NCT6775_REG_TARGET; - data->REG_FAN = NCT6779_REG_FAN; + data->REG_FAN_RPM = NCT6779_REG_FAN_RPM; data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; @@ -3976,7 +3982,7 @@ static int nct6775_probe(struct platform_device *pdev) data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; data->REG_TARGET = NCT6775_REG_TARGET; - data->REG_FAN = NCT6779_REG_FAN; + data->REG_FAN_RPM = NCT6779_REG_FAN_RPM; data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;