From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9290C4E50A2; Mon, 19 Oct 2026 13:05:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792415152; cv=none; b=Icq0FhEnhqyXJKxIWx+A5GBgvtn9ksJszVmINtoH6DVxMPb3dkIphZTeoH6PQ+C5J7zIiKDsTJi0U5VyzhepGw1nSplUdtCAqon2nhsRzuWzzrDDGsDP58c6wwOJidYQblCScSbu+C3qxCEmoiZW93N/9AVcXljUnqwx67uOxCk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792415152; c=relaxed/simple; bh=3Ijrg3nEW+Z17uhEmZsWAsOO3cT9MIRzO2ioDezjdyU=; h=From:To:Cc:Subject:Message-ID:In-Reply-To:References:MIME-Version: Date:Content-Type; b=tuaxGxFS00nUXL1oNTpFYBSJtGDl9NvAHeImMIeJOz3oPDnfQVWUJTK77AApg5KimOL7K1XUr+s6Tf6bsFqs9BcbBBw0VFQXmxb/wLRE/RMRljPhiZidfOm0NLs9i6qV2imTCviJkHsgB2jvjm3EFr8KV4W5GRj9n8SYh5CCIqI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ra2+o0mG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ra2+o0mG" Received: by smtp.kernel.org (Postfix) with ESMTPS id 0BB01C2BD00; Mon, 19 Oct 2026 13:05:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1792415152; bh=3Ijrg3nEW+Z17uhEmZsWAsOO3cT9MIRzO2ioDezjdyU=; h=From:To:Cc:Subject:In-Reply-To:References:Date:Reply-To:From; b=ra2+o0mGX8n/DndFX5/8mCiymm8uBR61LUtcji4+ocdNJGPjDobg3nT8IpoivUT3q isR/tjokCbGuoHfaaKeWd9d1t9ICP0fI3ZXvHm91UzU3ZVH7pCTEE286vftqkl3ORZ Uj6BYVP5E18XVtLVaY8UyfMOAaNJzxKSLowjDrqJl38Auglc4hXvbo2fUID3p+s02F fI50CqDxDW5kXKThLiwys3VQGViX/nGQ0ssGhv6Acyzo/tuPQHtaM4ICJPaG520fuK aKEukE/tb3GeN2VtFiM80vduY8pHHvqOGa10DK6nCzQyoxQ3lEr7krojekVN//6QrC VykaUZd/U1QlQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3FAFCCF2DB; Mon, 19 Oct 2026 13:05:51 +0000 (UTC) From: Wenqiang Zhao via B4 Relay To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich Cc: David Lechner , Andy Shevchenko , Andy Shevchenko , linux@analog.com, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Lothar Rubusch , Joshua Crofts Subject: [PATCH v4] iio: accel: adxl345: separate event state from query errors Message-ID: <20261019-adxl345-event-v4-1@gmail.com> In-Reply-To: <20261018-adxl345-event-state-v3-1@gmail.com> References: <20261018-adxl345-event-state-v3-1@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Date: Mon, 19 Oct 2026 21:05:20 +0800 X-Mailer: b4 0.16.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Developer-Signature: v=1; a=ed25519-sha256; t=1792415121; l=7771; i=berringtoni36@gmail.com; s=review-20261018; h=from:subject:message-id; bh=t6MX/8oGIufvmp0907rushGQ7MJGcxeEuUhw9O58mVY=; b=+iD6jIob0adQBB1sjk0Xq5Pw44m5vRn96DkCexoxkzhaufm15fjX1fwISukvuOG/es5J6//Er wCJVik6qpHYB0zorUtTwkVqt5wygZCGkANYyJlk0mgQ7fSei05z/VdS X-Developer-Key: i=berringtoni36@gmail.com; a=ed25519; pk=rRiAvRvS4MMqogNnloZgVnqWliVWNDq+PcP6vMYXOvs= X-Endpoint-Received: by B4 Relay for berringtoni36@gmail.com/review-20261018 with auth_id=1226 X-Original-From: Wenqiang Zhao Reply-To: berringtoni36@gmail.com From: Wenqiang Zhao The activity/inactivity query helpers return either a boolean result or a negative regmap error. adxl345_read_mag_config() converts the latter to 1 with !!, reporting a failed read as an enabled event. The disable path also turns a coupling query error into a successful write. Return query status separately from the boolean result by passing bool output parameters to both helpers. Rename them from is_* to get_* and update the event read, disable and link-bit callers to check the status before using the result. Preserve the successful coupling-mismatch no-op when disabling an event. Fixes: 66a1af6d8a63 ("iio: accel: adxl345: add activity event feature") Fixes: 31f7679bb69a ("iio: accel: adxl345: add coupling detection for activity/inactivity") Assisted-by: LLM Signed-off-by: Wenqiang Zhao --- v4: - Return directly from the coupling-query switch cases, as Andy suggested. - Check query errors inside each event-read direction case. v3: - Return query status separately from bool output parameters. - Update the coupling helper and all event-read, disable and link-bit callers. - Combine the previous two patches because both paths share the helpers. Validation: 534 host function-chain cases pass with UBSan, including register-read fault injection, link-bit updates and free-fall queries. The upstream baseline reproduces 36 event-read and 12 event-disable failures. No full kernel build or sensor hardware test was performed. Assistance: Codex implemented the requested control-flow changes and reran the existing host tests. drivers/iio/accel/adxl345_core.c | 94 ++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 37 deletions(-) diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c index 6c9080d88c60bde088c3a00083bfe0f0c111bc89..e5b5075e41f6c037f0c6a40410aa81d2507083c9 100644 --- a/drivers/iio/accel/adxl345_core.c +++ b/drivers/iio/accel/adxl345_core.c @@ -463,27 +463,25 @@ static int adxl345_set_inact_time(struct adxl345_state *st, u32 val_int, } /** - * adxl345_is_act_inact_ac() - Verify if AC or DC coupling is currently enabled. - * + * adxl345_get_act_inact_ac() - Check the configured coupling. * @st: The device data. * @type: The activity or inactivity type. + * @matches: Whether the configured coupling matches the provided type. * - * Given a type of activity / inactivity combined with either AC coupling set or - * default to DC, this function verifies if the combination is currently - * configured, hence enabled or not. - * - * Return: true if configured coupling matches the provided type, else a negative - * error value. + * Return: 0 on success, or a negative error value. */ -static int adxl345_is_act_inact_ac(struct adxl345_state *st, - enum adxl345_activity_type type) +static int adxl345_get_act_inact_ac(struct adxl345_state *st, + enum adxl345_activity_type type, + bool *matches) { unsigned int regval; bool coupling; int ret; - if (type == ADXL345_INACTIVITY_FF) - return true; + if (type == ADXL345_INACTIVITY_FF) { + *matches = true; + return 0; + } ret = regmap_read(st->regmap, ADXL345_REG_ACT_INACT_CTRL, ®val); if (ret) @@ -494,10 +492,12 @@ static int adxl345_is_act_inact_ac(struct adxl345_state *st, switch (type) { case ADXL345_ACTIVITY: case ADXL345_INACTIVITY: - return coupling == ADXL345_COUPLING_DC; + *matches = coupling == ADXL345_COUPLING_DC; + return 0; case ADXL345_ACTIVITY_AC: case ADXL345_INACTIVITY_AC: - return coupling == ADXL345_COUPLING_AC; + *matches = coupling == ADXL345_COUPLING_AC; + return 0; default: return -EINVAL; } @@ -567,14 +567,17 @@ static int adxl345_set_act_inact_ac(struct adxl345_state *st, adxl345_act_acdc_msk[type], act_inact_ac); } -static int adxl345_is_act_inact_en(struct adxl345_state *st, - enum adxl345_activity_type type) +static int adxl345_get_act_inact_en(struct adxl345_state *st, + enum adxl345_activity_type type, + bool *enabled) { unsigned int axis_ctrl; unsigned int regval; bool int_en, en; int ret; + *enabled = false; + ret = regmap_read(st->regmap, ADXL345_REG_ACT_INACT_CTRL, &axis_ctrl); if (ret) return ret; @@ -585,13 +588,13 @@ static int adxl345_is_act_inact_en(struct adxl345_state *st, case ADXL345_ACTIVITY_AC: en = FIELD_GET(ADXL345_ACT_XYZ_EN, axis_ctrl); if (!en) - return false; + return 0; break; case ADXL345_INACTIVITY: case ADXL345_INACTIVITY_AC: en = FIELD_GET(ADXL345_INACT_XYZ_EN, axis_ctrl); if (!en) - return false; + return 0; break; case ADXL345_INACTIVITY_FF: en = true; @@ -607,37 +610,39 @@ static int adxl345_is_act_inact_en(struct adxl345_state *st, int_en = adxl345_act_int_reg[type] & regval; if (!int_en) - return false; + return 0; /* Check if configured coupling matches provided type */ - return adxl345_is_act_inact_ac(st, type); + return adxl345_get_act_inact_ac(st, type, enabled); } static int adxl345_set_act_inact_linkbit(struct adxl345_state *st, enum adxl345_activity_type type, bool en) { - int act_ac_en, inact_ac_en; - int act_en, inact_en; + bool act_ac_en, inact_ac_en; + bool act_en, inact_en; + int ret; - act_en = adxl345_is_act_inact_en(st, ADXL345_ACTIVITY); - if (act_en < 0) - return act_en; + ret = adxl345_get_act_inact_en(st, ADXL345_ACTIVITY, &act_en); + if (ret) + return ret; - act_ac_en = adxl345_is_act_inact_en(st, ADXL345_ACTIVITY_AC); - if (act_ac_en < 0) - return act_ac_en; + ret = adxl345_get_act_inact_en(st, ADXL345_ACTIVITY_AC, &act_ac_en); + if (ret) + return ret; if (type == ADXL345_INACTIVITY_FF) { inact_en = false; } else { - inact_en = adxl345_is_act_inact_en(st, ADXL345_INACTIVITY); - if (inact_en < 0) - return inact_en; + ret = adxl345_get_act_inact_en(st, ADXL345_INACTIVITY, &inact_en); + if (ret) + return ret; - inact_ac_en = adxl345_is_act_inact_en(st, ADXL345_INACTIVITY_AC); - if (inact_ac_en < 0) - return inact_ac_en; + ret = adxl345_get_act_inact_en(st, ADXL345_INACTIVITY_AC, + &inact_ac_en); + if (ret) + return ret; inact_en = inact_en || inact_ac_en; } @@ -656,6 +661,7 @@ static int adxl345_set_act_inact_en(struct adxl345_state *st, unsigned int axis_ctrl; unsigned int threshold; unsigned int period; + bool matches; int ret; if (cmd_en) { @@ -692,7 +698,10 @@ static int adxl345_set_act_inact_en(struct adxl345_state *st, * current call attempts to turn off a DC-coupled activity, this * inconsistency should be detected here. */ - if (adxl345_is_act_inact_ac(st, type) <= 0) + ret = adxl345_get_act_inact_ac(st, type, &matches); + if (ret) + return ret; + if (!matches) return 0; } @@ -1174,14 +1183,25 @@ static int adxl345_read_mag_config(struct adxl345_state *st, enum adxl345_activity_type type_act, enum adxl345_activity_type type_inact) { + bool enabled; + int ret; + switch (dir) { case IIO_EV_DIR_RISING: - return !!adxl345_is_act_inact_en(st, type_act); + ret = adxl345_get_act_inact_en(st, type_act, &enabled); + if (ret) + return ret; + break; case IIO_EV_DIR_FALLING: - return !!adxl345_is_act_inact_en(st, type_inact); + ret = adxl345_get_act_inact_en(st, type_inact, &enabled); + if (ret) + return ret; + break; default: return -EINVAL; } + + return enabled; } static int adxl345_write_mag_config(struct adxl345_state *st, base-commit: 9ee8306121495d2a25aa5d1bfd519f2748786b83