From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 F27393BBFBB for ; Wed, 19 Aug 2026 02:46:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787107583; cv=none; b=K8vsymhur16j5GOfEUwLF15CznX3/wI7sq3nJ/acDNykzTgnOXoNAzKfJVLx2BvFwRSve1zlpNhLzNOsiHQNp+7Rcg+tnEJBgoYnKjf0stk9xbEpXRq0y2tlYV76vvDdj2cFl+3Bbw+2qedVDNlyK6NzAyPFtBJHOayrHYCqpq0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787107583; c=relaxed/simple; bh=dHtsMvxseM2mz2bybLgU0nhWzZmvm08/euHluGUf/AU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WXcuIt6Sxs0Os1YZZyfviq5mEA5RIFaiIrWQ7um3da8uvdwEtfdyyYMHVzp+RpvFBq6MaCk+cViEvWQQ1Cf0+91AqmHGuXN2vx5Eh0VubNqqz10Ta1vWbIqMg6t4TbM0RdO9qvBNOTxPIn1m/LREBjv6PPWKz2gusWDbcz8mHSc= 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=OQDpL59U; arc=none smtp.client-ip=209.85.214.180 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="OQDpL59U" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2cc61541f8cso19586135ad.0 for ; Tue, 18 Aug 2026 19:46:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787107581; x=1787712381; 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:content-type; bh=stfjpAJHpr1tI6bk+hzEPHQSEbBIL0+pPuu0CZvvOfk=; b=OQDpL59UQC7ZYrDpFgaESb0VcH9TcVO9Cq5QSDfhttpAr2V6Qh6o+Xh881R4bBPUxs JGlLsYSey/PyOhe/R5hpTSbHgu7Wzjl9mS5H3UXNsYiZp07usX2KkknmPIHUGHUlSJ7J h3NQ5LPsZL7QZ9lvX7BwYoEn5hwJhHamDyAgNAF6aaachpW14QuPf3tl/4CBp5+7wpIE cyLOMQQanc0g7btKLUlsQr7sHm5df/ho++Hw9E9+McwK7uYDlw/4RwZleEVdugLdUMQG 0mpDM8ELG602wVUBxaF87KamF9vys2e0uKMpms82BwJcJgFnnpwwcRh5zvRkw0VCBJeW sNkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787107581; x=1787712381; 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:content-type; bh=stfjpAJHpr1tI6bk+hzEPHQSEbBIL0+pPuu0CZvvOfk=; b=r6jpQL3Ckytz1JzD7kR2e85IqOVneOQprRiUTWQwjHna932/VSyY+w7ZiZH5/OkthW SfhALLQzm0m19IICGQVw+Qn3aL5MV1gZaxKAenjk8AILN6Zm9XNENFYNbMjtnL5VpqYd hPAZvoRT/rUlyIg6sTinx1c0q4ZuWubQ4j/nIFfxvAaP6C4clx+PXhH0/yltTYVGZEqW fabMTECd4Fq0XzV5g4jRrK4dMiyAQvdpst5FUCvb0rFT6HyJjPvwcNpctvsougbHQvcG qfmfsXSxcbLW3Q3GL7KZ2uLXXjfzhpT+D5tHA6dK565lsX4HqMymWaZxFaNAb0NUpenj Spog== X-Forwarded-Encrypted: i=1; AHgh+RrPjxk/Ynw0gKOMrp+WFalhXYbkHLbYxaH/q2oIE3Crk21+Il654CPXyHlG0pmm6KWWV/ddzbVCJ6zNw1g=@vger.kernel.org X-Gm-Message-State: AOJu0YwMehofMZOyIrMTYG1V6DkWsZhhFGP4hPjqeWTjo48sw9K0MSaU OYF2r9Hihe2iRE6F+o9RJ4NfODLFy56jGIhWEEgoYLpSyhdP92jM42s= X-Gm-Gg: AR+sD13ntUVfmypqs5gpkRSuHF3AviQlgJP1bHgnr/fEMR02ELnyKFCAnhRwIHFdvuq v0RxFq3WI4JrwBl5JDeW71XtOuN/+KMnVi8BU+oD6w1JJce/apnRmO8X/w6w/42OtZlKDfu+ZHu JeJVtaPE7I3l6ZIujZZTk3ZzS/meIC9DvAk3PNSIZbO5klgwwesr4nDJpeBiUU8YgFcQRxLx8GV qQCdEVF6r8qNnoIx50ssBgiecMGzm1D8TU/F7+hUZWf0gVhgoo30RciBF6Aw7+9cjsc0isUt+Hz CVnna2hZ3vZfqtUBYeYX73InfaASbeGlvPvlPPO5DfWJlXAVBIZSwM1RfCLlLNZvurFraCzD3DD gvPLYG/KeI7ay2D2hfEbP9HedJ71PEeSAp8mmT+SOJHwWmMhBPC/Ak9cNOatjpc6oT4rCBfXn+X Zl6/l5qtiY5c39UIEFnhFxawR3eD6SEWVHrPpiizAzMTMalndE9AWdd2X5lhN7t5okLSF208JAY UuV2x6nLuD/ X-Received: by 2002:a17:90b:3c88:b0:381:10a3:8b10 with SMTP id 98e67ed59e1d1-3957f9d9267mr2161064a91.14.1787107581222; Tue, 18 Aug 2026 19:46:21 -0700 (PDT) Received: from t-rex ([2401:4900:c271:d798:62eb:64d0:acb1:f42]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327bec30f49sm1502673eec.0.2026.08.18.19.46.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Aug 2026 19:46:20 -0700 (PDT) From: kr494167@gmail.com To: andy.shevchenko@gmail.com, andy@kernel.org, geert@linux-m68k.org Cc: chris.packham@alliedtelesis.co.nz, linux-kernel@vger.kernel.org, Surendra Singh Chouhan Subject: [PATCH 0/3 3/3] auxdisplay: max6959: fix work initialization race and convert to devm_linedisp_register() Date: Wed, 19 Aug 2026 08:15:56 +0530 Message-ID: <20260819024556.63534-4-kr494167@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260819024556.63534-1-kr494167@gmail.com> References: <20260819024556.63534-1-kr494167@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 From: Surendra Singh Chouhan INIT_DELAYED_WORK(&priv->work, max6959_disp_update) was previously called inside max6959_linedisp_get_map_type(), which is invoked during/after linedisp_register(). Initializing a delayed_work structure inside a map query callback can re-initialize an active work item or race with max6959_linedisp_update(). In addition, max6959_i2c_remove() called cancel_delayed_work_sync() before linedisp_unregister(&priv->linedisp), allowing sysfs updates to reschedule work after cancel_delayed_work_sync() completed. Fix these by moving INIT_DELAYED_WORK() to probe(), using devm_add_action_or_reset() for work cancellation, and converting to devm_linedisp_register(). Registering devm_linedisp_register() after work cancellation action ensures proper LIFO teardown order, allowing max6959_i2c_remove() to be removed entirely. Fixes: a9bcd02fa422 ("auxdisplay: Add driver for MAX695x 7-segment LED controllers") Signed-off-by: Surendra Singh Chouhan --- drivers/auxdisplay/max6959.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/auxdisplay/max6959.c b/drivers/auxdisplay/max6959.c index 888788a1ff08..795bdac9af3f 100644 --- a/drivers/auxdisplay/max6959.c +++ b/drivers/auxdisplay/max6959.c @@ -63,11 +63,15 @@ static void max6959_disp_update(struct work_struct *work) regmap_bulk_write(priv->regmap, REG_DIGIT(0), buf, ARRAY_SIZE(buf)); } -static int max6959_linedisp_get_map_type(struct linedisp *linedisp) +static void max6959_cancel_work(void *data) { - struct max6959_priv *priv = container_of(linedisp, struct max6959_priv, linedisp); + struct delayed_work *work = data; - INIT_DELAYED_WORK(&priv->work, max6959_disp_update); + cancel_delayed_work_sync(work); +} + +static int max6959_linedisp_get_map_type(struct linedisp *linedisp) +{ return LINEDISP_MAP_SEG7; } @@ -123,6 +127,11 @@ static int max6959_i2c_probe(struct i2c_client *client) if (!priv) return -ENOMEM; + INIT_DELAYED_WORK(&priv->work, max6959_disp_update); + ret = devm_add_action_or_reset(dev, max6959_cancel_work, &priv->work); + if (ret) + return ret; + priv->regmap = devm_regmap_init_i2c(client, &max6959_regmap_config); if (IS_ERR(priv->regmap)) return PTR_ERR(priv->regmap); @@ -131,7 +140,7 @@ static int max6959_i2c_probe(struct i2c_client *client) if (ret) return ret; - ret = linedisp_register(&priv->linedisp, dev, 4, &max6959_linedisp_ops); + ret = devm_linedisp_register(dev, &priv->linedisp, 4, &max6959_linedisp_ops); if (ret) return ret; @@ -140,14 +149,6 @@ static int max6959_i2c_probe(struct i2c_client *client) return 0; } -static void max6959_i2c_remove(struct i2c_client *client) -{ - struct max6959_priv *priv = i2c_get_clientdata(client); - - cancel_delayed_work_sync(&priv->work); - linedisp_unregister(&priv->linedisp); -} - static int max6959_suspend(struct device *dev) { return max6959_enable(dev_get_drvdata(dev), false); @@ -179,7 +180,6 @@ static struct i2c_driver max6959_i2c_driver = { .of_match_table = max6959_of_table, }, .probe = max6959_i2c_probe, - .remove = max6959_i2c_remove, .id_table = max6959_i2c_id, }; module_i2c_driver(max6959_i2c_driver); -- 2.55.0