]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Input: snvs_pwrkey - support power-off-time-sec
authorIan Ray <ian.ray@gehealthcare.com>
Thu, 1 May 2025 03:51:50 +0000 (20:51 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 1 May 2025 04:03:14 +0000 (21:03 -0700)
The power-off 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@gehealthcare.com>
Link: https://lore.kernel.org/r/20250315093455.1100-3-ian.ray@gehealthcare.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/keyboard/snvs_pwrkey.c

index f7b5f1e25c803dddd1791636942442e244af86e5..ce006108184f98d7af97b79a9c707d1591626ff0 100644 (file)
@@ -27,6 +27,8 @@
 #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 DEBOUNCE_TIME          30
 #define REPEAT_INTERVAL                60
@@ -114,6 +116,8 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
        struct device_node *np;
        struct clk *clk;
        int error;
+       unsigned int val;
+       unsigned int bpt;
        u32 vid;
 
        /* Get SNVS register Page */
@@ -148,6 +152,27 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev)
        if (pdata->irq < 0)
                return -EINVAL;
 
+       error = of_property_read_u32(np, "power-off-time-sec", &val);
+       if (!error) {
+               switch (val) {
+               case 0:
+                       bpt = 0x3;
+                       break;
+               case 5:
+               case 10:
+               case 15:
+                       bpt = (val / 5) - 1;
+                       break;
+               default:
+                       dev_err(&pdev->dev,
+                               "power-off-time-sec %d out of range\n", val);
+                       return -EINVAL;
+               }
+
+               regmap_update_bits(pdata->snvs, SNVS_LPCR_REG, SNVS_LPCR_BPT_MASK,
+                                  bpt << SNVS_LPCR_BPT_SHIFT);
+       }
+
        regmap_read(pdata->snvs, SNVS_HPVIDR1_REG, &vid);
        pdata->minor_rev = vid & 0xff;