From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C72A381AFA for ; Mon, 18 May 2026 22:02:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779141781; cv=none; b=p+7tpZtOn/UJ50uhU0bFWfgbvlHjlY/5zH6aj70sIrHaJd2AMuUJhcFloN5gcQ1cMPwKJ4ksR4K8/Ru8HsptJQKK0N1FDhtG75cVMFOGKGE4q8mUSFbvveqwbXbkj5+2X28Dv9bgKSKek8avSLBmE8rZhgkrEvhxwRbOA+OBj18= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779141781; c=relaxed/simple; bh=YIgzdEh/qr3hlX5d3x7wEDgkdp098G1nkKAjjuV5Y7Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SwsIod0KDZ61Y2l9k5G2DXDMYBIwFDUpbFxg+KQX1xfQBleCSDDxCsAgPdJ9UVvlAqWiWlCebjojG3J2ap/2BqfcZ3tgHuOGPQlepvByGTnDWUpHOTEOsyENg6IGKNzu6Qpmav7qNRvbbvYR1/q9sADFd4A74LvtcHoZW+j0LVE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Uzmnk/Mb; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Uzmnk/Mb" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-837b39eb078so1910621b3a.2 for ; Mon, 18 May 2026 15:02:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779141778; x=1779746578; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bvK2VJD8fl/Rjr0aAvzpby1wY4IjpgTnX0YvfLJpkFQ=; b=Uzmnk/MbTBsVOb9lDVD5zubjipoeduNTWfuI6vYvMENntdWqcHbhR3rqCMjyDO7m5n auY7hJNcvxvxnyypYDEZArlZVan4aEpI3wx0aueuGx/RG6n39LMWEaTJ0X8QnoeXRo6C AZ7zRVHkIa8XnF1GdcgZMGTXJfOgmByPIk8jpcI0YyLDdMpmbwViwD9KOGOxGcKHjr0V RbvvMwuHwV7OLK24jO09udZncwfSx6lDRcAclXB8dveVz+OXv7fpWZdElpnyhix1q35e uIQk7qpZS67XjpagzhH1/a4DN92RjAdIQGvyuGI2vidSowntKFPvc+WnKOjTmuHJnmrN 2DXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779141778; x=1779746578; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=bvK2VJD8fl/Rjr0aAvzpby1wY4IjpgTnX0YvfLJpkFQ=; b=YXZbToQtCOZ8CnRWIaefze8c8vu3CX+PKKjemS6cY54KjbOuTpW268N6mueF8FdDhw 4c4JaPQ691aEQyjbGMFFBdPue66URJeX0YPltf/6BXf51yJ/cASc+oz3iI9rx7/zN/wc p9nuWBBbd4cFnAD0naBJ6lOK1Spe+RHm/B6i3/2BiaCiiPZqE25sPOsZO2z04utKSudu tSxESwcZzSBC9afke045WcTvifypiQ3FFu+YGm+zKRqOm4+Pj8ukmzQMO6Ol59w2CFeR BudzBx7ddpDMb8REG5kAwKdkQKHQjhiq0TjHvySsrXeK/5oacn6i2XzQSljajJl/N8nU FMfw== X-Forwarded-Encrypted: i=1; AFNElJ8CITan3WiW3Cm2aICtJckJf/SkCqvUjG2iGhtY3vFd4Mc56o7w2MwI92Ca3aC4sR1qOXdk78oU820IWu0=@vger.kernel.org X-Gm-Message-State: AOJu0YwJQkhXbEcdby1T0G3Z1Kfsolv44vAxrhcGLAiE2fJghLuFAcqX 6WoavBvpQxGQhCfXKjDsPZDtVD2YrLksBda01vGWSDugmuQ1vzU/PTUO X-Gm-Gg: Acq92OHvr/dcf//mWzzMKG3DnRICQlBBwZsOZ3Kw3kgM2/a1XDk/cSFyiM7c9MFOpYJ tXrrqPUwk+Mr2SMp5ZBAQGe+GHtsoVZGZUUMzOk2N7FvXagPt+eUt2aE773HOOLgZDqMz4M7MMu 7bhGctdKoyJxxoy/OLhoQQWTl6BzFT8UXj1+Mr9vzuPIU3K50p+PO0/Zw/kc2LL+AENHhBOmjei MpHBPS5EeW9SVmmi+FaGXKHYSKvosAa4rZWwi22vEbqGC3CFwJiBSxzoo/j3+7e7PjLFx0HQHkh JZ7BYIvYXFeoAudgi/gaXQUFuS7zDXdqg4XYKJXKbQ/SNur0siT3pV6gG21E92XGRaGzgKgNzRT kLCOf1vkrSiI9RZnKYldXu2Ravz/ylJq5J2PLfd2mXdFdIqPzLJgB0aOiIgQSD9LUFJNjABPzz7 WlfSaMuxPjya/s17vO2Fy9HRTSZPU9vpIJy5dDPR7+BEjrwdWfCLgO+cSE1pPy9TOvvVKFrNkPK LsEi9J15XRQr26BfSBqgKnnz4UkhfCtritmJ3evLvskdR3bDoGayKGNm6h9kEwnlY7TK68= X-Received: by 2002:a05:6a00:2d19:b0:82f:a89e:e16f with SMTP id d2e1a72fcca58-83f33b2f58fmr17303350b3a.14.1779141777904; Mon, 18 May 2026 15:02:57 -0700 (PDT) Received: from lord-daniel-VivoBook-ASUSLaptop-K3502ZA-S3502ZA.www.tendawifi.com ([14.139.108.62]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f1977b128sm15772960b3a.22.2026.05.18.15.02.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2026 15:02:57 -0700 (PDT) From: Piyush Patle To: Jonathan Cameron Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andreas Klinger , Andy Shevchenko , Conor Dooley , Krzysztof Kozlowski , Rob Herring Subject: [PATCH v9 05/11] iio: adc: hx711: move scale computation to per-device storage Date: Tue, 19 May 2026 03:32:21 +0530 Message-ID: <20260518220228.63322-6-piyushpatle228@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260518220228.63322-1-piyushpatle228@gmail.com> References: <20260518220228.63322-1-piyushpatle228@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The gain-to-scale table is global today, so probe-time scale updates for one device overwrite the values used by any earlier device instance. Fix this by making the gain table const and storing the computed scale values per device in hx711_data. No functional change for single-sensor configurations. Signed-off-by: Piyush Patle Reviewed-by: Andy Shevchenko --- No change from v8. Already applied to iio.git testing branch. drivers/iio/adc/hx711.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c index 1db8b68a8f64..86d2a70dd3de 100644 --- a/drivers/iio/adc/hx711.c +++ b/drivers/iio/adc/hx711.c @@ -28,22 +28,20 @@ struct hx711_gain_to_scale { int gain; int gain_pulse; - int scale; int channel; }; /* * .scale depends on AVDD which in turn is known as soon as the regulator - * is available - * therefore we set .scale in hx711_probe() + * is available; it is stored per device in hx711_data.gain_scale[] * * channel A in documentation is channel 0 in source code * channel B in documentation is channel 1 in source code */ -static struct hx711_gain_to_scale hx711_gain_to_scale[HX711_GAIN_MAX] = { - { 128, 1, 0, 0 }, - { 32, 2, 0, 1 }, - { 64, 3, 0, 0 } +static const struct hx711_gain_to_scale hx711_gain_to_scale[HX711_GAIN_MAX] = { + { 128, 1, 0 }, + { 32, 2, 1 }, + { 64, 3, 0 }, }; static int hx711_get_gain_to_pulse(int gain) @@ -56,22 +54,22 @@ static int hx711_get_gain_to_pulse(int gain) return 1; } -static int hx711_get_gain_to_scale(int gain) +static int hx711_get_gain_to_scale(const int *gain_scale, int gain) { int i; for (i = 0; i < HX711_GAIN_MAX; i++) if (hx711_gain_to_scale[i].gain == gain) - return hx711_gain_to_scale[i].scale; + return gain_scale[i]; return 0; } -static int hx711_get_scale_to_gain(int scale) +static int hx711_get_scale_to_gain(const int *gain_scale, int scale) { int i; for (i = 0; i < HX711_GAIN_MAX; i++) - if (hx711_gain_to_scale[i].scale == scale) + if (gain_scale[i] == scale) return hx711_gain_to_scale[i].gain; return -EINVAL; } @@ -82,6 +80,7 @@ struct hx711_data { struct gpio_desc *gpiod_dout; int gain_set; /* gain set on device */ int gain_chan_a; /* gain for channel A */ + int gain_scale[HX711_GAIN_MAX]; struct mutex lock; /* * triggered buffer @@ -290,7 +289,8 @@ static int hx711_read_raw(struct iio_dev *indio_dev, *val = 0; mutex_lock(&hx711_data->lock); - *val2 = hx711_get_gain_to_scale(hx711_data->gain_set); + *val2 = hx711_get_gain_to_scale(hx711_data->gain_scale, + hx711_data->gain_set); mutex_unlock(&hx711_data->lock); @@ -321,7 +321,7 @@ static int hx711_write_raw(struct iio_dev *indio_dev, mutex_lock(&hx711_data->lock); - gain = hx711_get_scale_to_gain(val2); + gain = hx711_get_scale_to_gain(hx711_data->gain_scale, val2); if (gain < 0) { mutex_unlock(&hx711_data->lock); return gain; @@ -386,6 +386,7 @@ static ssize_t hx711_scale_available_show(struct device *dev, struct device_attribute *attr, char *buf) { + struct hx711_data *hx711_data = iio_priv(dev_to_iio_dev(dev)); struct iio_dev_attr *iio_attr = to_iio_dev_attr(attr); int channel = iio_attr->address; int i, len = 0; @@ -393,7 +394,7 @@ static ssize_t hx711_scale_available_show(struct device *dev, for (i = 0; i < HX711_GAIN_MAX; i++) if (hx711_gain_to_scale[i].channel == channel) len += sprintf(buf + len, "0.%09d ", - hx711_gain_to_scale[i].scale); + hx711_data->gain_scale[i]); len += sprintf(buf + len, "\n"); @@ -511,7 +512,7 @@ static int hx711_probe(struct platform_device *pdev) ret *= 100; for (i = 0; i < HX711_GAIN_MAX; i++) - hx711_gain_to_scale[i].scale = + hx711_data->gain_scale[i] = ret / hx711_gain_to_scale[i].gain / 1678; hx711_data->gain_set = 128; -- 2.43.0