From patchwork Sat Jan 8 20:53:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707613 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B1ECC433FE for ; Sat, 8 Jan 2022 20:53:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232894AbiAHUxc (ORCPT ); Sat, 8 Jan 2022 15:53:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232888AbiAHUxb (ORCPT ); Sat, 8 Jan 2022 15:53:31 -0500 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F1CB0C06173F; Sat, 8 Jan 2022 12:53:30 -0800 (PST) Received: by mail-qk1-x72e.google.com with SMTP id f138so10014588qke.10; Sat, 08 Jan 2022 12:53:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zrHQRo0zoQMTPRIHvDLoRVw1z6+WqQ9h09dSoESChVo=; b=XusMXkWDcFk2RmekDBV1nALtpM65w7Y/2YNVjCGDDPbXuSrqGRnZNuE7jpkiCKdYGF iCEAwWr1k+IYCQosJmo1znIRoz0xQepPRSpy+Mm8HQM/ogiz56ec3ihqblbuHs0tk5J2 9p8La0+OsmcQ0ktse83nYtuvcWO5iTxT1DrGPPGLHPl1vduBZOP5vPb2usFtzZvd7NYm Nsue8bHrl0c+X4MA4Ayo0mjMb5Shb5wvNDWEZbln1KknU2QkTbpc1G3/BlCWBDtUsxlO 3J/UsiwqmF5AkEL8ac24dWmzjZo9nlJzWpPENH17Ny25Uyc8cyQRwscjN93+D9knVzPe cS5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zrHQRo0zoQMTPRIHvDLoRVw1z6+WqQ9h09dSoESChVo=; b=mLLtz8VcxJBVeItOvW0ibvMdjoxaQv5jsrycrEX9LRfiwmexhx1YrtUEz14F3XGARf o/ka9NvC8MoC/4aA8WGHQyfYB9MS2T63hpIznJivPT6pAr2IT8P/4BNPQFP8XcSAMHvB q7fjYBZJFP66io8CEE/LbxAScSfs21tPeCyLhucbn54j/jtVcpyhOkgJnlr605sqYhWM 5LSjaB35GE9xikoku/nCaSWrzIzCMbd6Ih1hwM/UAoDpZmKH+Em5unRBsteACQ8J/J+u kmj53U4wVFLvB6W2qUg1kzvh8A4fJbOXUuo+F6+7J2tJvMJRC2lwEPVvjIYcO98cwgAR 7bPg== X-Gm-Message-State: AOAM530LdQuqjj/vKPkD3XDWQ/hsyW1SXnuN4lHHPOunYo9cZtl33xjo HtNoOvqNWEphW3Y44LxPiP8lHO9mnwQoeA== X-Google-Smtp-Source: ABdhPJwcACzNsk8tiXVW5nA8D1d5dliMHsNfe77E0uLwgrECHzcJc2mjwaNpA/bj0udli3r34PJ0gA== X-Received: by 2002:a05:620a:1903:: with SMTP id bj3mr2618896qkb.37.1641675210162; Sat, 08 Jan 2022 12:53:30 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:29 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 01/16] iio: inkern: apply consumer scale on IIO_VAL_INT cases Date: Sat, 8 Jan 2022 15:53:04 -0500 Message-Id: <20220108205319.2046348-2-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org When a consumer calls iio_read_channel_processed() and the channel has an integer scale, the scale channel scale is applied and the processed value is returned as expected. On the other hand, if the consumer calls iio_convert_raw_to_processed() the scaling factor requested by the consumer is not applied. This for example causes the consumer to process mV when expecting uV. Make sure to always apply the scaling factor requested by the consumer. Fixes: 48e44ce0f881 ("iio:inkern: Add function to read the processed value") Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/inkern.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 0222885b334c..021e1397ffc5 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -616,7 +616,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, switch (scale_type) { case IIO_VAL_INT: - *processed = raw64 * scale_val; + *processed = raw64 * scale_val * scale; break; case IIO_VAL_INT_PLUS_MICRO: if (scale_val2 < 0) From patchwork Sat Jan 8 20:53:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707614 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 48AB7C43217 for ; Sat, 8 Jan 2022 20:53:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232867AbiAHUxf (ORCPT ); Sat, 8 Jan 2022 15:53:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50800 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232904AbiAHUxd (ORCPT ); Sat, 8 Jan 2022 15:53:33 -0500 Received: from mail-qv1-xf33.google.com (mail-qv1-xf33.google.com [IPv6:2607:f8b0:4864:20::f33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D58DCC06173F; Sat, 8 Jan 2022 12:53:32 -0800 (PST) Received: by mail-qv1-xf33.google.com with SMTP id kd9so9447668qvb.11; Sat, 08 Jan 2022 12:53:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=M8wRgrjBM7Xg74cduQguANgNOGJedTRLrqER6uUYvxA=; b=Tvrb6onhQcujJ8Qdut2XQNqro5bS1+hAlbQqf//YU4ulzD6+8d5FSEoIV5iwDbmsOh 9blebLHCy9KK8oMVotoddLd17vj2738Zvh90ezTsFrXDKJ/blFHYmxnsgFUmf8nKG8LP l6WsdeiDPExCuM0T6I/kajrN5aIQfcH67pXPfPHLVvxPwqADvZ9EmzB7FEvo+yQsdDw8 1tqNNmjmPQ/zXxqbnIPi/Y8IIarX1axSA5W3C6zJgEdxm62IQY/HOZyhhF5+x0MJjH5X sQM0ekViSVVRIVz8wRQt/gEKNfnJzdgVkjHj4vP1Z3owOEZPGMDEuIpMhAxJ5nt/4jED 62JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=M8wRgrjBM7Xg74cduQguANgNOGJedTRLrqER6uUYvxA=; b=b5yPqYyNRoZNJZ5qK8W7B2vCfy/dsKpAE9WtR3yeTqCl/eM6xJzU8cpiOrXFT0tOUs nVtCz1XwTHHMvz6dFQopXR+VfjZgOM1nQXTWQDk4myoYN6nsLS+A2IdzL6J9syuhgpyb 5LCW1cSe34wOkCbRfz8SA47yzz44CTNStgn0AR3jrgz3wbtSsSTxkEadkf5uUw2/sb3L djgaCxVuIkR0J8mSPZ/FRnI9qgg17HZ/ELdBj1RTSJVmDJz7l4qMFijv1ddH4hkyFtAn FPwGqCuj9EbFw3qGx/vvU971BUfkF80m+1d1idL2axsEXW7r3teQ48Di7xsb2nW1/4BA JCig== X-Gm-Message-State: AOAM5326fFG0WhPceswFPsTfxk08azZWLhJvLFr/wIYxhSZUzkvPZVKf papZuhbYg+h+/YAoWY0mcfA= X-Google-Smtp-Source: ABdhPJxUsEnlYNXADnQ1ybMN8zn0ZOOoXW7z59deh2KrAC4FDr5kgQ1GeIY89koKc7uPYhftvOmz8w== X-Received: by 2002:ad4:5f86:: with SMTP id jp6mr10425181qvb.28.1641675212060; Sat, 08 Jan 2022 12:53:32 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:31 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 02/16] iio: inkern: apply consumer scale when no channel scale is available Date: Sat, 8 Jan 2022 15:53:05 -0500 Message-Id: <20220108205319.2046348-3-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org When a consumer calls iio_read_channel_processed() and no channel scale is available, it's assumed that the scale is one and the raw value is returned as expected. On the other hand, if the consumer calls iio_convert_raw_to_processed() the scaling factor requested by the consumer is not applied. This for example causes the consumer to process mV when expecting uV. Make sure to always apply the scaling factor requested by the consumer. Fixes: adc8ec5ff183 ("iio: inkern: pass through raw values if no scaling") Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/inkern.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 021e1397ffc5..dbe13fad3cbb 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -607,10 +607,10 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, IIO_CHAN_INFO_SCALE); if (scale_type < 0) { /* - * Just pass raw values as processed if no scaling is - * available. + * If no channel scaling is available apply consumer scale to + * raw value and return. */ - *processed = raw; + *processed = raw * scale; return 0; } From patchwork Sat Jan 8 20:53:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707615 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12643C433EF for ; Sat, 8 Jan 2022 20:53:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232923AbiAHUxg (ORCPT ); Sat, 8 Jan 2022 15:53:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232915AbiAHUxe (ORCPT ); Sat, 8 Jan 2022 15:53:34 -0500 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35804C06173F; Sat, 8 Jan 2022 12:53:34 -0800 (PST) Received: by mail-qt1-x836.google.com with SMTP id bp39so9569965qtb.6; Sat, 08 Jan 2022 12:53:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=OecU8XiB4j/XKZWsY12TD6ThPis9wE2cHR5/jhGyLBM=; b=etknok4layZ6IPMp8o2EbWyZcYWPqyMmutqF6YpfCRoHhwK/cZZk2iPLhg5HvJB0My gIXG5Ip/K2Axtz6Vu01FXXaR7VPaLJnzdcrEsq1mley+FTN8aPVVn5vQ4JJbT89LpQmb Qh3DIBX5RET7aIvJiEXfAoLNXdMRQGHvSqmo2SYBu3v2mwzATmr4/XIwnTn3/hQdjCLE uMx9DZPazsp1RNQr8t5yffYe3dlWMDlZHC8f/L43Hfn0qO46mwG/6YgKx5zN7fjNy8FU 0sS0jzqtSIGRRIhpbf6Olj/3QWx7o953uraF5Eyt6+8Dau5b3I06U5/Khc0cxTlHaPR3 /dDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OecU8XiB4j/XKZWsY12TD6ThPis9wE2cHR5/jhGyLBM=; b=HL8eCZ47KF+zT+R5D9arowkydhBw/ffWWv5WuV5qUl9IKunRj9lfch/ObO/Tcql7QV rehrbbKanf27bWG+f+ZPAs6q+RkruOhI68uOauJYe/PUOwBBGabPfQY9aUBEqT6i7wpW j7QmwVHkn8KnCfwvbEeFRK8T8jp8oxXsQKLEChlHxQtd/6VniT8rE9vTKmBHwJ6djvIL RJktsMC9Iq1ijOIXbroYLhOYQzopMWEpyzWn6ITFaioSCwC9jHL510DhlN4iOuKnf2Rd y5OXv24S19pTSxiC7GKZmtAm3/dR+QhH9ILn6b8S69FOP/+yqMW5mU/z/Ryp6OAqxnfz XCHg== X-Gm-Message-State: AOAM530wX21vZzeX4y3dvJekzEKiQnMhW5KmzcIb0NPgdWPlLn+V/FlV dFhUSxDuInt7imGAlvYNrY4= X-Google-Smtp-Source: ABdhPJzRoe6Umbg+WbRadLhN6FszPgkbpOd+YQ9Vc7mrbejHNZGlCCpN+krtkacsWpVR87A2nZA7Tw== X-Received: by 2002:ac8:5952:: with SMTP id 18mr56830855qtz.429.1641675213407; Sat, 08 Jan 2022 12:53:33 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:33 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 03/16] iio: inkern: make a best effort on offset calculation Date: Sat, 8 Jan 2022 15:53:06 -0500 Message-Id: <20220108205319.2046348-4-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org iio_convert_raw_to_processed_unlocked() assumes the offset is an integer. Make a best effort to get a valid offset value for fractional cases without breaking implicit truncations. Fixes: 48e44ce0f881 ("iio:inkern: Add function to read the processed value") Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/inkern.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index dbe13fad3cbb..df74765d33dc 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -595,13 +595,35 @@ EXPORT_SYMBOL_GPL(iio_read_channel_average_raw); static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, int raw, int *processed, unsigned int scale) { - int scale_type, scale_val, scale_val2, offset; + int scale_type, scale_val, scale_val2; + int offset_type, offset_val, offset_val2; s64 raw64 = raw; - int ret; - ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET); - if (ret >= 0) - raw64 += offset; + offset_type = iio_channel_read(chan, &offset_val, &offset_val2, + IIO_CHAN_INFO_OFFSET); + if (offset_type >= 0) { + switch (offset_type) { + case IIO_VAL_INT: + break; + case IIO_VAL_INT_PLUS_MICRO: + case IIO_VAL_INT_PLUS_NANO: + /* + * Both IIO_VAL_INT_PLUS_MICRO and IIO_VAL_INT_PLUS_NANO + * implicitely truncate the offset to it's integer form. + */ + break; + case IIO_VAL_FRACTIONAL: + offset_val /= offset_val2; + break; + case IIO_VAL_FRACTIONAL_LOG2: + offset_val >>= offset_val2; + break; + default: + return -EINVAL; + } + + raw64 += offset_val; + } scale_type = iio_channel_read(chan, &scale_val, &scale_val2, IIO_CHAN_INFO_SCALE); From patchwork Sat Jan 8 20:53:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707624 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94134C4332F for ; Sat, 8 Jan 2022 20:54:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232952AbiAHUxh (ORCPT ); Sat, 8 Jan 2022 15:53:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50818 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232937AbiAHUxg (ORCPT ); Sat, 8 Jan 2022 15:53:36 -0500 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B64B2C06173F; Sat, 8 Jan 2022 12:53:35 -0800 (PST) Received: by mail-qv1-xf2e.google.com with SMTP id kk22so9521781qvb.0; Sat, 08 Jan 2022 12:53:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mxK+sc1QAs60zDhKd9gn07PMGjZ4i6lT+9wHQfHyyaM=; b=V0WjO27mbKRadm7b0rB51N+fdPHef06KY+IBUlwSqIhQr40tdWAC15srIXtcoaTDqq C6ayQ/9ee05huo7Tn7iQs9QZKiOUkf21YnSC79nKbtPSZUNsCJd4u9OD8t0SnB7EZmYs l5l5xYTlhBoWHYFWmC+yNVCTjrQrGcYEDYv5VoI1HYdCSz57X1XmRe3f0PcWEFGK/CPt zU7nOgTjoieSTvQffF26ZIvakpEeY6CqIgPrEAuyVAv8ETY6IQwk7aqORSQXC8bmBp+3 thoNai9E1VpH02FaBDr5fu7A82A96vais07/OVT6DHlBOde/kzzopWTIpDS5gzurnq+H TnJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mxK+sc1QAs60zDhKd9gn07PMGjZ4i6lT+9wHQfHyyaM=; b=nxD9eDh53aWSmsmksQo7cF3pHswxSsXkWLPpJC7TsK8Rlw15EIhqyquW4KV1lt/P8a WmZ6sZ6DTKG034L7xq2HBiLHJ5jj0k0cqst3teAJi1JQCbhEUM/i83+u7yA1wUNeGWKs 679hRrCnTK2/KNX82Jqxbce29716MM5DHs5/ZAddzzbM9p89NRK6jWuyKy+vlkZ9CYnr omBX/IHQeLhbs99xT2dG21EJNkbotAHXu7hA0iqf/lk5xjIpbt3LNsariEq/CIExD6yS Ru9Ki2IjZ6vU5CAtFfKlWXhQ6hs2WqpbP/iyOhveb8p4eSZ5rRDz5ExCjNxIULOHMO5n pStQ== X-Gm-Message-State: AOAM530fiTMZafWwdUQdGNm4hZOPUPaeLeEWDtZATKKXUJXP8dLZu1ZR iT+aQedDyOhAjhtXffO1a1U= X-Google-Smtp-Source: ABdhPJyUFfqlTD4tQ4zrDLICb2V6gmDFuxC9gPXl9Wcw3zQ2DtYaTCHzCbU4tu1ji2BcT+N526hvgg== X-Received: by 2002:a05:6214:1761:: with SMTP id et1mr61119161qvb.131.1641675214996; Sat, 08 Jan 2022 12:53:34 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:34 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 04/16] iio: afe: rescale: use s64 for temporary scale calculations Date: Sat, 8 Jan 2022 15:53:07 -0500 Message-Id: <20220108205319.2046348-5-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org All four scaling coefficients can take signed values. Make tmp a signed 64-bit integer and switch to div_s64() to preserve signs during 64-bit divisions. Fixes: 8b74816b5a9a ("iio: afe: rescale: new driver") Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 774eb3044edd..271d73e420c4 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -39,7 +39,7 @@ static int rescale_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { struct rescale *rescale = iio_priv(indio_dev); - unsigned long long tmp; + s64 tmp; int ret; switch (mask) { @@ -77,10 +77,10 @@ static int rescale_read_raw(struct iio_dev *indio_dev, *val2 = rescale->denominator; return IIO_VAL_FRACTIONAL; case IIO_VAL_FRACTIONAL_LOG2: - tmp = *val * 1000000000LL; - do_div(tmp, rescale->denominator); + tmp = (s64)*val * 1000000000LL; + tmp = div_s64(tmp, rescale->denominator); tmp *= rescale->numerator; - do_div(tmp, 1000000000LL); + tmp = div_s64(tmp, 1000000000LL); *val = tmp; return ret; default: From patchwork Sat Jan 8 20:53:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707616 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AC41C4332F for ; Sat, 8 Jan 2022 20:53:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232939AbiAHUxj (ORCPT ); Sat, 8 Jan 2022 15:53:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50832 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232948AbiAHUxh (ORCPT ); Sat, 8 Jan 2022 15:53:37 -0500 Received: from mail-qk1-x72f.google.com (mail-qk1-x72f.google.com [IPv6:2607:f8b0:4864:20::72f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 56D84C061401; Sat, 8 Jan 2022 12:53:37 -0800 (PST) Received: by mail-qk1-x72f.google.com with SMTP id b85so10075480qkc.1; Sat, 08 Jan 2022 12:53:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oWhmcFtfhgbZtaLu7vpHXMJXolJo6+/DDSY5r7bw7Nk=; b=PYN/kYpVDfPjGHCGQ/wRuOSzTMT064pJ+qQXj6CfvQYK3eq/ptLuNcoKrUqcauF+d6 UPeafesL4GV+puJVcb3Vp8FBwXrrUeJo/VaVz8jkfs1X6ORDtPndgn1doitbxdXU5URE jsahDfGDFGpVBlCvzUnylHoC7Yb7hziWfeRssTgZ3l6lG59c1SZC5uKINuzEOFaSIFOQ GVa8gaXCiowMaOBFt8ilb+pl8Xkqn6BBMaRS/EG3f6HQekeXyaMBZ0Ig/ZHKnCC85cNp 53tv32WTd2O+RS6Zoq25z9K1r1ctEO1ANQlpQyIYmwc3vdVkz+4LclOoTaLHCqnzw/Pf aHBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oWhmcFtfhgbZtaLu7vpHXMJXolJo6+/DDSY5r7bw7Nk=; b=cPbFXsaidSVj1PfL0hwHvEefpoS8pK2eUgyl3tILVxpTuYlHSDMFk7n5GIgrC03gTl aq+K/wKBS0bK52XfQKClSitSlK/YsSd7eo2NEuy6+UQlUWnlZa/h12jL2dneIWR8Ayb4 F/E9+5ru0jpULFn/zh/4hPYAN/e07uQbKnyyLWO6rA0dtcGQF2DdYnHKMPr1rftLr8r1 /2xcWkecnw443hKNItpg762wy1xf8UWnJ5phIAsSH2vwZuaY/7J4JQVMNJ4rAq2DCYLL vYcQKIHrtdiWX7ucQ78vZy6jlGWs4TIJVnBATAvnC+jN+Oj40UvFYs3I0BAdHvL5Guc/ rX1Q== X-Gm-Message-State: AOAM532A2U8yPVALUfm/ObRuZi8mcmNEGVNHWFFNuzPRzwp1kPSjpPrP oJO797boufyuu5tOPHsWlOPMLodBGQ8= X-Google-Smtp-Source: ABdhPJzAbYsYPC9bUz04flrV8AD9l40D+kQkDB9GuzJsXR67yjaNttNtD0EB1hrBbHi/LrSESYACyg== X-Received: by 2002:a37:654:: with SMTP id 81mr10725406qkg.499.1641675216578; Sat, 08 Jan 2022 12:53:36 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:36 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 05/16] iio: afe: rescale: reorder includes Date: Sat, 8 Jan 2022 15:53:08 -0500 Message-Id: <20220108205319.2046348-6-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Includes should be ordered alphabetically which is already the case, but follow what is done in other drivers by separation IIO specific headers with a blank line. Signed-off-by: Liam Beguin --- drivers/iio/afe/iio-rescale.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 271d73e420c4..69710c481376 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -9,14 +9,15 @@ #include #include -#include -#include #include #include #include #include #include +#include +#include + struct rescale; struct rescale_cfg { From patchwork Sat Jan 8 20:53:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707620 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA259C433F5 for ; Sat, 8 Jan 2022 20:53:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232974AbiAHUxn (ORCPT ); Sat, 8 Jan 2022 15:53:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232970AbiAHUxj (ORCPT ); Sat, 8 Jan 2022 15:53:39 -0500 Received: from mail-qk1-x732.google.com (mail-qk1-x732.google.com [IPv6:2607:f8b0:4864:20::732]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B079EC061401; Sat, 8 Jan 2022 12:53:38 -0800 (PST) Received: by mail-qk1-x732.google.com with SMTP id b85so10075523qkc.1; Sat, 08 Jan 2022 12:53:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=e/ker9BlooBL9CPJxenjCRhQehzmhQtAZVQ9PuNp+0Q=; b=UQtKps1+Z2lJvU2UWoQvngzI/nQOKOwiKCvrhLdKh5hKoLIA4Y19walKXjUs4mDiU2 9c81bFO7RaGHLWIztX/I0uWjXh7ec4ge8hb7KKZZ6tUjh0wTkMpnoK2WSla2MxMZrkLm wLT5mRxxpc92CcerDbgvQzZbohD35zq82NbdHhmdezOLlsWFkbsmP1HFd1QFxLxey8uU 489oGk+12wlKC4+enKugG/feBx8Vcv586BHOvBN1r+UNEfNHqd5bFboWNzGL+NZNpGLj +/H4qnArXb5jbpdLPAKXLDgY2QS/GxzWoPaLeK6gHGOIRCEE6q9DOAB/O1CzQe1HEilc xJqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=e/ker9BlooBL9CPJxenjCRhQehzmhQtAZVQ9PuNp+0Q=; b=Hk50AWOLrz2wLLcThXJLazaoA+t2uu8S3UUe7JL1QDW1jKSYdjjBFUOFUmVmIY2zD0 I/3rI4CoP3lIbt0H/2F3WbhX67uJfE6pzA3wSqqR2/mJKkaCRtFWEtim50NxLqZxhu2l wBwmgpYpfDQc2lmxNdxXcSVxzLpjNQ/s9QDczJw+kbU2dCas/t4DNZLqCmLFLROLHlgi jwQ2/CVccwXChI7wwuoPyijoxEIgAWTAIMmGWnZo4D95bWhl4wVpo4PAY8nEf8C7ABaQ nipY70hW6ksX7mylONLMs6OIGtPHMTAzx2nGx6ikyb5BJ2rpKYcrOM/WbOOFjgPjsRVm CdXw== X-Gm-Message-State: AOAM530PJ4H1sTxQpuLlN/B5FVsI4tyDVlGXLkA18IWPpeWpz3EzIQuP RLYUS3EorP1PVgu4gk5gDAg= X-Google-Smtp-Source: ABdhPJyVXFmDL3ciTJKREasamp6t5falDecl7daJFhOUtgS7P8m3QftNMAaurZWhvl6z2hdUciSxcg== X-Received: by 2002:a05:620a:4708:: with SMTP id bs8mr21101333qkb.246.1641675217884; Sat, 08 Jan 2022 12:53:37 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:37 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 06/16] iio: afe: rescale: expose scale processing function Date: Sat, 8 Jan 2022 15:53:09 -0500 Message-Id: <20220108205319.2046348-7-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org In preparation for the addition of kunit tests, expose the logic responsible for combining channel scales. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 65 ++++++++++++++------------------- include/linux/iio/afe/rescale.h | 32 ++++++++++++++++ 2 files changed, 60 insertions(+), 37 deletions(-) create mode 100644 include/linux/iio/afe/rescale.h diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 69710c481376..65832dd09249 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -15,32 +15,43 @@ #include #include +#include #include #include -struct rescale; - -struct rescale_cfg { - enum iio_chan_type type; - int (*props)(struct device *dev, struct rescale *rescale); -}; +int rescale_process_scale(struct rescale *rescale, int scale_type, + int *val, int *val2) +{ + s64 tmp; -struct rescale { - const struct rescale_cfg *cfg; - struct iio_channel *source; - struct iio_chan_spec chan; - struct iio_chan_spec_ext_info *ext_info; - bool chan_processed; - s32 numerator; - s32 denominator; -}; + switch (scale_type) { + case IIO_VAL_FRACTIONAL: + *val *= rescale->numerator; + *val2 *= rescale->denominator; + return scale_type; + case IIO_VAL_INT: + *val *= rescale->numerator; + if (rescale->denominator == 1) + return scale_type; + *val2 = rescale->denominator; + return IIO_VAL_FRACTIONAL; + case IIO_VAL_FRACTIONAL_LOG2: + tmp = (s64)*val * 1000000000LL; + tmp = div_s64(tmp, rescale->denominator); + tmp *= rescale->numerator; + tmp = div_s64(tmp, 1000000000LL); + *val = tmp; + return scale_type; + default: + return -EOPNOTSUPP; + } +} static int rescale_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct rescale *rescale = iio_priv(indio_dev); - s64 tmp; int ret; switch (mask) { @@ -66,27 +77,7 @@ static int rescale_read_raw(struct iio_dev *indio_dev, } else { ret = iio_read_channel_scale(rescale->source, val, val2); } - switch (ret) { - case IIO_VAL_FRACTIONAL: - *val *= rescale->numerator; - *val2 *= rescale->denominator; - return ret; - case IIO_VAL_INT: - *val *= rescale->numerator; - if (rescale->denominator == 1) - return ret; - *val2 = rescale->denominator; - return IIO_VAL_FRACTIONAL; - case IIO_VAL_FRACTIONAL_LOG2: - tmp = (s64)*val * 1000000000LL; - tmp = div_s64(tmp, rescale->denominator); - tmp *= rescale->numerator; - tmp = div_s64(tmp, 1000000000LL); - *val = tmp; - return ret; - default: - return -EOPNOTSUPP; - } + return rescale_process_scale(rescale, ret, val, val2); default: return -EINVAL; } diff --git a/include/linux/iio/afe/rescale.h b/include/linux/iio/afe/rescale.h new file mode 100644 index 000000000000..698092b6cbb1 --- /dev/null +++ b/include/linux/iio/afe/rescale.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2021 Liam Beguin + */ + +#ifndef __IIO_RESCALE_H__ +#define __IIO_RESCALE_H__ + +#include +#include + +struct device; +struct rescale; + +struct rescale_cfg { + enum iio_chan_type type; + int (*props)(struct device *dev, struct rescale *rescale); +}; + +struct rescale { + const struct rescale_cfg *cfg; + struct iio_channel *source; + struct iio_chan_spec chan; + struct iio_chan_spec_ext_info *ext_info; + bool chan_processed; + s32 numerator; + s32 denominator; +}; + +int rescale_process_scale(struct rescale *rescale, int scale_type, + int *val, int *val2); +#endif /* __IIO_RESCALE_H__ */ From patchwork Sat Jan 8 20:53:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707621 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 100E0C433FE for ; Sat, 8 Jan 2022 20:53:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232937AbiAHUxm (ORCPT ); Sat, 8 Jan 2022 15:53:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232985AbiAHUxk (ORCPT ); Sat, 8 Jan 2022 15:53:40 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B404C061401; Sat, 8 Jan 2022 12:53:40 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id c15so9182699qtc.4; Sat, 08 Jan 2022 12:53:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CBLRVrk3xpz2O6iyUKgQBIpD55XcpP+X1Rfi97tWxlw=; b=A5kD749gYOKFY2xeF48Es1ixf68+vj4LsL46VBhD6DSbwi+0TMDtQlksYBkvYABs55 fZLWWhOdWOwCrmeaCXuPdQ5xIPrD5bn7t2MdRqZyShDaN+CPy3khj1h8zW8zKLt5xjJJ LAe0F/DT60qqqA+CbmBXaAjx15oQSX57PkkEAkc7aYchkJt/cpoFZcUO474NQadZMnEH GHJrjn1WnaOo3z7qjYDNtnM2mJ2rxxZp3GzvKLbguUJMDxtKyjk5tT0RfaRMFGxtGsvE UWw9NLZRUj/uzxo+S90+QqL5MYLYPzBzRLiJz7IqcT/fLZLJrbc60OGppWIOckoecKVo 22gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CBLRVrk3xpz2O6iyUKgQBIpD55XcpP+X1Rfi97tWxlw=; b=kFRPR1iyihgaVddzvecwMoQ/lP5b5S/Hcx7wvnb9JPt5xu5VjwlKvS0g3JvprkWReG GVLYptSIJ/PQh0F1ISV2IJYJibXMA5wyawS4+muvrW8Kccb/hBlLcKUoGtQMC2Nsp/Y9 w+3mm4wXTObT7Q/akLWEwrH5GkN2XaFGn++/5rhTqmU5oeIBIzAMXevNiShJF9iXI29R X4CSKB2qPFDQzPFDkD7VtuVgbTAu336NEaaA9SFJS/tRGwW+fwUtUpL4pzUU9TI11j8A crZpiqC5fxfWb8MMCP6UJTa9BQ4/M8dzs2zgHp+vSuzGXlVn2cU6pLXtQ2MEG3jInuIu TOeg== X-Gm-Message-State: AOAM533sA55Rly9uOiC5JT//UHE/7G/EIiaXzRxm66m8d7WuLrCQgiYg Q+MIvwXDhd8bJo8twGSwnWk/emS6Dg0= X-Google-Smtp-Source: ABdhPJx5xFvNDlmgEVio04Nd6rrcMNdelQtA4MfLnaAzafRk5UAoRw9aO39EpgpJYmm5dHHKvy5trA== X-Received: by 2002:a05:622a:170d:: with SMTP id h13mr62409318qtk.99.1641675219650; Sat, 08 Jan 2022 12:53:39 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:39 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 07/16] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support Date: Sat, 8 Jan 2022 15:53:10 -0500 Message-Id: <20220108205319.2046348-8-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Some ADCs use IIO_VAL_INT_PLUS_{NANO,MICRO} scale types. Add support for these to allow using the iio-rescaler with them. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 65832dd09249..f833eb38f8bb 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -23,6 +24,9 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, int *val, int *val2) { s64 tmp; + s32 rem; + u32 mult; + u32 neg; switch (scale_type) { case IIO_VAL_FRACTIONAL: @@ -41,6 +45,37 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, tmp *= rescale->numerator; tmp = div_s64(tmp, 1000000000LL); *val = tmp; + return scale_type; + case IIO_VAL_INT_PLUS_NANO: + case IIO_VAL_INT_PLUS_MICRO: + mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA; + + /* + * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val + * OR *val2 is negative the schan scale is negative, i.e. + * *val = 1 and *val2 = -0.5 yields -1.5 not -0.5. + */ + neg = *val < 0 || *val2 < 0; + + tmp = (s64)abs(*val) * abs(rescale->numerator); + *val = div_s64_rem(tmp, abs(rescale->denominator), &rem); + + tmp = (s64)rem * mult + (s64)abs(*val2) * abs(rescale->numerator); + tmp = div_s64(tmp, abs(rescale->denominator)); + + *val += div_s64_rem(tmp, mult, val2); + + /* + * If only one of the rescaler elements or the schan scale is + * negative, the combined scale is negative. + */ + if (neg ^ ((rescale->numerator < 0) ^ (rescale->denominator < 0))) { + if (*val) + *val = -*val; + else + *val2 = -*val2; + } + return scale_type; default: return -EOPNOTSUPP; From patchwork Sat Jan 8 20:53:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707622 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 468CBC4332F for ; Sat, 8 Jan 2022 20:53:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233170AbiAHUx5 (ORCPT ); Sat, 8 Jan 2022 15:53:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233010AbiAHUxm (ORCPT ); Sat, 8 Jan 2022 15:53:42 -0500 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5371C061747; Sat, 8 Jan 2022 12:53:41 -0800 (PST) Received: by mail-qt1-x834.google.com with SMTP id o17so9653950qtk.1; Sat, 08 Jan 2022 12:53:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UW/B2X5MfhYVZnFmf8491KJHtOUBdLNdyCanOaNTorM=; b=HrvtWVtOPobsAb6hXarWkL3EiLPSPbd8PxLJfQZem6pmAEEC1JW1t0t2HPkBE5K1a7 0QuCnaySfD2VM3VFQISl1QJVHJMmrXnm2eDl5/iFrc2qQGolCQn8g+5pqMAz1ZB0eLPc 06GqNw7ZsE6uiJNKw69HNNGTSUPYca4ZDe6fO2QPVuKrUgvh7FYMQELx5o8DBuvw5CVv a9duixAK4/X9S15aexqr64HOfS4pVSyQPJcEnQTjknpX1paKdqvaPcP2nNbKRm8f6u33 eNzYdFTsedTq6MzyGHJSQIrmnI1dClTddkowQDK2qHqib1fu8qJQaXBi7rZUCGyMVLRI NSKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UW/B2X5MfhYVZnFmf8491KJHtOUBdLNdyCanOaNTorM=; b=NDRNukb70JIlH+H+ZEL+I98UrhVgqc113mYn9ne5oXUgxuWFep4w62EcwdZuL2TSHx wRzGYVORJLBhjUQLEgVb5/2ShgPC/qDb69Q5tf42aJSjtlr+5lyCoVe3tSbA66SZrnaN 8cnMRohg+Wn+JiCJdqzsNoYkJ9O8H7cjjSW8bIv3O5FTEoXXeMwJoJxTk9qtG+hRmi32 9MAJJN0H48q3dFB3rynELylse99nV/E1IzegROSLgrLP8y7JAohw8llZa9gW/mBluQKa U1wGnENb1xXrgJWbB9r3CdjLu0043NJKNA1vdWU/3/rnK5mLWJhgS8vRwy3gtQAFnWWc rE0g== X-Gm-Message-State: AOAM532kKQmCcir87yGyo47KZwcrcb7WJ33ZT7vRSgwMjn8w8h5ug56Q 5FOzh4BzArEUPr93+end3Og= X-Google-Smtp-Source: ABdhPJzaJ81mu/nSAW4l4hlUBA7uRRu9GYQk46XwFMYvQTE/E3u6E96QdqVC81Q7MojZtmBBTMpT1w== X-Received: by 2002:a05:622a:c:: with SMTP id x12mr61230640qtw.502.1641675221005; Sat, 08 Jan 2022 12:53:41 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:40 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 08/16] iio: afe: rescale: add offset support Date: Sat, 8 Jan 2022 15:53:11 -0500 Message-Id: <20220108205319.2046348-9-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org This is a preparatory change required for the addition of temperature sensing front ends. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 80 +++++++++++++++++++++++++++++++++ include/linux/iio/afe/rescale.h | 4 ++ 2 files changed, 84 insertions(+) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index f833eb38f8bb..68eb3e341939 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -82,11 +82,46 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, } } +int rescale_process_offset(struct rescale *rescale, int scale_type, + int scale, int scale2, int schan_off, + int *val, int *val2) +{ + s64 tmp, tmp2; + + switch (scale_type) { + case IIO_VAL_FRACTIONAL: + tmp = (s64)rescale->offset * scale2; + *val = div_s64(tmp, scale) + schan_off; + return IIO_VAL_INT; + case IIO_VAL_INT: + *val = div_s64(rescale->offset, scale) + schan_off; + return IIO_VAL_INT; + case IIO_VAL_FRACTIONAL_LOG2: + tmp = (s64)rescale->offset * (1 << scale2); + *val = div_s64(tmp, scale) + schan_off; + return IIO_VAL_INT; + case IIO_VAL_INT_PLUS_NANO: + tmp = (s64)rescale->offset * GIGA; + tmp2 = ((s64)scale * GIGA) + scale2; + *val = div64_s64(tmp, tmp2) + schan_off; + return IIO_VAL_INT; + case IIO_VAL_INT_PLUS_MICRO: + tmp = (s64)rescale->offset * MEGA; + tmp2 = ((s64)scale * MEGA) + scale2; + *val = div64_s64(tmp, tmp2) + schan_off; + return IIO_VAL_INT; + default: + return -EOPNOTSUPP; + } +} + static int rescale_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct rescale *rescale = iio_priv(indio_dev); + int scale, scale2; + int schan_off = 0; int ret; switch (mask) { @@ -113,6 +148,47 @@ static int rescale_read_raw(struct iio_dev *indio_dev, ret = iio_read_channel_scale(rescale->source, val, val2); } return rescale_process_scale(rescale, ret, val, val2); + case IIO_CHAN_INFO_OFFSET: + /* + * Processed channels are scaled 1-to-1 and source offset is + * already taken into account. + * + * In other cases, real world measurement are expressed as: + * + * schan_scale * (raw + schan_offset) + * + * Given that the rescaler parameters are applied recursively: + * + * rescaler_scale * (schan_scale * (raw + schan_offset) + + * rescaler_offset) + * + * Or, + * + * (rescaler_scale * schan_scale) * (raw + + * (schan_offset + rescaler_offset / schan_scale) + * + * Thus, reusing the original expression the parameters exposed + * to userspace are: + * + * scale = schan_scale * rescaler_scale + * offset = schan_offset + rescaler_offset / schan_scale + */ + if (rescale->chan_processed) { + *val = rescale->offset; + return IIO_VAL_INT; + } + + if (iio_channel_has_info(rescale->source->channel, + IIO_CHAN_INFO_OFFSET)) { + ret = iio_read_channel_offset(rescale->source, + &schan_off, NULL); + if (ret != IIO_VAL_INT) + return ret < 0 ? ret : -EOPNOTSUPP; + } + + ret = iio_read_channel_scale(rescale->source, &scale, &scale2); + return rescale_process_offset(rescale, ret, scale, scale2, + schan_off, val, val2); default: return -EINVAL; } @@ -189,6 +265,9 @@ static int rescale_configure_channel(struct device *dev, chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE); + if (rescale->offset) + chan->info_mask_separate |= BIT(IIO_CHAN_INFO_OFFSET); + /* * Using .read_avail() is fringe to begin with and makes no sense * whatsoever for processed channels, so we make sure that this cannot @@ -353,6 +432,7 @@ static int rescale_probe(struct platform_device *pdev) rescale->cfg = of_device_get_match_data(dev); rescale->numerator = 1; rescale->denominator = 1; + rescale->offset = 0; ret = rescale->cfg->props(dev, rescale); if (ret) diff --git a/include/linux/iio/afe/rescale.h b/include/linux/iio/afe/rescale.h index 698092b6cbb1..891bc935a396 100644 --- a/include/linux/iio/afe/rescale.h +++ b/include/linux/iio/afe/rescale.h @@ -25,8 +25,12 @@ struct rescale { bool chan_processed; s32 numerator; s32 denominator; + s32 offset; }; int rescale_process_scale(struct rescale *rescale, int scale_type, int *val, int *val2); +int rescale_process_offset(struct rescale *rescale, int scale_type, + int scale, int scale2, int schan_off, + int *val, int *val2); #endif /* __IIO_RESCALE_H__ */ From patchwork Sat Jan 8 20:53:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707617 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 848E9C433FE for ; Sat, 8 Jan 2022 20:53:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232983AbiAHUxp (ORCPT ); Sat, 8 Jan 2022 15:53:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233019AbiAHUxn (ORCPT ); Sat, 8 Jan 2022 15:53:43 -0500 Received: from mail-qt1-x835.google.com (mail-qt1-x835.google.com [IPv6:2607:f8b0:4864:20::835]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC82AC061401; Sat, 8 Jan 2022 12:53:42 -0800 (PST) Received: by mail-qt1-x835.google.com with SMTP id l17so9595381qtk.7; Sat, 08 Jan 2022 12:53:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=k3+NdqmX0cfn1TfZEbC1RxKDwjuL4tYh51nEZNOIN1E=; b=DcaS1v6uwXsuBBurqPOMQZyMThHALFBdi/5vjVU7HyWLBGOFs5W0szWoi3LZTOzYvb /DJ9ySkKEzvh8GQ5MtxEhUTj4d2brtrikp6A6zsoHDK+fgFWR2+XVsr+3OEN1ip+Tfgn jsolRgWKsGLz42t0DAscsP/1+k2BDEPhjhQpj/2OMKN4loU9R7nI6Lk+nqrq0zCWcc6l 0V8gThu1MAsMPp8RV+Z0dPMlULP9V6MUm9P4JftRZp9bPrvO1LnPCNsmISoLOBthsnYO 4YJoK8cVfrdLX2BR58eo1oUqfub0plDuX6+hSlEmDuQDp3fcuh0t9lkEWi6D3B77Us1B aXlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=k3+NdqmX0cfn1TfZEbC1RxKDwjuL4tYh51nEZNOIN1E=; b=N8EQJU/54s+R4TMkE5vFoaean/1Ryg0PLc0NHYnC2L8f79Ot6WB1GR7dNXQ0Qe9uO5 Wp3knU8nHwihlGVtlGVyn0+Rv2IdL4uhGd2cFHPeiUTSGeXx5DhhIqEljf36mDSOdjp3 R9KBZik2R1oCQ6Lo9LKtUqTHHNYZpMhuwqEd+OvvL7CrSLkRH/d9S0E9ZJz/ski4/lKq nFHQpTaMkPoaKu1sAedRvAN1EpW8CdJ99wNuc13llS0CJgJQotf1zVP4Xkfg/gtZd34L X1CKLcrQ+6dvSIhAsNNNBBl9IyEbzdCLW2DYmfx648tU7gV6Bqb7YqnsvsEJF/yL5fuw Y/+A== X-Gm-Message-State: AOAM533nsTfG/cJDn04n16CP7J21rN9jKHR6RsHVEYFRp/7b7Gd5FjcI ykEzJUTgFBWdh+VwtSnRHrI= X-Google-Smtp-Source: ABdhPJx/0uryou7f2wFxej8UmNYzsiFOfRF2kDL11B1C8QZPTRlNIdP02Q8AFODnNJGh2aDEufD3lQ== X-Received: by 2002:ac8:5809:: with SMTP id g9mr2948517qtg.312.1641675222138; Sat, 08 Jan 2022 12:53:42 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:41 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 09/16] iio: afe: rescale: fix accuracy for small fractional scales Date: Sat, 8 Jan 2022 15:53:12 -0500 Message-Id: <20220108205319.2046348-10-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org The approximation caused by integer divisions can be costly on smaller scale values since the decimal part is significant compared to the integer part. Switch to an IIO_VAL_INT_PLUS_NANO scale type in such cases to maintain accuracy. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 68eb3e341939..ed3ef994997f 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -24,7 +24,7 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, int *val, int *val2) { s64 tmp; - s32 rem; + s32 rem, rem2; u32 mult; u32 neg; @@ -43,9 +43,23 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, tmp = (s64)*val * 1000000000LL; tmp = div_s64(tmp, rescale->denominator); tmp *= rescale->numerator; - tmp = div_s64(tmp, 1000000000LL); + + tmp = div_s64_rem(tmp, 1000000000LL, &rem); *val = tmp; - return scale_type; + + if (!rem) + return scale_type; + + tmp = 1 << *val2; + + rem2 = *val % (int)tmp; + *val = *val / (int)tmp; + + *val2 = rem / (int)tmp; + if (rem2) + *val2 += div_s64((s64)rem2 * 1000000000LL, tmp); + + return IIO_VAL_INT_PLUS_NANO; case IIO_VAL_INT_PLUS_NANO: case IIO_VAL_INT_PLUS_MICRO: mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA; From patchwork Sat Jan 8 20:53:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707619 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 698A4C43219 for ; Sat, 8 Jan 2022 20:53:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233119AbiAHUxv (ORCPT ); Sat, 8 Jan 2022 15:53:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50886 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232948AbiAHUxo (ORCPT ); Sat, 8 Jan 2022 15:53:44 -0500 Received: from mail-qk1-x729.google.com (mail-qk1-x729.google.com [IPv6:2607:f8b0:4864:20::729]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14FCEC061401; Sat, 8 Jan 2022 12:53:44 -0800 (PST) Received: by mail-qk1-x729.google.com with SMTP id b85so10075670qkc.1; Sat, 08 Jan 2022 12:53:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6WptJPRGNHV4JiwPZI5nOc7RDaGnvmwg6Kkf+gxMu70=; b=OEE7TekimQgT4bxMXn9a8aNdshdo47366NwGlzJ2JAK3OifIhXJIdRrptrYxG8H3WD ORRVV0z47Tjs0sJOUb8CLHJXgnPP3wJ4q1N+F5AB5tyEwgJiN8LI4IDPxLZLbeTNVkn7 GvdQAALYzbdLaul87LwocaDuVhMUT/46hHIGg1XGQlBOAqhOEe/5a1FqUbks/i7auqq+ ozMOIx3I92MarUlC9wXAZa/Luti5GJVBP24/O3QG+34Lfr8d5BLZp3M4XRbG+UIrilUh Eosij7MEeWVY7CPC8ea5AP6BC5Vf4boNwvYG7hKUvCzjmuPvioJZTO4GtVAClVSAemEk r6xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6WptJPRGNHV4JiwPZI5nOc7RDaGnvmwg6Kkf+gxMu70=; b=oqpx+1afd0HXtECPf/HLTzKsCVqRqYAMfclLYGr1kw4dcmM85ocs8tpJmTlfOHAtNK W9XgaT8NpZ6M5Vu1VLLGeTUcCZ/+KJ/TbZPrGq33Vnzfegerb5CvYhg2NqOcHhZHWotH wzJqiAfAW/LfYYGWaLfyMvytS0IBVSRNUSZtDxsFYjEODGYaIWvzcz0kAjXH7Wgw8xGN 3wm619UPSJzsS8I+Mxvezok0Jex8zrZHbJnbpIp1S3F0ybVPN4r+OEzWsog2aRq1L4TV EwYdFYe3gJa8wAD6zC6jWPTxtyatR6T3o1Mh0oei6RqpXiBrMOGMZL5ja4KZByKs4kR8 BrYw== X-Gm-Message-State: AOAM532M3pUpHftRi2C7AkIIvlK4NQUMPNeNOImaDoWzu/x+jTjcvPoR oN2Td2KenyfbD6KJ0arS7Vup0pqUl9E= X-Google-Smtp-Source: ABdhPJyK2XSOi+n9HjGB8u6iCAvYBUgQQP4Z601nCpG3sPFk7Jqgk1oaynWUZDxcktZuiRkueHB5xg== X-Received: by 2002:a05:620a:1588:: with SMTP id d8mr8573795qkk.174.1641675223279; Sat, 08 Jan 2022 12:53:43 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:42 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 10/16] iio: afe: rescale: reduce risk of integer overflow Date: Sat, 8 Jan 2022 15:53:13 -0500 Message-Id: <20220108205319.2046348-11-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Reduce the risk of integer overflow by doing the scale calculation on a 64-bit integer. Since the rescaling is only performed on *val, reuse the IIO_VAL_FRACTIONAL_LOG2 case. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index ed3ef994997f..5b87965482d2 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -24,21 +24,31 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, int *val, int *val2) { s64 tmp; + int _val, _val2; s32 rem, rem2; u32 mult; u32 neg; switch (scale_type) { - case IIO_VAL_FRACTIONAL: - *val *= rescale->numerator; - *val2 *= rescale->denominator; - return scale_type; case IIO_VAL_INT: *val *= rescale->numerator; if (rescale->denominator == 1) return scale_type; *val2 = rescale->denominator; return IIO_VAL_FRACTIONAL; + case IIO_VAL_FRACTIONAL: + /* + * When the product of both scales doesn't overflow, avoid + * potential accuracy loss (for in kernel consumers) by + * keeping a fractional representation. + */ + if (!check_mul_overflow(*val, rescale->numerator, &_val) && + !check_mul_overflow(*val2, rescale->denominator, &_val2)) { + *val = _val; + *val2 = _val2; + return IIO_VAL_FRACTIONAL; + } + fallthrough; case IIO_VAL_FRACTIONAL_LOG2: tmp = (s64)*val * 1000000000LL; tmp = div_s64(tmp, rescale->denominator); @@ -50,7 +60,10 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, if (!rem) return scale_type; - tmp = 1 << *val2; + if (scale_type == IIO_VAL_FRACTIONAL) + tmp = *val2; + else + tmp = ULL(1) << *val2; rem2 = *val % (int)tmp; *val = *val / (int)tmp; From patchwork Sat Jan 8 20:53:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707618 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92004C433F5 for ; Sat, 8 Jan 2022 20:53:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233108AbiAHUxt (ORCPT ); Sat, 8 Jan 2022 15:53:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232967AbiAHUxq (ORCPT ); Sat, 8 Jan 2022 15:53:46 -0500 Received: from mail-qt1-x829.google.com (mail-qt1-x829.google.com [IPv6:2607:f8b0:4864:20::829]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD8FFC06173F; Sat, 8 Jan 2022 12:53:45 -0800 (PST) Received: by mail-qt1-x829.google.com with SMTP id q14so9561623qtx.10; Sat, 08 Jan 2022 12:53:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HAVVTR8V7YyJFJ8xkaZy5F2t1OKBs2z26bNzz6aY2ek=; b=ANV8NsvVXr4nqmZDfwgyaSwmkIovdPQPoaY3SKd6Q9kI4ZzpNO0+PQz1DqOFM4K8TS eNM3ZTXJjS01A5CcU3i08jz3umSpyEdstelPql6HaMu1pYvHddqEoazC/RYwT1iEb1jk USTtCDf+pAp3suyQ/FIlA79V54bU296nIHVQLQ4JsfPZg6ALq0OXwtHfcop+Nu3Xysgw ZSf4a3i/RIwz3JXP/xitUWHk/hn332+LOff2IDihU66e4O7e8I3uB+K7R90o23/q4Z7L 79MlNX+9d4+xQdzXJeZ+RKtEBsTTpDuft+dFvFgrfv3fmEtEkDm1jo0Sq3Mf+YiHzSSz TJHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HAVVTR8V7YyJFJ8xkaZy5F2t1OKBs2z26bNzz6aY2ek=; b=I/TcchbMvA3oi4sRUnO0JEBpMjFdPa0PDkmuyIAP5J1nn3x7znCPgBbH0AdmcC5jfz RZOjOPg3+C9nYSn1DL0aBJ9Lr/tso6LhsaWx29RsJqgorr8Xsumq/e6RR2OkhdQfMOac Ga27Sr08laio4gMF89zVNrbvnZhfVJclzSiu+naGMH30expzq4WsNRPr9BbbyWS8L+GB 5CBjkP1sKqqTcHEqt7/K2H5pGQT1qjmPNkk1vtvAScfS5aaq6HU/hY6KWsPMylIG2Mrt +KoU5JSBChBH7Far3hMFtTAJ0SZXPREOJARfHhEJB7DYj1VhG/91clGAazrWjzPco+MP TPtg== X-Gm-Message-State: AOAM531EPnjng+cIpMLB07qwIadeIc5VlUt8CK27MkFvRti2otnoVpWL n1RQsueBWOIl5Y1Z56A6IE8= X-Google-Smtp-Source: ABdhPJxONqKdL+0how5zMI9NQ11vDLD4o1wCrRg32sLGM4ZghTN/e1189vnXyyo0vTnq97zM+RI3tg== X-Received: by 2002:a05:622a:93:: with SMTP id o19mr6874942qtw.379.1641675224845; Sat, 08 Jan 2022 12:53:44 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:44 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 11/16] iio: afe: rescale: make use of units.h Date: Sat, 8 Jan 2022 15:53:14 -0500 Message-Id: <20220108205319.2046348-12-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Make use of well-defined SI metric prefixes to improve code readability. Signed-off-by: Liam Beguin --- drivers/iio/afe/iio-rescale.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 5b87965482d2..2379da74fe23 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -50,11 +50,11 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, } fallthrough; case IIO_VAL_FRACTIONAL_LOG2: - tmp = (s64)*val * 1000000000LL; + tmp = (s64)*val * GIGA; tmp = div_s64(tmp, rescale->denominator); tmp *= rescale->numerator; - tmp = div_s64_rem(tmp, 1000000000LL, &rem); + tmp = div_s64_rem(tmp, GIGA, &rem); *val = tmp; if (!rem) @@ -70,7 +70,7 @@ int rescale_process_scale(struct rescale *rescale, int scale_type, *val2 = rem / (int)tmp; if (rem2) - *val2 += div_s64((s64)rem2 * 1000000000LL, tmp); + *val2 += div_s64((s64)rem2 * GIGA, tmp); return IIO_VAL_INT_PLUS_NANO; case IIO_VAL_INT_PLUS_NANO: @@ -331,8 +331,8 @@ static int rescale_current_sense_amplifier_props(struct device *dev, * gain_div / (gain_mult * sense), while trying to keep the * numerator/denominator from overflowing. */ - factor = gcd(sense, 1000000); - rescale->numerator = 1000000 / factor; + factor = gcd(sense, MEGA); + rescale->numerator = MEGA / factor; rescale->denominator = sense / factor; factor = gcd(rescale->numerator, gain_mult); @@ -360,8 +360,8 @@ static int rescale_current_sense_shunt_props(struct device *dev, return ret; } - factor = gcd(shunt, 1000000); - rescale->numerator = 1000000 / factor; + factor = gcd(shunt, MEGA); + rescale->numerator = MEGA / factor; rescale->denominator = shunt / factor; return 0; From patchwork Sat Jan 8 20:53:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707623 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46FB4C433FE for ; Sat, 8 Jan 2022 20:54:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233092AbiAHUx6 (ORCPT ); Sat, 8 Jan 2022 15:53:58 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232985AbiAHUxr (ORCPT ); Sat, 8 Jan 2022 15:53:47 -0500 Received: from mail-qt1-x834.google.com (mail-qt1-x834.google.com [IPv6:2607:f8b0:4864:20::834]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 54609C061401; Sat, 8 Jan 2022 12:53:47 -0800 (PST) Received: by mail-qt1-x834.google.com with SMTP id f9so8841652qtk.3; Sat, 08 Jan 2022 12:53:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ibQg3NLOM/9PBwu517Z+tHaM8YKa/T0CV1ybnmQMCjo=; b=RZjaM30aMby5OSSzb/WRtBLfE3a/LpDz/0WpOD2sYCjwYbZpHBNs2EqG6KOCRiXw14 NHUNMvcsP6fQ6iLaeQU8t+AuVdzvZEuyGnbMkNi+/c13evW80ovjlUcOu38QbeYxTu4u /PcjQptT8ABH3vxFBZPb6UnjL8BzhZsTyUU+uoYQK2rj/g7V4GOPg4eeJ8WnWK61/WiH yhrAZzibSw7wR7HIfdf2QlqI1RrvMWxZPUZ8vCLymTow0WO4VRMCIZ7tEOnVJkIv08G+ p5+VoJSdk6N62MS94RwW0rrstnsmdnFUiXLJWRWWfrZUwTJM8aEjACUpHDA9ybGCjw+d u/hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ibQg3NLOM/9PBwu517Z+tHaM8YKa/T0CV1ybnmQMCjo=; b=Qo4CNO2Ugyo4E2rQAjSzKrKSTyJObPvbmPeR+0lUaZJoyeLDCXmuKKyq9cBAoD6CiB 4k2FZGn67H5cN4vG+IH6m5oVorbqaZriY2K95rZyT+vRXx6dDQPcNBD94pEk+cZbMzMu Pdky0sgIS9za8vYQEL8xG9oQgS5EL5zwwfijT01/mIfrRE0HO8wY/QVJTYh/GDppQAqi GqlA9a+F8UCB4fSgnb2zVm5lPqyhpmK09/aU6QA8MORRivtDGsaxdjesNCAWYBUCyR4d I9q1sZ/XAy6I3PRpH44YrbV7vspzyApsgWrA+obNRbz77WDttrZiYGhTJ+n0MX1rlR5/ qNdQ== X-Gm-Message-State: AOAM533RsLH4e3qQhjmAQC9XRSil8E4F64r4KAaE+syH+lwI5g32X3B/ TmglyMD/M0nGcBb5iOHkefr8OmjNexo= X-Google-Smtp-Source: ABdhPJyLIfthpSA7/utmFukwEXd+rnwc9ZsDCpkuIUxSeMqak56cBCQ77ks1MNaPXBEoN3+yB3f+nw== X-Received: by 2002:a05:622a:40d:: with SMTP id n13mr60976156qtx.511.1641675226384; Sat, 08 Jan 2022 12:53:46 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:46 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 12/16] iio: test: add basic tests for the iio-rescale driver Date: Sat, 8 Jan 2022 15:53:15 -0500 Message-Id: <20220108205319.2046348-13-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org The iio-rescale driver supports various combinations of scale types and offsets. These can often result in large integer multiplications. Make sure these calculations are done right by adding a set of kunit test cases that build on top of iio-test-format. To run these tests, add the following to .kunitconfig $ cat .kunitconfig CONFIG_IIO=y CONFIG_IIO_RESCALE_KUNIT_TEST=y CONFIG_KUNIT=y Then run: $ ./tools/testing/kunit/kunit.py run --kunitconfig .kunitconfig Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/test/Kconfig | 10 + drivers/iio/test/Makefile | 1 + drivers/iio/test/iio-test-rescale.c | 711 ++++++++++++++++++++++++++++ 3 files changed, 722 insertions(+) create mode 100644 drivers/iio/test/iio-test-rescale.c diff --git a/drivers/iio/test/Kconfig b/drivers/iio/test/Kconfig index 679a7794af20..872ed4ed140a 100644 --- a/drivers/iio/test/Kconfig +++ b/drivers/iio/test/Kconfig @@ -4,6 +4,16 @@ # # Keep in alphabetical order +config IIO_RESCALE_KUNIT_TEST + bool "Test IIO rescale conversion functions" + depends on KUNIT && !IIO_RESCALE + default KUNIT_ALL_TESTS + help + If you want to run tests on the iio-rescale code say Y here. + + This takes advantage of ARCH=um to run tests and should be used by + developers to tests their changes to the rescaling logic. + config IIO_TEST_FORMAT bool "Test IIO formatting functions" depends on KUNIT=y diff --git a/drivers/iio/test/Makefile b/drivers/iio/test/Makefile index 467519a2027e..f15ae0a6394f 100644 --- a/drivers/iio/test/Makefile +++ b/drivers/iio/test/Makefile @@ -4,5 +4,6 @@ # # Keep in alphabetical order +obj-$(CONFIG_IIO_RESCALE_KUNIT_TEST) += iio-test-rescale.o ../afe/iio-rescale.o obj-$(CONFIG_IIO_TEST_FORMAT) += iio-test-format.o CFLAGS_iio-test-format.o += $(DISABLE_STRUCTLEAK_PLUGIN) diff --git a/drivers/iio/test/iio-test-rescale.c b/drivers/iio/test/iio-test-rescale.c new file mode 100644 index 000000000000..a3bbe2db76d3 --- /dev/null +++ b/drivers/iio/test/iio-test-rescale.c @@ -0,0 +1,711 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Kunit tests for IIO rescale conversions + * + * Copyright (c) 2021 Liam Beguin + */ + +#include +#include +#include + +#include +#include + +#include + +struct rescale_tc_data { + const char *name; + + const s32 numerator; + const s32 denominator; + const s32 offset; + + const int schan_val; + const int schan_val2; + const int schan_off; + const int schan_scale_type; + + const char *expected; + const char *expected_off; +}; + +const struct rescale_tc_data scale_cases[] = { + /* + * Typical use cases + */ + { + .name = "typical IIO_VAL_INT, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT, + .schan_val = 42, + .expected = "5210.918114143", + }, + { + .name = "typical IIO_VAL_INT, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT, + .schan_val = 42, + .expected = "-5210.918114143", + }, + { + .name = "typical IIO_VAL_FRACTIONAL, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 42, + .schan_val2 = 20, + .expected = "260.545905707", + }, + { + .name = "typical IIO_VAL_FRACTIONAL, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 42, + .schan_val2 = 20, + .expected = "-260.545905707", + }, + { + .name = "typical IIO_VAL_FRACTIONAL_LOG2, positive", + .numerator = 42, + .denominator = 53, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 4096, + .schan_val2 = 16, + .expected = "0.049528301", + }, + { + .name = "typical IIO_VAL_FRACTIONAL_LOG2, negative", + .numerator = -42, + .denominator = 53, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 4096, + .schan_val2 = 16, + .expected = "-0.049528301", + }, + { + .name = "typical IIO_VAL_INT_PLUS_NANO, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456, + .expected = "1240.710106203", + }, + { + .name = "typical IIO_VAL_INT_PLUS_NANO, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456, + .expected = "-1240.710106203", + }, + { + .name = "typical IIO_VAL_INT_PLUS_MICRO, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 1234, + .expected = "1240.84789", + }, + { + .name = "typical IIO_VAL_INT_PLUS_MICRO, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 1234, + .expected = "-1240.84789", + }, + /* + * Use cases with small scales involving divisions + */ + { + .name = "small IIO_VAL_FRACTIONAL, 261/509 scaled by 90/1373754273", + .numerator = 261, + .denominator = 509, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 90, + .schan_val2 = 1373754273, + .expected = "0.000000033594", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 90/1373754273 scaled by 261/509", + .numerator = 90, + .denominator = 1373754273, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 261, + .schan_val2 = 509, + .expected = "0.000000033594", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 760/1373754273 scaled by 427/2727", + .numerator = 760, + .denominator = 1373754273, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 427, + .schan_val2 = 2727, + .expected = "0.000000086626", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 761/1373754273 scaled by 427/2727", + .numerator = 761, + .denominator = 1373754273, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 427, + .schan_val2 = 2727, + .expected = "0.000000086740", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 5/32768 scaled by 3/10000", + .numerator = 5, + .denominator = 32768, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 3, + .schan_val2 = 10000, + .expected = "0.0000000457763671875", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 0 < scale < 1", + .numerator = 6, + .denominator = 6, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 1, + .schan_val2 = 3, + .expected = "0.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL, -1 < scale < 0", + .numerator = -6, + .denominator = 6, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 1, + .schan_val2 = 3, + .expected = "-0.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL, 0 < scale < 2", + .numerator = 8, + .denominator = 2, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 1, + .schan_val2 = 3, + .expected = "1.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL, -2 < scale < 0", + .numerator = -8, + .denominator = 2, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 1, + .schan_val2 = 3, + .expected = "-1.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, 760/32768 scaled by 15/22", + .numerator = 760, + .denominator = 32768, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 15, + .schan_val2 = 22, + .expected = "0.000000082946", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, 761/32768 scaled by 15/22", + .numerator = 761, + .denominator = 32768, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 15, + .schan_val2 = 22, + .expected = "0.000000083055", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, 0 < scale < 1", + .numerator = 16, + .denominator = 3, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 1, + .schan_val2 = 4, + .expected = "0.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, -1 < scale < 0", + .numerator = -16, + .denominator = 3, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 1, + .schan_val2 = 4, + .expected = "-0.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, 0 < scale < 2", + .numerator = 8, + .denominator = 3, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 1, + .schan_val2 = 1, + .expected = "1.3333333333333333", + }, + { + .name = "small IIO_VAL_FRACTIONAL_LOG2, -2 < scale < 0", + .numerator = -8, + .denominator = 3, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 1, + .schan_val2 = 1, + .expected = "-1.3333333333333333", + }, + { + .name = "small IIO_VAL_INT_PLUS_MICRO, positive", + .numerator = 1, + .denominator = 2, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 5, + .schan_val2 = 1234, + .expected = "2.500617", + }, + { + .name = "small IIO_VAL_INT_PLUS_MICRO, negative", + .numerator = -1, + .denominator = 2, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 5, + .schan_val2 = 1234, + .expected = "-2.500617", + }, + /* + * INT_PLUS_{MICRO,NANO} positive/negative corner cases + */ + { + .name = "negative IIO_VAL_INT_PLUS_NANO, negative schan", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = 123456, + .expected = "-1240.710106203", + }, + { + .name = "negative IIO_VAL_INT_PLUS_NANO, both negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = 123456, + .expected = "1240.710106203", + }, + { + .name = "negative IIO_VAL_INT_PLUS_NANO, 3 negative", + .numerator = -1000000, + .denominator = -8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = 123456, + .expected = "-1240.710106203", + }, + { + .name = "negative IIO_VAL_INT_PLUS_NANO, 4 negative", + .numerator = -1000000, + .denominator = -8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = -123456, + .expected = "-1240.710106203", + }, + { + .name = "negative IIO_VAL_INT_PLUS_NANO, negative, *val = 0", + .numerator = 1, + .denominator = -10, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 0, + .schan_val2 = 123456789, + .expected = "-0.012345678", + }, + /* + * INT_PLUS_{MICRO,NANO} decimal part overflow + */ + { + .name = "decimal overflow IIO_VAL_INT_PLUS_NANO, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456789, + .expected = "1256.01200856", + }, + { + .name = "decimal overflow IIO_VAL_INT_PLUS_NANO, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456789, + .expected = "-1256.01200856", + }, + { + .name = "decimal overflow IIO_VAL_INT_PLUS_NANO, negative schan", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = 123456789, + .expected = "-1256.01200856", + }, + { + .name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, positive", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 123456789, + .expected = "16557.914267", + }, + { + .name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, negative", + .numerator = -1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 123456789, + .expected = "-16557.914267", + }, + { + .name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, negative schan", + .numerator = 1000000, + .denominator = 8060, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = -10, + .schan_val2 = 123456789, + .expected = "-16557.914267", + }, + /* + * 32-bit overflow conditions + */ + { + .name = "overflow IIO_VAL_FRACTIONAL, positive", + .numerator = 2, + .denominator = 20, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = S32_MAX, + .schan_val2 = 1, + .expected = "214748364.7", + }, + { + .name = "overflow IIO_VAL_FRACTIONAL, negative", + .numerator = -2, + .denominator = 20, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = S32_MAX, + .schan_val2 = 1, + .expected = "-214748364.7", + }, + { + .name = "overflow IIO_VAL_FRACTIONAL_LOG2, positive", + .numerator = S32_MAX, + .denominator = 4096, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 4096, + .schan_val2 = 16, + .expected = "32767.99998474121", + }, + { + .name = "overflow IIO_VAL_FRACTIONAL_LOG2, negative", + .numerator = S32_MAX, + .denominator = 4096, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = -4096, + .schan_val2 = 16, + .expected = "-32767.99998474121", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_NANO, positive", + .numerator = 2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = S32_MAX, + .expected = "1.214748364", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_NANO, negative", + .numerator = -2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = S32_MAX, + .expected = "-1.214748364", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_NANO, negative schan", + .numerator = 2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = -10, + .schan_val2 = S32_MAX, + .expected = "-1.214748364", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_MICRO, positive", + .numerator = 2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = S32_MAX, + .expected = "215.748364", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_MICRO, negative", + .numerator = -2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = S32_MAX, + .expected = "-215.748364", + }, + { + .name = "overflow IIO_VAL_INT_PLUS_MICRO, negative schan", + .numerator = 2, + .denominator = 20, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = -10, + .schan_val2 = S32_MAX, + .expected = "-215.748364", + }, +}; + +const struct rescale_tc_data offset_cases[] = { + /* + * Typical use cases + */ + { + .name = "typical IIO_VAL_INT, positive", + .offset = 1234, + .schan_scale_type = IIO_VAL_INT, + .schan_val = 123, + .schan_val2 = 0, + .schan_off = 14, + .expected_off = "24", /* 23.872 */ + }, + { + .name = "typical IIO_VAL_INT, negative", + .offset = -1234, + .schan_scale_type = IIO_VAL_INT, + .schan_val = 12, + .schan_val2 = 0, + .schan_off = 14, + .expected_off = "-88", /* -88.83333333333333 */ + }, + { + .name = "typical IIO_VAL_FRACTIONAL, positive", + .offset = 1234, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 12, + .schan_val2 = 34, + .schan_off = 14, + .expected_off = "3510", /* 3510.333333333333 */ + }, + { + .name = "typical IIO_VAL_FRACTIONAL, negative", + .offset = -1234, + .schan_scale_type = IIO_VAL_FRACTIONAL, + .schan_val = 12, + .schan_val2 = 34, + .schan_off = 14, + .expected_off = "-3482", /* -3482.333333333333 */ + }, + { + .name = "typical IIO_VAL_FRACTIONAL_LOG2, positive", + .offset = 1234, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 12, + .schan_val2 = 16, + .schan_off = 14, + .expected_off = "6739299", /* 6739299.333333333 */ + }, + { + .name = "typical IIO_VAL_FRACTIONAL_LOG2, negative", + .offset = -1234, + .schan_scale_type = IIO_VAL_FRACTIONAL_LOG2, + .schan_val = 12, + .schan_val2 = 16, + .schan_off = 14, + .expected_off = "-6739271", /* -6739271.333333333 */ + }, + { + .name = "typical IIO_VAL_INT_PLUS_NANO, positive", + .offset = 1234, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456789, + .schan_off = 14, + .expected_off = "135", /* 135.8951219647469 */ + }, + { + .name = "typical IIO_VAL_INT_PLUS_NANO, negative", + .offset = -1234, + .schan_scale_type = IIO_VAL_INT_PLUS_NANO, + .schan_val = 10, + .schan_val2 = 123456789, + .schan_off = 14, + .expected_off = "-107", /* -107.89512196474689 */ + }, + { + .name = "typical IIO_VAL_INT_PLUS_MICRO, positive", + .offset = 1234, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 123456789, + .schan_off = 14, + .expected_off = "23", /* 23.246438560723952 */ + }, + { + .name = "typical IIO_VAL_INT_PLUS_MICRO, negative", + .offset = -12345, + .schan_scale_type = IIO_VAL_INT_PLUS_MICRO, + .schan_val = 10, + .schan_val2 = 123456789, + .schan_off = 14, + .expected_off = "-78", /* -78.50185091745313 */ + }, +}; + +static void case_to_desc(const struct rescale_tc_data *t, char *desc) +{ + strcpy(desc, t->name); +} + +KUNIT_ARRAY_PARAM(iio_rescale_scale, scale_cases, case_to_desc); +KUNIT_ARRAY_PARAM(iio_rescale_offset, offset_cases, case_to_desc); + +/** + * iio_str_to_nano() - Parse a fixed-point string to get an + * IIO_VAL_INT_PLUS_NANO value + * @str: The string to parse + * @nano: The number as an integer + * + * Returns 0 on success, or a negative error code if the string cound not be + * parsed. + */ +static int iio_str_to_nano(const char *str, s64 *nano) +{ + int tmp, tmp2; + int ret = 0; + + /* + * iio_str_to_fixpoint() uses 10^8 here instead of 10^9 as fract_mult is + * the multiplier for the first decimal place. + */ + ret = iio_str_to_fixpoint(str, 100000000, &tmp, &tmp2); + if (ret < 0) + return ret; + + if (tmp < 0) + tmp2 *= -1; + + *nano = (s64)tmp * GIGA + tmp2; + + return ret; +} + +/** + * iio_test_relative_error_ppm() - Compute relative error (in parts-per-million) + * between two fixed-point strings + * @real_str: The real value as a string + * @exp_str: The expected value as a string + * + * Returns a negative error code if the strings cound not be parsed, or the + * relative error in parts-per-million. + */ +static int iio_test_relative_error_ppm(const char *real_str, const char *exp_str) +{ + s64 real, exp, err; + int ret; + + ret = iio_str_to_nano(real_str, &real); + if (ret < 0) + return ret; + + ret = iio_str_to_nano(exp_str, &exp); + if (ret < 0) + return ret; + + if (!exp) { + pr_err("Expected value is null, relative error is undefined\n"); + return -EINVAL; + } + + err = MEGA * abs(exp - real); + + return (int)div64_u64(err, abs(exp)); +} + +static void iio_rescale_test_scale(struct kunit *test) +{ + struct rescale_tc_data *t = (struct rescale_tc_data *)test->param_value; + char *buff = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); + struct rescale rescale; + int values[2]; + int rel_ppm; + int ret; + + rescale.numerator = t->numerator; + rescale.denominator = t->denominator; + rescale.offset = t->offset; + values[0] = t->schan_val; + values[1] = t->schan_val2; + + ret = rescale_process_scale(&rescale, t->schan_scale_type, + &values[0], &values[1]); + + ret = iio_format_value(buff, ret, 2, values); + KUNIT_EXPECT_EQ(test, (int)strlen(buff), ret); + + rel_ppm = iio_test_relative_error_ppm(buff, t->expected); + KUNIT_EXPECT_GE_MSG(test, rel_ppm, 0, "failed to compute ppm\n"); + + KUNIT_EXPECT_EQ_MSG(test, rel_ppm, 0, + "\t real=%s" + "\texpected=%s\n", + buff, t->expected); +} + +static void iio_rescale_test_offset(struct kunit *test) +{ + struct rescale_tc_data *t = (struct rescale_tc_data *)test->param_value; + char *buff_off = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); + struct rescale rescale; + int values[2]; + int ret; + + rescale.numerator = t->numerator; + rescale.denominator = t->denominator; + rescale.offset = t->offset; + values[0] = t->schan_val; + values[1] = t->schan_val2; + + ret = rescale_process_offset(&rescale, t->schan_scale_type, + t->schan_val, t->schan_val2, t->schan_off, + &values[0], &values[1]); + + ret = iio_format_value(buff_off, ret, 2, values); + KUNIT_EXPECT_EQ(test, (int)strlen(buff_off), ret); + + KUNIT_EXPECT_STREQ(test, strim(buff_off), t->expected_off); +} + +static struct kunit_case iio_rescale_test_cases[] = { + KUNIT_CASE_PARAM(iio_rescale_test_scale, iio_rescale_scale_gen_params), + KUNIT_CASE_PARAM(iio_rescale_test_offset, iio_rescale_offset_gen_params), + {} +}; + +static struct kunit_suite iio_rescale_test_suite = { + .name = "iio-rescale", + .test_cases = iio_rescale_test_cases, +}; +kunit_test_suite(iio_rescale_test_suite); From patchwork Sat Jan 8 20:53:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707625 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 16325C433FE for ; Sat, 8 Jan 2022 20:54:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233302AbiAHUyJ (ORCPT ); Sat, 8 Jan 2022 15:54:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50940 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233143AbiAHUxx (ORCPT ); Sat, 8 Jan 2022 15:53:53 -0500 Received: from mail-qt1-x829.google.com (mail-qt1-x829.google.com [IPv6:2607:f8b0:4864:20::829]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D94EC061756; Sat, 8 Jan 2022 12:53:48 -0800 (PST) Received: by mail-qt1-x829.google.com with SMTP id f9so8841690qtk.3; Sat, 08 Jan 2022 12:53:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TjC5W1uMtjFisxRfNfbcBR2U4GPs8BcV/PzZwfqvMv0=; b=qgR5O/2WxIrS+uxMmILUab/UbSoxJPm+sTXNeDthISOQBmWbom6pWvtluNnMWz286y Klt0TNFrz44DMdCzuBUvYEgFdSTe+wma6ztXkbjfc9wvTtLHKYN/4DM8ulS5560Hu5mu D5kQrg2ZeSABNZF3gDdkq6cL2mAtV7/rzHOer/Uds00Y6q1x3k03v6qHFQb1KAIUu4bR xNdvHt085N0zUWEbaiH6elK0TcBXHSTnR5IxOJetJ8mA+jemB3bA/QWs/qcrQQAEZ9f3 PtldnH9a3jWfbHX2V3nQTJyvxakOz/MT9kq21JJoUwzSvwyvmqBqLGJbvvoid/m2w7QU m5KQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TjC5W1uMtjFisxRfNfbcBR2U4GPs8BcV/PzZwfqvMv0=; b=0IX5E/Q9AwbYrOHFW3RjN0CEvicRmItsx3tCeKzKVoSMXq0tuT49TCYY0GnEB51Dzs DeYd3wJwCKOE/D2rxJqbu6K+J4sCbyHk/h65jponIuvyThQtHroDOqc8zL1Ek0MiIa+v uCU3U9RLhVYF2yceBBnynDCb0IfoCOGQpGds8t6tMPynyavuJgVuXOGz1Da7SNONTpxc ffWSarKwcXv/TGEK+j1/BsqYSNKLKRDfmAQqvw/1pqhHLS2iQr9V7Yq7Fq6orfT37g92 YajVzbMmi2/r0rRMXcMY4UIGlLueOGRjwyQJNhZ/04lhqjLbd7qR5Hw4Iu8C+vP65ERO 3anw== X-Gm-Message-State: AOAM531jEdsLOoKpiW26PXwsrAS8p3mVjNKG8QMgD0CVawbWBzSzknwK 4nVmdrZAch3pCxk+LB1kP5s= X-Google-Smtp-Source: ABdhPJzoKhpzUftsJiJHg3fm+WL8TPTr7iaftV3voI1nR6kaRXcQRgDuj/EWb5SykEdkie7zxyW3MQ== X-Received: by 2002:a05:622a:312:: with SMTP id q18mr24966493qtw.367.1641675227732; Sat, 08 Jan 2022 12:53:47 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:47 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 13/16] iio: afe: rescale: add RTD temperature sensor support Date: Sat, 8 Jan 2022 15:53:16 -0500 Message-Id: <20220108205319.2046348-14-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org An RTD (Resistance Temperature Detector) is a kind of temperature sensor used to get a linear voltage to temperature reading within a give range (usually 0 to 100 degrees Celsius). Common types of RTDs include PT100, PT500, and PT1000. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 2379da74fe23..12c5e8d0d25c 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -394,10 +394,52 @@ static int rescale_voltage_divider_props(struct device *dev, return 0; } +static int rescale_temp_sense_rtd_props(struct device *dev, + struct rescale *rescale) +{ + u32 factor; + u32 alpha; + u32 iexc; + u32 tmp; + int ret; + u32 r0; + + ret = device_property_read_u32(dev, "excitation-current-microamp", + &iexc); + if (ret) { + dev_err(dev, "failed to read excitation-current-microamp: %d\n", + ret); + return ret; + } + + ret = device_property_read_u32(dev, "alpha-ppm-per-celsius", &alpha); + if (ret) { + dev_err(dev, "failed to read alpha-ppm-per-celsius: %d\n", + ret); + return ret; + } + + ret = device_property_read_u32(dev, "r-naught-ohms", &r0); + if (ret) { + dev_err(dev, "failed to read r-naught-ohms: %d\n", ret); + return ret; + } + + tmp = r0 * iexc * alpha / MEGA; + factor = gcd(tmp, MEGA); + rescale->numerator = MEGA / factor; + rescale->denominator = tmp / factor; + + rescale->offset = -1 * ((r0 * iexc) / MEGA * MILLI); + + return 0; +} + enum rescale_variant { CURRENT_SENSE_AMPLIFIER, CURRENT_SENSE_SHUNT, VOLTAGE_DIVIDER, + TEMP_SENSE_RTD, }; static const struct rescale_cfg rescale_cfg[] = { @@ -413,6 +455,10 @@ static const struct rescale_cfg rescale_cfg[] = { .type = IIO_VOLTAGE, .props = rescale_voltage_divider_props, }, + [TEMP_SENSE_RTD] = { + .type = IIO_TEMP, + .props = rescale_temp_sense_rtd_props, + }, }; static const struct of_device_id rescale_match[] = { @@ -422,6 +468,8 @@ static const struct of_device_id rescale_match[] = { .data = &rescale_cfg[CURRENT_SENSE_SHUNT], }, { .compatible = "voltage-divider", .data = &rescale_cfg[VOLTAGE_DIVIDER], }, + { .compatible = "temperature-sense-rtd", + .data = &rescale_cfg[TEMP_SENSE_RTD], }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, rescale_match); From patchwork Sat Jan 8 20:53:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707627 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 484BEC43219 for ; Sat, 8 Jan 2022 20:54:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233024AbiAHUyP (ORCPT ); Sat, 8 Jan 2022 15:54:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233163AbiAHUxy (ORCPT ); Sat, 8 Jan 2022 15:53:54 -0500 Received: from mail-qt1-x82d.google.com (mail-qt1-x82d.google.com [IPv6:2607:f8b0:4864:20::82d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3DB21C06175B; Sat, 8 Jan 2022 12:53:50 -0800 (PST) Received: by mail-qt1-x82d.google.com with SMTP id a1so9551484qtx.11; Sat, 08 Jan 2022 12:53:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/0ROVjBtOv58dYnTC1wxv7OiF3Nz5B0Zoen6sj7TfJ8=; b=ZB3KqunNjaHpw0gvIBkdvu2xaxjBoSRBMEwhiNHLJSo41PtOWYdsXL4GXdoagab2Zu 8Np4CR6eku4Qgh8rhTAx1RwOo2l6xoa6jgChL9Q1hpOQyuzLoaHLpQnZcU1PwZkg0/4l mhm1fUkSv5Wg3LHJrhYPo5owERIT3l/g66+1OHsA5THlgTZSlGaYHNKReoEGB/YqBiaR AgPQMP0ce6/BJnl8zf/G6ENHLdOjkNz4usjZ5z7KGSW6gQWzg47vgUPqv8AWur1r2Iqq MsUulPfTtYjNyDNMfY7/c2Kqn3sPe1XH5AaqgBK6g91qQArKZxUwynyNnO7Inq6pyFWL 5T0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/0ROVjBtOv58dYnTC1wxv7OiF3Nz5B0Zoen6sj7TfJ8=; b=vLE81sY4qcnvjW/Z6G897Gzo/4p8ENaln9akr1M2Qn2v9qseDrOKyaFXwp25EzMgSB SnxlQykY0JlOXhdePtaQ9ps0e70dlQ8C2FoQwmBWQOFTYKGQwTn9TrzVl3w+UOdssqjO taKHxfydXUfpzpGplMJf7Bk5QxcgmJnE4cpekp/G/M/BVXkHV3If7A9e9B6Tp5/Izs7e OOPq2wKrPl8nKC2sQn2pCmygYGG4SzIABly5km53DwGpyP9sn6h67r9uhOayKFaVJ7WX kfMJ0ZWlsV3Mmw5clxf7Ve/S0QZJGZJututD6WY1j2PcUudYGWdaNQIcVMcjGeg6xZjY SWnQ== X-Gm-Message-State: AOAM530rf8wfIMFMlI++0i3Y8JmojbrWY4E3xYxpz1R1i6txOTP8iEro Xv/db/3GJd37oq3gSftycSg= X-Google-Smtp-Source: ABdhPJz21wLTntPP49TQIqloAjfdrmn2uQZw6sgUBe42HokKBeSeCER37yicB5j4+LV0hs9J01Ovxw== X-Received: by 2002:ac8:7d08:: with SMTP id g8mr59713780qtb.443.1641675229438; Sat, 08 Jan 2022 12:53:49 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:48 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 14/16] iio: afe: rescale: add temperature transducers Date: Sat, 8 Jan 2022 15:53:17 -0500 Message-Id: <20220108205319.2046348-15-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org A temperature transducer is a device that converts a thermal quantity into any other physical quantity. This patch adds support for temperature to voltage (like the LTC2997) and temperature to current (like the AD590) linear transducers. In both cases these are assumed to be connected to a voltage ADC. Signed-off-by: Liam Beguin Reviewed-by: Peter Rosin --- drivers/iio/afe/iio-rescale.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 12c5e8d0d25c..4d70b72f59a5 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -435,11 +435,37 @@ static int rescale_temp_sense_rtd_props(struct device *dev, return 0; } +static int rescale_temp_transducer_props(struct device *dev, + struct rescale *rescale) +{ + s32 offset = 0; + s32 sense = 1; + s32 alpha; + int ret; + + device_property_read_u32(dev, "sense-offset-millicelsius", &offset); + device_property_read_u32(dev, "sense-resistor-ohms", &sense); + ret = device_property_read_u32(dev, "alpha-ppm-per-celsius", &alpha); + if (ret) { + dev_err(dev, "failed to read alpha-ppm-per-celsius: %d\n", ret); + return ret; + } + + rescale->numerator = MEGA; + rescale->denominator = alpha * sense; + + rescale->offset = div_s64((s64)offset * rescale->denominator, + rescale->numerator); + + return 0; +} + enum rescale_variant { CURRENT_SENSE_AMPLIFIER, CURRENT_SENSE_SHUNT, VOLTAGE_DIVIDER, TEMP_SENSE_RTD, + TEMP_TRANSDUCER, }; static const struct rescale_cfg rescale_cfg[] = { @@ -459,6 +485,10 @@ static const struct rescale_cfg rescale_cfg[] = { .type = IIO_TEMP, .props = rescale_temp_sense_rtd_props, }, + [TEMP_TRANSDUCER] = { + .type = IIO_TEMP, + .props = rescale_temp_transducer_props, + }, }; static const struct of_device_id rescale_match[] = { @@ -470,6 +500,8 @@ static const struct of_device_id rescale_match[] = { .data = &rescale_cfg[VOLTAGE_DIVIDER], }, { .compatible = "temperature-sense-rtd", .data = &rescale_cfg[TEMP_SENSE_RTD], }, + { .compatible = "temperature-transducer", + .data = &rescale_cfg[TEMP_TRANSDUCER], }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, rescale_match); From patchwork Sat Jan 8 20:53:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707626 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E06D9C433EF for ; Sat, 8 Jan 2022 20:54:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233013AbiAHUyN (ORCPT ); Sat, 8 Jan 2022 15:54:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233169AbiAHUx5 (ORCPT ); Sat, 8 Jan 2022 15:53:57 -0500 Received: from mail-qv1-xf36.google.com (mail-qv1-xf36.google.com [IPv6:2607:f8b0:4864:20::f36]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 81F1FC06175D; Sat, 8 Jan 2022 12:53:51 -0800 (PST) Received: by mail-qv1-xf36.google.com with SMTP id o10so9475378qvc.5; Sat, 08 Jan 2022 12:53:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EoVz/z4Kv5flD6bBPkUi3ywu6/Ph5Pi55G9NAdUbUhI=; b=JB/GGwTvKXgIXawkydGQfQNe8QeBW4/7mg95LnrEOmNGY1FLmz2zvuWdELEyvGnmtO CWFv0w+dJi8RPeQbJ58aOxGuXx21EywvqD1i31qikp182z3Hj7LeKAWttii+y7VsVjjY UwVDIg0NWkDBj4M/hxNZBMgfp50V5/oUZmj+f9f7tRspkkdqcgeP4AwjBAAzYupcIKOw RYfX9FqZiWjaqcPxKYsCXXci4uQtqtjBCgZoPB31NIJLhm4KHtzTt/+fpMsypKv3pFJ0 MnLapqlSUJ4cnyYdG+zu66pgDggKqqvmTThrh4DTTTdlrlnw/znbtPxzz5ssvO63tyj0 rudQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EoVz/z4Kv5flD6bBPkUi3ywu6/Ph5Pi55G9NAdUbUhI=; b=CuVJuZD2GpbBXJETNEuu2qupKqAga3RXMLIAP75TDK2gyfKMWFVni0sq5eQlJ2DLF9 knrnkmt+s2QPr+z6yD0Ich/fyzs0MbvL8/VhAUvuhwZrZQSKmMRVBO9x42nmqrQ3dgy3 SofCKQZTGbEtCD61hjosV9AHfa3jW22fd5VFTMhLPflKRsp7iu3b1be8RjtaquVhwb9r bY9X9pD5cLFaLlPgrL2CqYWoMutSN0Rm+fzTe13SvyoQ9mWOHg7IVDwEBWPlxlT/qces 1crRYOnOJlT/dJJfwwj6nv6V06bUmx30u9FfbXVL0xc5bT7WqNr6rBIpv3W1CxIQqQPW DX2g== X-Gm-Message-State: AOAM530cX5jCiTQuVDkpvreOxKJMpmSHCZmFD+UjiLYmnFqhexy5DBk/ XQK71b5T57XHz4YfdpnsWm8= X-Google-Smtp-Source: ABdhPJzLPlQ8CBQvgk9O6QmzPTsggxfUU7F1JEjXhTmn6djftHEiMjlGAPFdZTb5AaOl0W/4bM2+aQ== X-Received: by 2002:a05:6214:27cc:: with SMTP id ge12mr62552008qvb.122.1641675230675; Sat, 08 Jan 2022 12:53:50 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:50 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 15/16] dt-bindings: iio: afe: add bindings for temperature-sense-rtd Date: Sat, 8 Jan 2022 15:53:18 -0500 Message-Id: <20220108205319.2046348-16-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org An ADC is often used to measure other quantities indirectly. This binding describe one case, the measurement of a temperature through the voltage across an RTD resistor such as a PT1000. Signed-off-by: Liam Beguin Reviewed-by: Rob Herring Reviewed-by: Peter Rosin --- .../iio/afe/temperature-sense-rtd.yaml | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml diff --git a/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml b/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml new file mode 100644 index 000000000000..336ce96371db --- /dev/null +++ b/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml @@ -0,0 +1,101 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/afe/temperature-sense-rtd.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Temperature Sense RTD + +maintainers: + - Liam Beguin + +description: | + RTDs (Resistance Temperature Detectors) are a kind of temperature sensors + used to get a linear voltage to temperature reading within a give range + (usually 0 to 100 degrees Celsius). + + When an io-channel measures the output voltage across an RTD such as a + PT1000, the interesting measurement is almost always the corresponding + temperature, not the voltage output. This binding describes such a circuit. + + The general transfer function here is (using SI units) + + V = R(T) * iexc + R(T) = r0 * (1 + alpha * T) + T = 1 / (alpha * r0 * iexc) * (V - r0 * iexc) + + The following circuit matches what's in the examples section. + + 5V0 + ----- + | + +---+----+ + | R 5k | + +---+----+ + | + V 1mA + | + +---- Vout + | + +---+----+ + | PT1000 | + +---+----+ + | + ----- + GND + +properties: + compatible: + const: temperature-sense-rtd + + io-channels: + maxItems: 1 + description: | + Channel node of a voltage io-channel. + + '#io-channel-cells': + const: 0 + + excitation-current-microamp: + description: The current fed through the RTD sensor. + + alpha-ppm-per-celsius: + description: | + alpha can also be expressed in micro-ohms per ohm Celsius. It's a linear + approximation of the resistance versus temperature relationship + between 0 and 100 degrees Celsius. + + alpha = (R_100 - R_0) / (100 * R_0) + + Where, R_100 is the resistance of the sensor at 100 degrees Celsius, and + R_0 (or r-naught-ohms) is the resistance of the sensor at 0 degrees + Celsius. + + Pure platinum has an alpha of 3925. Industry standards such as IEC60751 + and ASTM E-1137 specify an alpha of 3850. + + r-naught-ohms: + description: | + Resistance of the sensor at 0 degrees Celsius. + Common values are 100 for PT100, 500 for PT500, and 1000 for PT1000 + +additionalProperties: false +required: + - compatible + - io-channels + - excitation-current-microamp + - alpha-ppm-per-celsius + - r-naught-ohms + +examples: + - | + pt1000_1: temperature-sensor0 { + compatible = "temperature-sense-rtd"; + #io-channel-cells = <0>; + io-channels = <&temp_adc1 0>; + + excitation-current-microamp = <1000>; /* i = U/R = 5 / 5000 */ + alpha-ppm-per-celsius = <3908>; + r-naught-ohms = <1000>; + }; +... From patchwork Sat Jan 8 20:53:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liam Beguin X-Patchwork-Id: 12707628 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCF97C4332F for ; Sat, 8 Jan 2022 20:54:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233007AbiAHUyO (ORCPT ); Sat, 8 Jan 2022 15:54:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50916 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233171AbiAHUx6 (ORCPT ); Sat, 8 Jan 2022 15:53:58 -0500 Received: from mail-qt1-x829.google.com (mail-qt1-x829.google.com [IPv6:2607:f8b0:4864:20::829]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0F770C061763; Sat, 8 Jan 2022 12:53:53 -0800 (PST) Received: by mail-qt1-x829.google.com with SMTP id bp39so9570624qtb.6; Sat, 08 Jan 2022 12:53:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1iY9Z6nxGuMrblVO4UQYMXVHJL6H5huSq3eeUbaBoIY=; b=m4OsGMd/UUpI/hzhFvRhmejWMAe330FeHORHkKnNdXejyL7pKY0hzKalTaxP1Ah1Od YI/ncXbVChN3DZYDEAPXICS4eWv5yiIOUYi3ZGHMxYxEPjoi+9pmReJduhoaO8HDNCru 7WUXkOyrYeRvV6EM3fvDZeBx6EFPA2c9qlMBHB6jyE8RVi9BzFMANDVXLvE2t6NGQYtB cmFmN8yDQ+X+qGWARBMzpBy68DOlicmIYY4AdPBKTPaI9lscy3kN9HQPpoLPaAEbL6Wn vcsDenX37jqmJW7mt5MsyOHrUamLJMkC5LW7w5NRIDXBV7s1jVjk1nm7Gr/tRdWdirko Bg2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1iY9Z6nxGuMrblVO4UQYMXVHJL6H5huSq3eeUbaBoIY=; b=oXlcTU7zBZ1eQ6B1UJYQ9EftRBgNlZuQVa+2/0cqNLSsC5RGE4YTMw3Q42xLtGgv34 AdXZAmHBMa6ak8qFo/pzZZYuCHUhYzo63JuF/QCikQ/qCxmLzSv5wiHHuzS5b6uyXSRV ZJ6fFXWOpOwzMmLIG0pFW9FWNp5wgYYeP3hdwcK6szvqZONd0Cc8v6dfqYQ+PrS+zNAk o3K8woXjkL6LQoRxJ3ZadYEeJMaKh462vTqtEyEQR0dzS1Hlwjjiuku5ejTbh2g8DEfa 0ukMtC6aFrmdXMHeZEwKZz020wN5eJfVoiYfcBnG3V88V+3Nv+HQFOeNwzjM6ECOoY1/ 0Nbg== X-Gm-Message-State: AOAM533TYJPlqjmOXogCtV7RuHYdLnGx85xgkYIR1b1bEEthDoT6Ku0d V51hyw5bFUUqqJeuKvS4Lj8= X-Google-Smtp-Source: ABdhPJw8W9zSUtuQ9Yn7T8AGM60e9YkZH1RAD8IHFtS5SSRM53FS4tAAf/YxXwBvAnwZZk5Jg1fYlA== X-Received: by 2002:a05:622a:1713:: with SMTP id h19mr61036653qtk.464.1641675232255; Sat, 08 Jan 2022 12:53:52 -0800 (PST) Received: from shaak.. (69-165-204-82.cable.teksavvy.com. [69.165.204.82]) by smtp.gmail.com with ESMTPSA id p16sm1650377qtx.19.2022.01.08.12.53.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Jan 2022 12:53:51 -0800 (PST) From: Liam Beguin To: liambeguin@gmail.com, peda@axentia.se, jic23@kernel.org, andy.shevchenko@gmail.com, lars@metafoo.de Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org Subject: [PATCH v12 16/16] dt-bindings: iio: afe: add bindings for temperature transducers Date: Sat, 8 Jan 2022 15:53:19 -0500 Message-Id: <20220108205319.2046348-17-liambeguin@gmail.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220108205319.2046348-1-liambeguin@gmail.com> References: <20220108205319.2046348-1-liambeguin@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org An ADC is often used to measure other quantities indirectly. This binding describe one case, the measurement of a temperature through a temperature transducer (either voltage or current). Signed-off-by: Liam Beguin Reviewed-by: Rob Herring Reviewed-by: Peter Rosin --- .../iio/afe/temperature-transducer.yaml | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml diff --git a/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml b/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml new file mode 100644 index 000000000000..cfbf5350db27 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml @@ -0,0 +1,114 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/afe/temperature-transducer.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Temperature Transducer + +maintainers: + - Liam Beguin + +description: | + A temperature transducer is a device that converts a thermal quantity + into any other physical quantity. This binding applies to temperature to + voltage (like the LTC2997), and temperature to current (like the AD590) + linear transducers. + In both cases these are assumed to be connected to a voltage ADC. + + When an io-channel measures the output voltage of a temperature analog front + end such as a temperature transducer, the interesting measurement is almost + always the corresponding temperature, not the voltage output. This binding + describes such a circuit. + + The general transfer function here is (using SI units) + V(T) = Rsense * Isense(T) + T = (Isense(T) / alpha) + offset + T = 1 / (Rsense * alpha) * (V + offset * Rsense * alpha) + + When using a temperature to voltage transducer, Rsense is set to 1. + + The following circuits show a temperature to current and a temperature to + voltage transducer that can be used with this binding. + + VCC + ----- + | + +---+---+ + | AD590 | VCC + +---+---+ ----- + | | + V proportional to T +----+----+ + | D+ --+ | + +---- Vout | LTC2997 +--- Vout + | D- --+ | + +---+----+ +---------+ + | Rsense | | + +---+----+ ----- + | GND + ----- + GND + +properties: + compatible: + const: temperature-transducer + + io-channels: + maxItems: 1 + description: | + Channel node of a voltage io-channel. + + '#io-channel-cells': + const: 0 + + sense-offset-millicelsius: + description: | + Temperature offset. + This offset is commonly used to convert from Kelvins to degrees Celsius. + In that case, sense-offset-millicelsius would be set to <(-273150)>. + default: 0 + + sense-resistor-ohms: + description: | + The sense resistor. + By default sense-resistor-ohms cancels out the resistor making the + circuit behave like a temperature transducer. + default: 1 + + alpha-ppm-per-celsius: + description: | + Sometimes referred to as output gain, slope, or temperature coefficient. + + alpha is expressed in parts per million which can be micro-amps per + degrees Celsius or micro-volts per degrees Celsius. The is the main + characteristic of a temperature transducer and should be stated in the + datasheet. + +additionalProperties: false + +required: + - compatible + - io-channels + - alpha-ppm-per-celsius + +examples: + - | + ad950: temperature-sensor-0 { + compatible = "temperature-transducer"; + #io-channel-cells = <0>; + io-channels = <&temp_adc 3>; + + sense-offset-millicelsius = <(-273150)>; /* Kelvin to degrees Celsius */ + sense-resistor-ohms = <8060>; + alpha-ppm-per-celsius = <1>; /* 1 uA/K */ + }; + - | + znq_tmp: temperature-sensor-1 { + compatible = "temperature-transducer"; + #io-channel-cells = <0>; + io-channels = <&temp_adc 2>; + + sense-offset-millicelsius = <(-273150)>; /* Kelvin to degrees Celsius */ + alpha-ppm-per-celsius = <4000>; /* 4 mV/K */ + }; +...