From nobody Thu Apr 2 10:37:58 2026 Received: from mail-qv1-f43.google.com (mail-qv1-f43.google.com [209.85.219.43]) (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 EF40C28643C for ; Mon, 16 Feb 2026 01:55:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771206904; cv=none; b=NR9KwzgL7PoEcoggo8FSyYFDDzdf8qAzKxvkdO36yb66+hse7BOsZv2NfbRVV8OMMqSsiTq3dMdtjoHNqzrwfNguXBnFLVD8VONx0WAVqoQi4iAovjt2L2pbawff4s2XXKnOyWGWX76vIt9h9UuNGToFMyhzyIS0AHtd//QG9KM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771206904; c=relaxed/simple; bh=KsWPbtp7dclOQsts4hkX/EvpcaH3CkHz85VewowG1As=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dmoYbmzHybqqerXMreNvrZNzEBO7RJjAK/jHgLHivbaOuAsG9Xc04C6Dv6DWUg+EsqrpyTrHmJsOAkiWv7qVYC1TVwvIq+gj+fyZARm9YnCRmdLv5dgbuh+11Kf5KOG2tHSLPl/s5JOeOLVloMeJkDdMymqP5LqJejuN3cEztRY= 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=GlDJUXuV; arc=none smtp.client-ip=209.85.219.43 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="GlDJUXuV" Received: by mail-qv1-f43.google.com with SMTP id 6a1803df08f44-896f82e5961so44322136d6.0 for ; Sun, 15 Feb 2026 17:55:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771206901; x=1771811701; 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=kpXlIWLRWovA3pP6LHlXyJYMgADVO8vHpsAgvc24yB8=; b=GlDJUXuVnlnDaOhFAOhUN6E88wIKc500wV4IG5zjdCUDhIbCcmCz5VW4e1xWyzJYAj NHiyyoXgPQ3TRmjdSmYnjrbeMcDq9nEsLLx4mP3zrW/qtDy4BvuRvHVzIVnTXowT94a5 FGIE1L1wfYGKjYAyVXz3O9woFD9zkW8nmwTemQqW3T0vK98bLtj4YS/55wmMNCQJBzv8 BtDbf/v0atQwNw4Z+rvbpeEMa2AxtGoC9RuppLi2OkQmK6Hqlz7/k6k8Lt9IKNOhgLH0 kB91kbvL35mvn20D8cecf0d86nOmGaZGtTgJhKspkZOR6xAnUYcCugb4fiHKEIY4UPJ8 szcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771206901; x=1771811701; 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=kpXlIWLRWovA3pP6LHlXyJYMgADVO8vHpsAgvc24yB8=; b=IwNyUnXyiUiw0VV8+52t4ExXb/62+wdROP2rpM5zg4EM6HZjXI7U2NGspfjo+8OavG XXe4HmnC95Z6eUFirZsJICknpQv3lVYymLokOsCgd9qn1GLu110TugRfWaA5rxIEhd8O URuxy/ExycGHuTUq/3spafmrmTjlLRhBaS99/sCG9+T9uB3on+4gVGt1P8mPhgZ/0S3B AHLJeRYqQ/lsHalXHN/q9dj2p2nv3Pc0aizErECzsaqRNBLMoB7JVx0+o8n2PNYdnqsZ mKUigFXJXou1NfDiwRCnOKa96Xi5w10dLema8jfhvwX92O1Gvo9jaiKMhrzsj9vbJDZk jHRg== X-Forwarded-Encrypted: i=1; AJvYcCU5Ux3V5ZtqcbdlyNsHe/o94kMqJ/xmGE3hZ0q7DpHUqhiqoAFbcg09XiWfurzv6TJmbv22DYdQ5tOD72Y=@vger.kernel.org X-Gm-Message-State: AOJu0YxRBKwHDb+RcefXh6MgjXfslHVEiWPFCsuiIu2qkXRPTMITkNIP pSw/sEGQmrAReIIrR2Ju1v/j1T12AH0UTjTaMPkEc0xwXFVgymL9EPmu X-Gm-Gg: AZuq6aLVU87FfEKojQsrEksEv67afxELYCkqY+hO/lvHi0C61xac9xI2RX9ViS4le6L b8kk7WqdTdp8DguX2mB5PZs/HJP11VPLokpN2W1wPd3SDCGBvs/SMFD5MPZs4XbLTH1vh68UWfW 1gu+Ueuob0wkw2rmsXJvd7RI7fmlNimO+6pXEb5cJbCSpZv91MgLVn1G3TQKDw9Ncn3TymjfOpX 1LljhGHsQB0DjBmFICO1DcfsaLiWl10Cs0scllaZpMhC3CbZ1Uj2OIhxPpcHDROo1/HAlPAjid5 TtntQo4O7r8woo4rRUicFL2HzJ6AXEfHObsy423VGNnYBxyvjcJHkj7OyE9IerIZpKexVqxpQe9 TmVvP/2ZZktKs0DPJSES1QIsBb3KfKpkqhcn3kMzcuS+LevY7BxsePZTETS7u/PNqwmq1l5CGe7 h1ZXFZU2ZNNahKtYkuZ7UbPIkujq6S+fGIKUou1/tY/w== X-Received: by 2002:ad4:5d6b:0:b0:895:4cc2:8bfe with SMTP id 6a1803df08f44-8974049b5ffmr95098266d6.48.1771206900921; Sun, 15 Feb 2026 17:55:00 -0800 (PST) Received: from localhost.localdomain ([50.21.71.60]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-506849fbb9dsm126926161cf.15.2026.02.15.17.55.00 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 15 Feb 2026 17:55:00 -0800 (PST) From: Neel Bullywon To: jic23@kernel.org Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Neel Bullywon Subject: [PATCH v7 1/3] iio: magnetometer: bmc150_magn: use automated cleanup for mutex Date: Sun, 15 Feb 2026 20:54:52 -0500 Message-ID: <20260216015454.61836-2-neelb2403@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20260216015454.61836-1-neelb2403@gmail.com> References: <20260216015454.61836-1-neelb2403@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: quoted-printable Content-Type: text/plain; charset="utf-8" Use guard() and scoped_guard() to replace manual mutex lock/unlock calls. This simplifies error handling and ensures RAII-style cleanup. guard() is used in read_raw, write_raw, trig_reen, trigger_set_state, suspend, and resume. Case blocks using guard() in read_raw and write_raw are wrapped in braces at the case label level to ensure clear scope for the cleanup guards. scoped_guard() is used in remove and runtime_suspend where a short mutex-protected scope is needed for a single function call. The trigger_handler function is left unchanged as mixing guard() with goto error paths can be fragile. Signed-off-by: Neel Bullywon --- drivers/iio/magnetometer/bmc150_magn.c | 109 ++++++++++--------------- 1 file changed, 41 insertions(+), 68 deletions(-) diff --git a/drivers/iio/magnetometer/bmc150_magn.c b/drivers/iio/magnetome= ter/bmc150_magn.c index 6a73f6e2f1f0..ff6196c86e6b 100644 --- a/drivers/iio/magnetometer/bmc150_magn.c +++ b/drivers/iio/magnetometer/bmc150_magn.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -453,33 +454,29 @@ static int bmc150_magn_read_raw(struct iio_dev *indio= _dev, s32 values[AXIS_XYZ_MAX]; =20 switch (mask) { - case IIO_CHAN_INFO_RAW: + case IIO_CHAN_INFO_RAW: { if (iio_buffer_enabled(indio_dev)) return -EBUSY; - mutex_lock(&data->mutex); + + guard(mutex)(&data->mutex); =20 ret =3D bmc150_magn_set_power_state(data, true); - if (ret < 0) { - mutex_unlock(&data->mutex); + if (ret < 0) return ret; - } =20 ret =3D bmc150_magn_read_xyz(data, values); if (ret < 0) { bmc150_magn_set_power_state(data, false); - mutex_unlock(&data->mutex); return ret; } *val =3D values[chan->scan_index]; =20 ret =3D bmc150_magn_set_power_state(data, false); - if (ret < 0) { - mutex_unlock(&data->mutex); + if (ret < 0) return ret; - } =20 - mutex_unlock(&data->mutex); return IIO_VAL_INT; + } case IIO_CHAN_INFO_SCALE: /* * The API/driver performs an off-chip temperature @@ -527,48 +524,39 @@ static int bmc150_magn_write_raw(struct iio_dev *indi= o_dev, int ret; =20 switch (mask) { - case IIO_CHAN_INFO_SAMP_FREQ: + case IIO_CHAN_INFO_SAMP_FREQ: { if (val > data->max_odr) return -EINVAL; - mutex_lock(&data->mutex); - ret =3D bmc150_magn_set_odr(data, val); - mutex_unlock(&data->mutex); - return ret; + guard(mutex)(&data->mutex); + return bmc150_magn_set_odr(data, val); + } case IIO_CHAN_INFO_OVERSAMPLING_RATIO: switch (chan->channel2) { case IIO_MOD_X: - case IIO_MOD_Y: + case IIO_MOD_Y: { if (val < 1 || val > 511) return -EINVAL; - mutex_lock(&data->mutex); + guard(mutex)(&data->mutex); ret =3D bmc150_magn_set_max_odr(data, val, 0, 0); - if (ret < 0) { - mutex_unlock(&data->mutex); + if (ret < 0) return ret; - } - ret =3D regmap_update_bits(data->regmap, + return regmap_update_bits(data->regmap, BMC150_MAGN_REG_REP_XY, BMC150_MAGN_REG_REP_DATAMASK, - BMC150_MAGN_REPXY_TO_REGVAL - (val)); - mutex_unlock(&data->mutex); - return ret; - case IIO_MOD_Z: + BMC150_MAGN_REPXY_TO_REGVAL(val)); + } + case IIO_MOD_Z: { if (val < 1 || val > 256) return -EINVAL; - mutex_lock(&data->mutex); + guard(mutex)(&data->mutex); ret =3D bmc150_magn_set_max_odr(data, 0, val, 0); - if (ret < 0) { - mutex_unlock(&data->mutex); + if (ret < 0) return ret; - } - ret =3D regmap_update_bits(data->regmap, + return regmap_update_bits(data->regmap, BMC150_MAGN_REG_REP_Z, BMC150_MAGN_REG_REP_DATAMASK, - BMC150_MAGN_REPZ_TO_REGVAL - (val)); - mutex_unlock(&data->mutex); - return ret; + BMC150_MAGN_REPZ_TO_REGVAL(val)); + } default: return -EINVAL; } @@ -782,9 +770,8 @@ static void bmc150_magn_trig_reen(struct iio_trigger *t= rig) if (!data->dready_trigger_on) return; =20 - mutex_lock(&data->mutex); + guard(mutex)(&data->mutex); ret =3D bmc150_magn_reset_intr(data); - mutex_unlock(&data->mutex); if (ret) dev_err(data->dev, "Failed to reset interrupt\n"); } @@ -794,32 +781,28 @@ static int bmc150_magn_data_rdy_trigger_set_state(str= uct iio_trigger *trig, { struct iio_dev *indio_dev =3D iio_trigger_get_drvdata(trig); struct bmc150_magn_data *data =3D iio_priv(indio_dev); - int ret =3D 0; + int ret; + + guard(mutex)(&data->mutex); =20 - mutex_lock(&data->mutex); if (state =3D=3D data->dready_trigger_on) - goto err_unlock; + return 0; =20 ret =3D regmap_update_bits(data->regmap, BMC150_MAGN_REG_INT_DRDY, BMC150_MAGN_MASK_DRDY_EN, state << BMC150_MAGN_SHIFT_DRDY_EN); if (ret < 0) - goto err_unlock; + return ret; =20 data->dready_trigger_on =3D state; =20 if (state) { ret =3D bmc150_magn_reset_intr(data); if (ret < 0) - goto err_unlock; + return ret; } - mutex_unlock(&data->mutex); =20 return 0; - -err_unlock: - mutex_unlock(&data->mutex); - return ret; } =20 static const struct iio_trigger_ops bmc150_magn_trigger_ops =3D { @@ -980,9 +963,8 @@ void bmc150_magn_remove(struct device *dev) if (data->dready_trig) iio_trigger_unregister(data->dready_trig); =20 - mutex_lock(&data->mutex); - bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true); - mutex_unlock(&data->mutex); + scoped_guard(mutex, &data->mutex) + bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true); =20 regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators); } @@ -995,10 +977,9 @@ static int bmc150_magn_runtime_suspend(struct device *= dev) struct bmc150_magn_data *data =3D iio_priv(indio_dev); int ret; =20 - mutex_lock(&data->mutex); - ret =3D bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SLEEP, - true); - mutex_unlock(&data->mutex); + scoped_guard(mutex, &data->mutex) + ret =3D bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SLEEP, + true); if (ret < 0) { dev_err(dev, "powering off device failed\n"); return ret; @@ -1024,28 +1005,20 @@ static int bmc150_magn_suspend(struct device *dev) { struct iio_dev *indio_dev =3D dev_get_drvdata(dev); struct bmc150_magn_data *data =3D iio_priv(indio_dev); - int ret; - - mutex_lock(&data->mutex); - ret =3D bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SLEEP, - true); - mutex_unlock(&data->mutex); =20 - return ret; + guard(mutex)(&data->mutex); + return bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SLEEP, + true); } =20 static int bmc150_magn_resume(struct device *dev) { struct iio_dev *indio_dev =3D dev_get_drvdata(dev); struct bmc150_magn_data *data =3D iio_priv(indio_dev); - int ret; - - mutex_lock(&data->mutex); - ret =3D bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_NORMAL, - true); - mutex_unlock(&data->mutex); =20 - return ret; + guard(mutex)(&data->mutex); + return bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_NORMAL, + true); } #endif =20 --=20 2.44.0