lkml.org 
[lkml]   [2020]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V3 2/5] firmware: imx: scu-irq: Add API to retrieve status of IRQ
    Date
    From: Franck LENORMAND <franck.lenormand@oss.nxp.com>

    This patch adds the API to retrieve the status of an IRQ.

    It also adds values used to process SECVIO IRQ from the SCU.

    Signed-off-by: Franck LENORMAND <franck.lenormand@nxp.com>
    ---
    drivers/firmware/imx/imx-scu-irq.c | 48 +++++++++++++++++++++++++++-----------
    include/linux/firmware/imx/sci.h | 4 ++++
    2 files changed, 39 insertions(+), 13 deletions(-)

    diff --git a/drivers/firmware/imx/imx-scu-irq.c b/drivers/firmware/imx/imx-scu-irq.c
    index d9dcc20..bb0b5aa 100644
    --- a/drivers/firmware/imx/imx-scu-irq.c
    +++ b/drivers/firmware/imx/imx-scu-irq.c
    @@ -1,6 +1,6 @@
    // SPDX-License-Identifier: GPL-2.0+
    /*
    - * Copyright 2019 NXP
    + * Copyright 2019-2020 NXP
    *
    * 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)

    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;
    int ret;
    u8 i;

    for (i = 0; i < IMX_SC_IRQ_NUM_GROUP; i++) {
    - 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 = i;
    -
    - ret = imx_scu_call_rpc(imx_sc_irq_ipc_handle, &msg, true);
    + ret = imx_scu_irq_get_status(i, &irq_status);
    if (ret) {
    pr_err("get irq group %d status failed, ret %d\n",
    i, ret);
    return;
    }

    - irq_status = msg.data.resp.status;
    if (!irq_status)
    continue;

    @@ -97,6 +86,39 @@ static void imx_scu_irq_work_handler(struct work_struct *work)
    }
    }

    +/**
    + * imx_scu_irq_get_status() - Get the status of the IRQs of a group
    + *
    + * @group: The group of IRQ to retrieve status
    + * @irq_status: Status of the IRQs retrieved
    + *
    + * @return Returns 0 for success and < 0 for errors
    + */
    +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)
    {
    struct imx_sc_msg_irq_enable msg;
    diff --git a/include/linux/firmware/imx/sci.h b/include/linux/firmware/imx/sci.h
    index 914dce1..20a16a7 100644
    --- a/include/linux/firmware/imx/sci.h
    +++ b/include/linux/firmware/imx/sci.h
    @@ -17,9 +17,13 @@
    #include <linux/firmware/imx/svc/rm.h>
    #include <linux/firmware/imx/svc/seco.h>

    +#define IMX_SC_IRQ_GROUP_WAKE 3U /* Wakeup interrupts */
    +#define IMX_SC_IRQ_SECVIO BIT(6) /* Security violation */
    +
    int imx_scu_enable_general_irq_channel(struct device *dev);
    int imx_scu_irq_register_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_soc_init(struct device *dev);
    +int imx_scu_irq_get_status(u8 group, u32 *irq_status);
    #endif /* _SC_SCI_H */
    --
    2.7.4
    \
     
     \ /
      Last update: 2020-11-10 15:13    [W:3.362 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site