Skip to content

Commit d2bd250

Browse files
MrVanShawn Guo
authored andcommitted
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: Peng Fan <[email protected]> Signed-off-by: Shawn Guo <[email protected]>
1 parent 19a72e0 commit d2bd250

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

drivers/firmware/imx/imx-scu-irq.c

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SPDX-License-Identifier: GPL-2.0+
22
/*
3-
* Copyright 2019 NXP
3+
* Copyright 2019,2023 NXP
44
*
55
* Implementation of the SCU IRQ functions using MU.
66
*
@@ -66,29 +66,18 @@ static int imx_scu_irq_notifier_call_chain(unsigned long status, u8 *group)
6666

6767
static void imx_scu_irq_work_handler(struct work_struct *work)
6868
{
69-
struct imx_sc_msg_irq_get_status msg;
70-
struct imx_sc_rpc_msg *hdr = &msg.hdr;
7169
u32 irq_status;
7270
int ret;
7371
u8 i;
7472

7573
for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
76-
hdr->ver = IMX_SC_RPC_VERSION;
77-
hdr->svc = IMX_SC_RPC_SVC_IRQ;
78-
hdr->func = IMX_SC_IRQ_FUNC_STATUS;
79-
hdr->size = 2;
80-
81-
msg.data.req.resource = mu_resource_id;
82-
msg.data.req.group = i;
83-
84-
ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true);
74+
ret = imx_scu_irq_get_status(i, &irq_status);
8575
if (ret) {
8676
pr_err("get irq group %d status failed, ret %d\n",
8777
i, ret);
8878
return;
8979
}
9080

91-
irq_status = msg.data.resp.status;
9281
if (!irq_status)
9382
continue;
9483

@@ -97,6 +86,31 @@ static void imx_scu_irq_work_handler(struct work_struct *work)
9786
}
9887
}
9988

89+
int imx_scu_irq_get_status(u8 group, u32 *irq_status)
90+
{
91+
struct imx_sc_msg_irq_get_status msg;
92+
struct imx_sc_rpc_msg *hdr = &msg.hdr;
93+
int ret;
94+
95+
hdr->ver = IMX_SC_RPC_VERSION;
96+
hdr->svc = IMX_SC_RPC_SVC_IRQ;
97+
hdr->func = IMX_SC_IRQ_FUNC_STATUS;
98+
hdr->size = 2;
99+
100+
msg.data.req.resource = mu_resource_id;
101+
msg.data.req.group = group;
102+
103+
ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true);
104+
if (ret)
105+
return ret;
106+
107+
if (irq_status)
108+
*irq_status = msg.data.resp.status;
109+
110+
return 0;
111+
}
112+
EXPORT_SYMBOL(imx_scu_irq_get_status);
113+
100114
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
101115
{
102116
struct imx_sc_msg_irq_enable msg;

include/linux/firmware/imx/sci.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ int imx_scu_enable_general_irq_channel(struct device *dev);
2121
int imx_scu_irq_register_notifier(struct notifier_block *nb);
2222
int imx_scu_irq_unregister_notifier(struct notifier_block *nb);
2323
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable);
24+
int imx_scu_irq_get_status(u8 group, u32 *irq_status);
2425
int imx_scu_soc_init(struct device *dev);
2526
#else
2627
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)
4748
{
4849
return -EOPNOTSUPP;
4950
}
51+
52+
static inline int imx_scu_irq_get_status(u8 group, u32 *irq_status)
53+
{
54+
return -EOPNOTSUPP;
55+
}
5056
#endif
5157
#endif /* _SC_SCI_H */

0 commit comments

Comments
 (0)