lkml.org 
[lkml]   [2019]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH 03/10] soc: mediatek: move the CMDQ_IRQ_MASK into cmdq driver data
    From
    Date
    Hi, Bibby:

    On Tue, 2019-01-29 at 15:32 +0800, Bibby Hsieh wrote:
    > The interrupt mask and thread number has positive correlation,
    > so we move the CMDQ_IRQ_MASK into cmdq driver data and calculate
    > it by thread number.
    >
    > Signed-off-by: Bibby Hsieh <bibby.hsieh@mediatek.com>
    > ---
    > drivers/mailbox/mtk-cmdq-mailbox.c | 12 ++++++++----
    > 1 file changed, 8 insertions(+), 4 deletions(-)
    >
    > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
    > index 909eb23..f6174ca 100644
    > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
    > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
    > @@ -17,7 +17,6 @@
    > #include <linux/of_device.h>
    >
    > #define CMDQ_OP_CODE_MASK (0xff << CMDQ_OP_CODE_SHIFT)
    > -#define CMDQ_IRQ_MASK 0xffff
    > #define CMDQ_NUM_CMD(t) (t->cmd_buf_size / CMDQ_INST_SIZE)
    >
    > #define CMDQ_CURR_IRQ_STATUS 0x10
    > @@ -71,6 +70,7 @@ struct cmdq {
    > void __iomem *base;
    > u32 irq;
    > u32 thread_nr;
    > + u32 irq_mask;
    > struct cmdq_thread *thread;
    > struct clk *clock;
    > bool suspended;
    > @@ -284,11 +284,11 @@ static irqreturn_t cmdq_irq_handler(int irq, void *dev)
    > unsigned long irq_status, flags = 0L;
    > int bit;
    >
    > - irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & CMDQ_IRQ_MASK;
    > - if (!(irq_status ^ CMDQ_IRQ_MASK))
    > + irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & cmdq->irq_mask;
    > + if (!(irq_status ^ cmdq->irq_mask))
    > return IRQ_NONE;
    >
    > - for_each_clear_bit(bit, &irq_status, fls(CMDQ_IRQ_MASK)) {
    > + for_each_clear_bit(bit, &irq_status, fls(cmdq->irq_mask)) {

    for_each_clear_bit(bit, &irq_status, cmdq->thread_nr) {

    Regards,
    CK

    > struct cmdq_thread *thread = &cmdq->thread[bit];
    >
    > spin_lock_irqsave(&thread->chan->lock, flags);
    > @@ -472,6 +472,9 @@ static int cmdq_probe(struct platform_device *pdev)
    > dev_err(dev, "failed to get irq\n");
    > return -EINVAL;
    > }
    > +
    > + cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);
    > + cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0);
    > err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED,
    > "mtk_cmdq", cmdq);
    > if (err < 0) {
    > @@ -489,6 +492,7 @@ static int cmdq_probe(struct platform_device *pdev)
    > }
    >
    > cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);
    > + cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0);
    > cmdq->mbox.dev = dev;
    > cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr,
    > sizeof(*cmdq->mbox.chans), GFP_KERNEL);


    \
     
     \ /
      Last update: 2019-01-29 10:23    [W:2.630 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site