From nobody Fri Dec 19 15:44:51 2025 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 54BFA3446C6; Wed, 5 Nov 2025 19:52:55 +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=1762372375; cv=none; b=kqvgX3OQ9LJETs3fMObBz5Orf7Defzk8Qz1Kuvsmqye3gccOoD1C/9fo2Ewgbs6W5z5cW0ImwAjIGw91IZHGnuGdvPRBw3FrAZMDNUYok5knVdH6uBItX0RHIUh/xvRstNhgq1bwkVYSKJgpMriTK9U9m2O3qtmaSq8wlusEPmc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762372375; c=relaxed/simple; bh=U+QvbDkpaf3iiW8wMbRoxmFLPrrGzAULeGqeGxjatsY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XmUcKtBcd5H6D0bZIQp6XAJkM55O9/qyGMFyq3TSbSHypI9rFt50VGI99Ehsm84StlNMaK5Y6sPO0kXqqBdCiPii9HMc6oZpVInFPP/Y1qwyeiokU/CNboBMcvcyv8jJKU8KIxqgbq+G7bR3uNMrjJGdoj9wdl0zw9LF7yMd9QQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LrghAsRB; 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="LrghAsRB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2DA61C116C6; Wed, 5 Nov 2025 19:52:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1762372374; bh=U+QvbDkpaf3iiW8wMbRoxmFLPrrGzAULeGqeGxjatsY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LrghAsRBfUX40e18MYZ4LNzb8Whxm4OkYFzUYhFKvNFaIHk8qJ522gbUozKOBZv3j 8kZReKIMeRNYvm7ueit9BOxfPFxwjOMl1QLix5G8xsI17lI8UIQ4ZMv19U4MU8KB0V CAjagFDcZHZ2w7d4SXnlXOGP7vnOGJ3NPgODHjExiDFTnXjyJKdfZ8KETgyPnmWjHR bhhfUFGvalw//mkof3tuoUHk/CI18yW9V8F2p8Ncp20/+jxsGTkptrulHYfJjc4Vf6 NysI9m0Gw8ADXUltqtGROC/orzXAnNFMyTZmDkGOGz75pNq/TFkXmjbUM3E1EwyhT1 nYP9rjhtUK+PQ== From: akemnade@kernel.org Date: Wed, 05 Nov 2025 20:52:36 +0100 Subject: [PATCH v3 2/3] Input: twl4030 - add TWL603x power button Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251105-twl6030-button-v3-2-9b37eb2b0989@kernel.org> References: <20251105-twl6030-button-v3-0-9b37eb2b0989@kernel.org> In-Reply-To: <20251105-twl6030-button-v3-0-9b37eb2b0989@kernel.org> To: Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Andreas Kemnade , Dmitry Torokhov , Tony Lindgren , Kevin Hilman Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, linux-omap@vger.kernel.org, Andreas Kemnade X-Mailer: b4 0.15-dev-a6db3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3834; i=akemnade@kernel.org; h=from:subject:message-id; bh=cXdiSFoOQjIF/JLmwyIa+OOXmaHNkrjxPnKrQetGb+Q=; b=owGbwMvMwCUm/rzkS6lq2x3G02pJDJncq3lfSJU9cVKNu66fbprxYfpvnQMaFy4yVzLkySg/r l53/FZQRykLgxgXg6yYIssvawW3TyrPcoOnRtjDzGFlAhnCwMUpABMp2M/wv1zF5Lf+h2UJe1+w uFkc3hXf+F/v//vdUfrah7MPrp0ey8DIMGPlohvhlgrc875yBO5b/F9uxr2bzK+DpZat9i1oTZ5 QyA4A X-Developer-Key: i=akemnade@kernel.org; a=openpgp; fpr=EEC0DB858E66C0DA70620AC07DBD6AC74DE29324 From: Andreas Kemnade Like the TWL4030, these PMICs also have a power button feature, so extend the TWL4030 power button driver. As the irqchip of the TWL6030 mfd driver does not provide mask, unmask finctions, do it manually. Signed-off-by: Andreas Kemnade --- drivers/input/misc/twl4030-pwrbutton.c | 61 ++++++++++++++++++++++++++++++= +--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/tw= l4030-pwrbutton.c index f85cc289c053..b72fba9a1b2c 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c @@ -25,22 +25,40 @@ #include #include #include +#include #include #include #include #include =20 -#define PWR_PWRON_IRQ (1 << 0) +#define PWR_PWRON_IRQ BIT(0) =20 -#define STS_HW_CONDITIONS 0xf +#define STS_HW_CONDITIONS_4030 0xf +#define STS_HW_CONDITIONS_6030 0x2 + +struct twl_pwrbutton_chipdata { + u8 status_reg; + bool need_manual_irq; +}; + +static const struct twl_pwrbutton_chipdata twl4030_chipdata =3D { + STS_HW_CONDITIONS_4030, + false, +}; + +static const struct twl_pwrbutton_chipdata twl6030_chipdata =3D { + STS_HW_CONDITIONS_6030, + true, +}; =20 static irqreturn_t powerbutton_irq(int irq, void *_pwr) { struct input_dev *pwr =3D _pwr; + const struct twl_pwrbutton_chipdata *pdata =3D dev_get_drvdata(pwr->dev.p= arent); int err; u8 value; =20 - err =3D twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS); + err =3D twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, pdata->status_reg); if (!err) { pm_wakeup_event(pwr->dev.parent, 0); input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); @@ -55,10 +73,17 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr) =20 static int twl4030_pwrbutton_probe(struct platform_device *pdev) { + const struct twl_pwrbutton_chipdata *pdata; struct input_dev *pwr; int irq =3D platform_get_irq(pdev, 0); int err; =20 + pdata =3D device_get_match_data(&pdev->dev); + if (!pdata) + return -EINVAL; + + platform_set_drvdata(pdev, (void *)pdata); + pwr =3D devm_input_allocate_device(&pdev->dev); if (!pwr) { dev_err(&pdev->dev, "Can't allocate power button\n"); @@ -85,14 +110,41 @@ static int twl4030_pwrbutton_probe(struct platform_dev= ice *pdev) return err; } =20 + if (pdata->need_manual_irq) { + err =3D twl6030_interrupt_unmask(0x01, REG_INT_MSK_LINE_A); + if (err < 0) + return err; + + err =3D twl6030_interrupt_unmask(0x01, REG_INT_MSK_STS_A); + if (err < 0) + return err; + } + device_init_wakeup(&pdev->dev, true); =20 return 0; } =20 +static void twl4030_pwrbutton_remove(struct platform_device *pdev) +{ + const struct twl_pwrbutton_chipdata *pdata =3D platform_get_drvdata(pdev); + + if (pdata->need_manual_irq) { + twl6030_interrupt_mask(0x01, REG_INT_MSK_LINE_A); + twl6030_interrupt_mask(0x01, REG_INT_MSK_STS_A); + } +} + #ifdef CONFIG_OF static const struct of_device_id twl4030_pwrbutton_dt_match_table[] =3D { - { .compatible =3D "ti,twl4030-pwrbutton" }, + { + .compatible =3D "ti,twl4030-pwrbutton", + .data =3D &twl4030_chipdata, + }, + { + .compatible =3D "ti,twl6030-pwrbutton", + .data =3D &twl6030_chipdata, + }, {}, }; MODULE_DEVICE_TABLE(of, twl4030_pwrbutton_dt_match_table); @@ -100,6 +152,7 @@ MODULE_DEVICE_TABLE(of, twl4030_pwrbutton_dt_match_tabl= e); =20 static struct platform_driver twl4030_pwrbutton_driver =3D { .probe =3D twl4030_pwrbutton_probe, + .remove =3D twl4030_pwrbutton_remove, .driver =3D { .name =3D "twl4030_pwrbutton", .of_match_table =3D of_match_ptr(twl4030_pwrbutton_dt_match_table), --=20 2.47.3