Commit d2bd250c authored by Peng Fan's avatar Peng Fan Committed by Shawn Guo

firmware: imx: scu-irq: add imx_scu_irq_get_status

Extract the scu irq get status code from imx_scu_irq_work_handler and
make into a new function imx_scu_irq_get_status which could be used
by others, such as SECO.
Signed-off-by: default avatarPeng Fan <peng.fan@nxp.com>
Signed-off-by: default avatarShawn Guo <shawnguo@kernel.org>
parent 19a72e0c
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
/* /*
* Copyright 2019 NXP * Copyright 2019,2023 NXP
* *
* Implementation of the SCU IRQ functions using MU. * Implementation of the SCU IRQ functions using MU.
* *
...@@ -66,29 +66,18 @@ static int imx_scu_irq_notifier_call_chain(unsigned long status, u8 *group) ...@@ -66,29 +66,18 @@ static int imx_scu_irq_notifier_call_chain(unsigned long status, u8 *group)
static void imx_scu_irq_work_handler(struct work_struct *work) static void imx_scu_irq_work_handler(struct work_struct *work)
{ {
struct imx_sc_msg_irq_get_status msg;
struct imx_sc_rpc_msg *hdr = &msg.hdr;
u32 irq_status; u32 irq_status;
int ret; int ret;
u8 i; u8 i;
for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) { for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
hdr->ver = IMX_SC_RPC_VERSION; ret = imx_scu_irq_get_status(i, &irq_status);
hdr->svc = IMX_SC_RPC_SVC_IRQ;
hdr->func = IMX_SC_IRQ_FUNC_STATUS;
hdr->size = 2;
msg.data.req.resource = mu_resource_id;
msg.data.req.group = i;
ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true);
if (ret) { if (ret) {
pr_err("get irq group %d status failed, ret %d\n", pr_err("get irq group %d status failed, ret %d\n",
i, ret); i, ret);
return; return;
} }
irq_status = msg.data.resp.status;
if (!irq_status) if (!irq_status)
continue; continue;
...@@ -97,6 +86,31 @@ static void imx_scu_irq_work_handler(struct work_struct *work) ...@@ -97,6 +86,31 @@ static void imx_scu_irq_work_handler(struct work_struct *work)
} }
} }
int imx_scu_irq_get_status(u8 group, u32 *irq_status)
{
struct imx_sc_msg_irq_get_status msg;
struct imx_sc_rpc_msg *hdr = &msg.hdr;
int ret;
hdr->ver = IMX_SC_RPC_VERSION;
hdr->svc = IMX_SC_RPC_SVC_IRQ;
hdr->func = IMX_SC_IRQ_FUNC_STATUS;
hdr->size = 2;
msg.data.req.resource = mu_resource_id;
msg.data.req.group = group;
ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true);
if (ret)
return ret;
if (irq_status)
*irq_status = msg.data.resp.status;
return 0;
}
EXPORT_SYMBOL(imx_scu_irq_get_status);
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable) int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
{ {
struct imx_sc_msg_irq_enable msg; struct imx_sc_msg_irq_enable msg;
......
...@@ -21,6 +21,7 @@ int imx_scu_enable_general_irq_channel(struct device *dev); ...@@ -21,6 +21,7 @@ int imx_scu_enable_general_irq_channel(struct device *dev);
int imx_scu_irq_register_notifier(struct notifier_block *nb); int imx_scu_irq_register_notifier(struct notifier_block *nb);
int imx_scu_irq_unregister_notifier(struct notifier_block *nb); int imx_scu_irq_unregister_notifier(struct notifier_block *nb);
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable); int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable);
int imx_scu_irq_get_status(u8 group, u32 *irq_status);
int imx_scu_soc_init(struct device *dev); int imx_scu_soc_init(struct device *dev);
#else #else
static inline int imx_scu_soc_init(struct device *dev) static inline int imx_scu_soc_init(struct device *dev)
...@@ -47,5 +48,10 @@ static inline int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable) ...@@ -47,5 +48,10 @@ static inline int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
static inline int imx_scu_irq_get_status(u8 group, u32 *irq_status)
{
return -EOPNOTSUPP;
}
#endif #endif
#endif /* _SC_SCI_H */ #endif /* _SC_SCI_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment