diff options
author | Bibby Hsieh <bibby.hsieh@mediatek.com> | 2019-08-28 21:48:10 -0400 |
---|---|---|
committer | Jassi Brar <jaswinder.singh@linaro.org> | 2019-09-17 01:40:05 -0400 |
commit | 2c49e4e846bf365e8e683e3229d240f70eef65fc (patch) | |
tree | c1ef63437bac55a6599a6961c8fdd19b98e0ac79 | |
parent | 2d645217f1982190a54b2b0cb5f5ca42ec4d165e (diff) |
mailbox: mediatek: cmdq: move the CMDQ_IRQ_MASK into cmdq driver data
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>
Reviewed-by: CK Hu <ck.hu@mediatek.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
-rw-r--r-- | drivers/mailbox/mtk-cmdq-mailbox.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c index 00d5219094e5..8fddd26288e8 100644 --- a/drivers/mailbox/mtk-cmdq-mailbox.c +++ b/drivers/mailbox/mtk-cmdq-mailbox.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/of_device.h> | 18 | #include <linux/of_device.h> |
19 | 19 | ||
20 | #define CMDQ_OP_CODE_MASK (0xff << CMDQ_OP_CODE_SHIFT) | 20 | #define CMDQ_OP_CODE_MASK (0xff << CMDQ_OP_CODE_SHIFT) |
21 | #define CMDQ_IRQ_MASK 0xffff | ||
22 | #define CMDQ_NUM_CMD(t) (t->cmd_buf_size / CMDQ_INST_SIZE) | 21 | #define CMDQ_NUM_CMD(t) (t->cmd_buf_size / CMDQ_INST_SIZE) |
23 | 22 | ||
24 | #define CMDQ_CURR_IRQ_STATUS 0x10 | 23 | #define CMDQ_CURR_IRQ_STATUS 0x10 |
@@ -72,6 +71,7 @@ struct cmdq { | |||
72 | void __iomem *base; | 71 | void __iomem *base; |
73 | u32 irq; | 72 | u32 irq; |
74 | u32 thread_nr; | 73 | u32 thread_nr; |
74 | u32 irq_mask; | ||
75 | struct cmdq_thread *thread; | 75 | struct cmdq_thread *thread; |
76 | struct clk *clock; | 76 | struct clk *clock; |
77 | bool suspended; | 77 | bool suspended; |
@@ -285,11 +285,11 @@ static irqreturn_t cmdq_irq_handler(int irq, void *dev) | |||
285 | unsigned long irq_status, flags = 0L; | 285 | unsigned long irq_status, flags = 0L; |
286 | int bit; | 286 | int bit; |
287 | 287 | ||
288 | irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & CMDQ_IRQ_MASK; | 288 | irq_status = readl(cmdq->base + CMDQ_CURR_IRQ_STATUS) & cmdq->irq_mask; |
289 | if (!(irq_status ^ CMDQ_IRQ_MASK)) | 289 | if (!(irq_status ^ cmdq->irq_mask)) |
290 | return IRQ_NONE; | 290 | return IRQ_NONE; |
291 | 291 | ||
292 | for_each_clear_bit(bit, &irq_status, fls(CMDQ_IRQ_MASK)) { | 292 | for_each_clear_bit(bit, &irq_status, cmdq->thread_nr) { |
293 | struct cmdq_thread *thread = &cmdq->thread[bit]; | 293 | struct cmdq_thread *thread = &cmdq->thread[bit]; |
294 | 294 | ||
295 | spin_lock_irqsave(&thread->chan->lock, flags); | 295 | spin_lock_irqsave(&thread->chan->lock, flags); |
@@ -473,6 +473,9 @@ static int cmdq_probe(struct platform_device *pdev) | |||
473 | dev_err(dev, "failed to get irq\n"); | 473 | dev_err(dev, "failed to get irq\n"); |
474 | return -EINVAL; | 474 | return -EINVAL; |
475 | } | 475 | } |
476 | |||
477 | cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev); | ||
478 | cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0); | ||
476 | err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED, | 479 | err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED, |
477 | "mtk_cmdq", cmdq); | 480 | "mtk_cmdq", cmdq); |
478 | if (err < 0) { | 481 | if (err < 0) { |
@@ -489,7 +492,6 @@ static int cmdq_probe(struct platform_device *pdev) | |||
489 | return PTR_ERR(cmdq->clock); | 492 | return PTR_ERR(cmdq->clock); |
490 | } | 493 | } |
491 | 494 | ||
492 | cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev); | ||
493 | cmdq->mbox.dev = dev; | 495 | cmdq->mbox.dev = dev; |
494 | cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr, | 496 | cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr, |
495 | sizeof(*cmdq->mbox.chans), GFP_KERNEL); | 497 | sizeof(*cmdq->mbox.chans), GFP_KERNEL); |