summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBibby Hsieh <bibby.hsieh@mediatek.com>2019-08-28 21:48:12 -0400
committerJassi Brar <jaswinder.singh@linaro.org>2019-09-17 01:40:05 -0400
commit6058f11870b8e6d4f5cc7b591097c00bf69a000d (patch)
tree367fe652fffa26c359f818f2d13f78b851b7120d
parent286358c444d5bcae260659bcd8a0b3bf317e9cc8 (diff)
mailbox: mediatek: cmdq: clear the event in cmdq initial flow
GCE hardware stored event information in own internal sysram, if the initial value in those sysram is not zero value it will cause a situation that gce can wait the event immediately after client ask gce to wait event but not really trigger the corresponding hardware. In order to make sure that the wait event function is exactly correct, we need to clear the sysram value in cmdq initial flow. Fixes: 623a6143a845 ("mailbox: mediatek: Add Mediatek CMDQ driver") 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.c5
-rw-r--r--include/linux/mailbox/mtk-cmdq-mailbox.h3
-rw-r--r--include/linux/soc/mediatek/mtk-cmdq.h3
3 files changed, 8 insertions, 3 deletions
diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
index 69daaadc3a5f..9a6ce9f5a7db 100644
--- a/drivers/mailbox/mtk-cmdq-mailbox.c
+++ b/drivers/mailbox/mtk-cmdq-mailbox.c
@@ -21,6 +21,7 @@
21#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)
22 22
23#define CMDQ_CURR_IRQ_STATUS 0x10 23#define CMDQ_CURR_IRQ_STATUS 0x10
24#define CMDQ_SYNC_TOKEN_UPDATE 0x68
24#define CMDQ_THR_SLOT_CYCLES 0x30 25#define CMDQ_THR_SLOT_CYCLES 0x30
25#define CMDQ_THR_BASE 0x100 26#define CMDQ_THR_BASE 0x100
26#define CMDQ_THR_SIZE 0x80 27#define CMDQ_THR_SIZE 0x80
@@ -104,8 +105,12 @@ static void cmdq_thread_resume(struct cmdq_thread *thread)
104 105
105static void cmdq_init(struct cmdq *cmdq) 106static void cmdq_init(struct cmdq *cmdq)
106{ 107{
108 int i;
109
107 WARN_ON(clk_enable(cmdq->clock) < 0); 110 WARN_ON(clk_enable(cmdq->clock) < 0);
108 writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); 111 writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES);
112 for (i = 0; i <= CMDQ_MAX_EVENT; i++)
113 writel(i, cmdq->base + CMDQ_SYNC_TOKEN_UPDATE);
109 clk_disable(cmdq->clock); 114 clk_disable(cmdq->clock);
110} 115}
111 116
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index ccb73422c2fa..e6f54ef6698b 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -20,6 +20,9 @@
20#define CMDQ_WFE_WAIT BIT(15) 20#define CMDQ_WFE_WAIT BIT(15)
21#define CMDQ_WFE_WAIT_VALUE 0x1 21#define CMDQ_WFE_WAIT_VALUE 0x1
22 22
23/** cmdq event maximum */
24#define CMDQ_MAX_EVENT 0x3ff
25
23/* 26/*
24 * CMDQ_CODE_MASK: 27 * CMDQ_CODE_MASK:
25 * set write mask 28 * set write mask
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 54ade13a9b15..4e8899972db4 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -13,9 +13,6 @@
13 13
14#define CMDQ_NO_TIMEOUT 0xffffffffu 14#define CMDQ_NO_TIMEOUT 0xffffffffu
15 15
16/** cmdq event maximum */
17#define CMDQ_MAX_EVENT 0x3ff
18
19struct cmdq_pkt; 16struct cmdq_pkt;
20 17
21struct cmdq_client { 18struct cmdq_client {