Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <peng.fan@nxp.com>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>

authored by

Peng Fan and committed by
Shawn Guo
d2bd250c 19a72e0c

+33 -13
+27 -13
drivers/firmware/imx/imx-scu-irq.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0+ 2 2 /* 3 - * Copyright 2019 NXP 3 + * Copyright 2019,2023 NXP 4 4 * 5 5 * Implementation of the SCU IRQ functions using MU. 6 6 * ··· 66 66 67 67 static void imx_scu_irq_work_handler(struct work_struct *work) 68 68 { 69 - struct imx_sc_msg_irq_get_status msg; 70 - struct imx_sc_rpc_msg *hdr = &msg.hdr; 71 69 u32 irq_status; 72 70 int ret; 73 71 u8 i; 74 72 75 73 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); 85 75 if (ret) { 86 76 pr_err("get irq group %d status failed, ret %d\n", 87 77 i, ret); 88 78 return; 89 79 } 90 80 91 - irq_status = msg.data.resp.status; 92 81 if (!irq_status) 93 82 continue; 94 83 ··· 85 96 imx_scu_irq_notifier_call_chain(irq_status, &i); 86 97 } 87 98 } 99 + 100 + int imx_scu_irq_get_status(u8 group, u32 *irq_status) 101 + { 102 + struct imx_sc_msg_irq_get_status msg; 103 + struct imx_sc_rpc_msg *hdr = &msg.hdr; 104 + int ret; 105 + 106 + hdr->ver = IMX_SC_RPC_VERSION; 107 + hdr->svc = IMX_SC_RPC_SVC_IRQ; 108 + hdr->func = IMX_SC_IRQ_FUNC_STATUS; 109 + hdr->size = 2; 110 + 111 + msg.data.req.resource = mu_resource_id; 112 + msg.data.req.group = group; 113 + 114 + ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true); 115 + if (ret) 116 + return ret; 117 + 118 + if (irq_status) 119 + *irq_status = msg.data.resp.status; 120 + 121 + return 0; 122 + } 123 + EXPORT_SYMBOL(imx_scu_irq_get_status); 88 124 89 125 int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable) 90 126 {
+6
include/linux/firmware/imx/sci.h
··· 21 21 int imx_scu_irq_register_notifier(struct notifier_block *nb); 22 22 int imx_scu_irq_unregister_notifier(struct notifier_block *nb); 23 23 int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable); 24 + int imx_scu_irq_get_status(u8 group, u32 *irq_status); 24 25 int imx_scu_soc_init(struct device *dev); 25 26 #else 26 27 static inline int imx_scu_soc_init(struct device *dev) ··· 45 44 } 46 45 47 46 static inline int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable) 47 + { 48 + return -EOPNOTSUPP; 49 + } 50 + 51 + static inline int imx_scu_irq_get_status(u8 group, u32 *irq_status) 48 52 { 49 53 return -EOPNOTSUPP; 50 54 }