diff options
Diffstat (limited to 'drivers/mailbox/mtk-cmdq-mailbox.c')
| -rw-r--r-- | drivers/mailbox/mtk-cmdq-mailbox.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c index 00d5219094e5..9a6ce9f5a7db 100644 --- a/drivers/mailbox/mtk-cmdq-mailbox.c +++ b/drivers/mailbox/mtk-cmdq-mailbox.c @@ -18,10 +18,10 @@  #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 +#define CMDQ_SYNC_TOKEN_UPDATE		0x68  #define CMDQ_THR_SLOT_CYCLES		0x30  #define CMDQ_THR_BASE			0x100  #define CMDQ_THR_SIZE			0x80 @@ -72,6 +72,7 @@ struct cmdq {  	void __iomem		*base;  	u32			irq;  	u32			thread_nr; +	u32			irq_mask;  	struct cmdq_thread	*thread;  	struct clk		*clock;  	bool			suspended; @@ -104,8 +105,12 @@ static void cmdq_thread_resume(struct cmdq_thread *thread)  static void cmdq_init(struct cmdq *cmdq)  { +	int i; +  	WARN_ON(clk_enable(cmdq->clock) < 0);  	writel(CMDQ_THR_ACTIVE_SLOT_CYCLES, cmdq->base + CMDQ_THR_SLOT_CYCLES); +	for (i = 0; i <= CMDQ_MAX_EVENT; i++) +		writel(i, cmdq->base + CMDQ_SYNC_TOKEN_UPDATE);  	clk_disable(cmdq->clock);  } @@ -285,11 +290,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, cmdq->thread_nr) {  		struct cmdq_thread *thread = &cmdq->thread[bit];  		spin_lock_irqsave(&thread->chan->lock, flags); @@ -473,6 +478,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,7 +497,6 @@ static int cmdq_probe(struct platform_device *pdev)  		return PTR_ERR(cmdq->clock);  	} -	cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);  	cmdq->mbox.dev = dev;  	cmdq->mbox.chans = devm_kcalloc(dev, cmdq->thread_nr,  					sizeof(*cmdq->mbox.chans), GFP_KERNEL); @@ -537,6 +544,7 @@ static const struct dev_pm_ops cmdq_pm_ops = {  static const struct of_device_id cmdq_of_ids[] = {  	{.compatible = "mediatek,mt8173-gce", .data = (void *)16}, +	{.compatible = "mediatek,mt8183-gce", .data = (void *)24},  	{}  };  |