From nobody Mon Sep 28 23:53:39 2026 Received: from mail-m155101.qiye.163.com (mail-m155101.qiye.163.com [101.71.155.101]) (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 0926B390CB2 for ; Sat, 15 Aug 2026 07:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=101.71.155.101 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786777845; cv=none; b=BYDtfg0KuZuc7t+3wViH93e7xx1NW4P4SRxdESjjS1T9uuv0nNkireFwCTglrCyzHfNheQn0DtuFPGGoDnbum+g9ePQVorquAAm9673gT5CZwGMivt+SAfm5NhnCE5roYR3IG2G115Kgy3/IGKMQcpY/ubYHFnqMuYpswhTj6Ns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786777845; c=relaxed/simple; bh=ngz+k8IuMTSZvzm1NlWAT5IYQu5w6qlBkCh/s9tc6fg=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=EMIPmGNTemh79oZYPnkJsJcuX8JSxg6V4mqmW7D0mO5COalhx55eqFcKx/J23IWgJQfFy/A2SRRRQXzRV+9XLlrei1SdQRz6PtyxaFqGtsgrT740tIJtNxBVY4UxRekG9d+iZEgy8yCL489VMffM6C0k1l97CI0yg9qMv5y/kx8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=seu.edu.cn; spf=pass smtp.mailfrom=seu.edu.cn; dkim=pass (1024-bit key) header.d=seu.edu.cn header.i=@seu.edu.cn header.b=CZv6qHUF; arc=none smtp.client-ip=101.71.155.101 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=seu.edu.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=seu.edu.cn Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=seu.edu.cn header.i=@seu.edu.cn header.b="CZv6qHUF" Received: from LAPTOP-99KJFSET (unknown [43.138.0.3]) by smtp.qiye.163.com (Hmail) with ESMTP id 4a16a6978; Sat, 15 Aug 2026 15:10:35 +0800 (GMT+08:00) From: Hongyan Xu To: Andy Shevchenko Cc: Andy Shevchenko , Geert Uytterhoeven , Miguel Ojeda , Miguel Ojeda , linux-kernel@vger.kernel.org, Jianhao Xu , Lars Poeschel , Willy Tarreau , Hongyan Xu Subject: [PATCH v2] auxdisplay: charlcd: cancel backlight work on registration failure Date: Sat, 15 Aug 2026 15:10:33 +0800 Message-ID: <20260815071033.1757-1-getshell@seu.edu.cn> X-Mailer: git-send-email 2.50.1.windows.1 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 X-HM-Tid: 0aa00442151303a1kunm6640545180fcf X-HM-MType: 10 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkaS08eVh8eQhkeSUsZTk0fTlYeHw 5VEwETFhoSFyQUDg9ZV1kYEgtZQVlPSFVKSENVS1VIWVdZFhoPEhUdFFlBWU9LSFVKS0lCQ0NMVU pLS1VLWQY+ DKIM-Signature: a=rsa-sha256; b=CZv6qHUFx9PjSnG3eiEg+HSSilbeSkPq2gCAze41wOaY/idgNpzwTv4z10mYWosEU9WDWUG03YqhycfFg5bVfnJ1RjRNfZswdZJZnUtyh/Ogbxq2Jn5J3qlknAvDfbLLqZLO5FQaxAZIrTq360CMoetGPUkwsxJ0SaqhmSFil80=; c=relaxed/relaxed; s=default; d=seu.edu.cn; v=1; bh=uIKnUw0XQMtcATXkge7Bbsf/VLs51tdNo06a3crafA4=; h=date:mime-version:subject:message-id:from; Content-Type: text/plain; charset="utf-8" With CONFIG_CHARLCD_BL_FLASH, charlcd_init() schedules bl_work before charlcd_register() calls misc_register(). If registration fails, the caller frees the charlcd object while delayed work still contains its address. Add charlcd_deinit() to cancel the delayed work and turn the backlight off. Use it for both registration rollback and normal unregistration. Fixes: 39f8ea46724e ("auxdisplay: charlcd: Extract character LCD core from = misc/panel") Reviewed-by: Geert Uytterhoeven Signed-off-by: Hongyan Xu --- Changes in v2: - Factor the backlight cleanup into charlcd_deinit() and reuse it from charlcd_unregister() (Andy, Geert). - Add the Fixes tag (Andy). drivers/auxdisplay/charlcd.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c index 09020bb8ad15..ae2692ec3963 100644 --- a/drivers/auxdisplay/charlcd.c +++ b/drivers/auxdisplay/charlcd.c @@ -595,6 +595,16 @@ static int charlcd_init(struct charlcd *lcd) return 0; } =20 +static void charlcd_deinit(struct charlcd *lcd) +{ + struct charlcd_priv *priv =3D charlcd_to_priv(lcd); + + if (lcd->ops->backlight) { + cancel_delayed_work_sync(&priv->bl_work); + lcd->ops->backlight(lcd, CHARLCD_OFF); + } +} + struct charlcd *charlcd_alloc(unsigned int drvdata_size) { struct charlcd_priv *priv; @@ -654,8 +664,10 @@ int charlcd_register(struct charlcd *lcd) return ret; =20 ret =3D misc_register(&charlcd_dev); - if (ret) + if (ret) { + charlcd_deinit(lcd); return ret; + } =20 the_charlcd =3D lcd; register_reboot_notifier(&panel_notifier); @@ -665,16 +677,11 @@ EXPORT_SYMBOL_GPL(charlcd_register); =20 int charlcd_unregister(struct charlcd *lcd) { - struct charlcd_priv *priv =3D charlcd_to_priv(lcd); - unregister_reboot_notifier(&panel_notifier); charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-"); misc_deregister(&charlcd_dev); the_charlcd =3D NULL; - if (lcd->ops->backlight) { - cancel_delayed_work_sync(&priv->bl_work); - priv->lcd.ops->backlight(&priv->lcd, CHARLCD_OFF); - } + charlcd_deinit(lcd); =20 return 0; } --=20 2.50.1.windows.1