[PATCH 2/2] Input: snvs_pwrkey - add configurable force shutdown time

From: Ian Ray
Date: Thu Mar 13 2025 - 07:51:38 EST


Support configurable shutdown period using a new, optional, device tree
property.

The force shutdown time is configured in LPCR[17:16] BTN_PRESS_TIME:

* b00: 5 seconds (SoC default)
* b01: 10 seconds
* b10: 15 seconds
* b11: PMIC is not disabled

Signed-off-by: Ian Ray <ian.ray@xxxxxxxxxxxxxxxx>
---
.../arm64/boot/dts/freescale/imx8mp-ppdv2.dts | 4 ++++
drivers/input/keyboard/snvs_pwrkey.c | 24 +++++++++++++++++++
2 files changed, 28 insertions(+)

diff --git a/arch/arm64/boot/dts/freescale/imx8mp-ppdv2.dts b/arch/arm64/boot/dts/freescale/imx8mp-ppdv2.dts
index 7cc427f23e59..921eda35154a 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-ppdv2.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-ppdv2.dts
@@ -699,6 +699,10 @@ &pinctrl_usdhc2_200mhz {
<MX8MP_IOMUXC_GPIO1_IO04__GPIO1_IO04 0x106>;
};

+&snvs_pwrkey {
+ force-shutdown-time = <0>;
+};
+
&usdhc2 {
/delete-property/ cd-gpios;
/delete-property/ wp-gpios;
diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c
index f7b5f1e25c80..2ba848df061c 100644
--- a/drivers/input/keyboard/snvs_pwrkey.c
+++ b/drivers/input/keyboard/snvs_pwrkey.c
@@ -27,7 +27,10 @@
#define SNVS_HPSR_BTN BIT(6)
#define SNVS_LPSR_SPO BIT(18)
#define SNVS_LPCR_DEP_EN BIT(5)
+#define SNVS_LPCR_BPT_SHIFT 16
+#define SNVS_LPCR_BPT_MASK (3 << SNVS_LPCR_BPT_SHIFT)

+#define FORCE_SHUTDOWN_TIME 5 /* LPCR 17:16 default */
#define DEBOUNCE_TIME 30
#define REPEAT_INTERVAL 60

@@ -114,6 +117,8 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
struct device_node *np;
struct clk *clk;
int error;
+ int force_shutdown_time;
+ int bpt;
u32 vid;

/* Get SNVS register Page */
@@ -148,11 +153,30 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
if (pdata->irq < 0)
return -EINVAL;

+ force_shutdown_time = FORCE_SHUTDOWN_TIME;
+ of_property_read_u32(np, "force-shutdown-time", &force_shutdown_time);
+ switch (force_shutdown_time) {
+ case 0:
+ /* Disable long-press detection. */
+ bpt = 0x3;
+ break;
+ case 5:
+ case 10:
+ case 15:
+ bpt = (force_shutdown_time / 5) - 1;
+ break;
+ default:
+ dev_err(&pdev->dev, "Invalid force-shutdown-time %d\n", force_shutdown_time);
+ return -EINVAL;
+ }
+
regmap_read(pdata->snvs, SNVS_HPVIDR1_REG, &vid);
pdata->minor_rev = vid & 0xff;

regmap_update_bits(pdata->snvs, SNVS_LPCR_REG, SNVS_LPCR_DEP_EN, SNVS_LPCR_DEP_EN);

+ regmap_update_bits(pdata->snvs, SNVS_LPCR_REG, SNVS_LPCR_BPT_MASK, bpt << SNVS_LPCR_BPT_SHIFT);
+
/* clear the unexpected interrupt before driver ready */
regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);

--
2.39.5