From patchwork Tue May 30 20:27:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Leis X-Patchwork-Id: 9755207 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5C1F5601D2 for ; Tue, 30 May 2017 20:27:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4FE6527569 for ; Tue, 30 May 2017 20:27:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4399D283C6; Tue, 30 May 2017 20:27:49 +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.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID 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 DE67727569 for ; Tue, 30 May 2017 20:27:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751070AbdE3U1s (ORCPT ); Tue, 30 May 2017 16:27:48 -0400 Received: from mail-pf0-f175.google.com ([209.85.192.175]:35473 "EHLO mail-pf0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750951AbdE3U1s (ORCPT ); Tue, 30 May 2017 16:27:48 -0400 Received: by mail-pf0-f175.google.com with SMTP id n23so82107670pfb.2 for ; Tue, 30 May 2017 13:27:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:subject:date:message-id; bh=gWowu3ihLvhT0Na1QNBmeAO8liwHFRUImh/7lBia8BE=; b=CCnDz5Z6tnMmk7/pVUttxxOA1N4wXzmFz5nCUmLDEJBOPjtrtw1SJCqVBO78aL4lQ9 URW5ubK8rM8/PHzdVesg76/YuVkmw56eQnk1lOyjAulfNZgqy6T0ucwLVz10XgDRz0pK vcxBlY0aDqs3WsfTDHKCzk0kvtI1Yvsy+6PlD97iVWPeBqNSFLcbAmpYgnYD5Kyt0pT+ LkJU9hhCCkUVKzhH4e67t+GNk0snlch5LfBHUNpcv6g5+b1w4xw05SBuEDKkx3VhMxTS cg4CMvoUK/GqRV/rjRvkxvVQ/yPK2xZSk7AF29E73RgC2uQjKE4yXV1i7w7/WfKR8Ls6 zM2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=gWowu3ihLvhT0Na1QNBmeAO8liwHFRUImh/7lBia8BE=; b=Xf2sHARuHkMRUynSMJI4NKR9y1xaO38XMhnWmudGYzJmgwxgVDxxz9QDsL1VOzbmNH EBNBD7BK6lDih9W4A5uxayQ35MtCBxCbn9CUMxI+lyuFTXr3B518hpl1Y2O0IeLyhBwi OjYumlsmO1gpqRDLXcawkyCDNvcIXxk/b7G+x6/fTjW82prfrm73GjQaNaNEp4Byrabw iBXhjWqklpxc/C7f9ahmKwLRmXnPyr/BtF3QyRtbivbfM9zicDxcOI5svpWWnKlyJzUE Ojffq5O2YTdHhkICTKx0isWh1xGyx2fpdt+pctvxD6TKlu3rsFy35mdBPpd/J4qjZNrZ AYnQ== X-Gm-Message-State: AODbwcBafcwrGDnwFVhnSTXPcnmfmKJe27lpGl8bVlfuda2+rE7vDAPC pJP9kBQDc4kN6MHm X-Received: by 10.84.210.166 with SMTP id a35mr2202526pli.160.1496176067196; Tue, 30 May 2017 13:27:47 -0700 (PDT) Received: from venture.svl.corp.google.com ([100.123.242.104]) by smtp.gmail.com with ESMTPSA id 204sm21185229pfu.19.2017.05.30.13.27.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 30 May 2017 13:27:46 -0700 (PDT) From: Patrick Venture To: venture@google.com, joel@jms.id.au, jdelvare@suse.com, linux@roeck-us.net, linux-hwmon@vger.kernel.org Subject: [PATCH] hwmon: (aspeed-pwm-tacho) Enable both edge measurement. Date: Tue, 30 May 2017 13:27:39 -0700 Message-Id: <20170530202739.31508-1-venture@google.com> X-Mailer: git-send-email 2.13.0.219.gdb65acc882-goog 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 The aspeed-pwm-tacho controller supports measuring the fan tach by using leading, falling, or both edges. This change allows the driver to support either of the three configurations and will appropriately modify the returned tach data. I tested this and found the number returned matched what I expected. Signed-off-by: Patrick Venture --- drivers/hwmon/aspeed-pwm-tacho.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/aspeed-pwm-tacho.c b/drivers/hwmon/aspeed-pwm-tacho.c index 48403a2115be..f288928b5e8a 100644 --- a/drivers/hwmon/aspeed-pwm-tacho.c +++ b/drivers/hwmon/aspeed-pwm-tacho.c @@ -145,11 +145,20 @@ #define PWM_MAX 255 +#define BOTH_EDGES 0x02 /* 10b */ + #define M_PWM_DIV_H 0x00 #define M_PWM_DIV_L 0x05 #define M_PWM_PERIOD 0x5F #define M_TACH_CLK_DIV 0x00 -#define M_TACH_MODE 0x00 +/* + * 5:4 Type N fan tach mode selection bit: + * 00: falling + * 01: rising + * 10: both + * 11: reserved. + */ +#define M_TACH_MODE 0x10 #define M_TACH_UNIT 0x1000 #define INIT_FAN_CTRL 0xFF @@ -162,6 +171,7 @@ struct aspeed_pwm_tacho_data { u8 type_pwm_clock_division_h[3]; u8 type_pwm_clock_division_l[3]; u8 type_fan_tach_clock_division[3]; + u8 type_fan_tach_mode[3]; u16 type_fan_tach_unit[3]; u8 pwm_port_type[8]; u8 pwm_port_fan_ctrl[8]; @@ -498,7 +508,7 @@ static u32 aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv, u8 fan_tach_ch) { u32 raw_data, tach_div, clk_source, sec, val; - u8 fan_tach_ch_source, type; + u8 fan_tach_ch_source, type, mode, both; regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0); regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0x1 << fan_tach_ch); @@ -512,7 +522,14 @@ static u32 aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv, regmap_read(priv->regmap, ASPEED_PTCR_RESULT, &val); raw_data = val & RESULT_VALUE_MASK; tach_div = priv->type_fan_tach_clock_division[type]; - tach_div = 0x4 << (tach_div * 2); + /* + * We need the mode to determine if the raw_data is double (from + * counting both edges). + */ + mode = priv->type_fan_tach_mode[type]; + both = (mode & BOTH_EDGES) ? 1 : 0; + + tach_div = (0x4 << both) << (tach_div * 2); clk_source = priv->clk_freq; if (raw_data == 0) @@ -696,6 +713,7 @@ static void aspeed_create_type(struct aspeed_pwm_tacho_data *priv) aspeed_set_tacho_type_enable(priv->regmap, TYPEM, true); priv->type_fan_tach_clock_division[TYPEM] = M_TACH_CLK_DIV; priv->type_fan_tach_unit[TYPEM] = M_TACH_UNIT; + priv->type_fan_tach_mode[TYPEM] = M_TACH_MODE; aspeed_set_tacho_type_values(priv->regmap, TYPEM, M_TACH_MODE, M_TACH_UNIT, M_TACH_CLK_DIV); }