From patchwork Tue Jul 6 13:01:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Balac, Arun Saravanan" X-Patchwork-Id: 12360563 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5B52C07E96 for ; Tue, 6 Jul 2021 13:02:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C9F6F61C3D for ; Tue, 6 Jul 2021 13:02:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232130AbhGFNEy (ORCPT ); Tue, 6 Jul 2021 09:04:54 -0400 Received: from mx0b-00154904.pphosted.com ([148.163.137.20]:43664 "EHLO mx0b-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232005AbhGFNEy (ORCPT ); Tue, 6 Jul 2021 09:04:54 -0400 Received: from pps.filterd (m0170397.ppops.net [127.0.0.1]) by mx0b-00154904.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166CguQR011334; Tue, 6 Jul 2021 09:01:58 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dell.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=5DB2ZlQNxFh1ufgYLv5bIiTpYWZVY5GVMMz/uueDDjU=; b=gtprpC6aGS5/GM9gZkBS5M7Jt7sPpSj4hllBeRaCkWdwosfRS5kGVcXknntnX4p/nDX7 BS44zbdjg0nuebB59QjW3MkG9J7gi0lfD3KlYmZGXxcCxWVERBfi64PMKJIveDD87s5N yaDwjDLx89fGpFv8Av9sfejDK4yPduq76qHp/PuMWG4pAffl6YB7pObWxTrL8LRoNrtf 9vwdFUdp7q8hSt//lI91tJaFUybmUeZi8TvhkC9pWcYnK8pCs9+oK1kAJE6QXY4i1DiF lRzSqE5cjVJKFNH/OU1iL+TOJJ3ja4DRNb8sMxF49k0ceZHJ+1hFx1PdGJa5LfBKr5aN 5g== Received: from mx0a-00154901.pphosted.com (mx0a-00154901.pphosted.com [67.231.149.39]) by mx0b-00154904.pphosted.com with ESMTP id 39m90ukj89-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 06 Jul 2021 09:01:58 -0400 Received: from pps.filterd (m0142699.ppops.net [127.0.0.1]) by mx0a-00154901.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166D1Vsv013719; Tue, 6 Jul 2021 09:01:57 -0400 Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2109.outbound.protection.outlook.com [104.47.55.109]) by mx0a-00154901.pphosted.com with ESMTP id 39mhn9dacj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Jul 2021 09:01:57 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WrmltVi5fQBALclPeSLByLSEchksp8TwHBvBGbBM2iJzxzg35lvoPBIOr6lrkbYtpj37hq2jB9T8AAohadME22eGmL+TKzTIQgxAj/V3f+tStrfQUNUNZfDpV202Xb15ySUgARfEPOxyJfsXzj9WP4hvAHe/mS+XO1F6+Y7pQLUh7eV9Z6RtV3rLlVRp/luE0hl1zxRNi1O4Fd99WI7vEoZtvLtd989Nj7+8zq998rMqy7OXgf8K9Vb91fcFEWvkjHOkhJKflyhhnYH9YBpjx/oN1b+CxAzlpWz0qyAqK1L2/hx6BQ0cncmcgF7Zym2iT3kvM010BsME88wzNFDFuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5DB2ZlQNxFh1ufgYLv5bIiTpYWZVY5GVMMz/uueDDjU=; b=kuJbbq62OmmusMK5LHquKlfsNB1OaKs3QyoLFvVUbirmqVp6iHPMHasNYfvcoAUpaatj1HQuccvbcCVCXzr23T3W2NWcIJae/i8nBDKquqN2j7PM3vlOEhoirLy+en8eZIHXGFHG67WXjk7XWncBeTWFJxBxjguxC+lvqhDXMKseSBwhV8z4BvucbL5HhsQmQ4tlmWt6bfqB14ty7PIQrYUv7/IOFoFcOSVCWWnQ5t6/7YGC22/k4/wOf2ITdoE3dCs+IQzoQceuvs93hktrdANdpGNfuLV+a4IEmHr75CvaH+3aN6Pyu9RcvXFanHeHkqLyamqRhdN9Hqpd5ggeDA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=dell.com; dmarc=pass action=none header.from=dell.com; dkim=pass header.d=dell.com; arc=none Received: from MW2PR1901MB2028.namprd19.prod.outlook.com (2603:10b6:302:8::11) by MWHPR19MB1469.namprd19.prod.outlook.com (2603:10b6:300:d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22; Tue, 6 Jul 2021 13:01:55 +0000 Received: from MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372]) by MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372%6]) with mapi id 15.20.4308.020; Tue, 6 Jul 2021 13:01:55 +0000 From: "Balac, Arun Saravanan" To: "linux@roeck-us.net" , "jdelvare@suse.com" CC: "linux-hwmon@vger.kernel.org" Subject: [PATCH 1/5] hwmon: Driver for MAX6620 Fan sensor Thread-Topic: [PATCH 1/5] hwmon: Driver for MAX6620 Fan sensor Thread-Index: AddyZTH8Yu1iaZkKQM6DT+eAcjz4oQ== Date: Tue, 6 Jul 2021 13:01:55 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Extended_MSFT_Method=Manual; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_ActionId=688a970f-9369-4d1b-b41b-44d34a74be47; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Application=Microsoft Azure Information Protection; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Name=External Public; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SetDate=2021-07-06T13:01:48.8424973Z; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Owner=Arun_Saravanan_Balac@Dell.com; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SiteId=945c199a-83a2-4e80-9f8c-5a91be5752dd; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Enabled=True authentication-results: roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=none action=none header.from=Dell.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 1f8f9870-bc1e-4411-0864-08d9407e3b58 x-ms-traffictypediagnostic: MWHPR19MB1469: x-microsoft-antispam-prvs: x-exotenant: 2khUwGVqB6N9v58KS13ncyUmMJd8q4 x-ms-oob-tlc-oobclassifiers: OLM:4714; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: X5xEUHH2ojw6zjGGm8HrtuomeuJPE4cLxZjT9IXT9bXt4NLu6KgVoPufLIk6qV6/QnIzifLzga4HeEDkuI5duqET7IOjpZyGwBWuBZe86yTiuMcNCl6omW+PAQ26o0KPWaw1l7h+Pmz2fkBj1RvlMUbz4xZv7cGpKloNnrGOqpGPhBZKipYz7I8WmuHPgiyyJLn3ZBlqm/slkrF8KCVLUgT+4p3DE8kZp/Nhk73KN830AH10QtJtjNuKrkghYAZX6zs7vjoB8j0oHyg32kUlZXGTfWkHljeyW8xkJ0G6Py58MejXNCD6Sr/BnxWiIr/b1u73OV6T8+FFXOijfay72JKKIM7hVW9CvUSSo4HUnkATHdueRoeaHJS788zXHDhc1bRlokN0OYHTcYavxcB28fX9F7ZAL6R8DQ45G78xoLf1xR2CEOwodxgudHZBUwZ4oXrTliNjQM6eo1IDmq4QZle3RGjfkcR1nw8+xAWz6bhA8B8oQqmeY3Ir1+6KZ4dEZorKbRFkewV0nO8LomYVotQW3xP2cVM4bkMEa/YmnPuPDCB/EinQGYpKD7pJpVayRtuTIjDLLbaZ4bRsqFCQ1JV5IxS9pBGsSYCgm7jMZRRjuqSmgTxYspNKbPhfhRW0pVlK/zbckOL9OxuPHRvqY82GXz1gQ8/eyCIlJWoijswJUpj7woiUhH4Oo6pt6TwM62aL2JYpakn7yga41poU2VC5JE1dIc66OTnjQo2I97PYdlg12zVr0+enrbVMpV448saIHAviBLLeqM7g1KYfTXuCUYUO4k/Nw3ZxA3AFGIA= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR1901MB2028.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(396003)(366004)(136003)(376002)(39860400002)(5660300002)(33656002)(8936002)(66946007)(110136005)(83380400001)(66556008)(26005)(8676002)(7696005)(786003)(66476007)(30864003)(76116006)(55236004)(316002)(86362001)(6506007)(478600001)(2906002)(122000001)(64756008)(966005)(52536014)(4326008)(186003)(55016002)(9686003)(66446008)(71200400001)(38100700002)(2004002)(559001)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: PDOpXpZf0sBSOiTucyokcSVW42DR9IqfnbQ4XUWH8/KFp2ee1NoEWPTDcUGPyItAHDQOBVD40FjVld2+Ps87L0GtHQlHFw7w1zxZEloqRmubUSSZZDLKUuT3KKx6rJII1MzD1k10jK9ViItPzPIuhxMcbmw4MERRBtl8WkVbpHpskPBpv8IcCYaTflSVffhUNfWMKP2gWv8xkEeLduoCiK3kDBRqUBJdcL9EZjtnzNhGSydz8dZ+frTo3HQ+XDLuFwtNjgh+PLEvqHz8HOWT74Jex65CFJw8ZunkaMhrSz/NkFHU3Jmf0vSZpTvjj6ig91jjyY8lZOl3fjnZmNuvnqquZ+sba9dxxhqOHOa8E4XHHkv1n5zsWvpHwEkVW9+1OCw3gyuMy6xt1qnvoxhxWxQChhjZUyXZZHnAcB2RZP3aKWCtBbRN4RWVReyIk5+dfgindjsl1hpS0D03llco4ypigkcz8lWVqbS3kk9SxnJo0dEcHr/mEEAJGZd6mbJYDO/UKlOBInnla/KjYc2smWBq50HAkUJxzW9jZUeY+qbJ7RirENYL/7THTtS/uw1pe8TeMdhS1zO0IIyTQkjj6MPs74M7rrhPi7uqLSDQ+FdpZsbmNJJ4hJPl8Lpm9ZZKa6hBFAUOkyH7RCZAwnWs/dqIyRQQxTOSJTNzRN7CW297zeM69PW8LHMSKQUjnqs0T8SzSGAQfHhV/W5DQqhonefZCq/UoTBNlfwUtaLWc2LXmA6vqJjx7BA2aY25HK7x5cZcVU7wx441Qo3JYHwsxc2Tbdo3eRnuungmNkhvWrV0WP2FhXfU/J8YbpOVkjEhPouN1bb0m/6302/bivwZHU+kOrllY3hXxwrym/G2Ptt3SQQFUhE3q63I5CDA/xFrBnpCxdvaif9wYgtW2EMwKMuSPgw1WlG3TAxDtRCXaHp2Hjac09CIzxn63a1i6z/cpy+TX4qBx/rAfk7xA8S4z81W1qsKgE6yX1YXQ1CXiFAKz6cqRCyoF0y4ebWDz3NfS3tfsZK9gfmO2YRnJ7QZpVmnEXtt1K9f9UhZjojdh9IPr4DqRlDKcXpdCa9DWTNx0l4b1Eo/vHzJFWfy9e8wCHEvREnrWEWYTAKoNBE2XVBGrIG4lJVql/NO1gglfI88C+XQBN/4VFZ7jMwJ2wN80oPWA4uv1XxHx6g06R7DVrsgCx4HK86P4owJj62pvaLZ/K8GtSNrRlZKYlMwFXf260xuXZyqTJ9TXtRWilD+4eRnWPmJHwYSC5dfe0mJ2sZqG42RE70ZMasWAEWVXANHs8lXR141K86lHSHkiWx52dtGy57rko4A8YSo/r/Ep0Dz x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: Dell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR1901MB2028.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1f8f9870-bc1e-4411-0864-08d9407e3b58 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Jul 2021 13:01:55.3768 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 945c199a-83a2-4e80-9f8c-5a91be5752dd X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 81VNVPtxp2hN3tBlZQU1dSiMF+60p3NAFzWQTYDKhGtmY6nsE6gaZ7sP6eA3ts/z+m8PzeuRCFgU4EapvOaGrIXRAVPKybY8aBn8wyf5DwU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR19MB1469 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-06_06:2021-07-02,2021-07-06 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 adultscore=0 malwarescore=0 impostorscore=0 mlxlogscore=999 spamscore=0 phishscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 X-Proofpoint-GUID: eseUth_I7GvnzNrDJPajrUsA7nZkHqI1 X-Proofpoint-ORIG-GUID: eseUth_I7GvnzNrDJPajrUsA7nZkHqI1 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 spamscore=0 phishscore=0 mlxscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org From: Cumulus Networks Driver for MAX6620 Fan sensor --- drivers/hwmon/Kconfig | 10 + drivers/hwmon/Makefile | 1 + drivers/hwmon/max6620.c | 702 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 713 insertions(+) create mode 100644 drivers/hwmon/max6620.c diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index e3675377bc5d..31478a55a3be 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1068,6 +1068,16 @@ config SENSORS_MAX6650 This driver can also be built as a module. If so, the module will be called max6650. +config SENSORS_MAX6620 + tristate "Maxim MAX6620 sensor chip" + depends on I2C + help + If you say yes here you get support for the MAX6620 + sensor chips. + + This driver can also be built as a module. If so, the module + will be called max6620. + config SENSORS_MAX6697 tristate "Maxim MAX6697 and compatibles" depends on I2C diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index d712c61c1f5e..923af2e4aecd 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -139,6 +139,7 @@ obj-$(CONFIG_SENSORS_MAX6621) += max6621.o obj-$(CONFIG_SENSORS_MAX6639) += max6639.o obj-$(CONFIG_SENSORS_MAX6642) += max6642.o obj-$(CONFIG_SENSORS_MAX6650) += max6650.o +obj-$(CONFIG_SENSORS_MAX6620) += max6620.o obj-$(CONFIG_SENSORS_MAX6697) += max6697.o obj-$(CONFIG_SENSORS_MAX31790) += max31790.o obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o diff --git a/drivers/hwmon/max6620.c b/drivers/hwmon/max6620.c new file mode 100644 index 000000000000..3c337c7b0f4d --- /dev/null +++ b/drivers/hwmon/max6620.c @@ -0,0 +1,702 @@ +/* + * max6620.c - Linux Kernel module for hardware monitoring. + * + * (C) 2012 by L. Grunenberg + * + * based on code written by : + * 2007 by Hans J. Koch + * John Morris + * Copyright (c) 2003 Spirent Communications + * and Claus Gindhart + * + * This module has only been tested with the MAX6620 chip. + * + * The datasheet was last seen at: + * + * http://pdfserv.maxim-ic.com/en/ds/MAX6620.pdf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Insmod parameters + */ + + +/* clock: The clock frequency of the chip the driver should assume */ +static int clock = 8192; + +module_param(clock, int, S_IRUGO); + +static const unsigned short normal_i2c[] = {0x0a, 0x1a, 0x2a, I2C_CLIENT_END}; + +/* + * MAX 6620 registers + */ + +#define MAX6620_REG_CONFIG 0x00 +#define MAX6620_REG_FAULT 0x01 +#define MAX6620_REG_CONF_FAN0 0x02 +#define MAX6620_REG_CONF_FAN1 0x03 +#define MAX6620_REG_CONF_FAN2 0x04 +#define MAX6620_REG_CONF_FAN3 0x05 +#define MAX6620_REG_DYN_FAN0 0x06 +#define MAX6620_REG_DYN_FAN1 0x07 +#define MAX6620_REG_DYN_FAN2 0x08 +#define MAX6620_REG_DYN_FAN3 0x09 +#define MAX6620_REG_TACH0 0x10 +#define MAX6620_REG_TACH1 0x12 +#define MAX6620_REG_TACH2 0x14 +#define MAX6620_REG_TACH3 0x16 +#define MAX6620_REG_VOLT0 0x18 +#define MAX6620_REG_VOLT1 0x1A +#define MAX6620_REG_VOLT2 0x1C +#define MAX6620_REG_VOLT3 0x1E +#define MAX6620_REG_TAR0 0x20 +#define MAX6620_REG_TAR1 0x22 +#define MAX6620_REG_TAR2 0x24 +#define MAX6620_REG_TAR3 0x26 +#define MAX6620_REG_DAC0 0x28 +#define MAX6620_REG_DAC1 0x2A +#define MAX6620_REG_DAC2 0x2C +#define MAX6620_REG_DAC3 0x2E + +/* + * Config register bits + */ + +#define MAX6620_CFG_RUN 0x80 +#define MAX6620_CFG_POR 0x40 +#define MAX6620_CFG_TIMEOUT 0x20 +#define MAX6620_CFG_FULLFAN 0x10 +#define MAX6620_CFG_OSC 0x08 +#define MAX6620_CFG_WD_MASK 0x06 +#define MAX6620_CFG_WD_2 0x02 +#define MAX6620_CFG_WD_6 0x04 +#define MAX6620_CFG_WD10 0x06 +#define MAX6620_CFG_WD 0x01 + + +/* + * Failure status register bits + */ + +#define MAX6620_FAIL_TACH0 0x10 +#define MAX6620_FAIL_TACH1 0x20 +#define MAX6620_FAIL_TACH2 0x40 +#define MAX6620_FAIL_TACH3 0x80 +#define MAX6620_FAIL_MASK0 0x01 +#define MAX6620_FAIL_MASK1 0x02 +#define MAX6620_FAIL_MASK2 0x04 +#define MAX6620_FAIL_MASK3 0x08 + + +/* Minimum and maximum values of the FAN-RPM */ +#define FAN_RPM_MIN 240 +#define FAN_RPM_MAX 30000 + +#define DIV_FROM_REG(reg) (1 << ((reg & 0xE0) >> 5)) + +static int max6620_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int max6620_init_client(struct i2c_client *client); +static int max6620_remove(struct i2c_client *client); +static struct max6620_data *max6620_update_device(struct device *dev); + +static const u8 config_reg[] = { + MAX6620_REG_CONF_FAN0, + MAX6620_REG_CONF_FAN1, + MAX6620_REG_CONF_FAN2, + MAX6620_REG_CONF_FAN3, +}; + +static const u8 dyn_reg[] = { + MAX6620_REG_DYN_FAN0, + MAX6620_REG_DYN_FAN1, + MAX6620_REG_DYN_FAN2, + MAX6620_REG_DYN_FAN3, +}; + +static const u8 tach_reg[] = { + MAX6620_REG_TACH0, + MAX6620_REG_TACH1, + MAX6620_REG_TACH2, + MAX6620_REG_TACH3, +}; + +static const u8 volt_reg[] = { + MAX6620_REG_VOLT0, + MAX6620_REG_VOLT1, + MAX6620_REG_VOLT2, + MAX6620_REG_VOLT3, +}; + +static const u8 target_reg[] = { + MAX6620_REG_TAR0, + MAX6620_REG_TAR1, + MAX6620_REG_TAR2, + MAX6620_REG_TAR3, +}; + +static const u8 dac_reg[] = { + MAX6620_REG_DAC0, + MAX6620_REG_DAC1, + MAX6620_REG_DAC2, + MAX6620_REG_DAC3, +}; + +/* + * Driver data (common to all clients) + */ + +static const struct i2c_device_id max6620_id[] = { + { "max6620", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, max6620_id); + +static struct i2c_driver max6620_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "max6620", + }, + .probe = max6620_probe, + .remove = __devexit_p(max6620_remove), + .id_table = max6620_id, + .address_list = normal_i2c, +}; + +/* + * Client data (each client gets its own) + */ + +struct max6620_data { + struct device *hwmon_dev; + struct mutex update_lock; + int nr_fans; + char valid; /* zero until following fields are valid */ + unsigned long last_updated; /* in jiffies */ + + /* register values */ + u8 speed[4]; + u8 config; + u8 fancfg[4]; + u8 fandyn[4]; + u8 tach[4]; + u8 volt[4]; + u8 target[4]; + u8 dac[4]; + u8 fault; +}; + +static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, char *buf) { + + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = max6620_update_device(dev); + int rpm; + + /* + * Calculation details: + * + * Each tachometer counts over an interval given by the "count" + * register (0.25, 0.5, 1 or 2 seconds). This module assumes + * that the fans produce two pulses per revolution (this seems + * to be the most common). + */ + if(data->tach[attr->index] == 0 || data->tach[attr->index] == 255) { + rpm = 0; + } else { + rpm = ((clock / (data->tach[attr->index] << 3)) * 30 * DIV_FROM_REG(data->fandyn[attr->index])); + } + + return sprintf(buf, "%d\n", rpm); +} + +static ssize_t get_target(struct device *dev, struct device_attribute *devattr, char *buf) { + + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = max6620_update_device(dev); + int kscale, ktach, rpm; + + /* + * Use the datasheet equation: + * + * FanSpeed = KSCALE x fCLK / [256 x (KTACH + 1)] + * + * then multiply by 60 to give rpm. + */ + + kscale = DIV_FROM_REG(data->fandyn[attr->index]); + ktach = data->target[attr->index]; + if(ktach == 0) { + rpm = 0; + } else { + rpm = ((60 * kscale * clock) / (ktach << 3)); + } + return sprintf(buf, "%d\n", rpm); +} + +static ssize_t set_target(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { + + struct i2c_client *client = to_i2c_client(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = i2c_get_clientdata(client); + int kscale, ktach; + unsigned long rpm; + int err; + + err = kstrtoul(buf, 10, &rpm); + if (err) + return err; + + rpm = SENSORS_LIMIT(rpm, FAN_RPM_MIN, FAN_RPM_MAX); + + /* + * Divide the required speed by 60 to get from rpm to rps, then + * use the datasheet equation: + * + * KTACH = [(fCLK x KSCALE) / (256 x FanSpeed)] - 1 + */ + + mutex_lock(&data->update_lock); + + kscale = DIV_FROM_REG(data->fandyn[attr->index]); + ktach = ((60 * kscale * clock) / rpm); + if (ktach < 0) + ktach = 0; + if (ktach > 255) + ktach = 255; + data->target[attr->index] = ktach; + + i2c_smbus_write_byte_data(client, target_reg[attr->index], data->target[attr->index]); + i2c_smbus_write_byte_data(client, target_reg[attr->index]+0x01, 0x00); + + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Get/set the fan speed in open loop mode using pwm1 sysfs file. + * Speed is given as a relative value from 0 to 255, where 255 is maximum + * speed. Note that this is done by writing directly to the chip's DAC, + * it won't change the closed loop speed set by fan1_target. + * Also note that due to rounding errors it is possible that you don't read + * back exactly the value you have set. + */ + +static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr, char *buf) { + + int pwm; + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = max6620_update_device(dev); + + /* + * Useful range for dac is 0-180 for 12V fans and 0-76 for 5V fans. + * Lower DAC values mean higher speeds. + */ + pwm = ((int)data->volt[attr->index]); + + if (pwm < 0) + pwm = 0; + + return sprintf(buf, "%d\n", pwm); +} + +static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { + + struct i2c_client *client = to_i2c_client(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = i2c_get_clientdata(client); + unsigned long pwm; + int err; + + err = kstrtoul(buf, 10, &pwm); + if (err) + return err; + + pwm = SENSORS_LIMIT(pwm, 0, 255); + + mutex_lock(&data->update_lock); + + data->dac[attr->index] = pwm; + + + i2c_smbus_write_byte_data(client, dac_reg[attr->index], data->dac[attr->index]); + i2c_smbus_write_byte_data(client, dac_reg[attr->index]+1, 0x00); + + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Get/Set controller mode: + * Possible values: + * 0 = Fan always on + * 1 = Open loop, Voltage is set according to speed, not regulated. + * 2 = Closed loop, RPM for all fans regulated by fan1 tachometer + */ + +static ssize_t get_enable(struct device *dev, struct device_attribute *devattr, char *buf) { + + struct max6620_data *data = max6620_update_device(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + int mode = (data->fancfg[attr->index] & 0x80 ) >> 7; + int sysfs_modes[2] = {1, 2}; + + return sprintf(buf, "%d\n", sysfs_modes[mode]); +} + +static ssize_t set_enable(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { + + struct i2c_client *client = to_i2c_client(dev); + struct max6620_data *data = i2c_get_clientdata(client); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + int max6620_modes[3] = {0, 1, 0}; + unsigned long mode; + int err; + + err = kstrtoul(buf, 10, &mode); + if (err) + return err; + + if (mode > 2) + return -EINVAL; + + mutex_lock(&data->update_lock); + + data->fancfg[attr->index] = i2c_smbus_read_byte_data(client, config_reg[attr->index]); + data->fancfg[attr->index] = (data->fancfg[attr->index] & ~0x80) + | (max6620_modes[mode] << 7); + + i2c_smbus_write_byte_data(client, config_reg[attr->index], data->fancfg[attr->index]); + + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Read/write functions for fan1_div sysfs file. The MAX6620 has no such + * divider. We handle this by converting between divider and counttime: + * + * (counttime == k) <==> (divider == 2^k), k = 0, 1, 2, 3, 4 or 5 + * + * Lower values of k allow to connect a faster fan without the risk of + * counter overflow. The price is lower resolution. You can also set counttime + * using the module parameter. Note that the module parameter "prescaler" also + * influences the behaviour. Unfortunately, there's no sysfs attribute + * defined for that. See the data sheet for details. + */ + +static ssize_t get_div(struct device *dev, struct device_attribute *devattr, char *buf) { + + struct max6620_data *data = max6620_update_device(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + + return sprintf(buf, "%d\n", DIV_FROM_REG(data->fandyn[attr->index])); +} + +static ssize_t set_div(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { + + struct i2c_client *client = to_i2c_client(dev); + struct max6620_data *data = i2c_get_clientdata(client); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + unsigned long div; + int err; + u8 div_bin; + + err = kstrtoul(buf, 10, &div); + if (err) + return err; + + mutex_lock(&data->update_lock); + switch (div) { + case 1: + div_bin = 0; + break; + case 2: + div_bin = 1; + break; + case 4: + div_bin = 2; + break; + case 8: + div_bin = 3; + break; + case 16: + div_bin = 4; + break; + case 32: + div_bin = 5; + break; + default: + mutex_unlock(&data->update_lock); + return -EINVAL; + } + data->fandyn[attr->index] &= 0x1F; + data->fandyn[attr->index] |= div_bin << 5; + i2c_smbus_write_byte_data(client, dyn_reg[attr->index], data->fandyn[attr->index]); + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Get alarm stati: + * Possible values: + * 0 = no alarm + * 1 = alarm + */ + +static ssize_t get_alarm(struct device *dev, struct device_attribute *devattr, char *buf) { + + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct max6620_data *data = max6620_update_device(dev); + struct i2c_client *client = to_i2c_client(dev); + int alarm = 0; + + if (data->fault & (1 << attr->index)) { + mutex_lock(&data->update_lock); + alarm = 1; + data->fault &= ~(1 << attr->index); + data->fault |= i2c_smbus_read_byte_data(client, + MAX6620_REG_FAULT); + mutex_unlock(&data->update_lock); + } + + return sprintf(buf, "%d\n", alarm); +} + +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1); +static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2); +static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3); +static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, get_target, set_target, 0); +static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_div, set_div, 0); +// static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 0); +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, get_target, set_target, 1); +static SENSOR_DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO, get_div, set_div, 1); +// static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 1); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, get_target, set_target, 2); +static SENSOR_DEVICE_ATTR(fan3_div, S_IWUSR | S_IRUGO, get_div, set_div, 2); +// static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 2); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, get_target, set_target, 3); +static SENSOR_DEVICE_ATTR(fan4_div, S_IWUSR | S_IRUGO, get_div, set_div, 3); +// static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 3); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 3); + +static struct attribute *max6620_attrs[] = { + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan1_target.dev_attr.attr, + &sensor_dev_attr_fan1_div.dev_attr.attr, +// &sensor_dev_attr_pwm1_enable.dev_attr.attr, + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_fan2_target.dev_attr.attr, + &sensor_dev_attr_fan2_div.dev_attr.attr, +// &sensor_dev_attr_pwm2_enable.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_fan3_target.dev_attr.attr, + &sensor_dev_attr_fan3_div.dev_attr.attr, +// &sensor_dev_attr_pwm3_enable.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_fan4_target.dev_attr.attr, + &sensor_dev_attr_fan4_div.dev_attr.attr, +// &sensor_dev_attr_pwm4_enable.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, + NULL +}; + +static struct attribute_group max6620_attr_grp = { + .attrs = max6620_attrs, +}; + + +/* + * Real code + */ + +static int __devinit max6620_probe(struct i2c_client *client, const struct i2c_device_id *id) { + + struct max6620_data *data; + int err; + + data = devm_kzalloc(&client->dev, sizeof(struct max6620_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "out of memory.\n"); + return -ENOMEM; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->nr_fans = id->driver_data; + + /* + * Initialize the max6620 chip + */ + dev_info(&client->dev, "About to initialize module\n"); + + err = max6620_init_client(client); + if (err) + return err; + dev_info(&client->dev, "Module initialized\n"); + + err = sysfs_create_group(&client->dev.kobj, &max6620_attr_grp); + if (err) + return err; +dev_info(&client->dev, "Sysfs entries created\n"); + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (!IS_ERR(data->hwmon_dev)) + return 0; + + err = PTR_ERR(data->hwmon_dev); + dev_err(&client->dev, "error registering hwmon device.\n"); + + sysfs_remove_group(&client->dev.kobj, &max6620_attr_grp); + return err; +} + +static int __devexit max6620_remove(struct i2c_client *client) { + + struct max6620_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + + sysfs_remove_group(&client->dev.kobj, &max6620_attr_grp); + return 0; +} + +static int max6620_init_client(struct i2c_client *client) { + + struct max6620_data *data = i2c_get_clientdata(client); + int config; + int err = -EIO; + int i; + + config = i2c_smbus_read_byte_data(client, MAX6620_REG_CONFIG); + + if (config < 0) { + dev_err(&client->dev, "Error reading config, aborting.\n"); + return err; + } + + + + if (i2c_smbus_write_byte_data(client, MAX6620_REG_CONFIG, config)) { + dev_err(&client->dev, "Config write error, aborting.\n"); + return err; + } + + data->config = config; + for (i = 0; i < 4; i++) { + data->fancfg[i] = i2c_smbus_read_byte_data(client, config_reg[i]); + data->fancfg[i] |= 0x80; // enable TACH monitoring + i2c_smbus_write_byte_data(client, config_reg[i], data->fancfg[i]); + data->fandyn[i] = i2c_smbus_read_byte_data(client, dyn_reg[i]); + data-> fandyn[i] |= 0x1C; + i2c_smbus_write_byte_data(client, dyn_reg[i], data->fandyn[i]); + data->tach[i] = i2c_smbus_read_byte_data(client, tach_reg[i]); + data->volt[i] = i2c_smbus_read_byte_data(client, volt_reg[i]); + data->target[i] = i2c_smbus_read_byte_data(client, target_reg[i]); + data->dac[i] = i2c_smbus_read_byte_data(client, dac_reg[i]); + + + + } + + + + return 0; +} + + + + +static struct max6620_data *max6620_update_device(struct device *dev) +{ + int i; + struct i2c_client *client = to_i2c_client(dev); + struct max6620_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { + + for (i = 0; i < 4; i++) { + data->fancfg[i] = i2c_smbus_read_byte_data(client, config_reg[i]); + data->fandyn[i] = i2c_smbus_read_byte_data(client, dyn_reg[i]); + data->tach[i] = i2c_smbus_read_byte_data(client, tach_reg[i]); + data->volt[i] = i2c_smbus_read_byte_data(client, volt_reg[i]); + data->target[i] = i2c_smbus_read_byte_data(client, target_reg[i]); + data->dac[i] = i2c_smbus_read_byte_data(client, dac_reg[i]); + } + + + /* + * Alarms are cleared on read in case the condition that + * caused the alarm is removed. Keep the value latched here + * for providing the register through different alarm files. + */ + u8 fault_reg; + fault_reg = i2c_smbus_read_byte_data(client, MAX6620_REG_FAULT); + data->fault |= (fault_reg >> 4) & (fault_reg & 0x0F); + + data->last_updated = jiffies; + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + + return data; +} + +module_i2c_driver(max6620_driver); + +static int __init max6620_init(void) +{ + return i2c_add_driver(&max6620_driver); +} +module_init(max6620_init); + +/** + * sht21_init() - clean up driver + * + * Called when module is removed. + */ +static void __exit max6620_exit(void) +{ + i2c_del_driver(&max6620_driver); +} +module_exit(max6620_exit); + +MODULE_AUTHOR("Lucas Grunenberg"); +MODULE_DESCRIPTION("MAX6620 sensor driver"); +MODULE_LICENSE("GPL"); From patchwork Tue Jul 6 13:02:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Balac, Arun Saravanan" X-Patchwork-Id: 12360565 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A9131C07E96 for ; Tue, 6 Jul 2021 13:02:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9476961A46 for ; Tue, 6 Jul 2021 13:02:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229834AbhGFNE7 (ORCPT ); Tue, 6 Jul 2021 09:04:59 -0400 Received: from mx0a-00154904.pphosted.com ([148.163.133.20]:33320 "EHLO mx0a-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231975AbhGFNE6 (ORCPT ); Tue, 6 Jul 2021 09:04:58 -0400 Received: from pps.filterd (m0170392.ppops.net [127.0.0.1]) by mx0a-00154904.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166CfslY015318; Tue, 6 Jul 2021 09:02:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dell.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=e26wjKifH2nkTSdDBqSBuZxeutEjH/Cl9lUEmVm/Iyc=; b=FdbamcfaNAJ9/CkoR/QzuR1yJeFquPFvGWs5CHynsUc9PfkuRS29kz+Fx9uL5h2n5WdC qRl5e8Q2JF0oqGeeYSgGNRtz6M/r4u4F+mqJX0BSmLsYlGPxBOfjNebLAaGDlA225IbJ caEqGDTV/TpbXP9GxTf6OksehBD2RaYVo3OdK0Ol3mzr9LqN5OUcKQdwKBZ0eAnTVigw 9aK69rD3Pkb71yX8MMX0k197NIy/3XqOm5CGHORj1N8+pk3IXyNQ+I9lFsS86njCiAQE OIupAUjccKVKGB1sUKCB/wfx6kUp74vDNG9MfP7AdTWYFEjnl6wrDyQvGD4ncNnuMp/x /A== Received: from mx0b-00154901.pphosted.com (mx0b-00154901.pphosted.com [67.231.157.37]) by mx0a-00154904.pphosted.com with ESMTP id 39m5pfvan1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 06 Jul 2021 09:02:05 -0400 Received: from pps.filterd (m0144103.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166D1r4x061229; Tue, 6 Jul 2021 09:02:04 -0400 Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2106.outbound.protection.outlook.com [104.47.55.106]) by mx0b-00154901.pphosted.com with ESMTP id 39mjwscchf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Jul 2021 09:02:04 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IO9yTmiYFSfM8rTopBreZ25xgEbxEhjQNEnUJmrsvjoafkVUhZXwFXEk6CI8AEXxEhi+5Ry3tN+x4whTiN6fC3j9mf2ldphkcPT/LYjlZr5l/DZNJOvVrLcNKudwoLeLO4VPyjHiXeHCfw5AfYVEStX+ZvTtHnxoqeXMnF3eS8FQ3DKhSt42kAkku6eZMhU0ZCC+VLypJ4n+28H9urLrkGi0VukH7z0yYk3SfceCv8Ogjxwfs5QbLGMTm7LOfVRwawCf644Krgbx8aP1vG4ukF2JYENju25151xJw5ktJBi0DlqrIEZqwDMVROHjboTE/VkI14oN8P5YCPkyQW3rAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=e26wjKifH2nkTSdDBqSBuZxeutEjH/Cl9lUEmVm/Iyc=; b=WqeXipK3k7ayUn4JX5VtWL3c2ocTAJnQsF2UueZxwMG76qBuWzjEF49eWbiJGZZk9EpSVtM8bWnijhtoc/wmn6ep6Nax/DAVaU99PnCh7Lxqnk5T9LFkwLcSD0CNnQXyxFvdYZHvr59chuB/5aVIxb/T6JPefJpW8lGSXGATNCntTaIKHRMCPawrASrCz1NimyVYbuuFNnSp6hmAUF0u25yC0t/Wuchh+tov/0ryIQwMo2hXkGjYpe++l5svaZzZvPGciIB26YrM8Y4iqsgfFiXRWTayCqB4Y0w22haQI9CkjNU5a7zElqu8mydOZDKFlkSc56Z6yaGZIGWTIPDy0w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=dell.com; dmarc=pass action=none header.from=dell.com; dkim=pass header.d=dell.com; arc=none Received: from MW2PR1901MB2028.namprd19.prod.outlook.com (2603:10b6:302:8::11) by MWHPR19MB1469.namprd19.prod.outlook.com (2603:10b6:300:d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22; Tue, 6 Jul 2021 13:02:01 +0000 Received: from MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372]) by MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372%6]) with mapi id 15.20.4308.020; Tue, 6 Jul 2021 13:02:01 +0000 From: "Balac, Arun Saravanan" To: "linux@roeck-us.net" , "jdelvare@suse.com" CC: "linux-hwmon@vger.kernel.org" Subject: [PATCH 2/5] hwmon: MAX6620 fix rpm calculation accuracy Thread-Topic: [PATCH 2/5] hwmon: MAX6620 fix rpm calculation accuracy Thread-Index: AddyZU3llOyuWnf7QSCmcuWOsH1qHA== Date: Tue, 6 Jul 2021 13:02:01 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Enabled=True; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SiteId=945c199a-83a2-4e80-9f8c-5a91be5752dd; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Owner=Arun_Saravanan_Balac@Dell.com; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SetDate=2021-07-06T13:01:56.3528455Z; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Name=External Public; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Application=Microsoft Azure Information Protection; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_ActionId=005e6a98-4634-4f04-b1e0-15555c5d5411; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Extended_MSFT_Method=Manual authentication-results: roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=none action=none header.from=Dell.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: eee795a2-a69c-4a83-77a4-08d9407e3ee4 x-ms-traffictypediagnostic: MWHPR19MB1469: x-microsoft-antispam-prvs: x-exotenant: 2khUwGVqB6N9v58KS13ncyUmMJd8q4 x-ms-oob-tlc-oobclassifiers: OLM:7219; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: vWeHubd9Yen2gd7fATM81YWUs9p+ZdhT0OprPCMn+FKdLr6onQjuxSG4z4mx7Psuip2PDIOfw4dEt0GTS87mLE7QdIuKAprJ9q41yYp6Etta9PIXF0DFV3Tx+u5A2mY+q1CYHan/EQXNgn+oexwayc4ec3xviIwfU3ItiVuJgbgP0YllpNdzhBqXKwL19JkTC6aUj/5h4G3WdroOl8sTkGtQEm/lL+20v6ebtGP7tjsFdmyHvsNzXKtb7g4t/DyS0UWF0A6Sgs3CiwN6Vs4R88zzgJFhLMKrgcAoc5iHI5bjn8nZfpdmehNzaZApDfJ32qKdfqOAvUOveRB5NTpBESHb6wufFIi8fserenfqiqy8UL2okL9YvAyFG9zu2nfPi0hYKxnR/zYriTAjqo8rsyUM/jW0mqRT73nbYn2ZCGuwKZJOG3tL+EBF2ek54APsS+/T5R6f66naTl1lEKxPP2e80SqfN4P7BC7qRy79JhBJiXbImR2ox0ZcYDL24t4v0M2ZrUb2VNbPa9kQGFY3HnaszpSJ0iQs0OX6/fMR3lW8KUzr57pwFln4nEqlZnOTBXMP7y2MYAvljZ3PxiWw4b9RRfXtLgUCWYUqP79ogmOhvH8IhTUBfJuH77Cf7rSn9/Z+xi3TK+IJtToyk+2tiQ== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR1901MB2028.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(396003)(366004)(136003)(376002)(39860400002)(5660300002)(33656002)(8936002)(66946007)(110136005)(83380400001)(66556008)(26005)(8676002)(7696005)(786003)(66476007)(76116006)(55236004)(316002)(86362001)(6506007)(478600001)(2906002)(122000001)(64756008)(52536014)(4326008)(186003)(55016002)(9686003)(66446008)(71200400001)(38100700002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: 8xAgWP7wmZItu9YkQk6EyZPdBvvJRL+2EaavALmhkyNOg9BFYvShiFxywnf5++c0ru0uqJ6VrVtTREugVKz79HABOPty/7ohA20wkVvAVbidnzbqG+P2Nlw3O6TT934KP/Qmub4AZkDckbEzjEAW8coUcbi1AVBLkmxi61FQWx/rZ5BW4DZabhoDaG/+vDfFge68/T7muW0gkqREYuxSIGBh0hWz6VmbCuY5VM8Ai7Lpn1+khRgwCyS4xYOEJcswovoJIBVH9XiJENdnqN8qHnN2dtseBif+lSxJSsCIE7sd3Hcy/ilG+zGonnmMI+bWHHclPvFID/Vow7rsRpWWk6yIvVRSi2vS1edsNV01MSJeEsWNyio/pWBXa675d57ZGZVQS85CjbdVq7+BT2cVorfGlQQBDIHDnMOYNdflUJsU+jl/mkjCzHWDhMRkk6aBV4IOmNo9Ernl7DK7lhf+zP5fASqfwolq/S41FthlRBt1GsP5aBYFtARwJSVAhxl+soVA37VF3sLZlkmI4nuiMtEuRWrh3rm4KCtKUvS7nAVFVxGm2OtES+rQCNFBn7MSIzVhoBQFy2svnusmj7C1YtwwR52qwlanVDhS13HOgwMB2w2j5U8fB5rAG59bL1rRB15JoK2kvBu1LU/if8qA+ygt7kG1PWrUZsEkCJAKAyaGfVxzWtt7WcoNHl2Kwvf6zzErndMFQecsN4F+15IT0TnMTWP6gAKk/NKie+XnhRCqxxFzjuWSfY8gVQRbgASxJY2+qzoZwHKK/uZrfdce9I0yzJujldUxW0XxNy/7VGTCVge1N/ibd+4hcouB0EUtJOnVkHXcgmlXIzxY9y47qgcpQuhs/sbNFjGjuRVbVbSFC876PCk+nYOq8X+CW0HHKdBj+8LzPRP4xr3HnppEUpdJaeexoS8UitAOh9EPmju/81QG/91l0ve7Gdr6X8l/7Gt7+S/G8FSHM8aX7TYKNIZ1PU5bMrZR+xcxVnestVEtV1qvQD33BYtyZ/QRSicvy11eGtVZSDCH3QRtSQZCUE9XdbxkgwoafFV6I2zUeE7qNmHTLycPh2cdiatj74/TqTY99J4gO77ATDtLhRDBiV+69g4QkcHiQgolxnVd2ytjJBBxqplYxMF3LTPENyVBB6fKsKJtXsAiaGfZe9TS5+8XI2uClk/RgluEOcsFfKjfEQnHgFufqXk0Wn7yQ+4V/S3r2Q9wEP6yLtGYVzPjWyspsKfkzPi0vpn/GivplXCXmzTBNKxc7AxtbipNuCDMh7Vc/745zPzHaGY6zwaxgWmJIdu2feH/9s3Nf+poKO6RHZ5zsQbhmvBHjVza5BC5 x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: Dell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR1901MB2028.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: eee795a2-a69c-4a83-77a4-08d9407e3ee4 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Jul 2021 13:02:01.3483 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 945c199a-83a2-4e80-9f8c-5a91be5752dd X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: I4vpLHBTC27wsMljh3XywL2hhtK1EJDlpzcfLtS0SDBAXjcxu3MDw+uc3MWggNJXExnoHe1Pbq6RcEmBIYd11f7oFnmL/cq7of7B4YwuqCU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR19MB1469 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-06_06:2021-07-02,2021-07-06 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 mlxlogscore=999 bulkscore=0 lowpriorityscore=0 clxscore=1015 mlxscore=0 spamscore=0 suspectscore=0 priorityscore=1501 phishscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 X-Proofpoint-ORIG-GUID: JNLwgTvbVo12wfInUj0W2q_tdM8DYu4W X-Proofpoint-GUID: JNLwgTvbVo12wfInUj0W2q_tdM8DYu4W X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 malwarescore=0 phishscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org From: Cumulus Networks The driver only fills the most significant 8 bits of the fan tach count (11 bit value). Fixing the driver to use all of 11 bits for more accuracy. --- drivers/hwmon/max6620.c | 105 ++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 59 deletions(-) diff --git a/drivers/hwmon/max6620.c b/drivers/hwmon/max6620.c index 3c337c7b0f4d..2cd3b0beb6b4 100644 --- a/drivers/hwmon/max6620.c +++ b/drivers/hwmon/max6620.c @@ -46,6 +46,8 @@ /* clock: The clock frequency of the chip the driver should assume */ static int clock = 8192; +static u32 sr = 2; +static u32 np = 2; module_param(clock, int, S_IRUGO); @@ -213,22 +215,22 @@ static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, cha struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); - int rpm; - - /* - * Calculation details: - * - * Each tachometer counts over an interval given by the "count" - * register (0.25, 0.5, 1 or 2 seconds). This module assumes - * that the fans produce two pulses per revolution (this seems - * to be the most common). - */ - if(data->tach[attr->index] == 0 || data->tach[attr->index] == 255) { + struct i2c_client *client = to_i2c_client(dev); + u32 rpm = 0; + u32 tach = 0; + u32 tach1 = 0; + u32 tach2 = 0; + + tach1 = i2c_smbus_read_byte_data(client, tach_reg[attr->index]); + tach1 = (tach1 << 3) & 0x7f8; + tach2 = i2c_smbus_read_byte_data(client, tach_reg[attr->index] + 1); + tach2 = (tach2 >> 5) & 0x7; + tach = tach1 | tach2; + if (tach == 0) { rpm = 0; } else { - rpm = ((clock / (data->tach[attr->index] << 3)) * 30 * DIV_FROM_REG(data->fandyn[attr->index])); + rpm = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(tach * np); } - return sprintf(buf, "%d\n", rpm); } @@ -236,22 +238,21 @@ static ssize_t get_target(struct device *dev, struct device_attribute *devattr, struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); - int kscale, ktach, rpm; - - /* - * Use the datasheet equation: - * - * FanSpeed = KSCALE x fCLK / [256 x (KTACH + 1)] - * - * then multiply by 60 to give rpm. - */ - - kscale = DIV_FROM_REG(data->fandyn[attr->index]); - ktach = data->target[attr->index]; - if(ktach == 0) { + struct i2c_client *client = to_i2c_client(dev); + u32 rpm; + u32 target; + u32 target1; + u32 target2; + + target1 = i2c_smbus_read_byte_data(client, target_reg[attr->index]); + target1 = (target1 << 3) & 0x7f8; + target2 = i2c_smbus_read_byte_data(client, target_reg[attr->index] + 1); + target2 = (target2 >> 5) & 0x7; + target = target1 | target2; + if (target == 0) { rpm = 0; } else { - rpm = ((60 * kscale * clock) / (ktach << 3)); + rpm = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(target * np); } return sprintf(buf, "%d\n", rpm); } @@ -261,9 +262,11 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr, struct i2c_client *client = to_i2c_client(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = i2c_get_clientdata(client); - int kscale, ktach; - unsigned long rpm; + u32 rpm; int err; + u32 target; + u32 target1; + u32 target2; err = kstrtoul(buf, 10, &rpm); if (err) @@ -271,25 +274,13 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr, rpm = SENSORS_LIMIT(rpm, FAN_RPM_MIN, FAN_RPM_MAX); - /* - * Divide the required speed by 60 to get from rpm to rps, then - * use the datasheet equation: - * - * KTACH = [(fCLK x KSCALE) / (256 x FanSpeed)] - 1 - */ - mutex_lock(&data->update_lock); - kscale = DIV_FROM_REG(data->fandyn[attr->index]); - ktach = ((60 * kscale * clock) / rpm); - if (ktach < 0) - ktach = 0; - if (ktach > 255) - ktach = 255; - data->target[attr->index] = ktach; - - i2c_smbus_write_byte_data(client, target_reg[attr->index], data->target[attr->index]); - i2c_smbus_write_byte_data(client, target_reg[attr->index]+0x01, 0x00); + target = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(rpm * np); + target1 = (target >> 3) & 0xff; + target2 = (target << 5) & 0xe0; + i2c_smbus_write_byte_data(client, target_reg[attr->index], target1); + i2c_smbus_write_byte_data(client, target_reg[attr->index] + 1, target2); mutex_unlock(&data->update_lock); @@ -609,8 +600,11 @@ static int max6620_init_client(struct i2c_client *client) { } - - if (i2c_smbus_write_byte_data(client, MAX6620_REG_CONFIG, config)) { + /* + * Set bit 4, disable other fans from going full speed on a fail + * failure. + */ + if (i2c_smbus_write_byte_data(client, MAX6620_REG_CONFIG, config | 0x10)) { dev_err(&client->dev, "Config write error, aborting.\n"); return err; } @@ -618,28 +612,21 @@ static int max6620_init_client(struct i2c_client *client) { data->config = config; for (i = 0; i < 4; i++) { data->fancfg[i] = i2c_smbus_read_byte_data(client, config_reg[i]); - data->fancfg[i] |= 0x80; // enable TACH monitoring + data->fancfg[i] |= 0xa8; // enable TACH monitoring i2c_smbus_write_byte_data(client, config_reg[i], data->fancfg[i]); data->fandyn[i] = i2c_smbus_read_byte_data(client, dyn_reg[i]); - data-> fandyn[i] |= 0x1C; + /* 2 counts (001) and Rate change 100 (0.125 secs) */ + data-> fandyn[i] = 0x30; i2c_smbus_write_byte_data(client, dyn_reg[i], data->fandyn[i]); data->tach[i] = i2c_smbus_read_byte_data(client, tach_reg[i]); data->volt[i] = i2c_smbus_read_byte_data(client, volt_reg[i]); data->target[i] = i2c_smbus_read_byte_data(client, target_reg[i]); data->dac[i] = i2c_smbus_read_byte_data(client, dac_reg[i]); - - } - - - return 0; } - - - static struct max6620_data *max6620_update_device(struct device *dev) { int i; @@ -678,7 +665,7 @@ static struct max6620_data *max6620_update_device(struct device *dev) return data; } -module_i2c_driver(max6620_driver); +// module_i2c_driver(max6620_driver); static int __init max6620_init(void) { From patchwork Tue Jul 6 13:02:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Balac, Arun Saravanan" X-Patchwork-Id: 12360569 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 615B1C07E9C for ; Tue, 6 Jul 2021 13:02:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4159861C33 for ; Tue, 6 Jul 2021 13:02:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231950AbhGFNFN (ORCPT ); Tue, 6 Jul 2021 09:05:13 -0400 Received: from mx0a-00154904.pphosted.com ([148.163.133.20]:50438 "EHLO mx0a-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231836AbhGFNFG (ORCPT ); Tue, 6 Jul 2021 09:05:06 -0400 Received: from pps.filterd (m0170391.ppops.net [127.0.0.1]) by mx0a-00154904.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166Ch34r020721; Tue, 6 Jul 2021 09:02:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dell.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=kSignp1uvxvQzuP/XgyOpEedf6ydwWk5CMRCWfRL4Y0=; b=cM7rrHrNQnLUmHcfLiOfrZuCReO1giICf4vsGuJLFe/7MAt8c5WxonN09PzUo2gu4bbf xL5b/loMAKoUskuMf+x1IQ1eOGrtVDpJaaN6vSDIi2v9s5lFwW7Jfkai0p3ODdBzU1rw qSsUskRfgMRD+ArraoBgSICslUi3lP7KIMl6ksICIugiCalkn7NhCUY1FeXbMHMda8ym HbOjnBm8F1tnC+ZMrTEE0z43O0bBSrcu/MIXFUQ2mu9cdzJ/h1cj6e+cJKJnQgAaTLql VJwQgurkcWd6wG56igFtYbxVFHw/BKi1k6/MJBJSxBH9YvFLTElyla/1FqiNPaUeaZYU 6g== Received: from mx0b-00154901.pphosted.com (mx0b-00154901.pphosted.com [67.231.157.37]) by mx0a-00154904.pphosted.com with ESMTP id 39m77fkxhg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 06 Jul 2021 09:02:13 -0400 Received: from pps.filterd (m0144102.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166CiaIj022400; Tue, 6 Jul 2021 09:02:11 -0400 Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2107.outbound.protection.outlook.com [104.47.55.107]) by mx0b-00154901.pphosted.com with ESMTP id 39mjx0vckk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Jul 2021 09:02:11 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=aJtP1U2wCrl9ErVPw9OU021+NAVxtyofaY7eFnnUzvA7kAn/xNAQz/JgtimbD1BxX1l3EhFlV95hlrHV1a/Hat4pi4WLQvcYIv+gCXyakmz+133RS8sMdCYdIJDl/GNIET5y4rlFH2N10pIQGBP1Dj2H2q9SR6+PxxBfQha6u6igyhmRe2eMZlwaOwX304HDjrrLOrf9epeO8MzgN+tTPVod5fTG1O6LNSBv7hynHKV1h1sSNhr99dRFOL4PYDvbKRuYmdhjA/Zz5FLhUO27VSk6Zd+XmNYCClm9m7+UrDgzLOMEU26fJgh2sq6EQ8Nor+rtNfiz8ai3au3/+aw4yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kSignp1uvxvQzuP/XgyOpEedf6ydwWk5CMRCWfRL4Y0=; b=SdNdlDjuwIy1aMyz0GHhMU9TXj8rREjYojcECUkVDQPnETX4KdGSHgH6DGa1Vk2Tb3mWjbS7vMsLnlzYlpldmxWVDu7cye7ylD+b5w02sfjjLGW5CfdHd7ZGVBwyR9SEMnC2owLwwSoMi5qKzZ/FpVcpKgARKokinII337dSWO9ONc2qdjLdMnzmh42JFysRHCUMML+gpeDAGctVcgTfDtlfW51lrJfhXC0TMYA52+C4dvgh7DpaMcZSZW8uUrnXObA3U48F83/VogLmArTLd7Lb93zfrQvSE2JmMJf1MPf0TRhxaZSoRjYEu228QXwGAudSa2BidVGAlgnq2F9OBQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=dell.com; dmarc=pass action=none header.from=dell.com; dkim=pass header.d=dell.com; arc=none Received: from MW2PR1901MB2028.namprd19.prod.outlook.com (2603:10b6:302:8::11) by MWHPR19MB1469.namprd19.prod.outlook.com (2603:10b6:300:d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22; Tue, 6 Jul 2021 13:02:05 +0000 Received: from MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372]) by MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372%6]) with mapi id 15.20.4308.020; Tue, 6 Jul 2021 13:02:05 +0000 From: "Balac, Arun Saravanan" To: "linux@roeck-us.net" , "jdelvare@suse.com" CC: "linux-hwmon@vger.kernel.org" Subject: [PATCH 3/5] hwmon: Update MAX6620 driver to support newer kernel Thread-Topic: [PATCH 3/5] hwmon: Update MAX6620 driver to support newer kernel Thread-Index: AddyZXk4CgsgsEd+Q1CcnwYxK8Gi7g== Date: Tue, 6 Jul 2021 13:02:05 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Enabled=True; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SiteId=945c199a-83a2-4e80-9f8c-5a91be5752dd; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Owner=Arun_Saravanan_Balac@Dell.com; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SetDate=2021-07-06T13:02:01.6485527Z; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Name=External Public; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Application=Microsoft Azure Information Protection; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_ActionId=db4a4ecf-fffc-4d6a-980c-0fab5c79eaec; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Extended_MSFT_Method=Manual authentication-results: roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=none action=none header.from=Dell.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: ee3ed707-64b5-4f19-0a08-08d9407e417f x-ms-traffictypediagnostic: MWHPR19MB1469: x-microsoft-antispam-prvs: x-exotenant: 2khUwGVqB6N9v58KS13ncyUmMJd8q4 x-ms-oob-tlc-oobclassifiers: OLM:2043; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: hBcPiJUtQkeOkSPXbu60gXsU9dq5XF6fL75SO7E35Z+BBGzBzcckWxAruckzjxzTwGkzNhJWsmRAz1Ps6i8hst5ElZ8uZ42/+VWlj5JkCFUpQIJKqdDx6Z2S7jirwyNT56UhcQMCAzdEAftA3xOo1pCGURV7G9Vh4stl5UW+y2jwX+1eBRG5koSsfpbsW64zd3MzUD1Yy0Q197IGG6TjeXDTSXg7jLrP7z0jZbU7FCU0hkyH+pNuHLwVQoWc8UXxkniA862NBJO4QkMLz/PS2KQrtsWIRE7C4h6gPEQgI5gCpR1+YR99kBFv9vywnODVvvm+q1Yu6XdnSuyBw4ac0PhTL4HxWZJ9L8v1H9X0OqtaXm0a/xnyBLKPiu1e/rn8e4K39ark5r+eo6IZyxq6cRDU5QZshwG5MOzo9VMnGTVWe1kbtcLjZ07uByuyfT2WVWl78YGvs4m1jEt1ttbfSNTzTZHhhZjFY2JufDB78CCOXQW4fogT4iNeyWbzx1ASVft8YDmsscUTrWwxewmeHil5Sxbadgruf0w1uVXEz/nL3ablBMCpkBaQcTcKOY9nlaM3XpSMWwW9N9c5MmL7WPgfCRcN1LrPJ9heRcCN2XD5vHubVLuGrn+6fnZhBLBQtCcEIx+m96v3FMLmBVFO+w== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR1901MB2028.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(396003)(366004)(136003)(376002)(39860400002)(5660300002)(33656002)(8936002)(66946007)(110136005)(83380400001)(66556008)(26005)(8676002)(7696005)(786003)(66476007)(76116006)(55236004)(316002)(86362001)(6506007)(478600001)(2906002)(122000001)(64756008)(15650500001)(52536014)(4326008)(186003)(55016002)(9686003)(66446008)(71200400001)(38100700002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: c1K/TRezMOUyy5S8F2SdJPKsAA7VAi/1/0CgpPWJLd0OEUSe/tNxuNtKX/0olntT1vOCo42za3Pd77JbEXHzuqBTqko8FWUSct7R6dP6wt89/h3RHHOVfbtG8kD+rxT2l9H4XHWSm7C77odzlgwtutVMRa7O8dapUv3Qg7SCuRNeImgwESACS434aFizn9Wemm/O5PB23PsQ1NxFo2oin+LMgmi/53lDnTXHo73A7w6kFUjIm+jUvj+78qAeosqT0/+te8juQDWU69IQmGZgRkZloAq+m38QDd16DbTGMofq5rBnkkRExxcKS+TVdnCL2nVMLaTJW2M9o2kNekmxWZ9X3Jce1L7SJPC0n3SRrCnqbQx5XrvV/0lYREot4w9WZZOaihI6/Ocz+JJ0qvWqgC2HwukU4B5deCY64AdDEVulSrSscZLFrBdbG1BTeIGXgIgqTDC1L0JA2ISN5jjgWbKEgHrkqbt39RjWOMOGepBXyzqp4fcXZOyF3JJBGfdBGq9Wm1GCr/9S9HmoQHJDtLkqthK0/s2ZZfs7f2rCetM8TUQ1dvQ0/Er/fjOdTV1j8cZvZyKw69XGdGiLUyZDRgc2x5Le4gW6xGnQW0AT8u7UI1uN1N437AgpYfebLZ8zb1fAXnGV8uYeuiVcB7UT+DENiIy/ogLK9r8uu06hberctuaRbyj04s8nb2a3c7UDfaQc0fzWjcZYvRJjwnhGa+eWKgk+DzA87wTV44nG8kfSbJ+GZEAopRO04QiReqTIEBdqV0DzPPrWg9HIA920zSjOaXm3IO60KjRb6UyPlrxJchJldKCDtBCKI5Hy87y/2bTO2tsXgdZtkcJB6gAwCjJ+DJKCIZ3pnc1AdkcRXcZ651JcR234gIj4kgyistxEvq7OJGM7VhCk0ZalniitVCmQiLkxadtRsS0G0hnLQAR0Y0OlzK3ZtHmC97yMD6dEURfJOq/YG/+smUaE0jP7Yu3mciHD5tnMSkwyVgDGjNFfa9H03gDtpxDSOYaTZ6LSKCDkX78+xX1hRxNA2EMQ0lvMO9yhZWM1IU+BH6RKZK39fEMpF3Y6+PQFsFCAOkU8VUS5hn7SrMyHzr6yYKdi44CIEIO59GSXu+5/aDocyjHtsCwrvD79CUB5xDGon/s0JI2D21h7ueydzSkitJmuEcE8BY/YaVE29uIrNcLdeBa9ePYPjoc3GxRC7tMx7/3Js7fo9gY9HFdn+PjaCNJWmR26m5Cs1Mc1hjj1JLJKOS23XcmcXdca+Fdi6oCJA4caCvcBtQyou5Skt+P/C5kZ5tQU1Qg/0eX24CyhQvtYQfgrjLs5uytOwchZfQV8FagB x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: Dell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR1901MB2028.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ee3ed707-64b5-4f19-0a08-08d9407e417f X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Jul 2021 13:02:05.7767 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 945c199a-83a2-4e80-9f8c-5a91be5752dd X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: B81Pm08RSwP/aCr50du/m9nkyT/p1Re+Ng+i6xnAzBh9UdpqjGSzd6fWtFv5DaZJfyqoEchD5nCE6u4/N7Px6zkFiVrYsCysg5KVoLCrBmA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR19MB1469 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-06_06:2021-07-02,2021-07-06 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 malwarescore=0 adultscore=0 mlxscore=0 bulkscore=0 mlxlogscore=999 clxscore=1015 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 X-Proofpoint-ORIG-GUID: XMeSvbg7zsnolrFNA5q6qjRoRRQOch9H X-Proofpoint-GUID: XMeSvbg7zsnolrFNA5q6qjRoRRQOch9H X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 adultscore=0 spamscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org From: Shuotian Cheng Update MAX6620 driver to support newer kernel version --- drivers/hwmon/max6620.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/hwmon/max6620.c b/drivers/hwmon/max6620.c index 2cd3b0beb6b4..5c8b155ca155 100644 --- a/drivers/hwmon/max6620.c +++ b/drivers/hwmon/max6620.c @@ -183,7 +183,7 @@ static struct i2c_driver max6620_driver = { .name = "max6620", }, .probe = max6620_probe, - .remove = __devexit_p(max6620_remove), + .remove = max6620_remove, .id_table = max6620_id, .address_list = normal_i2c, }; @@ -231,6 +231,7 @@ static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, cha } else { rpm = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(tach * np); } + return sprintf(buf, "%d\n", rpm); } @@ -262,17 +263,17 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr, struct i2c_client *client = to_i2c_client(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = i2c_get_clientdata(client); - u32 rpm; + unsigned long rpm; int err; - u32 target; - u32 target1; - u32 target2; + unsigned long target; + unsigned long target1; + unsigned long target2; err = kstrtoul(buf, 10, &rpm); if (err) return err; - rpm = SENSORS_LIMIT(rpm, FAN_RPM_MIN, FAN_RPM_MAX); + rpm = clamp_val(rpm, FAN_RPM_MIN, FAN_RPM_MAX); mutex_lock(&data->update_lock); @@ -326,7 +327,7 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, con if (err) return err; - pwm = SENSORS_LIMIT(pwm, 0, 255); + pwm = clamp_val(pwm, 0, 255); mutex_lock(&data->update_lock); @@ -534,7 +535,7 @@ static struct attribute_group max6620_attr_grp = { * Real code */ -static int __devinit max6620_probe(struct i2c_client *client, const struct i2c_device_id *id) { +static int max6620_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max6620_data *data; int err; @@ -575,7 +576,7 @@ dev_info(&client->dev, "Sysfs entries created\n"); return err; } -static int __devexit max6620_remove(struct i2c_client *client) { +static int max6620_remove(struct i2c_client *client) { struct max6620_data *data = i2c_get_clientdata(client); @@ -599,7 +600,6 @@ static int max6620_init_client(struct i2c_client *client) { return err; } - /* * Set bit 4, disable other fans from going full speed on a fail * failure. @@ -615,14 +615,13 @@ static int max6620_init_client(struct i2c_client *client) { data->fancfg[i] |= 0xa8; // enable TACH monitoring i2c_smbus_write_byte_data(client, config_reg[i], data->fancfg[i]); data->fandyn[i] = i2c_smbus_read_byte_data(client, dyn_reg[i]); - /* 2 counts (001) and Rate change 100 (0.125 secs) */ + /* 2 counts (001) and Rate change 100 (0.125 secs) */ data-> fandyn[i] = 0x30; i2c_smbus_write_byte_data(client, dyn_reg[i], data->fandyn[i]); data->tach[i] = i2c_smbus_read_byte_data(client, tach_reg[i]); data->volt[i] = i2c_smbus_read_byte_data(client, volt_reg[i]); data->target[i] = i2c_smbus_read_byte_data(client, target_reg[i]); data->dac[i] = i2c_smbus_read_byte_data(client, dac_reg[i]); - } return 0; } @@ -665,8 +664,6 @@ static struct max6620_data *max6620_update_device(struct device *dev) return data; } -// module_i2c_driver(max6620_driver); - static int __init max6620_init(void) { return i2c_add_driver(&max6620_driver); From patchwork Tue Jul 6 13:02:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Balac, Arun Saravanan" X-Patchwork-Id: 12360567 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0844C07E96 for ; Tue, 6 Jul 2021 13:02:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A447161A46 for ; Tue, 6 Jul 2021 13:02:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231909AbhGFNFK (ORCPT ); Tue, 6 Jul 2021 09:05:10 -0400 Received: from mx0a-00154904.pphosted.com ([148.163.133.20]:49298 "EHLO mx0a-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231485AbhGFNFF (ORCPT ); Tue, 6 Jul 2021 09:05:05 -0400 Received: from pps.filterd (m0170392.ppops.net [127.0.0.1]) by mx0a-00154904.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166CfiuW015137; Tue, 6 Jul 2021 09:02:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dell.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=fi8MjcEiaqMrLHHL49HATIKZOQb4m/jzE1ZyVQ2bs8E=; b=KisWzOtyWrCYB1CYd++bGBlZ7or6u94PeLQuGxVmk57M5Eh7IF/NJVjSOT29yGVSgPJn OrxT65Bzj98fwQWrWrIQy7Sdg3kp/WwF8Qd9fbWsqIivVAdZ9kcwbngi0GgLe8RPiX5h PZqVaJvxmx2bB3DK/zeQ58v21ch8QYkRvhJr0CpKaxsTKfZ2CXTUJLDLsJ8iZV6nv8PD GwxYhbAwFq09CggLJYX4LV72ZVbsJmQNUPsqjFc7WjC8ZtAWObnhG3dhJh2fUmTfIyKC cTpDWbdygDDBvttYmVH9I+LCJkJdPApf5XZdZqQOeqzNkZ4Hut9LvNNerHk2menApneh 5w== Received: from mx0a-00154901.pphosted.com (mx0a-00154901.pphosted.com [67.231.149.39]) by mx0a-00154904.pphosted.com with ESMTP id 39m5pfvank-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 06 Jul 2021 09:02:12 -0400 Received: from pps.filterd (m0090351.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166Cirja048572; Tue, 6 Jul 2021 09:02:12 -0400 Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2102.outbound.protection.outlook.com [104.47.55.102]) by mx0b-00154901.pphosted.com with ESMTP id 39mj7jcutn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Jul 2021 09:02:12 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SkOjSmH3LhMIRSK0hNO42aszSeP1KtM2CfngqZUP/kAPCkie363Yf1TgaXI/DzkkucEHZbQrESzyL9XjdjEkQ7X5Qfw6IcFSP1sksYk099KHpTM+3baOSI2KPDIlAEfLRxNl5AaEf488CIkzbDNxNUfIYfao183jauWJTxEOOp22A7EA+2jGiGtTb8oD9aXW1noL4uiKd3E/bK0t1Ea8iTPXYuPkD3+p0Tw7EcGJdoGPUT555Md1UuHo6eodmQCTUk7L+vuJtbwSfsWHkTIWnfyIwtB6uV6WeAkNKJ1YTd8lNBh5QCUYm4M4DEX2WUjN8o30b+vnPlkQiBHItlwGLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fi8MjcEiaqMrLHHL49HATIKZOQb4m/jzE1ZyVQ2bs8E=; b=jhJkd1ZduI+KvJDqDCk5/Tnydyw8zjAPGwW2G/4FOsW71+/mQbIfQKUD8hqQshHrnEoqGdvzDf/NVYC2yzRq9n83sMlYNep/eUj2YEhicNON9NoEZd+M5/y8n0Al+3/zyz28OGXfrRrPc7a6KyNSRXf/y8C7LDU+yGaWUDqF4d0Jn9Tm5iQcXq7K4tXcfI7t9A8+Lf/09Qt6tgeSxXib7RAkvC0OXDDBkaWScKO6vgbWCZrrMkXveQk16E2R+iPdLdwiQm2m9ilMgTAP0tfxCiPdUt9SUAFuLX1K4W/zZWV8201zVgCEHDmemXFA6fZVeh7s4S/8n7i+0oA/rvTOUg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=dell.com; dmarc=pass action=none header.from=dell.com; dkim=pass header.d=dell.com; arc=none Received: from MW2PR1901MB2028.namprd19.prod.outlook.com (2603:10b6:302:8::11) by MWHPR19MB1469.namprd19.prod.outlook.com (2603:10b6:300:d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22; Tue, 6 Jul 2021 13:02:11 +0000 Received: from MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372]) by MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372%6]) with mapi id 15.20.4308.020; Tue, 6 Jul 2021 13:02:11 +0000 From: "Balac, Arun Saravanan" To: "linux@roeck-us.net" , "jdelvare@suse.com" CC: "linux-hwmon@vger.kernel.org" Subject: [PATCH 4/5] hwmon: Add attributes in MAX6620 driver to retrieve fan fault status Thread-Topic: [PATCH 4/5] hwmon: Add attributes in MAX6620 driver to retrieve fan fault status Thread-Index: AddyZbb7YM8omHGaRHm6ZzidpDaPHg== Date: Tue, 6 Jul 2021 13:02:11 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Enabled=True; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SiteId=945c199a-83a2-4e80-9f8c-5a91be5752dd; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Owner=Arun_Saravanan_Balac@Dell.com; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SetDate=2021-07-06T13:02:06.5816109Z; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Name=External Public; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Application=Microsoft Azure Information Protection; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_ActionId=61eb3a4d-7545-49bf-b088-efdd4b5af9b5; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Extended_MSFT_Method=Manual authentication-results: roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=none action=none header.from=Dell.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 5f62788e-c8b8-4811-8cc3-08d9407e44b4 x-ms-traffictypediagnostic: MWHPR19MB1469: x-microsoft-antispam-prvs: x-exotenant: 2khUwGVqB6N9v58KS13ncyUmMJd8q4 x-ms-oob-tlc-oobclassifiers: OLM:1824; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: ho4YjAYref14eGcDc+ETlxg0jexSUn1nQ6puW7tJUvrxOOXdoREq5CZ0s3Cpuy99GB05QruVEt/93XFLFoqbUhc2PoGAUXosQjLCuEpCejWqV88N8frw1tDWZp+V7d9odbaqm4skt2SKaM5XXq5QsdlPyLbEW4fVLFNsdfAEhKkCMPCd9LfWCgr2Y7hlGEu0y9Ct5aMvubftDBqvprpneDDvHgysoAFFzh4MXXQu7xmMtb6F/woH3iuLR3CRWcsnJlx28ZgxfCelYdvKW8+hCFa3fi5t03yOuWDCU9yMeYHT4+qWcurl3ZPVzb1mfeMWYFMWHGO67wH1fdzmzhjZEVfyIqKu95s/MHdBETCyJRIT4D95CRwLo37ZOxV13pi2JeaMJ9mVjg5wTYiS57/GjNP3qfY85hMDr2lJWdRIPY38p5OTi4YJwiCMPcpHSA1D5clpt0kNCGG7UANTk79rAdnYjtuce/LptokweHGL9j1rr5zX9bWaElDdmfnyPqiCBAjBMBWbg8jxvJEYiADi7th97+1J7o/upoiOjEO2IP1NWxGilcFccv1arItEpB5H9wN5egn693i4gIP8Vaf4poF2Yeo1IZaK6VPt52O8TH0QfREd9JRs+ijqefdaax6o4MnxfkiesQ3T23Ya3Sy4IA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR1901MB2028.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(396003)(366004)(136003)(376002)(39860400002)(5660300002)(33656002)(8936002)(66946007)(110136005)(83380400001)(66556008)(26005)(8676002)(7696005)(786003)(66476007)(76116006)(55236004)(316002)(86362001)(6506007)(478600001)(2906002)(122000001)(64756008)(52536014)(4326008)(186003)(55016002)(9686003)(66446008)(71200400001)(38100700002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: 68+/5pbnPb7919NLxHBRA2aynSYUtESvgVoQRm0TiUiO62UtLTFMGA9dJVhN/4XgG53fq2zuN8jRsZGWE+T1YwJZn2dhOpr2SeTLsh2lv6ej4SDMf4DKZdanVW4iyFfiOBxP/nhtpFoyawUwxGSkpxtUbFQIgtXN12yRjP/RuTSV/OvDEdbSscjHPvae9Ri2UA/BilOX95s9dx3J5CV6mzwqFCpO7yfchhY47WZs5/Jh4jQ+x2zxgj+3105JOnh2Zyn7kTFgEnQsyGBLvx5m3RVWGEbBbosdQgPCed2KH7IzA/uzOx6zXb860p0UoPYbr3LL3roPm4hbi/oDnhodV/wuKnqrvMgh4KtpBd9PY8xp+PpKr6OmDq2Nm9nY56qPXVR/PPvE6oLEXlpJkTUL/j+UQ0r7/6NmD5QoZqXnZ0GyiH2+0hyOH4NvXe19kF91CL0mCSIRYT4t4yaiaiG81b0o75jrjiSOIiNRGX9b42DDKZ+ia+RrfwsEN9oc6uyaK+6zVfzBc7RQxl6m+oiRE/kWlBCta/+pUJChKOI0xTtH/glgvJQ2ldZgs6sPgO8C0qYr82k/UfIZWIezqAYjG70YM3SfJ6g2Tl07y/GSr5W+mRLsMfHFDbg/P1WMhVR1QoukZlix/34CHVvfhnOyMn44RkDMSk50N1TsRsK4taZTN4QBp179zfl/V0oEL2X//OYVIBn/Ell5CgtLBLz2GFKm5D0nKTONKT24PO4bwKYwRYxJ9maPHffZc7IYRcD3PnFy3jJ8njRftFUg6E4ZddGHWV0XiYEX+XbvxTN7FykfZLaAHE/+K8YDB+m40YZBGCJcNkjwrdDDwoVjsj/sfMK9LXNY6WSzY0pWgotYPH9nFtdjmMTJUDKJqr2v78oq3vndBB0xQmXa9Gc5XBpa9Zoma8OK44PCwQkOSoIlrZdV4tSFbsdwyuTBRZa9k741Ab6YrBLYHAQGQI8syf66QBhTXL/a5C2QnP8qkCS2hyFJJfdR3JEoXlDtJFWcIBZzfMuTWQ2XXin/vAP9g7cu7qGwoxpxTUYhmHn61c5VYZSMFFvkZCP6ZnNIvPJZ3+WJz3gZMSKw6LqqE9yyuRYqOXJl7bKRMhtQxqQgAuu6PvY91LDu57kBdEU8SEISe07i7uwPRra8nsLBDzSUA3WtpqOM+pZmV5gMguuCC4kuii/JgHBY64So8ejFAT5pMCSO0vdbSxBdoWMnyDFJxmT/jiqIgYiZf/ZhcOWRF4N8Icu+Wyr47ogq0radDn4stujVmfDzCa8+gGJ3ufjkU/Nxuqsbxwc/PI8eMCr0p0Q5n/FWc8YTcxX8qCOviUDupuxN x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: Dell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR1901MB2028.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5f62788e-c8b8-4811-8cc3-08d9407e44b4 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Jul 2021 13:02:11.0926 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 945c199a-83a2-4e80-9f8c-5a91be5752dd X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: J6c3FeafZzsxtJDeP3kL+n1GlUqjvUQWjs9z9hML5f2SEIAKVB4AexavNb5z+qquk/PiRhS7j+AJmsA9i2Ip+Ro7ysK+Kn3+nTtJUIo8sH8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR19MB1469 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-06_06:2021-07-02,2021-07-06 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 malwarescore=0 phishscore=0 spamscore=0 suspectscore=0 mlxscore=0 impostorscore=0 adultscore=0 clxscore=1015 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 X-Proofpoint-ORIG-GUID: yqSEhhPXhmdEcm7_C3Ub8JM20pfm1hVG X-Proofpoint-GUID: yqSEhhPXhmdEcm7_C3Ub8JM20pfm1hVG X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 malwarescore=0 phishscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org From: Arun Saravanan Balachandran Add fan*_alarm attributes in MAX6620 driver to retrieve fan fault status Signed-off-by: Arun Saravanan Balachandran --- drivers/hwmon/max6620.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/max6620.c b/drivers/hwmon/max6620.c index 5c8b155ca155..6f921bbf3831 100644 --- a/drivers/hwmon/max6620.c +++ b/drivers/hwmon/max6620.c @@ -283,6 +283,9 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr, i2c_smbus_write_byte_data(client, target_reg[attr->index], target1); i2c_smbus_write_byte_data(client, target_reg[attr->index] + 1, target2); + /* Setting TACH count re-enables fan fault detection */ + data->fault &= ~(1 << attr->index); + mutex_unlock(&data->update_lock); return count; @@ -469,14 +472,11 @@ static ssize_t get_alarm(struct device *dev, struct device_attribute *devattr, c struct i2c_client *client = to_i2c_client(dev); int alarm = 0; + mutex_lock(&data->update_lock); if (data->fault & (1 << attr->index)) { - mutex_lock(&data->update_lock); alarm = 1; - data->fault &= ~(1 << attr->index); - data->fault |= i2c_smbus_read_byte_data(client, - MAX6620_REG_FAULT); - mutex_unlock(&data->update_lock); } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", alarm); } @@ -485,6 +485,10 @@ static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0); static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1); static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2); static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3); +static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, get_alarm, NULL, 0); +static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, get_alarm, NULL, 1); +static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, get_alarm, NULL, 2); +static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, get_alarm, NULL, 3); static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, get_target, set_target, 0); static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_div, set_div, 0); // static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 0); @@ -507,6 +511,10 @@ static struct attribute *max6620_attrs[] = { &sensor_dev_attr_fan2_input.dev_attr.attr, &sensor_dev_attr_fan3_input.dev_attr.attr, &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan1_alarm.dev_attr.attr, + &sensor_dev_attr_fan2_alarm.dev_attr.attr, + &sensor_dev_attr_fan3_alarm.dev_attr.attr, + &sensor_dev_attr_fan4_alarm.dev_attr.attr, &sensor_dev_attr_fan1_target.dev_attr.attr, &sensor_dev_attr_fan1_div.dev_attr.attr, // &sensor_dev_attr_pwm1_enable.dev_attr.attr, From patchwork Tue Jul 6 13:02:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Balac, Arun Saravanan" X-Patchwork-Id: 12360571 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0FD0EC07E9B for ; Tue, 6 Jul 2021 13:02:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E011E61C33 for ; Tue, 6 Jul 2021 13:02:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231955AbhGFNFP (ORCPT ); Tue, 6 Jul 2021 09:05:15 -0400 Received: from mx0a-00154904.pphosted.com ([148.163.133.20]:60748 "EHLO mx0a-00154904.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231937AbhGFNFL (ORCPT ); Tue, 6 Jul 2021 09:05:11 -0400 Received: from pps.filterd (m0170389.ppops.net [127.0.0.1]) by mx0a-00154904.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166Cff2T004334; Tue, 6 Jul 2021 09:02:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dell.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=smtpout1; bh=zeTNtfZVBXWmvvibWx4j0rpJly41rhEF+EzwcfV7Fy0=; b=INqj9ePao1B+uWhTFwwq/WbQ3gK7FNgOcObXwKbhHU3/UVXjFhwZ2fT8tOIOKzIqik+F 9LbAouwf/PFCSEHT38dJiKrzkVDMWNhRIG2ZdCuBSlnUSErpgCupuEplF4h66wM0sD0n CCSLCghwFQWgDF0ayCfuj/Ze5oTKz3DPg2X/J71ATE1WsfPVy4OS04s31fGH3TnR+Mz/ IzafePLWZ06inhtXoXtxdJCff4M8bjmoR9YTSprHtDhxczxUcLr1luavqE+62savYvLS kyOu9V1TqV/dvmmDrJBHhlkDw+B+rUApTC9CTgziPzceJKH5oCWqqNpt/yrzfyfLtZO0 Aw== Received: from mx0b-00154901.pphosted.com (mx0b-00154901.pphosted.com [67.231.157.37]) by mx0a-00154904.pphosted.com with ESMTP id 39m546vh5y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 06 Jul 2021 09:02:18 -0400 Received: from pps.filterd (m0089483.ppops.net [127.0.0.1]) by mx0b-00154901.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 166CkLZB050212; Tue, 6 Jul 2021 09:02:17 -0400 Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam07lp2043.outbound.protection.outlook.com [104.47.51.43]) by mx0b-00154901.pphosted.com with ESMTP id 39mjm94mt9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 06 Jul 2021 09:02:17 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hIN5ouGXWdmxVxE1oQzC+5CvyIJlV2AsmKvSHwauK0d06oKTdQ+gqLY3wooRTuYIMgbnx7yIFDy4Jrkhwp+QNHwhlQX3dzjVjikC3qMnXpOMvBTwjyLtyKubdydEagblUjpVcLpLwPWKTW1MGLjxB/A+EBX0l85s6MTlz/A4ssVMop6DpTXbM3BTG9ETLwoBI9ICu4h/cGa9KxvNfebEt3keKVmqqEMDP4Qow2mMHShLOJlZyUvnRaurhttnUnfBycY1d5LOxcRfSSCIeqoAYlXi/CGxGFl7YthMRISuHmC+nVmH0ZwdUSxipx8DcooF3/wXCAGQvtI5WQS0LmNQIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zeTNtfZVBXWmvvibWx4j0rpJly41rhEF+EzwcfV7Fy0=; b=mC9ZI1T/Pfw93F9steCPyiAg/C0a7hrzvDJVkRrwdPnEhBQ5WB3daxmhO+DJxKzBEtSaMSTC8M0Zem20N9fhZOiotrWEpOms23RPhNWzVNggUhn93rCb+IxfTpWdRd3SN8m6U+kHJ1k4qt6ilAvIJd+XUY95+0fCr4nPo4zwxxFXcTemNg/pnyxzomRBKbCExcMCeVhBy+I+bI8byAcv8EAn5K423BNy2/R6bmH/dp5d9xXApMOctk+Af3jU9UYCZw54wzWJ3cbWjIzgu2iBdYqJ+jccwiwz64UP/ABEEVdkf/ppyuZAYxb0kYmBg2C62Lbh0+RpIUJaa42lf7TKJA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=dell.com; dmarc=pass action=none header.from=dell.com; dkim=pass header.d=dell.com; arc=none Received: from MW2PR1901MB2028.namprd19.prod.outlook.com (2603:10b6:302:8::11) by MWHPR19MB1469.namprd19.prod.outlook.com (2603:10b6:300:d1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22; Tue, 6 Jul 2021 13:02:15 +0000 Received: from MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372]) by MW2PR1901MB2028.namprd19.prod.outlook.com ([fe80::fdcd:16d2:8903:2372%6]) with mapi id 15.20.4308.020; Tue, 6 Jul 2021 13:02:15 +0000 From: "Balac, Arun Saravanan" To: "linux@roeck-us.net" , "jdelvare@suse.com" CC: "linux-hwmon@vger.kernel.org" Subject: [PATCH 5/5] hwmon: Update MAX6620 driver as per linux code guidelines Thread-Topic: [PATCH 5/5] hwmon: Update MAX6620 driver as per linux code guidelines Thread-Index: AddyZd3a6453zk82RlugnnpI8D6OoQ== Date: Tue, 6 Jul 2021 13:02:15 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Enabled=True; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SiteId=945c199a-83a2-4e80-9f8c-5a91be5752dd; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Owner=Arun_Saravanan_Balac@Dell.com; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_SetDate=2021-07-06T13:02:11.0958735Z; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Name=External Public; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Application=Microsoft Azure Information Protection; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_ActionId=f1f1bad7-ee53-4b46-a230-6de4529768af; MSIP_Label_17cb76b2-10b8-4fe1-93d4-2202842406cd_Extended_MSFT_Method=Manual authentication-results: roeck-us.net; dkim=none (message not signed) header.d=none;roeck-us.net; dmarc=none action=none header.from=Dell.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 89632ea0-d512-4e2d-5d5c-08d9407e473c x-ms-traffictypediagnostic: MWHPR19MB1469: x-microsoft-antispam-prvs: x-exotenant: 2khUwGVqB6N9v58KS13ncyUmMJd8q4 x-ms-oob-tlc-oobclassifiers: OLM:3826; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: vGUILeack0PD2XjHLQlPMS9toio1gbzrJAiNhzIZYv9kv6xaz/etzUvsOd/SSJSb/2Waa80gID2+wPwdbZ3UbiXYTfZdMh0Du5hQhAFzGnzHywSJL5xQsP06KgKh2xkM+qowCS6gNn9PJJ14MgKBe9M4jdedgR5jlejfUVZtQJWGmz3mwfaxfD81e9Yq6c5CN3J2KcaA2mGHKq1npW6fhaX4SNZ2PzgkEbSiQtMuv3zK6EMjOOPdXHQ9nc838VUaYJfylpGJdOQqbDOzqe6VMT5WoeDzrbF+nnH/Z6yfHapQQbmvH02mx9F57f7mOx/2ekEtYHykniz5SjB95IL5jsMhdxF+SsDiK7RAm3gYwO6WGFp46hzqVh7ZsP1SqyZN8DRjDSfvfeYAoKv+rKmSyqNDHFCN3IJ0XMo0sgoGdHl8+69eeljr6iE42gM3aPc87/xILfhV186hU/pTsmu8A/F8lIIYKDDz5hT8Ogm0NjTzqqBYhz2p1yA5ETANwXMKhyNNo4tCrOkPqL59kVk0oCEybBDYEWpUHi/kvlwGhmgkbjNoiR9vls8Em+7nngqi4kj4c59aqNTd88kWebCvZLuy/MzE7x88XzeeP1GZYh9Lek8w+1W4XNmm/3MZ6wavlG9UJI117Tnw6HimDn2/15pZKo54NQZYVpTZaO4c8ruFBWc2mB8ayvfFdwZeUtLDUVtE57/4M2UOyJaC0aRJh7h8ffcZm+z9KJBpjTGygqIqYZ368ohNP7NsB/L1/YnvUeJyOkGAtQ65fJJz7iIX+ZggFSO3TJOeJDQZ7P3b+B8= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW2PR1901MB2028.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(346002)(396003)(366004)(136003)(376002)(39860400002)(5660300002)(33656002)(8936002)(66946007)(110136005)(83380400001)(66556008)(26005)(8676002)(7696005)(786003)(66476007)(30864003)(76116006)(55236004)(316002)(86362001)(6506007)(478600001)(2906002)(122000001)(64756008)(966005)(15650500001)(52536014)(4326008)(186003)(55016002)(9686003)(66446008)(71200400001)(38100700002)(2004002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: +fE1om2BWY4Wqc4YFMszT2IPvuWVfpU3ssQh9dJmtnJ/dnsyCZTrzVv+1Lz/YCa3w9cVZruoFgW6KM64hiUe/zjT4bRm6SGl/LgW75ERyPP3T2xsVBHaYnXYTjP1oMaCuK+MP8T/A2jJ0CxS0JOaYP6o8iZ5HN+Ax5PGmtf2xLzXJf0NhEX5DQqRz6rRq7+sywhrRFDzAnljIZSOg0PncAFrG6ld0O1b8aRr7F3ZZ/9/YjfxO7ZFrJuKXdQOYpn18SgJd9PvD1c3HxiCakZnarrSixSlhvGQTh7mf64c4JgwnPR/nL8fUnoZulrBC8oks3DhMqg3QYiCrUPb0wZS45lKI1SRR52EBOAiOFQoo7oRW6wbKe3J1LMZeS9kr0BoiOG+Gzn7ESu/czMrAC979rq6m38dLZUrCtr+2QUL2vpqE6cbLug83ZsGwh2/WJJJpXFuSvbfBqkuKS/xblaft+z9mtJiuPuXerZRv5kFkHJpsswds3kqAY1Q3OQYxOLaTJR/X/4JBP/pW7jtu/kOSic8aOmT6Nytb+JkSKp74p2UOVLrn0f4p3wd3x9zcJUUNa2S21vNJz3/H0xn2EG/bjseby3XGHuvm7XVV4HRNdzp2FTe5frzhp48ocpzpBDNWnH9INOYYUUVeGD/9KcrGRUQY+gDkPTIxse45gOTes8co4O7oZ3niuEPHqRxPwfrkolklHaJWH4xIPhOHgNsFfbbIptrFoV9xsEf2WMpuPUNudw3Dafr8YLMOfHlv0ZjOcOYjq8+JzrWAGHEdr+fCYpHEgzixyYzS2SyRpUJ3+Ji1ae0DXqJ3+G/m33W8Fxw0yulQ9+OKpPchXFeRSB61VAg/knU7BQcGnWKEfZZPjOcq1TwWKd0iAjAU0dQlOcbOHRoCqMZeCu6Zsvt6iaYZMTvFIUa8gahhbhil16VuFj6/8Qb17iqEd+BdOPccojIXkC6zHSw4/NgAerKYODjHbKE7+WvfLGZMD3eTaUyGHJNU+8mkLJdVk25vac1oJyK9Ww1/7B3QxMGYP49jsJGtLvGBC0nElZX7A0OUywB4sLJAFVwuE2UarZSO8T+puz3g9nP/nDk5DmyOSux2YrZP4TldBturR0T8mSTWsX9v3Aob9NiKE0G9HAbdouWgXVbycBW+EN4ELaQm/6wvMoqSYKDBasyO5HBHhsuOCG1tez/qhHg5HBk2jEEVgK34i1ZxMXLVRfg1KZgdZCLa4X0+SZJ4salnTFkRZn11kVaPIAiq+mj9xoMSSWibghC9/OJF6Xcsh3AjDe0x22VAHx0sLfkBwPPmRLWep7TqjO+URYa1c4++F6kmbkP9KUGgeZ7 x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: Dell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW2PR1901MB2028.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 89632ea0-d512-4e2d-5d5c-08d9407e473c X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Jul 2021 13:02:15.3392 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 945c199a-83a2-4e80-9f8c-5a91be5752dd X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: OD1zO4ThcjWmgyJ7ttko13RW/stm+1g+/N100dn0ue/H/wkK3v7z6x0vADU+/sPjTiZSu8zZE2GJ7aEJ1uW+AtSNHcqZ8HNStVu2nLd7eoc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR19MB1469 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-07-06_06:2021-07-02,2021-07-06 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 adultscore=0 malwarescore=0 phishscore=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 suspectscore=0 mlxlogscore=999 impostorscore=0 mlxscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 X-Proofpoint-GUID: 61dVMpiHRy9-3AnUdqCjo48K9b7CHmiQ X-Proofpoint-ORIG-GUID: 61dVMpiHRy9-3AnUdqCjo48K9b7CHmiQ X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 bulkscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 spamscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2107060062 Precedence: bulk List-ID: X-Mailing-List: linux-hwmon@vger.kernel.org From: Arun Saravanan Balachandran Update MAX6620 driver to comply with linux code guidelines Signed-off-by: Arun Saravanan Balachandran --- drivers/hwmon/max6620.c | 187 +++++++++++++--------------------------- 1 file changed, 59 insertions(+), 128 deletions(-) diff --git a/drivers/hwmon/max6620.c b/drivers/hwmon/max6620.c index 6f921bbf3831..a1b747081939 100644 --- a/drivers/hwmon/max6620.c +++ b/drivers/hwmon/max6620.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * max6620.c - Linux Kernel module for hardware monitoring. * @@ -15,19 +16,6 @@ * * http://pdfserv.maxim-ic.com/en/ds/MAX6620.pdf * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include @@ -46,10 +34,9 @@ /* clock: The clock frequency of the chip the driver should assume */ static int clock = 8192; -static u32 sr = 2; static u32 np = 2; -module_param(clock, int, S_IRUGO); +module_param(clock, int, 0444); static const unsigned short normal_i2c[] = {0x0a, 0x1a, 0x2a, I2C_CLIENT_END}; @@ -211,8 +198,8 @@ struct max6620_data { u8 fault; }; -static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, char *buf) { - +static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, char *buf) +{ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); struct i2c_client *client = to_i2c_client(dev); @@ -226,17 +213,16 @@ static ssize_t get_fan(struct device *dev, struct device_attribute *devattr, cha tach2 = i2c_smbus_read_byte_data(client, tach_reg[attr->index] + 1); tach2 = (tach2 >> 5) & 0x7; tach = tach1 | tach2; - if (tach == 0) { + if (tach == 0) rpm = 0; - } else { + else rpm = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(tach * np); - } return sprintf(buf, "%d\n", rpm); } -static ssize_t get_target(struct device *dev, struct device_attribute *devattr, char *buf) { - +static ssize_t get_target(struct device *dev, struct device_attribute *devattr, char *buf) +{ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); struct i2c_client *client = to_i2c_client(dev); @@ -250,16 +236,17 @@ static ssize_t get_target(struct device *dev, struct device_attribute *devattr, target2 = i2c_smbus_read_byte_data(client, target_reg[attr->index] + 1); target2 = (target2 >> 5) & 0x7; target = target1 | target2; - if (target == 0) { + if (target == 0) rpm = 0; - } else { + else rpm = (60 * DIV_FROM_REG(data->fandyn[attr->index]) * clock)/(target * np); - } + return sprintf(buf, "%d\n", rpm); } -static ssize_t set_target(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { - +static ssize_t +set_target(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ struct i2c_client *client = to_i2c_client(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = i2c_get_clientdata(client); @@ -300,8 +287,8 @@ static ssize_t set_target(struct device *dev, struct device_attribute *devattr, * back exactly the value you have set. */ -static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr, char *buf) { - +static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr, char *buf) +{ int pwm; struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); @@ -318,8 +305,9 @@ static ssize_t get_pwm(struct device *dev, struct device_attribute *devattr, cha return sprintf(buf, "%d\n", pwm); } -static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { - +static ssize_t +set_pwm(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ struct i2c_client *client = to_i2c_client(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = i2c_get_clientdata(client); @@ -334,7 +322,7 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, con mutex_lock(&data->update_lock); - data->dac[attr->index] = pwm; + data->dac[attr->index] = pwm; i2c_smbus_write_byte_data(client, dac_reg[attr->index], data->dac[attr->index]); @@ -345,53 +333,6 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, con return count; } -/* - * Get/Set controller mode: - * Possible values: - * 0 = Fan always on - * 1 = Open loop, Voltage is set according to speed, not regulated. - * 2 = Closed loop, RPM for all fans regulated by fan1 tachometer - */ - -static ssize_t get_enable(struct device *dev, struct device_attribute *devattr, char *buf) { - - struct max6620_data *data = max6620_update_device(dev); - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - int mode = (data->fancfg[attr->index] & 0x80 ) >> 7; - int sysfs_modes[2] = {1, 2}; - - return sprintf(buf, "%d\n", sysfs_modes[mode]); -} - -static ssize_t set_enable(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { - - struct i2c_client *client = to_i2c_client(dev); - struct max6620_data *data = i2c_get_clientdata(client); - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); - int max6620_modes[3] = {0, 1, 0}; - unsigned long mode; - int err; - - err = kstrtoul(buf, 10, &mode); - if (err) - return err; - - if (mode > 2) - return -EINVAL; - - mutex_lock(&data->update_lock); - - data->fancfg[attr->index] = i2c_smbus_read_byte_data(client, config_reg[attr->index]); - data->fancfg[attr->index] = (data->fancfg[attr->index] & ~0x80) - | (max6620_modes[mode] << 7); - - i2c_smbus_write_byte_data(client, config_reg[attr->index], data->fancfg[attr->index]); - - mutex_unlock(&data->update_lock); - - return count; -} - /* * Read/write functions for fan1_div sysfs file. The MAX6620 has no such * divider. We handle this by converting between divider and counttime: @@ -405,16 +346,17 @@ static ssize_t set_enable(struct device *dev, struct device_attribute *devattr, * defined for that. See the data sheet for details. */ -static ssize_t get_div(struct device *dev, struct device_attribute *devattr, char *buf) { - +static ssize_t get_div(struct device *dev, struct device_attribute *devattr, char *buf) +{ struct max6620_data *data = max6620_update_device(dev); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); return sprintf(buf, "%d\n", DIV_FROM_REG(data->fandyn[attr->index])); } -static ssize_t set_div(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { - +static ssize_t +set_div(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ struct i2c_client *client = to_i2c_client(dev); struct max6620_data *data = i2c_get_clientdata(client); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); @@ -465,46 +407,41 @@ static ssize_t set_div(struct device *dev, struct device_attribute *devattr, con * 1 = alarm */ -static ssize_t get_alarm(struct device *dev, struct device_attribute *devattr, char *buf) { - +static ssize_t get_alarm(struct device *dev, struct device_attribute *devattr, char *buf) +{ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct max6620_data *data = max6620_update_device(dev); - struct i2c_client *client = to_i2c_client(dev); int alarm = 0; mutex_lock(&data->update_lock); - if (data->fault & (1 << attr->index)) { + if (data->fault & (1 << attr->index)) alarm = 1; - } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", alarm); } -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan, NULL, 0); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan, NULL, 1); -static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, get_fan, NULL, 2); -static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, get_fan, NULL, 3); -static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, get_alarm, NULL, 0); -static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, get_alarm, NULL, 1); -static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, get_alarm, NULL, 2); -static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, get_alarm, NULL, 3); -static SENSOR_DEVICE_ATTR(fan1_target, S_IWUSR | S_IRUGO, get_target, set_target, 0); -static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, get_div, set_div, 0); -// static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 0); -static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 0); -static SENSOR_DEVICE_ATTR(fan2_target, S_IWUSR | S_IRUGO, get_target, set_target, 1); -static SENSOR_DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO, get_div, set_div, 1); -// static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 1); -static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 1); -static SENSOR_DEVICE_ATTR(fan3_target, S_IWUSR | S_IRUGO, get_target, set_target, 2); -static SENSOR_DEVICE_ATTR(fan3_div, S_IWUSR | S_IRUGO, get_div, set_div, 2); -// static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 2); -static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 2); -static SENSOR_DEVICE_ATTR(fan4_target, S_IWUSR | S_IRUGO, get_target, set_target, 3); -static SENSOR_DEVICE_ATTR(fan4_div, S_IWUSR | S_IRUGO, get_div, set_div, 3); -// static SENSOR_DEVICE_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, get_enable, set_enable, 3); -static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, get_pwm, set_pwm, 3); +static SENSOR_DEVICE_ATTR(fan1_input, 0444, get_fan, NULL, 0); +static SENSOR_DEVICE_ATTR(fan2_input, 0444, get_fan, NULL, 1); +static SENSOR_DEVICE_ATTR(fan3_input, 0444, get_fan, NULL, 2); +static SENSOR_DEVICE_ATTR(fan4_input, 0444, get_fan, NULL, 3); +static SENSOR_DEVICE_ATTR(fan1_alarm, 0444, get_alarm, NULL, 0); +static SENSOR_DEVICE_ATTR(fan2_alarm, 0444, get_alarm, NULL, 1); +static SENSOR_DEVICE_ATTR(fan3_alarm, 0444, get_alarm, NULL, 2); +static SENSOR_DEVICE_ATTR(fan4_alarm, 0444, get_alarm, NULL, 3); +static SENSOR_DEVICE_ATTR(fan1_target, 0644, get_target, set_target, 0); +static SENSOR_DEVICE_ATTR(fan1_div, 0644, get_div, set_div, 0); +static SENSOR_DEVICE_ATTR(pwm1, 0644, get_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(fan2_target, 0644, get_target, set_target, 1); +static SENSOR_DEVICE_ATTR(fan2_div, 0644, get_div, set_div, 1); +static SENSOR_DEVICE_ATTR(pwm2, 0644, get_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(fan3_target, 0644, get_target, set_target, 2); +static SENSOR_DEVICE_ATTR(fan3_div, 0644, get_div, set_div, 2); +static SENSOR_DEVICE_ATTR(pwm3, 0644, get_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(fan4_target, 0644, get_target, set_target, 3); +static SENSOR_DEVICE_ATTR(fan4_div, 0644, get_div, set_div, 3); +static SENSOR_DEVICE_ATTR(pwm4, 0644, get_pwm, set_pwm, 3); static struct attribute *max6620_attrs[] = { &sensor_dev_attr_fan1_input.dev_attr.attr, @@ -517,19 +454,15 @@ static struct attribute *max6620_attrs[] = { &sensor_dev_attr_fan4_alarm.dev_attr.attr, &sensor_dev_attr_fan1_target.dev_attr.attr, &sensor_dev_attr_fan1_div.dev_attr.attr, -// &sensor_dev_attr_pwm1_enable.dev_attr.attr, &sensor_dev_attr_pwm1.dev_attr.attr, &sensor_dev_attr_fan2_target.dev_attr.attr, &sensor_dev_attr_fan2_div.dev_attr.attr, -// &sensor_dev_attr_pwm2_enable.dev_attr.attr, &sensor_dev_attr_pwm2.dev_attr.attr, &sensor_dev_attr_fan3_target.dev_attr.attr, &sensor_dev_attr_fan3_div.dev_attr.attr, -// &sensor_dev_attr_pwm3_enable.dev_attr.attr, &sensor_dev_attr_pwm3.dev_attr.attr, &sensor_dev_attr_fan4_target.dev_attr.attr, &sensor_dev_attr_fan4_div.dev_attr.attr, -// &sensor_dev_attr_pwm4_enable.dev_attr.attr, &sensor_dev_attr_pwm4.dev_attr.attr, NULL }; @@ -543,16 +476,14 @@ static struct attribute_group max6620_attr_grp = { * Real code */ -static int max6620_probe(struct i2c_client *client, const struct i2c_device_id *id) { - +static int max6620_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ struct max6620_data *data; int err; data = devm_kzalloc(&client->dev, sizeof(struct max6620_data), GFP_KERNEL); - if (!data) { - dev_err(&client->dev, "out of memory.\n"); + if (!data) return -ENOMEM; - } i2c_set_clientdata(client, data); mutex_init(&data->update_lock); @@ -571,7 +502,7 @@ static int max6620_probe(struct i2c_client *client, const struct i2c_device_id * err = sysfs_create_group(&client->dev.kobj, &max6620_attr_grp); if (err) return err; -dev_info(&client->dev, "Sysfs entries created\n"); + dev_info(&client->dev, "Sysfs entries created\n"); data->hwmon_dev = hwmon_device_register(&client->dev); if (!IS_ERR(data->hwmon_dev)) @@ -584,8 +515,8 @@ dev_info(&client->dev, "Sysfs entries created\n"); return err; } -static int max6620_remove(struct i2c_client *client) { - +static int max6620_remove(struct i2c_client *client) +{ struct max6620_data *data = i2c_get_clientdata(client); hwmon_device_unregister(data->hwmon_dev); @@ -594,8 +525,8 @@ static int max6620_remove(struct i2c_client *client) { return 0; } -static int max6620_init_client(struct i2c_client *client) { - +static int max6620_init_client(struct i2c_client *client) +{ struct max6620_data *data = i2c_get_clientdata(client); int config; int err = -EIO; @@ -624,7 +555,7 @@ static int max6620_init_client(struct i2c_client *client) { i2c_smbus_write_byte_data(client, config_reg[i], data->fancfg[i]); data->fandyn[i] = i2c_smbus_read_byte_data(client, dyn_reg[i]); /* 2 counts (001) and Rate change 100 (0.125 secs) */ - data-> fandyn[i] = 0x30; + data->fandyn[i] = 0x30; i2c_smbus_write_byte_data(client, dyn_reg[i], data->fandyn[i]); data->tach[i] = i2c_smbus_read_byte_data(client, tach_reg[i]); data->volt[i] = i2c_smbus_read_byte_data(client, volt_reg[i]); @@ -637,6 +568,7 @@ static int max6620_init_client(struct i2c_client *client) { static struct max6620_data *max6620_update_device(struct device *dev) { int i; + u8 fault_reg; struct i2c_client *client = to_i2c_client(dev); struct max6620_data *data = i2c_get_clientdata(client); @@ -659,7 +591,6 @@ static struct max6620_data *max6620_update_device(struct device *dev) * caused the alarm is removed. Keep the value latched here * for providing the register through different alarm files. */ - u8 fault_reg; fault_reg = i2c_smbus_read_byte_data(client, MAX6620_REG_FAULT); data->fault |= (fault_reg >> 4) & (fault_reg & 0x0F);