From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755761AbdGKWBT (ORCPT ); Tue, 11 Jul 2017 18:01:19 -0400 Received: from mail-eopbgr10045.outbound.protection.outlook.com ([40.107.1.45]:34591 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755457AbdGKWBP (ORCPT ); Tue, 11 Jul 2017 18:01:15 -0400 Authentication-Results: spf=pass (sender IP is 188.184.36.50) smtp.mailfrom=cern.ch; topic.nl; dkim=none (message not signed) header.d=none;topic.nl; dmarc=bestguesspass action=none header.from=cern.ch; Date: Wed, 12 Jul 2017 00:00:31 +0200 From: Tom Levens X-X-Sender: tlevens@lxplus091.cern.ch To: Guenter Roeck CC: Mike Looijmans , Tom Levens , Rob Herring , Mark Rutland , "Jean Delvare" , , , Subject: Re: [PATCH v3 3/3] hwmon: ltc2990: support all measurement modes In-Reply-To: <080a2b76-7c9d-d8f2-c8f2-be1a513e2daa@roeck-us.net> Message-ID: References: <1499056140-6064-1-git-send-email-tom.levens@cern.ch> <1499056140-6064-3-git-send-email-tom.levens@cern.ch> <341b5c67-c013-5a7c-54b5-e8c2a7c168e7@topic.nl> <080a2b76-7c9d-d8f2-c8f2-be1a513e2daa@roeck-us.net> User-Agent: Alpine 2.20 (LRH 67 2015-01-07) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="-1195575205-201736693-1499810435=:28469" X-Originating-IP: [188.184.91.248] X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:188.184.36.50;IPV:NLI;CTRY:CH;EFV:NLI;SFV:NSPM;SFS:(10009020)(979002)(6009001)(39450400003)(39850400002)(39840400002)(39410400002)(39400400002)(2980300002)(438002)(189002)(252514010)(377424004)(24454002)(199003)(377454003)(106466001)(8676002)(478600001)(966005)(41446006)(4001350100001)(6116002)(356003)(53546010)(93886004)(3846002)(2950100002)(84326002)(189998001)(6916009)(6666003)(60046009)(512874002)(53416004)(7636002)(7736002)(305945005)(66066001)(38730400002)(6306002)(5660300001)(4610100001)(55016002)(54906002)(83506001)(2476003)(86362001)(1720100001)(2906002)(575784001)(5005980100005)(626005)(4326008)(8936002)(74482002)(110136004)(50986999)(6246003)(76176999)(229853002)(54356999)(15974865002)(7696004)(5009310100001)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1101;SCL:1;SRVR:DB6PR0602MB2871;H:cernmxgwlb4.cern.ch;FPR:;SPF:Pass;MLV:ovrnspm;MX:1;A:1;PTR:cernmx11.cern.ch;LANG:en; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 640740b3-bf8f-4aaa-6b32-08d4c8a855f6 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(8251501002)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:DB6PR0602MB2871; X-MS-TrafficTypeDiagnostic: DB6PR0602MB2871: X-Microsoft-Exchange-Diagnostics: 1;DB6PR0602MB2871;20:lE8/Y1fPX23/5bUhrZ4iwog3h/fuDfBKpZLRTExxNjlGh2Hzl20vswFaHTJKcRS4edyz1/gWTVGKAbg4MTpvydTADn2EhQlYnHSkmWPPchVUB9Gcx/zBgJVVnN5fqQrk1IQGpwYxkhG9jFavpfY6CReQNwIaEsyycxP5MnaVnK48tjSvJcit/LlSW/FzpGWqdlMdd4KpKOdydvvcJN05IRHX0gcwFzq/JvNCZ97MAnB8cMjsFq0Hfq883JJcIr4fCGhYL+ysZT5DNFhBrDk/li0+PEah720SrztjE/Kbs5OaffvqbYyCJzyHIZK8kIhX/hKhMJItbvOftTYW4N40MN3y9iMayeXjRiq2LGrVEXadV3kaD0sj6brwYBsGl0d1nz9RKdQm9M3VYGPlwBS5cRaUqz21k7shTEMa00/dBoTxbFxqyBTEAEKrArsAC+KdCe+Kqb1z0eJmAa6UW0Be/cPAjC0sTpYJ2A6L7+j3egRBRN9jbC3uOwTW6dq6HJEn X-Exchange-Antispam-Report-Test: UriScan:(20558992708506)(133145235818549)(72170088055959)(236129657087228)(90097320859284)(112613623882745); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(13016025)(8121501046)(13018025)(2017060910075)(93006095)(93004095)(100000703101)(100105400095)(3002001)(10201501046)(6041248)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201702281529075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(20161123558100)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DB6PR0602MB2871;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DB6PR0602MB2871; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0602MB2871;4:H+dwvN+aroawQNljGN8Eq8F3+ev84EKXrZc0fZ8V?= =?us-ascii?Q?ZlDF9IrS/3IIFKpMm3trOEx/biOLGuuQ+oxT0ccooCz6fa+JJK7UlIENeYZ4?= =?us-ascii?Q?tYam9njNgSdCcL8OEMNQIos5csywY3DJ7MgR9etOB8ssng3qoedknSYdOs6w?= =?us-ascii?Q?JQhBU9p8Nt15YHd54fzO+7iWvo7zRPagqJrHR6rHPoiX8SKYRBGcnw6mqlZC?= =?us-ascii?Q?fhFSvdXQvn6qECpK25MQKTiawGuDh/tHzHbx3acWQ+SVF05sl681Uc5wRgnG?= =?us-ascii?Q?nmcZFG3JjLEluXjaxBZAz01puCKd0fNYLLd0reJZg8wV4Xesgt3/upTmaVcq?= =?us-ascii?Q?Gf7dWDYZea7AZwfi48Y52n54mpbmAc4N87wlQVStw3+5XE6PtDRsxWfNdrg9?= =?us-ascii?Q?jrUPha5QIZxRjqh6/5kwmPHzNmJSsKymdJjTWZCMoOFL4e6WAL01lu7UnQCd?= =?us-ascii?Q?Bl32/QJsWo7dnYiF3kp4hW/0HEH6k95g3Rk0LABcZId7wRs3dFnen4mBAPSI?= =?us-ascii?Q?607/slNa/FkdlkSyH7RmLsLAYqcKkTNI6tFOOTMEyvDB1vULH+Xc6C83YKLH?= =?us-ascii?Q?XztfFsX7depFl9LOdOyRSzvprYU2hfOGMBE5ZDuxF7MADLnITX7dqsEDtc8o?= =?us-ascii?Q?S7Dtx48iR+c5I+kKN9AO6DVOTnCQ5yZHB2T4mEbFg/JGOnSSmt3SLyQi63gl?= =?us-ascii?Q?dsIuFYO0so+od+pjU/yYkqPf/4sugUcro299wuZOGS/tZTqSwFUPpg/GnZq3?= =?us-ascii?Q?KNYimLwcwCGqqrKE8bV07IvJIzlUkciJMydBxkbDWEs+7zZxlNAfBh2RBTR6?= =?us-ascii?Q?RVvR9VEvdw1CI/0WcdYqV2wZehOdO+T5CDzKhq83vi2UNQPvPvcrMmIs08an?= =?us-ascii?Q?7V5W6DGHuYZY2LeP8Ay/mXSfpzwJc61SGgcVtKYEUDlOc+C7D9SlZ7tDWnJy?= =?us-ascii?Q?RHoHW0gxAGP/C9zPQjJM15W0xNKs7h7/DhDBC75rG/VgIfjW8ZaUwzn3Tr90?= =?us-ascii?Q?LmyTYAX7U6QDWb35ofJQJQPEprzhFA9M1Wex3y5pmicZJfyaPZhxVQZSq8c1?= =?us-ascii?Q?FMxQirQoQpYx1y6EuGH40yWDXGTseMWk1x/VT/DvQPPeJ8xmsfxD2OcL+Ax1?= =?us-ascii?Q?qXUfWMUFZKcOQsZB5HtfBjXN7P+eHDRcoLWwmlGGD77gSvkK4iQ8xLkOMpiV?= =?us-ascii?Q?+i/wmbjjVulOAX3Sc5hnNYw/UO4K8L8HvpEMnJfSyp58BBgzqKpBhPUZ5AqR?= =?us-ascii?Q?lc9j4D3w+Hf5ApX80g0ODT5Of8bXhcd9gqyY89oKTG+HFMSo6AIMaI0FOYbJ?= =?us-ascii?Q?kk26Si2FKuFNBY2j9/QjcnWDF4ny37e+cbaMj7M4VJcub3M9yhcycwG7a7fP?= =?us-ascii?Q?4WJ2lOdW9lsmcoxcPNQacamrXrSBAPJ37EcGLstGxe6zUe1ZVrWuNEhKXSH1?= =?us-ascii?Q?5/DTDKk4FUrg5u892XoKV6MhAlhp4bb3JCwaPmh/63LaC/Qav7X7?= X-Forefront-PRVS: 0365C0E14B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0602MB2871;23:kUNTjpIBtIQecfJjZjG7gVBrURGMWRAEUJl4+lJ?= =?us-ascii?Q?O6MOfrfOwTB31KWaDNcmZO5MUPdNEP/RP1AKOgWGDu8hgRbNpKUW8uQxiBlL?= =?us-ascii?Q?tDQ4ziJ8FJlaS0+nZb3rhCePQ0qqa5ABnJcRaO3S1M5TtCQM1CaUTYjA0DXW?= =?us-ascii?Q?opHIfmopTiXZek04k1xHQXLnSWy6VL69cYZuHg8oshxDiBh3JZ+xLYb+Rt83?= =?us-ascii?Q?5aijtRFSKLCZBHfDgidDXLxO48AehIE9bDScdm1XyDxEWI+xm26CAcx5MuvX?= =?us-ascii?Q?yBFRLmCelC+1uo4IUoRWkX15A/1tJeTH4DoicJA6p1wkkMvKUAiFSfo1SLaE?= =?us-ascii?Q?9rlof7nfLnRLxkGXEFxX2S/J8reLB2CSXC70i3YT0VBxTUyp3gfaAaPjhf0c?= =?us-ascii?Q?KFdukv9dAwGWbwhmgIPZpOxOyvdVEPZ5e1sTKu9OqVrEL91lUbCOlOwmF1vu?= =?us-ascii?Q?fvK5XZMJyJv+vkFwLG3J0ALcScOl5G9N2eZR/c+YC0hrCfxFYADdhL3v1sWL?= =?us-ascii?Q?bX55OUq0eiJraT4MQybjTdGqU7s7Z0X4CGIlAmclaC+dAzvkM9ntJsHnAz2g?= =?us-ascii?Q?wIEZC2fTJnbSGZ/488cgROUymaoIkovlvxupky3G1zoOSuykIxe3K9r/tRAi?= =?us-ascii?Q?XHu4YAWcTrgR7XFdg2Xlj8SaImjt722NRmexgvsRTedeSHtT+JRotgl8WOnT?= =?us-ascii?Q?1vC5DQn+cw73lMAEw5bYhCGa9Y2bMhDX0SXDcMBuDZfLzCwlGMJznadZ6Ztf?= =?us-ascii?Q?HJI+wUwfghnRhDdWCgCmBh6qaK1z9+sXPaXffa1XyH7YQvg3kfFsfgDu0W1+?= =?us-ascii?Q?wPWyD88IRC5IfzNxzq97VCNeCPeDqYKNzdCUdHWXwKe9iXJDwrnvA5r6b0oH?= =?us-ascii?Q?YI+WrXEXv47DkMWYSCNSeA28Q87XxrNiKLUlXD8kI/SPUGr9hxEa0/O6IMQy?= =?us-ascii?Q?FYaNKlOlmizZA3+HJWJbn6Kqc7wMgCtMp+4LywdX8353ITkJufHxTJhYzJ61?= =?us-ascii?Q?mxfBOt/PRSDOOc7DjicK9giOVswYCOukypdI9ma2W4QmM6lJ6ZEQoHDJruzy?= =?us-ascii?Q?su73uSmZRXIih4ZMkBzDOjpdzoX6ABXiN8QUTK7IGm3Ml4ddL5Xt2BRJQKD7?= =?us-ascii?Q?llmQthRiCdJCFBFfKTiZ6rgRW8/pqWto0kwAVgFl6/Lo4EYD/6o6PrX7Pw/5?= =?us-ascii?Q?DJYuk/PPNAHAcemhPFf4eB2rqflpHeKOEW4KkpZvQy3KFLD0vgH7ovCMcfmL?= =?us-ascii?Q?3Ud7F7VYYdhzu2UP9tlEASSQizKgXu4q2gO+GaHe6mdL/aU5k203sugcKicz?= =?us-ascii?Q?Aq1yXCEZgRa9AumUGkRisjO1ofYunzfD7q3BVh/xRlhZDmcesPGSCY58KGLo?= =?us-ascii?Q?PqfqMDL+MFdKKG6amV/00R3nG1DYRQf4Ou84flLDjeupk48c4UIo93f3yo9l?= =?us-ascii?Q?porSnZd0Qy4zMYC1Li5v02jw44pPtuf/aV5hIf98NEEMR23Xz2F6pQxNpnTh?= =?us-ascii?Q?FupmYbv1lIZ1tosd6Zzd5xmu+raSbN0jqj+/NT8g7KM3g40zztDgoJSs101X?= =?us-ascii?Q?WnlPGh1Q/t+FbqD08Hi3YpguRr5P0RSOIKI8SMCDc4wq6297nOmBupcKQYdm?= =?us-ascii?Q?ecUBy6KFlx8OMK7/uU7zsLQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0602MB2871;6:SVVIo60k5nhbIdrVbDIRe659xH0/aT+BKVpgaiuZ?= =?us-ascii?Q?YwV/kCir/tl8VgMIjyuVgU6lnz1lI4LiChymI2ysO0r/iBie9/V1eKE7A4CO?= =?us-ascii?Q?Bj5994Hsoj1QsPBNPBeikuTDl114WO/Uvt79pZ7H2ZFPHKFo3rfW2881xg3b?= =?us-ascii?Q?Hk2eXgMJaZEe9HA5irmmGx81Gmrdj17UxUPuUQvaJyZvp94KfVLs0+HK8xNX?= =?us-ascii?Q?BuWyp/Aue4z0tM+x/SgKQCoYSCK+rfW7wnIIBYDxJNMYBrESPFgrfChnuNlo?= =?us-ascii?Q?UDjoqwpkCY1tbXNxtt/iajqzvmbqti9xbHrykx9OdbLltEY97+vLX1VHHmYg?= =?us-ascii?Q?JbNLb2QqcmpDPbRcobZIwi/ize0Cc5S4WZ9AYbbmzv3yBgJ2G/zcZk2D9uEI?= =?us-ascii?Q?kuCsN2MVJruKJw8HlwjSq9TbUSJmd5ACgxRVwjxqXPUk5QroTmlhXbNHP3o2?= =?us-ascii?Q?I6gd0VDrTZ52opHxJ7hSYFEBPQ3SoHBfxq4ppfVT3POUU13icxElsYOUspeo?= =?us-ascii?Q?waPC/aMgL7toV62L3f+vis1Czlrc1hi3LuxVpm5SZrmrfsWgTfzqcwngG1ks?= =?us-ascii?Q?E3f8j0GsdTqT77fIxcXmONK79UOWAPFtryLA8o5NNbU5izaXuzgMmEeclVvK?= =?us-ascii?Q?ZVvw6e9VTmdA4RaHLTcYVhr5/fvihTkG18PYesvomUoOWXLLzMb54+UGWF6z?= =?us-ascii?Q?UW6Zi5kwU8P3dViZ9RtjVUXyVZGj926GC9Wv3VIaP8p/zrn0PQ6OJPVDxADj?= =?us-ascii?Q?92igX5Iv7NCdiDgOho4FEHgv4Ro98TzOEmE0SSLzV5BTJoT9NXTSVxYgfupI?= =?us-ascii?Q?5Grm2X5s8GDB7D8eEXcR5byGnQDIYzG/B50y8bBl6U1WS27v6ZdqZDQG0/XM?= =?us-ascii?Q?8fr/4ehfsYt2DhZ6wufVIQXcAWiMR2dwKE20b81hAm+DhSMSusqF0fD0Kkip?= =?us-ascii?Q?EUZk/bOwAjI9nE3XGDmIISQkRpfXWcXisESSiSjXZDbR7+dh7kOCBlsW2mtp?= =?us-ascii?Q?m54=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0602MB2871;5:UOPoYLW4ZmWb/xkqs8vYrvPEHDA0mS3yCR9Jo+gX88m03lJVWX8EWjo0Q6tUWtIuR9CDsoFw/6sZrQpNGZRdd6xYu6/gAXu+q6zThEQEU0f9ABphNfzg9/4zACXCF7u0anxiqIs0qbLXBlXdksJRf4KJN0We74jcSzhOtGFgHiulDyumTzD2VwIP3j2t8nK8a3fMkCKGgyCuVJ5RWrkrcgnmdq1rdwbVclSJxwdO7Zc74u0hw7xlqb5rbHKQxccAUlDt5e+1xU3tetk7aXgz1Xa3KYRdc8amyXhqkrsMaHNyznuLzTECAojC/mQsVxbqd7SMntvno3vFZ6jKyspteCQ0XHVCPQYa0m1rjtb0D7lX5A1ZpW5eoRd4+8C5SXdhwT1EFgpTdUnLwLjfhWcTg3W0C6e1X2LmyehrwDHKWE+xIyS+oP6fNLYZXk5tH6EnnyCMg6TRuJaFdtto0NNrwuT29LUr9lc9ZH1xKkx4lIQrRkAs24K8EuCed/bgsKPn;24:L9yi7Prc99jmS6OqK8hS7HMT6b8ldcCj62pLWj0UwnOecsmEmabd7XezmRXY7vUbW0LhNxYtg4gUFTmhalFg06SEB2xkOeLahjBrpJSSoec= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0602MB2871;7:5964MD6HGuTe/c7+aVtnPHTxGuIKjpFpgqmIz4YwpB/IcLApgrXVXTs0bYcVSp1zjaSaB6hMvu2sFiX+eqmsecxogwZWb+3vwhH1VKKoc//hmNpKHT2XHzOZzEdUtgNLHxKQokk3mdi89wvJ9TfbzlLHq0Tg0CdV/lC8EqTeu+bcCedOWYMX0L/qU9VCFaa1NA0BxNq3ACybUTkGsVYswkfuCCpGMQy5vfRzqeWs0HkfoGMpkJM1/dG7gCkq4xEI/p1VHxNWFThsl8foPmsMTNr3E8kVViNAi3lSPkTjEOD5KJsmNvHHQDpMu8kRDb7a80t44AbGZV2S0j2t0qLzu1RxjnmEK+i9DPa5+ZhjOr8tbjm/Ds0vJ3LM0vzRrUazZVB3Fa11exhJ+T5aDSaNJzgJ5nZ1SIDW/R6BLFInW7Ue2ABOM2t2prh3DoWu4lBUlFdKEEhhNtj7g3yn8z+RSHdqvpF6ivaNCUg5WOGFNmc7LqaXOd9o7NH0yNJ2cK3Fnd1fR7Oxc2Yg2cE2IEyg0HNq8GcmufQ0gJsPyz7nZIESvCE59R/e9uFoNrla9XQzuuvv97zO/n7fp0BHLYdpRLVnBJ4zhD3M6Ob5m9gYdbtAdRSWKtNsn5t56Tec7ZRSP0ydLash6UCZ4zO9NFna9/Xw0SGAQDS5EvD/Zs8HC2ifbNXzri5hjTTO+E9PrL0KiN33umYh9tSOXKT1i1ZFgeNBdTLSgGxh698Ud/gGjgm9mLbGOKlGlH7AshkCMGa0gj6cFVmnq1Gij+KVUNOBergqvOrbW/YKkbmjnjE5tIo= X-OriginatorOrg: cern.ch X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jul 2017 22:01:08.5699 (UTC) X-MS-Exchange-CrossTenant-Id: c80d3499-4a40-4a8c-986e-abce017d6b19 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=c80d3499-4a40-4a8c-986e-abce017d6b19;Ip=[188.184.36.50];Helo=[cernmxgwlb4.cern.ch] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0602MB2871 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ---1195575205-201736693-1499810435=:28469 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8BIT On Mon, 3 Jul 2017, Guenter Roeck wrote: > On 07/02/2017 11:29 PM, Mike Looijmans wrote: >> Applied, and tested on my board, so you have my >> >> Tested-By: mike.looijmans@topic.nl >> >> Probably the maintainers will like to see a patch header mail with a "v3" >> summary for what you've changed ("git send-email --cover-letter" or >> something similar to that) >> > > ... and without it, the patch series tends to end up at the end of my review > list since I'll have to spend time tracking down the changes myself or, per > my choice, start all over and hope I catch all the problems found earlier. > > In other words, if people would like their patch series handled with > priority, making life easy for maintainers is a good start. Apologies, it seems the change summary got lost when sending the patches. Here it is: Changes since v2: * If a devicetree node does not exist, do not initialise the chip. In this case it is assumed that the initialisation has been done by another source. * Allow configuration of both of the "mode" fields in the control register. * Rename the devicetree property lltc->mode to lltc->meas-mode. * Specifying the mode in the devicetree node is now mandatory. * Small documentation updates. * Revert some unnecessary change of types. > Guenter > >> On 03-07-17 06:29, Tom Levens wrote: >> > Updated version of the ltc2990 driver which supports all measurement >> > modes (current, voltage, temperature) available in the chip. >> > >> > If devicetree is used, the mode must be specified with the property >> > "lltc,meas-mode". The format and possible values of the property are > > AFAIK, DT maintainers are not much into abbreviations. As far as I recall, this change was the suggestion of Rob as "mode" was too vague. >> > described in the binding. >> > >> > If devicetree is not used, the mode of the chip will not be configured. >> > Unless the chip is configured by another source, only the internal >> > temperature and supply voltage will be measured. >> > >> > Signed-off-by: Tom Levens >> > --- >> > Documentation/hwmon/ltc2990 | 24 ++++-- >> > drivers/hwmon/Kconfig | 7 +- >> > drivers/hwmon/ltc2990.c | 196 >> > +++++++++++++++++++++++++++++++++++++------- >> > 3 files changed, 185 insertions(+), 42 deletions(-) >> > >> > diff --git a/Documentation/hwmon/ltc2990 b/Documentation/hwmon/ltc2990 >> > index c25211e..3ed68f6 100644 >> > --- a/Documentation/hwmon/ltc2990 >> > +++ b/Documentation/hwmon/ltc2990 >> > @@ -8,6 +8,7 @@ Supported chips: >> > Datasheet: http://www.linear.com/product/ltc2990 >> > Author: Mike Looijmans >> > + Tom Levens >> > Description >> > @@ -16,10 +17,8 @@ Description >> > LTC2990 is a Quad I2C Voltage, Current and Temperature Monitor. >> > The chip's inputs can measure 4 voltages, or two inputs together (1+2 >> > and 3+4) >> > can be combined to measure a differential voltage, which is typically >> > used to >> > -measure current through a series resistor, or a temperature. >> > - >> > -This driver currently uses the 2x differential mode only. In order to >> > support >> > -other modes, the driver will need to be expanded. >> > +measure current through a series resistor, or a temperature with an >> > external >> > +diode. >> > Usage Notes >> > @@ -32,12 +31,19 @@ devices explicitly. >> > Sysfs attributes >> > ---------------- >> > +in0_input Voltage at Vcc pin in millivolt (range 2.5V to 5V) >> > +temp1_input Internal chip temperature in millidegrees Celcius >> > + >> > +A subset of the following attributes are visible, depending on the >> > measurement >> > +mode of the chip. >> > + >> > +in[1-4]_input Voltage at V[1-4] pin in millivolt >> > +temp2_input External temperature sensor TR1 in millidegrees Celcius >> > +temp3_input External temperature sensor TR2 in millidegrees Celcius >> > +curr1_input Current in mA across V1-V2 assuming a 1mOhm sense >> > resistor >> > +curr2_input Current in mA across V3-V4 assuming a 1mOhm sense >> > resistor >> > + >> > The "curr*_input" measurements actually report the voltage drop across >> > the >> > input pins in microvolts. This is equivalent to the current through a >> > 1mOhm >> > sense resistor. Divide the reported value by the actual sense resistor >> > value >> > in mOhm to get the actual value. >> > - >> > -in0_input Voltage at Vcc pin in millivolt (range 2.5V to 5V) >> > -temp1_input Internal chip temperature in millidegrees Celcius >> > -curr1_input Current in mA across v1-v2 assuming a 1mOhm sense >> > resistor. >> > -curr2_input Current in mA across v3-v4 assuming a 1mOhm sense >> > resistor. >> > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig >> > index 5ef2814..578e5a9 100644 >> > --- a/drivers/hwmon/Kconfig >> > +++ b/drivers/hwmon/Kconfig >> > @@ -709,15 +709,12 @@ config SENSORS_LTC2945 >> > be called ltc2945. >> > config SENSORS_LTC2990 >> > - tristate "Linear Technology LTC2990 (current monitoring mode only)" >> > + tristate "Linear Technology LTC2990" >> > depends on I2C >> > help >> > If you say yes here you get support for Linear Technology >> > LTC2990 >> > I2C System Monitor. The LTC2990 supports a combination of >> > voltage, >> > - current and temperature monitoring, but in addition to the Vcc >> > supply >> > - voltage and chip temperature, this driver currently only supports >> > - reading two currents by measuring two differential voltages >> > across >> > - series resistors. >> > + current and temperature monitoring. >> > This driver can also be built as a module. If so, the module >> > will >> > be called ltc2990. >> > diff --git a/drivers/hwmon/ltc2990.c b/drivers/hwmon/ltc2990.c >> > index e320d21..32f3a8d 100644 >> > --- a/drivers/hwmon/ltc2990.c >> > +++ b/drivers/hwmon/ltc2990.c >> > @@ -5,10 +5,6 @@ >> > * Author: Mike Looijmans >> > * >> > * License: GPLv2 >> > - * >> > - * This driver assumes the chip is wired as a dual current monitor, and >> > - * reports the voltage drop across two series resistors. It also >> > reports >> > - * the chip's internal temperature and Vcc power supply voltage. >> > */ >> > #include >> > @@ -18,6 +14,7 @@ >> > #include >> > #include >> > #include >> > +#include >> > #define LTC2990_STATUS 0x00 >> > #define LTC2990_CONTROL 0x01 >> > @@ -29,35 +26,109 @@ >> > #define LTC2990_V4_MSB 0x0C >> > #define LTC2990_VCC_MSB 0x0E >> > -#define LTC2990_CONTROL_KELVIN BIT(7) >> > -#define LTC2990_CONTROL_SINGLE BIT(6) >> > -#define LTC2990_CONTROL_MEASURE_ALL (0x3 << 3) >> > -#define LTC2990_CONTROL_MODE_CURRENT 0x06 >> > -#define LTC2990_CONTROL_MODE_VOLTAGE 0x07 >> > +#define LTC2990_IN0 BIT(0) >> > +#define LTC2990_IN1 BIT(1) >> > +#define LTC2990_IN2 BIT(2) >> > +#define LTC2990_IN3 BIT(3) >> > +#define LTC2990_IN4 BIT(4) >> > +#define LTC2990_CURR1 BIT(5) >> > +#define LTC2990_CURR2 BIT(6) >> > +#define LTC2990_TEMP1 BIT(7) >> > +#define LTC2990_TEMP2 BIT(8) >> > +#define LTC2990_TEMP3 BIT(9) >> > +#define LTC2990_NONE 0 >> > +#define LTC2990_ALL GENMASK(9, 0) >> > + >> > +#define LTC2990_MODE0_SHIFT 0 >> > +#define LTC2990_MODE0_MASK GENMASK(2, 0) >> > +#define LTC2990_MODE1_SHIFT 3 >> > +#define LTC2990_MODE1_MASK GENMASK(1, 0) >> > + >> > +/* Enabled measurements for mode bits 2..0 */ >> > +static const int ltc2990_attrs_ena_0[] = { >> > + LTC2990_IN1 | LTC2990_IN2 | LTC2990_TEMP3, >> > + LTC2990_CURR1 | LTC2990_TEMP3, >> > + LTC2990_CURR1 | LTC2990_IN3 | LTC2990_IN4, >> > + LTC2990_TEMP2 | LTC2990_IN3 | LTC2990_IN4, >> > + LTC2990_TEMP2 | LTC2990_CURR2, >> > + LTC2990_TEMP2 | LTC2990_TEMP3, >> > + LTC2990_CURR1 | LTC2990_CURR2, >> > + LTC2990_IN1 | LTC2990_IN2 | LTC2990_IN3 | LTC2990_IN4 >> > +}; >> > + >> > +/* Enabled measurements for mode bits 4..3 */ >> > +static const int ltc2990_attrs_ena_1[] = { >> > + LTC2990_NONE, >> > + LTC2990_TEMP2 | LTC2990_IN1 | LTC2990_CURR1, >> > + LTC2990_TEMP3 | LTC2990_IN3 | LTC2990_CURR2, >> > + LTC2990_ALL >> > +}; >> > + >> > +struct ltc2990_data { >> > + struct i2c_client *i2c; >> > + u32 mode[2]; >> > +}; >> > /* Return the converted value from the given register in uV or mC */ >> > -static int ltc2990_get_value(struct i2c_client *i2c, u8 reg, int >> > *result) >> > +static int ltc2990_get_value(struct i2c_client *i2c, int index, int >> > *result) >> > { >> > int val; >> > + u8 reg; >> > + >> > + switch (index) { >> > + case LTC2990_IN0: >> > + reg = LTC2990_VCC_MSB; >> > + break; >> > + case LTC2990_IN1: >> > + case LTC2990_CURR1: >> > + case LTC2990_TEMP2: >> > + reg = LTC2990_V1_MSB; >> > + break; >> > + case LTC2990_IN2: >> > + reg = LTC2990_V2_MSB; >> > + break; >> > + case LTC2990_IN3: >> > + case LTC2990_CURR2: >> > + case LTC2990_TEMP3: >> > + reg = LTC2990_V3_MSB; >> > + break; >> > + case LTC2990_IN4: >> > + reg = LTC2990_V4_MSB; >> > + break; >> > + case LTC2990_TEMP1: >> > + reg = LTC2990_TINT_MSB; >> > + break; >> > + default: >> > + return -EINVAL; >> > + } >> > val = i2c_smbus_read_word_swapped(i2c, reg); >> > if (unlikely(val < 0)) >> > return val; >> > - switch (reg) { >> > - case LTC2990_TINT_MSB: >> > - /* internal temp, 0.0625 degrees/LSB, 13-bit */ >> > + switch (index) { >> > + case LTC2990_TEMP1: >> > + case LTC2990_TEMP2: >> > + case LTC2990_TEMP3: >> > + /* temp, 0.0625 degrees/LSB */ >> > *result = sign_extend32(val, 12) * 1000 / 16; >> > break; >> > - case LTC2990_V1_MSB: >> > - case LTC2990_V3_MSB: >> > - /* Vx-Vy, 19.42uV/LSB. Depends on mode. */ >> > + case LTC2990_CURR1: >> > + case LTC2990_CURR2: >> > + /* Vx-Vy, 19.42uV/LSB */ >> > *result = sign_extend32(val, 14) * 1942 / 100; >> > break; >> > - case LTC2990_VCC_MSB: >> > - /* Vcc, 305.18μV/LSB, 2.5V offset */ >> > + case LTC2990_IN0: >> > + /* Vcc, 305.18uV/LSB, 2.5V offset */ >> > *result = sign_extend32(val, 14) * 30518 / (100 * 1000) + >> > 2500; >> > break; >> > + case LTC2990_IN1: >> > + case LTC2990_IN2: >> > + case LTC2990_IN3: >> > + case LTC2990_IN4: >> > + /* Vx, 305.18uV/LSB */ >> > + *result = sign_extend32(val, 14) * 30518 / (100 * 1000); >> > + break; >> > default: >> > return -EINVAL; /* won't happen, keep compiler happy */ >> > } >> > @@ -69,48 +140,117 @@ static ssize_t ltc2990_show_value(struct device >> > *dev, >> > struct device_attribute *da, char *buf) >> > { >> > struct sensor_device_attribute *attr = to_sensor_dev_attr(da); >> > + struct ltc2990_data *data = dev_get_drvdata(dev); >> > int value; >> > int ret; >> > - ret = ltc2990_get_value(dev_get_drvdata(dev), attr->index, &value); >> > + ret = ltc2990_get_value(data->i2c, attr->index, &value); >> > if (unlikely(ret < 0)) >> > return ret; >> > return snprintf(buf, PAGE_SIZE, "%d\n", value); >> > } >> > +static umode_t ltc2990_attrs_visible(struct kobject *kobj, >> > + struct attribute *a, int n) >> > +{ >> > + struct device *dev = container_of(kobj, struct device, kobj); >> > + struct ltc2990_data *data = dev_get_drvdata(dev); >> > + struct device_attribute *da = >> > + container_of(a, struct device_attribute, attr); >> > + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); >> > + >> > + int attrs_mask = LTC2990_IN0 | LTC2990_TEMP1 | >> > + ltc2990_attrs_ena_0[data->mode[0]] & >> > + ltc2990_attrs_ena_1[data->mode[1]]; >> > + >> > + if (attr->index & attrs_mask) >> > + return a->mode; >> > + >> > + return 0; >> > +} >> > + >> > static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > - LTC2990_TINT_MSB); >> > + LTC2990_TEMP1); >> > +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > + LTC2990_TEMP2); >> > +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > + LTC2990_TEMP3); >> > static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > - LTC2990_V1_MSB); >> > + LTC2990_CURR1); >> > static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > - LTC2990_V3_MSB); >> > + LTC2990_CURR2); >> > static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, ltc2990_show_value, >> > NULL, >> > - LTC2990_VCC_MSB); >> > + LTC2990_IN0); >> > +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, ltc2990_show_value, NULL, >> > + LTC2990_IN1); >> > +static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, ltc2990_show_value, NULL, >> > + LTC2990_IN2); >> > +static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, ltc2990_show_value, NULL, >> > + LTC2990_IN3); >> > +static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, ltc2990_show_value, NULL, >> > + LTC2990_IN4); >> > static struct attribute *ltc2990_attrs[] = { >> > & sensor_dev_attr_temp1_input.dev_attr.attr, >> > + &sensor_dev_attr_temp2_input.dev_attr.attr, >> > + &sensor_dev_attr_temp3_input.dev_attr.attr, >> > & sensor_dev_attr_curr1_input.dev_attr.attr, >> > & sensor_dev_attr_curr2_input.dev_attr.attr, >> > & sensor_dev_attr_in0_input.dev_attr.attr, >> > + &sensor_dev_attr_in1_input.dev_attr.attr, >> > + &sensor_dev_attr_in2_input.dev_attr.attr, >> > + &sensor_dev_attr_in3_input.dev_attr.attr, >> > + &sensor_dev_attr_in4_input.dev_attr.attr, >> > NULL, >> > }; >> > -ATTRIBUTE_GROUPS(ltc2990); >> > + >> > +static const struct attribute_group ltc2990_group = { >> > + .attrs = ltc2990_attrs, >> > + .is_visible = ltc2990_attrs_visible, >> > +}; >> > +__ATTRIBUTE_GROUPS(ltc2990); >> > static int ltc2990_i2c_probe(struct i2c_client *i2c, >> > const struct i2c_device_id *id) >> > { >> > int ret; >> > struct device *hwmon_dev; >> > + struct ltc2990_data *data; >> > + struct device_node *of_node = i2c->dev.of_node; >> > if (!i2c_check_functionality(i2c->adapter, >> > I2C_FUNC_SMBUS_BYTE_DATA | >> > I2C_FUNC_SMBUS_WORD_DATA)) >> > return -ENODEV; >> > - /* Setup continuous mode, current monitor */ >> > + data = devm_kzalloc(&i2c->dev, sizeof(struct ltc2990_data), >> > GFP_KERNEL); >> > + if (unlikely(!data)) >> > + return -ENOMEM; >> > + >> > + data->i2c = i2c; >> > + >> > + if (of_node) { >> > + ret = of_property_read_u32_array(of_node, "lltc,meas-mode", >> > + data->mode, 2); >> > + if (ret < 0) >> > + return ret; >> > + >> > + if (data->mode[0] & ~LTC2990_MODE0_MASK || >> > + data->mode[1] & ~LTC2990_MODE1_MASK) >> > + return -EINVAL; >> > + } else { >> > + ret = i2c_smbus_read_byte_data(i2c, LTC2990_CONTROL); >> > + if (ret < 0) >> > + return ret; >> > + >> > + data->mode[0] = ret >> LTC2990_MODE0_SHIFT & >> > LTC2990_MODE0_MASK; >> > + data->mode[1] = ret >> LTC2990_MODE1_SHIFT & >> > LTC2990_MODE1_MASK; >> > + } >> > + >> > + /* Setup continuous mode */ >> > ret = i2c_smbus_write_byte_data(i2c, LTC2990_CONTROL, >> > - LTC2990_CONTROL_MEASURE_ALL | >> > - LTC2990_CONTROL_MODE_CURRENT); >> > + data->mode[0] << LTC2990_MODE0_SHIFT | >> > + data->mode[1] << LTC2990_MODE1_SHIFT); >> > if (ret < 0) { >> > dev_err(&i2c->dev, "Error: Failed to set control mode.\n"); >> > return ret; >> > @@ -124,7 +264,7 @@ static int ltc2990_i2c_probe(struct i2c_client *i2c, >> > hwmon_dev = devm_hwmon_device_register_with_groups(&i2c->dev, >> > i2c->name, >> > - i2c, >> > + data, >> > ltc2990_groups); >> > return PTR_ERR_OR_ZERO(hwmon_dev); >> > >> >> >> >> Kind regards, >> >> Mike Looijmans >> System Expert >> >> TOPIC Products >> Materiaalweg 4, NL-5681 RJ Best >> Postbus 440, NL-5680 AK Best >> Telefoon: +31 (0) 499 33 69 79 >> E-mail: mike.looijmans@topicproducts.com >> Website: www.topicproducts.com >> >> Please consider the environment before printing this e-mail >> >> >> >> > > ---1195575205-201736693-1499810435=:28469--