Thread (16 messages) 16 messages, 3 authors, 2019-02-14

Re: [PATCH v4 6/6] usb: musb: Add support for MediaTek musb controller

From: Min Guo <hidden>
Date: 2019-01-22 01:45:26
Also in: linux-devicetree, linux-mediatek, linux-usb, lkml

Hi Bin,

On Mon, 2019-01-21 at 10:07 -0600, Bin Liu wrote:
Hi Min,

On Mon, Jan 21, 2019 at 08:22:31PM +0800, min.guo@mediatek.com wrote:
quoted
From: Min Guo <redacted>

This adds support for MediaTek musb controller in
host, peripheral and otg mode.
There are some quirk of MediaTek musb controller, such as:
 -W1C interrupt status registers
 -Private data toggle registers
 -No dedicated DMA interrupt line

Signed-off-by: Min Guo <redacted>
Signed-off-by: Yonglong Wu <redacted>
---
changes in v4:
1. no changes

changes in v3:
suggested by Bin:
1. Remove 'u8/u16 data' parameter in clearb/w() hooks
2. Replace musb_readb/w() with musb_clearb/w() to clear interrupts status

changes in v2:
suggested by Bin:
1. Add summarize of MediaTek musb controller differences in the commit log
2. Add "|| COMPILE_TEST" in Kconfig
3. Move MediaTek's private toggle registers from musb_regs.h to mediatek.c
4. Replace musb_readl() with musb_readw() to read 16bit toggle register
---
 drivers/usb/musb/Kconfig    |   8 +-
 drivers/usb/musb/Makefile   |   1 +
 drivers/usb/musb/mediatek.c | 624 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 632 insertions(+), 1 deletion(-)
 create mode 100644 drivers/usb/musb/mediatek.c
[snip]
quoted
+static irqreturn_t generic_interrupt(int irq, void *__hci)
+{
+	unsigned long flags;
+	irqreturn_t retval = IRQ_NONE;
+	struct musb *musb = __hci;
+
+	spin_lock_irqsave(&musb->lock, flags);
+	musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB) &
+	    musb_readb(musb->mregs, MUSB_INTRUSBE);
+	musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX)
+	    & musb_readw(musb->mregs, MUSB_INTRTXE);
+	musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX)
+	    & musb_readw(musb->mregs, MUSB_INTRRXE);
Based on my comment in 5/6, the above 3 musb_readb/w() can be changed to
quoted
+	/* MediaTek controller interrupt status is W1C */
+	musb_clearw(musb->mregs, MUSB_INTRRX);
+	musb_clearw(musb->mregs, MUSB_INTRTX);
+	musb_clearb(musb->mregs, MUSB_INTRUSB);
	musb->int_usb = musb_clearb(musb->mregs, MUSB_INTRUSB)
	musb->int_tx = musb_clearw(musb->mregs, MUSB_INTRTX);
	musb->int_rx = musb_clearw(musb->mregs, MUSB_INTRRX);
Okay.
quoted
+
+	if (musb->int_usb || musb->int_tx || musb->int_rx)
+		retval = musb_interrupt(musb);
+
+	spin_unlock_irqrestore(&musb->lock, flags);
+
+	return retval;
+}
+
[snip]
quoted
+
+static u8 mtk_musb_clearb(void __iomem *addr, unsigned int offset)
+{
+	u8 data;
+
+	/* W1C */
+	data = musb_readb(addr, offset);
+	musb_writeb(addr, offset, data);
+	return musb_readb(addr, offset);
	return data;
Okay.
quoted
+}
+
+static u16 mtk_musb_clearw(void __iomem *addr, unsigned int offset)
+{
+	u16 data;
+
+	/* W1C */
+	data = musb_readw(addr, offset);
+	musb_writew(addr, offset, data);
+	return musb_readw(addr, offset);
	return data;
Okay.
Regards,
-Bin.


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help