From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 A8E56311C3E for ; Sat, 28 Mar 2026 18:21:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774722075; cv=none; b=dM1J19kEbubVaEvUBGN0FTPoO8/D914rtFUwShvnWvyikP08RnsOx4VaOJf3lTXD5nIyYxccjvWcGAA6g5pov2Jww+yYUOpYAkdGZBBT71U12ofcZpQ8/EF7uSKUu8m8aKqMG6+ORSvHUjPrOJrseRgLDJxOUHzE4gIXfT6g5WU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774722075; c=relaxed/simple; bh=0pbOL/dGHERe1EfSvbVNssanpwxAN38tdpdbr/Jaxj8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cTy/LeYnh23EPsRciZx6QqK+LENvsfBHcKbc4fYS4FInE1k4RtGzoNvwT8kbOv9XCeG56ps0Dls2vwYJbmbZFoyBhDboiZI5FDROuY2Wu0/+Igc5RRwAIVXTvLiS5tAXahe/4a2/yY04vAYsvSscOd1t2a7heLXwMV2fhwX8oF0= 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=q140Y/7K; arc=none smtp.client-ip=209.85.214.174 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="q140Y/7K" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2b23f90f53aso10609965ad.0 for ; Sat, 28 Mar 2026 11:21:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774722074; x=1775326874; 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=U9KE3Yo35HcOp4QopaJDXVc4B2FMTqxqxd65+MOhm+I=; b=q140Y/7Kkp9tmO94vZ71RCDyQPT7Qkwbu8LCTXyrYy/TnsxY4YWN5w+5YObT0DCdQ9 0jIq2X4Ihf9atMVRlOLWpai4tQ/9K+EGxVvpxZOWjQvVkM55nryri7q89sfwwyN9RcKg dpkfwPhMe7hq2yj4OnT96age08ErfMSrpZo9+iOKK/ogoaLmjHVrYImGZI07lQbLJRo3 E4gnofcsww79ws9SH0dJH24TOI7ijD7VSs1aTAlpP2CNqwaHEpHveDERr8l75xs3HSIc u3+v3MlLXn6QtLGUsvHssAGGzn/hOv4c/OXk7VWFOcfWQun8/jkv8bbqKmpNCGIKlSUN PUwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774722074; x=1775326874; 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=U9KE3Yo35HcOp4QopaJDXVc4B2FMTqxqxd65+MOhm+I=; b=LbaGo8TOteQXEPh/D40eAwLDjQvN7SOdoA4pfbgQStSisDLXrSiSIAtaFSZ85vyl0j p7t6zWE53da4m6Gyl8aHRjpMcNG+bizv/8QVGZXfBgMm6XOj+13t4xXkMmIMui5jdkQq jE5K7RIFzPdYFyDPglmqKJ5z2RVnFRijqkENljAoQZbkL4C2aoH71ztMb4lb3FHURGJT 2ajQOxYuG3KVQa2K+eUHD/vneYsL/IAIG5nDIEuWsWAfe64plNpw+TYwepI67aymgNWR 1ljPCSWyeTlnFqc//vRp3NHfzJWuMNuQDoO8OWSfs0SbVnEhN/FapL8vfFOKBTg+Va2Z 3Mzw== X-Forwarded-Encrypted: i=1; AJvYcCXcmG6K1l5VoVXlCC0owj/GQcKPVLiVg06G5t9UoRJqBH7t4X3ov6OATRYLLu9yUZxBeSnDkvLU39tnVrw=@vger.kernel.org X-Gm-Message-State: AOJu0YwjbEQbtvcV7Ep6VGlaawAoxjVEptUH1xBYP0fkhhqyUWvSAF0K +BcpAkMWOpue0av7Xgg4LmsrglSJB/CYOurpkuic71M6BMNNp+rT/I4gAqKZnA== X-Gm-Gg: ATEYQzyNNEabEL1vUH3Fqy+iQ3Sz0DRiBtQizkcashxVCDpzfbKiGO98eIjrsJ3LpI8 QXxSYqYajuZJr+aZxa0n+vD5WcZDvmHHU97G0nPzDomb5ft01D7oFThxrRn1g2BCgjkikYtsvh7 n2hs3byA9kbZKgkDr75EYlQemWPT4ZSYIAiEF6alOVUYA2sdYvRwwOjVEvHuwY1noljejXYKBqk qrEpcpIIyCUIHZWg9joXmFRuEdM/0kmRDm7ci4Vt4Kmyrv9XwZWSKG+flLm4T5MMk3DenCVh75f XNwSjtYAr4HgyMjPRQ+9wjkMjFp8BXZJ8G1ptclgWx+ONSOKU+u9Maq23F7EDgynd/QvSIt9vam jmw7gUm6hYuGcg8+crwJEkbCX2frwf6KqZOEbFR4JPz4qlgioOfwGJzkFtEP7Hy2VIPdtVkGqEa Kj/n02NxkHEM/Hdr4QaytVrtc9wrzJkHQbRa7+Xn9/789+b6ppIs2OEnHR8gl+pQtEkg== X-Received: by 2002:a17:903:22d1:b0:2b0:659e:97c6 with SMTP id d9443c01a7336-2b0cdd06f24mr75180345ad.47.1774722073947; Sat, 28 Mar 2026 11:21:13 -0700 (PDT) Received: from tabrez-VivoBook-ASUSLaptop-X513UA-KM513UA.. ([115.96.68.45]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2427660c7sm28451665ad.44.2026.03.28.11.21.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Mar 2026 11:21:13 -0700 (PDT) From: Tabrez Ahmed To: linux@roeck-us.net Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, shuah@kernel.org, me@brighamcampbell.com, Tabrez Ahmed Subject: [PATCH 1/2] hwmon: (ads7871) Add mutex to serialize SPI transactions Date: Sat, 28 Mar 2026 23:50:14 +0530 Message-ID: <20260328182015.220298-2-tabreztalks@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260328182015.220298-1-tabreztalks@gmail.com> References: <20260328182015.220298-1-tabreztalks@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 If userspace reads multiple channels concurrently, the driver can overwrite ongoing REG_GAIN_MUX writes before the conversion completes. Add a mutex to the driver's private data structure to serialize hardware access and prevent concurrent userspace reads from corrupting the ADC multiplexer state. Update error paths to ensure the mutex is properly unlocked. Suggested-by: Guenter Roeck Signed-off-by: Tabrez Ahmed --- drivers/hwmon/ads7871.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c index 9bfdf9e6bcd77..02e69bef2ca12 100644 --- a/drivers/hwmon/ads7871.c +++ b/drivers/hwmon/ads7871.c @@ -59,11 +59,13 @@ #include #include #include +#include #define DEVICE_NAME "ads7871" struct ads7871_data { struct spi_device *spi; + struct mutex lock; }; static int ads7871_read_reg8(struct spi_device *spi, int reg) @@ -98,6 +100,8 @@ static ssize_t voltage_show(struct device *dev, struct device_attribute *da, uint8_t channel, mux_cnv; channel = attr->index; + + mutex_lock(&pdata->lock); /* * TODO: add support for conversions * other than single ended with a gain of 1 @@ -107,11 +111,11 @@ static ssize_t voltage_show(struct device *dev, struct device_attribute *da, ret = ads7871_write_reg8(spi, REG_GAIN_MUX, (MUX_CNV_BM | MUX_M3_BM | channel)); if (ret < 0) - return ret; + goto out_unlock; ret = ads7871_read_reg8(spi, REG_GAIN_MUX); if (ret < 0) - return ret; + goto out_unlock; mux_cnv = ((ret & MUX_CNV_BM) >> MUX_CNV_BV); /* * on 400MHz arm9 platform the conversion @@ -121,21 +125,27 @@ static ssize_t voltage_show(struct device *dev, struct device_attribute *da, i++; ret = ads7871_read_reg8(spi, REG_GAIN_MUX); if (ret < 0) - return ret; + goto out_unlock; mux_cnv = ((ret & MUX_CNV_BM) >> MUX_CNV_BV); msleep_interruptible(1); } if (mux_cnv == 0) { val = ads7871_read_reg16(spi, REG_LS_BYTE); - if (val < 0) - return val; + if (val < 0) { + ret = val; + goto out_unlock; + } /*result in volts*10000 = (val/8192)*2.5*10000*/ val = ((val >> 2) * 25000) / 8192; - return sysfs_emit(buf, "%d\n", val); + ret = sysfs_emit(buf, "%d\n", val); + goto out_unlock; } - return -ETIMEDOUT; + ret = -ETIMEDOUT; +out_unlock: + mutex_unlock(&pdata->lock); + return ret; } static SENSOR_DEVICE_ATTR_RO(in0_input, voltage, 0); @@ -194,7 +204,7 @@ static int ads7871_probe(struct spi_device *spi) return -ENOMEM; pdata->spi = spi; - + mutex_init(&pdata->lock); hwmon_dev = devm_hwmon_device_register_with_groups(dev, spi->modalias, pdata, ads7871_groups); -- 2.43.0