pinctrl: freescale: add pad wakeup config
authorShenwei Wang <shenwei.wang@nxp.com>
Thu, 27 Oct 2022 13:08:58 +0000 (08:08 -0500)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 8 Nov 2022 10:25:52 +0000 (11:25 +0100)
add the logic to configure the pad wakeup function via
the pin_config_set handler.

Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
Reported-by: kernel test robot <lkp@intel.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Link: https://lore.kernel.org/r/20221027130859.1444412-5-shenwei.wang@nxp.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/freescale/pinctrl-scu.c

index 59b5f8a..ea261b6 100644 (file)
 #include "../core.h"
 #include "pinctrl-imx.h"
 
+#define IMX_SC_PAD_FUNC_GET_WAKEUP     9
+#define IMX_SC_PAD_FUNC_SET_WAKEUP     4
+#define IMX_SC_IRQ_GROUP_WAKE           3   /* Wakeup interrupts */
+#define IMX_SC_IRQ_PAD                 2   /* Pad wakeup */
+
 enum pad_func_e {
        IMX_SC_PAD_FUNC_SET = 15,
        IMX_SC_PAD_FUNC_GET = 16,
@@ -36,10 +41,18 @@ struct imx_sc_msg_resp_pad_get {
        u32 val;
 } __packed;
 
+struct imx_sc_msg_gpio_set_pad_wakeup {
+       struct imx_sc_rpc_msg hdr;
+       u16 pad;
+       u8 wakeup;
+} __packed __aligned(4);
+
 static struct imx_sc_ipc *pinctrl_ipc_handle;
 
 int imx_pinctrl_sc_ipc_init(struct platform_device *pdev)
 {
+       imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_WAKE,
+                                        IMX_SC_IRQ_PAD, true);
        return imx_scu_get_handle(&pinctrl_ipc_handle);
 }
 EXPORT_SYMBOL_GPL(imx_pinctrl_sc_ipc_init);
@@ -81,6 +94,23 @@ int imx_pinconf_set_scu(struct pinctrl_dev *pctldev, unsigned pin_id,
        unsigned int val;
        int ret;
 
+       if (num_configs == 1) {
+               struct imx_sc_msg_gpio_set_pad_wakeup wmsg;
+
+               hdr = &wmsg.hdr;
+               hdr->ver = IMX_SC_RPC_VERSION;
+               hdr->svc = IMX_SC_RPC_SVC_PAD;
+               hdr->func = IMX_SC_PAD_FUNC_SET_WAKEUP;
+               hdr->size = 2;
+               wmsg.pad = pin_id;
+               wmsg.wakeup = *configs;
+               ret = imx_scu_call_rpc(pinctrl_ipc_handle, &wmsg, true);
+
+               dev_dbg(ipctl->dev, "wakeup pin_id: %d type: %ld\n",
+                               pin_id, *configs);
+               return ret;
+       }
+
        /*
         * Set mux and conf together in one IPC call
         */