From patchwork Tue Sep 20 11:28:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Nuno Sa X-Patchwork-Id: 12982029 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 99D63C54EE9 for ; Tue, 20 Sep 2022 11:48:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:CC:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=YEb0Xz/mTRQedo1Qc5fCvpWgbtEbzhpaE0bupA54FOw=; b=V+fDfaainkc6fO jKcuroutDyVt/5SdMhKG5K+jJFhYdTvpiLRS98QhlSnk/yd0cYNN9IvuGQMgLL+ateSDp0r4K2NN5 Akfunf5n2OAr2mlnTf8GziI1an8h5MxsN2zms4CdFSyLWVJ98lHTsYrrN1HsLzbfOSkZURbDntPis c/GT8r3yN25n/t5v7gVgZ6Ccup4gUjH/L4tVPhVWT5tOWrvePpD4pfvXf1VH4kFTSfXeK2k7Ub5i7 Vc7rfs8PLYn5Ec4xkPY2Nf1Awy0SRMlsH/ce3othjZ4aO6/DIxjlzhbF9YE4J7pCDWeGPlf8K01H8 WUF3PNx5Wz/KSuvuDhng==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oabYv-003NuS-Ic; Tue, 20 Sep 2022 11:37:14 +0000 Received: from mx0a-00128a01.pphosted.com ([148.163.135.77]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oabQz-003IhE-O5; Tue, 20 Sep 2022 11:29:03 +0000 Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 28K89WMQ025052; Tue, 20 Sep 2022 07:28:48 -0400 Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 3jpn468r58-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 20 Sep 2022 07:28:47 -0400 Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 28KBSkpC060735 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 20 Sep 2022 07:28:46 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.14; Tue, 20 Sep 2022 07:28:45 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.986.14 via Frontend Transport; Tue, 20 Sep 2022 07:28:45 -0400 Received: from nsa.ad.analog.com ([10.44.3.57]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 28KBR4Ua021723; Tue, 20 Sep 2022 07:28:37 -0400 From: =?utf-8?q?Nuno_S=C3=A1?= To: , , , , CC: Chunyan Zhang , Michael Hennerich , Martin Blumenstingl , Sascha Hauer , Cixi Geng , Kevin Hilman , Vladimir Zapolskiy , Pengutronix Kernel Team , Alexandru Ardelean , Fabio Estevam , Andriy Tryshnivskyy , Haibo Chen , Shawn Guo , Hans de Goede , Miquel Raynal , Jerome Brunet , Heiko Stuebner , Florian Boor , Ciprian Regus , Lars-Peter Clausen , Andy Shevchenko , Jonathan Cameron , Neil Armstrong , Baolin Wang , Jyoti Bhayana , =?utf-8?q?Nuno_S=C3=A1?= , Chen-Yu Tsai , Orson Zhai Subject: [PATCH 14/15] iio: health: max30102: do not use internal iio_dev lock Date: Tue, 20 Sep 2022 13:28:20 +0200 Message-ID: <20220920112821.975359-15-nuno.sa@analog.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20220920112821.975359-1-nuno.sa@analog.com> References: <20220920112821.975359-1-nuno.sa@analog.com> MIME-Version: 1.0 X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-ORIG-GUID: MuvilLkh7mxYwEDAcPLub34gb4zuKQJ6 X-Proofpoint-GUID: MuvilLkh7mxYwEDAcPLub34gb4zuKQJ6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-20_02,2022-09-16_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 phishscore=0 clxscore=1015 spamscore=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 malwarescore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2209200068 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220920_042901_827293_83E1E166 X-CRM114-Status: GOOD ( 21.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The pattern used in this device does not quite fit in the iio_device_claim_direct_mode() typical usage. In this case, iio_buffer_enabled() was being used not to prevent the raw access but to decide whether or not the device needs to be powered on before. If buffering, then the device is already on. To guarantee the same behavior, a combination of locks is being used: 1. Use iio_device_claim_direct_mode() to check if direct mode can be claimed and if we can, then we keep it until the reading is done (which also means the device will be powered on and off); 2. If already buffering, we need to make sure that buffering is not disabled (and hence, powering off the device) while doing a raw read. For that, we can make use of the local lock that already exists. Signed-off-by: Nuno Sá --- drivers/iio/health/max30102.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/drivers/iio/health/max30102.c b/drivers/iio/health/max30102.c index abbcef563807..e984c78b99f6 100644 --- a/drivers/iio/health/max30102.c +++ b/drivers/iio/health/max30102.c @@ -227,9 +227,20 @@ static int max30102_buffer_postenable(struct iio_dev *indio_dev) static int max30102_buffer_predisable(struct iio_dev *indio_dev) { struct max30102_data *data = iio_priv(indio_dev); + int ret; + + /* + * As stated in the comment in the read_raw() function, temperature + * can only be acquired if the engine is running. As such the mutex + * is used to make sure we do not power down while doing a temperature + * reading. + */ + mutex_lock(&data->lock); + ret = max30102_set_powermode(data, MAX30102_REG_MODE_CONFIG_MODE_NONE, + false); + mutex_unlock(&data->lock); - return max30102_set_powermode(data, MAX30102_REG_MODE_CONFIG_MODE_NONE, - false); + return ret; } static const struct iio_buffer_setup_ops max30102_buffer_setup_ops = { @@ -477,12 +488,14 @@ static int max30102_read_raw(struct iio_dev *indio_dev, * Temperature reading can only be acquired when not in * shutdown; leave shutdown briefly when buffer not running */ - mutex_lock(&indio_dev->mlock); - if (!iio_buffer_enabled(indio_dev)) + if (!iio_device_claim_direct_mode(indio_dev)) { ret = max30102_get_temp(data, val, true); - else + iio_device_release_direct_mode(indio_dev); + } else { + mutex_lock(&data->lock); ret = max30102_get_temp(data, val, false); - mutex_unlock(&indio_dev->mlock); + mutex_unlock(&data->lock); + } if (ret) return ret;