From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bin Liu Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller Date: Tue, 8 Jan 2019 09:44:41 -0600 Message-ID: <20190108154441.GG25910@uda0271908> References: <1545896066-897-1-git-send-email-min.guo@mediatek.com> <1545896066-897-5-git-send-email-min.guo@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1545896066-897-5-git-send-email-min.guo@mediatek.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: min.guo@mediatek.com Cc: Mark Rutland , devicetree@vger.kernel.org, Yonglong Wu , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Matthias Brugger , Rob Herring , Alan Stern , chunfeng.yun@mediatek.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org List-Id: linux-mediatek@lists.infradead.org Hi, On Thu, Dec 27, 2018 at 03:34:26PM +0800, min.guo@mediatek.com wrote: > From: Min Guo > > This adds support for MediaTek musb controller in > host, peripheral and otg mode > > Signed-off-by: Min Guo > Signed-off-by: Yonglong Wu > --- > drivers/usb/musb/Kconfig | 8 +- > drivers/usb/musb/Makefile | 1 + > drivers/usb/musb/mediatek.c | 562 +++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/musb/musb_core.c | 10 + > drivers/usb/musb/musb_core.h | 1 + > drivers/usb/musb/musb_dma.h | 1 + > drivers/usb/musb/musb_host.c | 79 ++++-- > drivers/usb/musb/musb_regs.h | 6 + > drivers/usb/musb/musbhsdma.c | 34 ++- > 9 files changed, 671 insertions(+), 31 deletions(-) > create mode 100644 drivers/usb/musb/mediatek.c > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > index ad08895..540fc9f 100644 > --- a/drivers/usb/musb/Kconfig > +++ b/drivers/usb/musb/Kconfig > @@ -115,6 +115,12 @@ config USB_MUSB_JZ4740 > depends on USB_MUSB_GADGET > depends on USB_OTG_BLACKLIST_HUB > > +config USB_MUSB_MEDIATEK > + tristate "MediaTek platforms" > + depends on ARCH_MEDIATEK Please also add '|| COMPILE_TEST' to make testing easier. > + depends on NOP_USB_XCEIV > + depends on GENERIC_PHY > + > config USB_MUSB_AM335X_CHILD > tristate > > @@ -141,7 +147,7 @@ config USB_UX500_DMA > > config USB_INVENTRA_DMA > bool 'Inventra' > - depends on USB_MUSB_OMAP2PLUS > + depends on USB_MUSB_OMAP2PLUS || USB_MUSB_MEDIATEK > help > Enable DMA transfers using Mentor's engine. > > diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile > index 3a88c79..63d82d0 100644 > --- a/drivers/usb/musb/Makefile > +++ b/drivers/usb/musb/Makefile > @@ -24,6 +24,7 @@ obj-$(CONFIG_USB_MUSB_DA8XX) += da8xx.o > obj-$(CONFIG_USB_MUSB_UX500) += ux500.o > obj-$(CONFIG_USB_MUSB_JZ4740) += jz4740.o > obj-$(CONFIG_USB_MUSB_SUNXI) += sunxi.o > +obj-$(CONFIG_USB_MUSB_MEDIATEK) += mediatek.o > > > obj-$(CONFIG_USB_MUSB_AM335X_CHILD) += musb_am335x.o > diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c > new file mode 100644 > index 0000000..15a6460 > --- /dev/null > +++ b/drivers/usb/musb/mediatek.c [snip] I will review this section later after we sorted out other things. > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c > index b7d5627..d60f76f 100644 > --- a/drivers/usb/musb/musb_core.c > +++ b/drivers/usb/musb/musb_core.c > @@ -1028,6 +1028,16 @@ static void musb_disable_interrupts(struct musb *musb) > temp = musb_readb(mbase, MUSB_INTRUSB); > temp = musb_readw(mbase, MUSB_INTRTX); > temp = musb_readw(mbase, MUSB_INTRRX); > + > + /* MediaTek controller interrupt status is W1C */ This W1C doesn't match to the MUSB Programming Guide that I have. Those registers are read-only. Is the difference due to the IP intergration in the mtk platforms? or is it a new version of the MUSB controller? If latter, what is the version? > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { Basically we don't want to use this type of platform specific quirks if possible, so let's try to not use it. > + musb_writeb(mbase, MUSB_INTRUSB, > + musb_readb(mbase, MUSB_INTRUSB)); For this clearing register bit operation, please create platform hooks musb_clearb() and musb_clearw() in struct musb_platform_ops instead, then follow how musb_readb() pointer is assigned in musb_init_controller() to use the W1C version for mtk platform. > + musb_writew(mbase, MUSB_INTRRX, > + musb_readw(mbase, MUSB_INTRRX)); > + musb_writew(mbase, MUSB_INTRTX, > + musb_readw(mbase, MUSB_INTRTX)); > + } > } > > static void musb_enable_interrupts(struct musb *musb) > diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h > index 04203b7..1bf4e9a 100644 > --- a/drivers/usb/musb/musb_core.h > +++ b/drivers/usb/musb/musb_core.h > @@ -138,6 +138,7 @@ enum musb_g_ep0_state { > */ > struct musb_platform_ops { > > +#define MUSB_MTK_QUIRKS BIT(10) > #define MUSB_G_NO_SKB_RESERVE BIT(9) > #define MUSB_DA8XX BIT(8) > #define MUSB_PRESERVE_SESSION BIT(7) > diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h > index 281e75d3..b218210 100644 > --- a/drivers/usb/musb/musb_dma.h > +++ b/drivers/usb/musb/musb_dma.h > @@ -197,6 +197,7 @@ static inline void musb_dma_controller_destroy(struct dma_controller *d) { } > extern struct dma_controller * > musbhs_dma_controller_create(struct musb *musb, void __iomem *base); > extern void musbhs_dma_controller_destroy(struct dma_controller *c); > +extern irqreturn_t dma_controller_irq(int irq, void *private_data); > > extern struct dma_controller * > tusb_dma_controller_create(struct musb *musb, void __iomem *base); > diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c > index b59ce9a..b1b0216 100644 > --- a/drivers/usb/musb/musb_host.c > +++ b/drivers/usb/musb/musb_host.c > @@ -292,20 +292,73 @@ static inline void musb_save_toggle(struct musb_qh *qh, int is_in, > { > void __iomem *epio = qh->hw_ep->regs; > u16 csr; > + struct musb *musb = qh->hw_ep->musb; > > /* > * FIXME: the current Mentor DMA code seems to have > * problems getting toggle correct. > */ > > - if (is_in) > - csr = musb_readw(epio, MUSB_RXCSR) & MUSB_RXCSR_H_DATATOGGLE; > - else > - csr = musb_readw(epio, MUSB_TXCSR) & MUSB_TXCSR_H_DATATOGGLE; > + /* MediaTek controller has private toggle register */ only one toggle register for all endpoints? how does it handle difference toggle values for different endpoints? > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { > + u16 toggle; > + u8 epnum = qh->hw_ep->epnum; > + > + if (is_in) > + toggle = musb_readl(musb->mregs, MUSB_RXTOG); should use musb_readw() instead? MUSB_RXTOG seems to be 16bit. > + else > + toggle = musb_readl(musb->mregs, MUSB_TXTOG); > + > + csr = toggle & (1 << epnum); > + } else { > + if (is_in) > + csr = musb_readw(epio, MUSB_RXCSR) > + & MUSB_RXCSR_H_DATATOGGLE; > + else > + csr = musb_readw(epio, MUSB_TXCSR) > + & MUSB_TXCSR_H_DATATOGGLE; Does this logic still work for the mtk platform even if it has its own private toggle register? If so, we don't need to change here. If not, let's try to not use this quirk flag. Please create a hook musb_platform_get_toggle() in struct musb_platform_ops. > + } > > usb_settoggle(urb->dev, qh->epnum, !is_in, csr ? 1 : 0); > } > > +static inline u16 musb_set_toggle(struct musb_qh *qh, int is_in, > + struct urb *urb) > +{ > + u16 csr = 0; > + u16 toggle = 0; > + struct musb *musb = qh->hw_ep->musb; > + u8 epnum = qh->hw_ep->epnum; > + > + toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); > + > + /* MediaTek controller has private toggle register */ > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { > + if (is_in) { > + musb_writel(musb->mregs, MUSB_RXTOGEN, (1 << epnum)); > + musb_writel(musb->mregs, MUSB_RXTOG, (toggle << epnum)); > + } else { > + musb_writel(musb->mregs, MUSB_TXTOGEN, (1 << epnum)); > + musb_writel(musb->mregs, MUSB_TXTOG, (toggle << epnum)); > + } > + } else { > + if (is_in) { > + if (toggle) > + csr = MUSB_RXCSR_H_WR_DATATOGGLE > + | MUSB_RXCSR_H_DATATOGGLE; > + else > + csr = 0; > + } else { > + if (toggle) > + csr |= MUSB_TXCSR_H_WR_DATATOGGLE > + | MUSB_TXCSR_H_DATATOGGLE; > + else > + csr |= MUSB_TXCSR_CLRDATATOG; > + } > + } > + return csr; Please create a seperate patch for this musb_set_toggle() without adding the mtk logic. It is a nice cleanup. > +} > + > /* > * Advance this hardware endpoint's queue, completing the specified URB and > * advancing to either the next URB queued to that qh, or else invalidating > @@ -772,13 +825,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum, > ); > csr |= MUSB_TXCSR_MODE; > > - if (!hw_ep->tx_double_buffered) { > - if (usb_gettoggle(urb->dev, qh->epnum, 1)) > - csr |= MUSB_TXCSR_H_WR_DATATOGGLE > - | MUSB_TXCSR_H_DATATOGGLE; > - else > - csr |= MUSB_TXCSR_CLRDATATOG; > - } > + if (!hw_ep->tx_double_buffered) > + csr |= musb_set_toggle(qh, !is_out, urb); > > musb_writew(epio, MUSB_TXCSR, csr); > /* REVISIT may need to clear FLUSHFIFO ... */ > @@ -860,17 +908,12 @@ static void musb_ep_program(struct musb *musb, u8 epnum, > > /* IN/receive */ > } else { > - u16 csr; > + u16 csr = 0; > > if (hw_ep->rx_reinit) { > musb_rx_reinit(musb, qh, epnum); > + csr |= musb_set_toggle(qh, !is_out, urb); > > - /* init new state: toggle and NYET, maybe DMA later */ > - if (usb_gettoggle(urb->dev, qh->epnum, 0)) > - csr = MUSB_RXCSR_H_WR_DATATOGGLE > - | MUSB_RXCSR_H_DATATOGGLE; > - else > - csr = 0; > if (qh->type == USB_ENDPOINT_XFER_INT) > csr |= MUSB_RXCSR_DISNYET; > > diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h > index 5cd7264..ffbe267 100644 > --- a/drivers/usb/musb/musb_regs.h > +++ b/drivers/usb/musb/musb_regs.h > @@ -273,6 +273,12 @@ > #define MUSB_RXHUBADDR 0x06 > #define MUSB_RXHUBPORT 0x07 > > +/* MediaTek controller toggle enable and status reg */ > +#define MUSB_RXTOG 0x80 > +#define MUSB_RXTOGEN 0x82 > +#define MUSB_TXTOG 0x84 > +#define MUSB_TXTOGEN 0x86 Again, these offsets are for different registers in the MUSB version I have, please let me know if you have different version of the MUSB IP. > + > static inline u8 musb_read_configdata(void __iomem *mbase) > { > musb_writeb(mbase, MUSB_INDEX, 0); > diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c > index 824adcb..c545475 100644 > --- a/drivers/usb/musb/musbhsdma.c > +++ b/drivers/usb/musb/musbhsdma.c > @@ -263,7 +263,7 @@ static int dma_channel_abort(struct dma_channel *channel) > return 0; > } > > -static irqreturn_t dma_controller_irq(int irq, void *private_data) > +irqreturn_t dma_controller_irq(int irq, void *private_data) > { > struct musb_dma_controller *controller = private_data; > struct musb *musb = controller->private_data; > @@ -285,6 +285,8 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) > spin_lock_irqsave(&musb->lock, flags); > > int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR); > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) > + musb_writeb(musb->mregs, MUSB_HSDMA_INTR, int_hsdma); you can use musb_clearb() defined above to get rid of this quirk. > > if (!int_hsdma) { > musb_dbg(musb, "spurious DMA irq"); > @@ -377,15 +379,17 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) > spin_unlock_irqrestore(&musb->lock, flags); > return retval; > } > +EXPORT_SYMBOL_GPL(dma_controller_irq); > > void musbhs_dma_controller_destroy(struct dma_controller *c) > { > struct musb_dma_controller *controller = container_of(c, > struct musb_dma_controller, controller); > + struct musb *musb = controller->private_data; > > dma_controller_stop(controller); > > - if (controller->irq) > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS) && controller->irq) > free_irq(controller->irq, c); > > kfree(controller); > @@ -398,11 +402,15 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb, > struct musb_dma_controller *controller; > struct device *dev = musb->controller; > struct platform_device *pdev = to_platform_device(dev); > - int irq = platform_get_irq_byname(pdev, "dma"); > + int irq = -1; > > - if (irq <= 0) { > - dev_err(dev, "No DMA interrupt line!\n"); > - return NULL; > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS)) { > + irq = platform_get_irq_byname(pdev, "dma"); > + > + if (irq < 0) { > + dev_err(dev, "No DMA interrupt line!\n"); > + return NULL; > + } > } Please create musbhs_dma_controller_destroy_noirq() for your platform to not use the quirk. > > controller = kzalloc(sizeof(*controller), GFP_KERNEL); > @@ -418,15 +426,17 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb, > controller->controller.channel_program = dma_channel_program; > controller->controller.channel_abort = dma_channel_abort; > > - if (request_irq(irq, dma_controller_irq, 0, > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS)) { > + if (request_irq(irq, dma_controller_irq, 0, > dev_name(musb->controller), &controller->controller)) { > - dev_err(dev, "request_irq %d failed!\n", irq); > - musb_dma_controller_destroy(&controller->controller); > + dev_err(dev, "request_irq %d failed!\n", irq); > + musb_dma_controller_destroy(&controller->controller); > > - return NULL; > - } > + return NULL; > + } > > - controller->irq = irq; > + controller->irq = irq; > + } > > return &controller->controller; > } Same here, create musbhs_dma_controller_create_noirq(). Then use both new API for the mtk glue driver. Regards, -Bin. From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [4/4] usb: musb: Add support for MediaTek musb controller From: Bin Liu Message-Id: <20190108154441.GG25910@uda0271908> Date: Tue, 8 Jan 2019 09:44:41 -0600 To: min.guo@mediatek.com Cc: Rob Herring , Greg Kroah-Hartman , Mark Rutland , Matthias Brugger , Alan Stern , chunfeng.yun@mediatek.com, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Yonglong Wu List-ID: SGksCgpPbiBUaHUsIERlYyAyNywgMjAxOCBhdCAwMzozNDoyNlBNICswODAwLCBtaW4uZ3VvQG1l ZGlhdGVrLmNvbSB3cm90ZToKPiBGcm9tOiBNaW4gR3VvIDxtaW4uZ3VvQG1lZGlhdGVrLmNvbT4K PiAKPiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgTWVkaWFUZWsgbXVzYiBjb250cm9sbGVyIGluCj4g aG9zdCwgcGVyaXBoZXJhbCBhbmQgb3RnIG1vZGUKPiAKPiBTaWduZWQtb2ZmLWJ5OiBNaW4gR3Vv IDxtaW4uZ3VvQG1lZGlhdGVrLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBZb25nbG9uZyBXdSA8eW9u Z2xvbmcud3VAbWVkaWF0ZWsuY29tPgo+IC0tLQo+ICBkcml2ZXJzL3VzYi9tdXNiL0tjb25maWcg ICAgIHwgICA4ICstCj4gIGRyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUgICAgfCAgIDEgKwo+ICBk cml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMgIHwgNTYyICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKPiAgZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyB8ICAx MCArCj4gIGRyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmggfCAgIDEgKwo+ICBkcml2ZXJzL3Vz Yi9tdXNiL211c2JfZG1hLmggIHwgICAxICsKPiAgZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3Qu YyB8ICA3OSArKysrLS0KPiAgZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaCB8ICAgNiArCj4g IGRyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgfCAgMzQgKystCj4gIDkgZmlsZXMgY2hhbmdl ZCwgNjcxIGluc2VydGlvbnMoKyksIDMxIGRlbGV0aW9ucygtKQo+ICBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy91c2IvbXVzYi9tZWRpYXRlay5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv dXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwo+IGluZGV4IGFkMDg4 OTUuLjU0MGZjOWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCj4gKysr IGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCj4gQEAgLTExNSw2ICsxMTUsMTIgQEAgY29uZmln IFVTQl9NVVNCX0paNDc0MAo+ICAJZGVwZW5kcyBvbiBVU0JfTVVTQl9HQURHRVQKPiAgCWRlcGVu ZHMgb24gVVNCX09UR19CTEFDS0xJU1RfSFVCCj4gIAo+ICtjb25maWcgVVNCX01VU0JfTUVESUFU RUsKPiArCXRyaXN0YXRlICJNZWRpYVRlayBwbGF0Zm9ybXMiCj4gKwlkZXBlbmRzIG9uIEFSQ0hf TUVESUFURUsKClBsZWFzZSBhbHNvIGFkZCAnfHwgQ09NUElMRV9URVNUJyB0byBtYWtlIHRlc3Rp bmcgZWFzaWVyLgoKPiArCWRlcGVuZHMgb24gTk9QX1VTQl9YQ0VJVgo+ICsJZGVwZW5kcyBvbiBH RU5FUklDX1BIWQo+ICsKPiAgY29uZmlnIFVTQl9NVVNCX0FNMzM1WF9DSElMRAo+ICAJdHJpc3Rh dGUKPiAgCj4gQEAgLTE0MSw3ICsxNDcsNyBAQCBjb25maWcgVVNCX1VYNTAwX0RNQQo+ICAKPiAg Y29uZmlnIFVTQl9JTlZFTlRSQV9ETUEKPiAgCWJvb2wgJ0ludmVudHJhJwo+IC0JZGVwZW5kcyBv biBVU0JfTVVTQl9PTUFQMlBMVVMKPiArCWRlcGVuZHMgb24gVVNCX01VU0JfT01BUDJQTFVTIHx8 IFVTQl9NVVNCX01FRElBVEVLCj4gIAloZWxwCj4gIAkgIEVuYWJsZSBETUEgdHJhbnNmZXJzIHVz aW5nIE1lbnRvcidzIGVuZ2luZS4KPiAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2Iv TWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCj4gaW5kZXggM2E4OGM3OS4uNjNk ODJkMCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCj4gKysrIGIvZHJp dmVycy91c2IvbXVzYi9NYWtlZmlsZQo+IEBAIC0yNCw2ICsyNCw3IEBAIG9iai0kKENPTkZJR19V U0JfTVVTQl9EQThYWCkJCQkrPSBkYTh4eC5vCj4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9VWDUw MCkJCQkrPSB1eDUwMC5vCj4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9KWjQ3NDApCQkJKz0gano0 NzQwLm8KPiAgb2JqLSQoQ09ORklHX1VTQl9NVVNCX1NVTlhJKQkJCSs9IHN1bnhpLm8KPiArb2Jq LSQoQ09ORklHX1VTQl9NVVNCX01FRElBVEVLKSAgICAgIAkJKz0gbWVkaWF0ZWsubwo+ICAKPiAg Cj4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9BTTMzNVhfQ0hJTEQpCQkrPSBtdXNiX2FtMzM1eC5v Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbWVkaWF0ZWsuYyBiL2RyaXZlcnMvdXNi L211c2IvbWVkaWF0ZWsuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4u MTVhNjQ2MAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVr LmMKCltzbmlwXQpJIHdpbGwgcmV2aWV3IHRoaXMgc2VjdGlvbiBsYXRlciBhZnRlciB3ZSBzb3J0 ZWQgb3V0IG90aGVyIHRoaW5ncy4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVz Yl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCj4gaW5kZXggYjdkNTYyNy4u ZDYwZjc2ZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCj4gKysr IGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwo+IEBAIC0xMDI4LDYgKzEwMjgsMTYgQEAg c3RhdGljIHZvaWQgbXVzYl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG11c2IgKm11c2IpCj4g IAl0ZW1wID0gbXVzYl9yZWFkYihtYmFzZSwgTVVTQl9JTlRSVVNCKTsKPiAgCXRlbXAgPSBtdXNi X3JlYWR3KG1iYXNlLCBNVVNCX0lOVFJUWCk7Cj4gIAl0ZW1wID0gbXVzYl9yZWFkdyhtYmFzZSwg TVVTQl9JTlRSUlgpOwo+ICsKPiArCS8qICBNZWRpYVRlayBjb250cm9sbGVyIGludGVycnVwdCBz dGF0dXMgaXMgVzFDICovCgpUaGlzIFcxQyBkb2Vzbid0IG1hdGNoIHRvIHRoZSBNVVNCIFByb2dy YW1taW5nIEd1aWRlIHRoYXQgSSBoYXZlLiBUaG9zZQpyZWdpc3RlcnMgYXJlIHJlYWQtb25seS4K SXMgdGhlIGRpZmZlcmVuY2UgZHVlIHRvIHRoZSBJUCBpbnRlcmdyYXRpb24gaW4gdGhlIG10ayBw bGF0Zm9ybXM/IG9yIGlzCml0IGEgbmV3IHZlcnNpb24gb2YgdGhlIE1VU0IgY29udHJvbGxlcj8g SWYgbGF0dGVyLCB3aGF0IGlzIHRoZSB2ZXJzaW9uPwoKPiArCWlmIChtdXNiLT5vcHMtPnF1aXJr cyAmIE1VU0JfTVRLX1FVSVJLUykgewoKQmFzaWNhbGx5IHdlIGRvbid0IHdhbnQgdG8gdXNlIHRo aXMgdHlwZSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBxdWlya3MgaWYKcG9zc2libGUsIHNvIGxldCdz IHRyeSB0byBub3QgdXNlIGl0LgoKPiArCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9JTlRSVVNC LAo+ICsJCQltdXNiX3JlYWRiKG1iYXNlLCBNVVNCX0lOVFJVU0IpKTsKCkZvciB0aGlzIGNsZWFy aW5nIHJlZ2lzdGVyIGJpdCBvcGVyYXRpb24sIHBsZWFzZSBjcmVhdGUgcGxhdGZvcm0gaG9va3MK bXVzYl9jbGVhcmIoKSBhbmQgbXVzYl9jbGVhcncoKSBpbiBzdHJ1Y3QgbXVzYl9wbGF0Zm9ybV9v cHMgaW5zdGVhZCwKdGhlbiBmb2xsb3cgaG93IG11c2JfcmVhZGIoKSBwb2ludGVyIGlzIGFzc2ln bmVkIGluCm11c2JfaW5pdF9jb250cm9sbGVyKCkgdG8gdXNlIHRoZSBXMUMgdmVyc2lvbiBmb3Ig bXRrIHBsYXRmb3JtLgoKPiArCQltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9JTlRSUlgsCj4gKwkJ CW11c2JfcmVhZHcobWJhc2UsIE1VU0JfSU5UUlJYKSk7Cj4gKwkJbXVzYl93cml0ZXcobWJhc2Us IE1VU0JfSU5UUlRYLAo+ICsJCQltdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0lOVFJUWCkpOwo+ICsJ fQo+ICB9Cj4gIAo+ICBzdGF0aWMgdm9pZCBtdXNiX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBt dXNiICptdXNiKQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oIGIv ZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAo+IGluZGV4IDA0MjAzYjcuLjFiZjRlOWEgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAo+ICsrKyBiL2RyaXZlcnMv dXNiL211c2IvbXVzYl9jb3JlLmgKPiBAQCAtMTM4LDYgKzEzOCw3IEBAIGVudW0gbXVzYl9nX2Vw MF9zdGF0ZSB7Cj4gICAqLwo+ICBzdHJ1Y3QgbXVzYl9wbGF0Zm9ybV9vcHMgewo+ICAKPiArI2Rl ZmluZSBNVVNCX01US19RVUlSS1MJQklUKDEwKQo+ICAjZGVmaW5lIE1VU0JfR19OT19TS0JfUkVT RVJWRQlCSVQoOSkKPiAgI2RlZmluZSBNVVNCX0RBOFhYCQlCSVQoOCkKPiAgI2RlZmluZSBNVVNC X1BSRVNFUlZFX1NFU1NJT04JQklUKDcpCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2Iv bXVzYl9kbWEuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaAo+IGluZGV4IDI4MWU3NWQz Li5iMjE4MjEwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaAo+ICsr KyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaAo+IEBAIC0xOTcsNiArMTk3LDcgQEAgc3Rh dGljIGlubGluZSB2b2lkIG11c2JfZG1hX2NvbnRyb2xsZXJfZGVzdHJveShzdHJ1Y3QgZG1hX2Nv bnRyb2xsZXIgKmQpIHsgfQo+ICBleHRlcm4gc3RydWN0IGRtYV9jb250cm9sbGVyICoKPiAgbXVz YmhzX2RtYV9jb250cm9sbGVyX2NyZWF0ZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdm9pZCBfX2lvbWVt ICpiYXNlKTsKPiAgZXh0ZXJuIHZvaWQgbXVzYmhzX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3koc3Ry dWN0IGRtYV9jb250cm9sbGVyICpjKTsKPiArZXh0ZXJuIGlycXJldHVybl90IGRtYV9jb250cm9s bGVyX2lycShpbnQgaXJxLCB2b2lkICpwcml2YXRlX2RhdGEpOwo+ICAKPiAgZXh0ZXJuIHN0cnVj dCBkbWFfY29udHJvbGxlciAqCj4gIHR1c2JfZG1hX2NvbnRyb2xsZXJfY3JlYXRlKHN0cnVjdCBt dXNiICptdXNiLCB2b2lkIF9faW9tZW0gKmJhc2UpOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Vz Yi9tdXNiL211c2JfaG9zdC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwo+IGluZGV4 IGI1OWNlOWEuLmIxYjAyMTYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hv c3QuYwo+ICsrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKPiBAQCAtMjkyLDIwICsy OTIsNzMgQEAgc3RhdGljIGlubGluZSB2b2lkIG11c2Jfc2F2ZV90b2dnbGUoc3RydWN0IG11c2Jf cWggKnFoLCBpbnQgaXNfaW4sCj4gIHsKPiAgCXZvaWQgX19pb21lbQkJKmVwaW8gPSBxaC0+aHdf ZXAtPnJlZ3M7Cj4gIAl1MTYJCQljc3I7Cj4gKwlzdHJ1Y3QgbXVzYiAqbXVzYiA9IHFoLT5od19l cC0+bXVzYjsKPiAgCj4gIAkvKgo+ICAJICogRklYTUU6IHRoZSBjdXJyZW50IE1lbnRvciBETUEg Y29kZSBzZWVtcyB0byBoYXZlCj4gIAkgKiBwcm9ibGVtcyBnZXR0aW5nIHRvZ2dsZSBjb3JyZWN0 Lgo+ICAJICovCj4gIAo+IC0JaWYgKGlzX2luKQo+IC0JCWNzciA9IG11c2JfcmVhZHcoZXBpbywg TVVTQl9SWENTUikgJiBNVVNCX1JYQ1NSX0hfREFUQVRPR0dMRTsKPiAtCWVsc2UKPiAtCQljc3Ig PSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpICYgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEU7 Cj4gKwkvKiBNZWRpYVRlayBjb250cm9sbGVyIGhhcyBwcml2YXRlIHRvZ2dsZSByZWdpc3RlciAq LwoKb25seSBvbmUgdG9nZ2xlIHJlZ2lzdGVyIGZvciBhbGwgZW5kcG9pbnRzPyBob3cgZG9lcyBp dCBoYW5kbGUKZGlmZmVyZW5jZSB0b2dnbGUgdmFsdWVzIGZvciBkaWZmZXJlbnQgZW5kcG9pbnRz PwoKPiArCWlmIChtdXNiLT5vcHMtPnF1aXJrcyAmIE1VU0JfTVRLX1FVSVJLUykgewo+ICsJCXUx NiB0b2dnbGU7Cj4gKwkJdTggZXBudW0gPSBxaC0+aHdfZXAtPmVwbnVtOwo+ICsKPiArCQlpZiAo aXNfaW4pCj4gKwkJCXRvZ2dsZSA9IG11c2JfcmVhZGwobXVzYi0+bXJlZ3MsIE1VU0JfUlhUT0cp OwoKc2hvdWxkIHVzZSBtdXNiX3JlYWR3KCkgaW5zdGVhZD8gTVVTQl9SWFRPRyBzZWVtcyB0byBi ZSAxNmJpdC4KCj4gKwkJZWxzZQo+ICsJCQl0b2dnbGUgPSBtdXNiX3JlYWRsKG11c2ItPm1yZWdz LCBNVVNCX1RYVE9HKTsKPiArCj4gKwkJY3NyID0gdG9nZ2xlICYgKDEgPDwgZXBudW0pOwo+ICsJ fSBlbHNlIHsKPiArCQlpZiAoaXNfaW4pCj4gKwkJCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVT Ql9SWENTUikKPiArCQkJCSYgTVVTQl9SWENTUl9IX0RBVEFUT0dHTEU7Cj4gKwkJZWxzZQo+ICsJ CQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpCj4gKwkJCQkmIE1VU0JfVFhDU1Jf SF9EQVRBVE9HR0xFOwoKRG9lcyB0aGlzIGxvZ2ljIHN0aWxsIHdvcmsgZm9yIHRoZSBtdGsgcGxh dGZvcm0gZXZlbiBpZiBpdCBoYXMgaXRzIG93bgpwcml2YXRlIHRvZ2dsZSByZWdpc3Rlcj8gSWYg c28sIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGhlcmUuCgpJZiBub3QsIGxldCdzIHRyeSB0byBu b3QgdXNlIHRoaXMgcXVpcmsgZmxhZy4gUGxlYXNlIGNyZWF0ZSBhIGhvb2sKbXVzYl9wbGF0Zm9y bV9nZXRfdG9nZ2xlKCkgaW4gc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzLgoKPiArCX0KPiAgCj4g IAl1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCBxaC0+ZXBudW0sICFpc19pbiwgY3NyID8gMSA6IDAp Owo+ICB9Cj4gIAo+ICtzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3NldF90b2dnbGUoc3RydWN0IG11 c2JfcWggKnFoLCBpbnQgaXNfaW4sCj4gKwkJCQkJc3RydWN0IHVyYiAqdXJiKQo+ICt7Cj4gKwl1 MTYgY3NyID0gMDsKPiArCXUxNiB0b2dnbGUgPSAwOwo+ICsJc3RydWN0IG11c2IgKm11c2IgPSBx aC0+aHdfZXAtPm11c2I7Cj4gKwl1OCBlcG51bSA9IHFoLT5od19lcC0+ZXBudW07Cj4gKwo+ICsJ dG9nZ2xlID0gdXNiX2dldHRvZ2dsZSh1cmItPmRldiwgcWgtPmVwbnVtLCAhaXNfaW4pOwo+ICsK PiArCS8qIE1lZGlhVGVrIGNvbnRyb2xsZXIgaGFzIHByaXZhdGUgdG9nZ2xlIHJlZ2lzdGVyICov Cj4gKwlpZiAobXVzYi0+b3BzLT5xdWlya3MgJiBNVVNCX01US19RVUlSS1MpIHsKPiArCQlpZiAo aXNfaW4pIHsKPiArCQkJbXVzYl93cml0ZWwobXVzYi0+bXJlZ3MsIE1VU0JfUlhUT0dFTiwgKDEg PDwgZXBudW0pKTsKPiArCQkJbXVzYl93cml0ZWwobXVzYi0+bXJlZ3MsIE1VU0JfUlhUT0csICh0 b2dnbGUgPDwgZXBudW0pKTsKPiArCQl9IGVsc2Ugewo+ICsJCQltdXNiX3dyaXRlbChtdXNiLT5t cmVncywgTVVTQl9UWFRPR0VOLCAoMSA8PCBlcG51bSkpOwo+ICsJCQltdXNiX3dyaXRlbChtdXNi LT5tcmVncywgTVVTQl9UWFRPRywgKHRvZ2dsZSA8PCBlcG51bSkpOwo+ICsJCX0KPiArCX0gZWxz ZSB7Cj4gKwkJaWYgKGlzX2luKSB7Cj4gKwkJCWlmICh0b2dnbGUpCj4gKwkJCQljc3IgPSBNVVNC X1JYQ1NSX0hfV1JfREFUQVRPR0dMRQo+ICsJCQkJCQl8IE1VU0JfUlhDU1JfSF9EQVRBVE9HR0xF Owo+ICsJCQllbHNlCj4gKwkJCQljc3IgPSAwOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWlmICh0b2dn bGUpCj4gKwkJCQljc3IgfD0gTVVTQl9UWENTUl9IX1dSX0RBVEFUT0dHTEUKPiArCQkJCQkJfCBN VVNCX1RYQ1NSX0hfREFUQVRPR0dMRTsKPiArCQkJZWxzZQo+ICsJCQkJY3NyIHw9IE1VU0JfVFhD U1JfQ0xSREFUQVRPRzsKPiArCQl9Cj4gKwl9Cj4gKwlyZXR1cm4gY3NyOwoKUGxlYXNlIGNyZWF0 ZSBhIHNlcGVyYXRlIHBhdGNoIGZvciB0aGlzIG11c2Jfc2V0X3RvZ2dsZSgpIHdpdGhvdXQgYWRk aW5nCnRoZSBtdGsgbG9naWMuIEl0IGlzIGEgbmljZSBjbGVhbnVwLgoKPiArfQo+ICsKPiAgLyoK PiAgICogQWR2YW5jZSB0aGlzIGhhcmR3YXJlIGVuZHBvaW50J3MgcXVldWUsIGNvbXBsZXRpbmcg dGhlIHNwZWNpZmllZCBVUkIgYW5kCj4gICAqIGFkdmFuY2luZyB0byBlaXRoZXIgdGhlIG5leHQg VVJCIHF1ZXVlZCB0byB0aGF0IHFoLCBvciBlbHNlIGludmFsaWRhdGluZwo+IEBAIC03NzIsMTMg KzgyNSw4IEBAIHN0YXRpYyB2b2lkIG11c2JfZXBfcHJvZ3JhbShzdHJ1Y3QgbXVzYiAqbXVzYiwg dTggZXBudW0sCj4gIAkJCQkJKTsKPiAgCQkJY3NyIHw9IE1VU0JfVFhDU1JfTU9ERTsKPiAgCj4g LQkJCWlmICghaHdfZXAtPnR4X2RvdWJsZV9idWZmZXJlZCkgewo+IC0JCQkJaWYgKHVzYl9nZXR0 b2dnbGUodXJiLT5kZXYsIHFoLT5lcG51bSwgMSkpCj4gLQkJCQkJY3NyIHw9IE1VU0JfVFhDU1Jf SF9XUl9EQVRBVE9HR0xFCj4gLQkJCQkJCXwgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEU7Cj4gLQkJ CQllbHNlCj4gLQkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfQ0xSREFUQVRPRzsKPiAtCQkJfQo+ICsJ CQlpZiAoIWh3X2VwLT50eF9kb3VibGVfYnVmZmVyZWQpCj4gKwkJCQljc3IgfD0gbXVzYl9zZXRf dG9nZ2xlKHFoLCAhaXNfb3V0LCB1cmIpOwo+ICAKPiAgCQkJbXVzYl93cml0ZXcoZXBpbywgTVVT Ql9UWENTUiwgY3NyKTsKPiAgCQkJLyogUkVWSVNJVCBtYXkgbmVlZCB0byBjbGVhciBGTFVTSEZJ Rk8gLi4uICovCj4gQEAgLTg2MCwxNyArOTA4LDEyIEBAIHN0YXRpYyB2b2lkIG11c2JfZXBfcHJv Z3JhbShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggZXBudW0sCj4gIAo+ICAJLyogSU4vcmVjZWl2ZSAq Lwo+ICAJfSBlbHNlIHsKPiAtCQl1MTYJY3NyOwo+ICsJCXUxNgljc3IgPSAwOwo+ICAKPiAgCQlp ZiAoaHdfZXAtPnJ4X3JlaW5pdCkgewo+ICAJCQltdXNiX3J4X3JlaW5pdChtdXNiLCBxaCwgZXBu dW0pOwo+ICsJCQljc3IgfD0gbXVzYl9zZXRfdG9nZ2xlKHFoLCAhaXNfb3V0LCB1cmIpOwo+ICAK PiAtCQkJLyogaW5pdCBuZXcgc3RhdGU6IHRvZ2dsZSBhbmQgTllFVCwgbWF5YmUgRE1BIGxhdGVy ICovCj4gLQkJCWlmICh1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCBxaC0+ZXBudW0sIDApKQo+IC0J CQkJY3NyID0gTVVTQl9SWENTUl9IX1dSX0RBVEFUT0dHTEUKPiAtCQkJCQl8IE1VU0JfUlhDU1Jf SF9EQVRBVE9HR0xFOwo+IC0JCQllbHNlCj4gLQkJCQljc3IgPSAwOwo+ICAJCQlpZiAocWgtPnR5 cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQo+ICAJCQkJY3NyIHw9IE1VU0JfUlhDU1JfRElT TllFVDsKPiAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmggYi9k cml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCj4gaW5kZXggNWNkNzI2NC4uZmZiZTI2NyAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCj4gKysrIGIvZHJpdmVycy91 c2IvbXVzYi9tdXNiX3JlZ3MuaAo+IEBAIC0yNzMsNiArMjczLDEyIEBACj4gICNkZWZpbmUgTVVT Ql9SWEhVQkFERFIJCTB4MDYKPiAgI2RlZmluZSBNVVNCX1JYSFVCUE9SVAkJMHgwNwo+ICAKPiAr LyogTWVkaWFUZWsgY29udHJvbGxlciB0b2dnbGUgZW5hYmxlIGFuZCBzdGF0dXMgcmVnICovCj4g KyNkZWZpbmUgTVVTQl9SWFRPRwkJMHg4MAo+ICsjZGVmaW5lIE1VU0JfUlhUT0dFTgkJMHg4Mgo+ ICsjZGVmaW5lIE1VU0JfVFhUT0cJCTB4ODQKPiArI2RlZmluZSBNVVNCX1RYVE9HRU4JCTB4ODYK CkFnYWluLCB0aGVzZSBvZmZzZXRzIGFyZSBmb3IgZGlmZmVyZW50IHJlZ2lzdGVycyBpbiB0aGUg TVVTQiB2ZXJzaW9uIEkKaGF2ZSwgcGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIGRpZmZl cmVudCB2ZXJzaW9uIG9mIHRoZSBNVVNCIElQLgoKPiArCj4gIHN0YXRpYyBpbmxpbmUgdTggbXVz Yl9yZWFkX2NvbmZpZ2RhdGEodm9pZCBfX2lvbWVtICptYmFzZSkKPiAgewo+ICAJbXVzYl93cml0 ZWIobWJhc2UsIE1VU0JfSU5ERVgsIDApOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNi L211c2Joc2RtYS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwo+IGluZGV4IDgyNGFk Y2IuLmM1NDU0NzUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwo+ ICsrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKPiBAQCAtMjYzLDcgKzI2Myw3IEBA IHN0YXRpYyBpbnQgZG1hX2NoYW5uZWxfYWJvcnQoc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVs KQo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfY29udHJv bGxlcl9pcnEoaW50IGlycSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQo+ICtpcnFyZXR1cm5fdCBkbWFf Y29udHJvbGxlcl9pcnEoaW50IGlycSwgdm9pZCAqcHJpdmF0ZV9kYXRhKQo+ICB7Cj4gIAlzdHJ1 Y3QgbXVzYl9kbWFfY29udHJvbGxlciAqY29udHJvbGxlciA9IHByaXZhdGVfZGF0YTsKPiAgCXN0 cnVjdCBtdXNiICptdXNiID0gY29udHJvbGxlci0+cHJpdmF0ZV9kYXRhOwo+IEBAIC0yODUsNiAr Mjg1LDggQEAgc3RhdGljIGlycXJldHVybl90IGRtYV9jb250cm9sbGVyX2lycShpbnQgaXJxLCB2 b2lkICpwcml2YXRlX2RhdGEpCj4gIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxh Z3MpOwo+ICAKPiAgCWludF9oc2RtYSA9IG11c2JfcmVhZGIobWJhc2UsIE1VU0JfSFNETUFfSU5U Uik7Cj4gKwlpZiAobXVzYi0+b3BzLT5xdWlya3MgJiBNVVNCX01US19RVUlSS1MpCj4gKwkJbXVz Yl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfSFNETUFfSU5UUiwgaW50X2hzZG1hKTsKCnlvdSBj YW4gdXNlIG11c2JfY2xlYXJiKCkgZGVmaW5lZCBhYm92ZSB0byBnZXQgcmlkIG9mIHRoaXMgcXVp cmsuCgo+ICAKPiAgCWlmICghaW50X2hzZG1hKSB7Cj4gIAkJbXVzYl9kYmcobXVzYiwgInNwdXJp b3VzIERNQSBpcnEiKTsKPiBAQCAtMzc3LDE1ICszNzksMTcgQEAgc3RhdGljIGlycXJldHVybl90 IGRtYV9jb250cm9sbGVyX2lycShpbnQgaXJxLCB2b2lkICpwcml2YXRlX2RhdGEpCj4gIAlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7Cj4gIAlyZXR1cm4gcmV0dmFs Owo+ICB9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGRtYV9jb250cm9sbGVyX2lycSk7Cj4gIAo+ICB2 b2lkIG11c2Joc19kbWFfY29udHJvbGxlcl9kZXN0cm95KHN0cnVjdCBkbWFfY29udHJvbGxlciAq YykKPiAgewo+ICAJc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIgPSBjb250 YWluZXJfb2YoYywKPiAgCQkJc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXIsIGNvbnRyb2xsZXIp Owo+ICsJc3RydWN0IG11c2IgKm11c2IgPSBjb250cm9sbGVyLT5wcml2YXRlX2RhdGE7Cj4gIAo+ ICAJZG1hX2NvbnRyb2xsZXJfc3RvcChjb250cm9sbGVyKTsKPiAgCj4gLQlpZiAoY29udHJvbGxl ci0+aXJxKQo+ICsJaWYgKCEobXVzYi0+b3BzLT5xdWlya3MgJiBNVVNCX01US19RVUlSS1MpICYm IGNvbnRyb2xsZXItPmlycSkKPiAgCQlmcmVlX2lycShjb250cm9sbGVyLT5pcnEsIGMpOwo+ICAK PiAgCWtmcmVlKGNvbnRyb2xsZXIpOwo+IEBAIC0zOTgsMTEgKzQwMiwxNSBAQCBzdHJ1Y3QgZG1h X2NvbnRyb2xsZXIgKm11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGUoc3RydWN0IG11c2IgKm11 c2IsCj4gIAlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlciAqY29udHJvbGxlcjsKPiAgCXN0cnVj dCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Cj4gIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Cj4gLQlpbnQgaXJxID0gcGxhdGZv cm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImRtYSIpOwo+ICsJaW50IGlycSA9IC0xOwo+ICAKPiAt CWlmIChpcnEgPD0gMCkgewo+IC0JCWRldl9lcnIoZGV2LCAiTm8gRE1BIGludGVycnVwdCBsaW5l IVxuIik7Cj4gLQkJcmV0dXJuIE5VTEw7Cj4gKwlpZiAoIShtdXNiLT5vcHMtPnF1aXJrcyAmIE1V U0JfTVRLX1FVSVJLUykpIHsKPiArCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2 LCAiZG1hIik7Cj4gKwo+ICsJCWlmIChpcnEgPCAwKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiTm8g RE1BIGludGVycnVwdCBsaW5lIVxuIik7Cj4gKwkJCXJldHVybiBOVUxMOwo+ICsJCX0KPiAgCX0K ClBsZWFzZSBjcmVhdGUgbXVzYmhzX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3lfbm9pcnEoKSBmb3Ig eW91ciBwbGF0Zm9ybSB0bwpub3QgdXNlIHRoZSBxdWlyay4KCj4gIAo+ICAJY29udHJvbGxlciA9 IGt6YWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7Cj4gQEAgLTQxOCwxNSAr NDI2LDE3IEBAIHN0cnVjdCBkbWFfY29udHJvbGxlciAqbXVzYmhzX2RtYV9jb250cm9sbGVyX2Ny ZWF0ZShzdHJ1Y3QgbXVzYiAqbXVzYiwKPiAgCWNvbnRyb2xsZXItPmNvbnRyb2xsZXIuY2hhbm5l bF9wcm9ncmFtID0gZG1hX2NoYW5uZWxfcHJvZ3JhbTsKPiAgCWNvbnRyb2xsZXItPmNvbnRyb2xs ZXIuY2hhbm5lbF9hYm9ydCA9IGRtYV9jaGFubmVsX2Fib3J0Owo+ICAKPiAtCWlmIChyZXF1ZXN0 X2lycShpcnEsIGRtYV9jb250cm9sbGVyX2lycSwgMCwKPiArCWlmICghKG11c2ItPm9wcy0+cXVp cmtzICYgTVVTQl9NVEtfUVVJUktTKSkgewo+ICsJCWlmIChyZXF1ZXN0X2lycShpcnEsIGRtYV9j b250cm9sbGVyX2lycSwgMCwKPiAgCQkJZGV2X25hbWUobXVzYi0+Y29udHJvbGxlciksICZjb250 cm9sbGVyLT5jb250cm9sbGVyKSkgewo+IC0JCWRldl9lcnIoZGV2LCAicmVxdWVzdF9pcnEgJWQg ZmFpbGVkIVxuIiwgaXJxKTsKPiAtCQltdXNiX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3koJmNvbnRy b2xsZXItPmNvbnRyb2xsZXIpOwo+ICsJCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfaXJxICVkIGZh aWxlZCFcbiIsIGlycSk7Cj4gKwkJCW11c2JfZG1hX2NvbnRyb2xsZXJfZGVzdHJveSgmY29udHJv bGxlci0+Y29udHJvbGxlcik7Cj4gIAo+IC0JCXJldHVybiBOVUxMOwo+IC0JfQo+ICsJCQlyZXR1 cm4gTlVMTDsKPiArCQl9Cj4gIAo+IC0JY29udHJvbGxlci0+aXJxID0gaXJxOwo+ICsJCWNvbnRy b2xsZXItPmlycSA9IGlycTsKPiArCX0KPiAgCj4gIAlyZXR1cm4gJmNvbnRyb2xsZXItPmNvbnRy b2xsZXI7Cj4gIH0KClNhbWUgaGVyZSwgY3JlYXRlIG11c2Joc19kbWFfY29udHJvbGxlcl9jcmVh dGVfbm9pcnEoKS4gVGhlbiB1c2UgYm90aApuZXcgQVBJIGZvciB0aGUgbXRrIGdsdWUgZHJpdmVy LgoKUmVnYXJkcywKLUJpbi4K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1660FC43387 for ; Tue, 8 Jan 2019 15:44:54 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D9DC420827 for ; Tue, 8 Jan 2019 15:44:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="jfXPYlJ5"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="zJW2AVPO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D9DC420827 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=RM/YcdrtFGMyG09HdUs9zXDgL1TDxM7rEbGbQzqwKSk=; b=jfXPYlJ5rtLYA4 hqqswLImUJurXE9fcrK/gU/GIQ/7tldLIw23x2wLQXtvLCDR0pMeeXv75xyG4jzbA32BQL8McBUqr 0+5CuunV52KnMSewiV4teD0F6EOOC3CAqaB23WTns0a/B07FHgjGHBGlINavVoGeeTnKHQL9v6k6t 2bWBJ98noIVzAMXb4evzH9oazl4QZZz072RJbb/2S9h6NeZ1Txzs2CeMQYwFARBvRVRPP8dWhMYg8 ewi182I54bMf5baWbs9HoI2uY5jzK/Fv758pK9ehNGwxo1pFXXxXGMgi3oaWWBq3E5zwskIc2MfaL cCzlLqAVvR5DrFOGgFfg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggtYi-0005m7-G9; Tue, 08 Jan 2019 15:44:52 +0000 Received: from fllv0015.ext.ti.com ([198.47.19.141]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggtYe-0005lK-Df; Tue, 08 Jan 2019 15:44:50 +0000 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id x08FifZ6111050; Tue, 8 Jan 2019 09:44:41 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1546962281; bh=fachTKCPBIn7riJjZp5zchXJqEK3IgIyqJSzpthgUh0=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=zJW2AVPOrdm92L5WzrUYjibA6UfDna2uicP+sgk5k92I99umyRF/C1KVcvE/XM+Cm RQW7p/cy7nRBSqY6zRwH6lz0nMMMsFhVLoodnIi3B48B3RNMwflrHSek/PooAMn3YX TO0BnRzGQnblsjSb9zJwQqr8ZyispAtHcJy5R6J0= Received: from DLEE103.ent.ti.com (dlee103.ent.ti.com [157.170.170.33]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x08FifhL076909 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 8 Jan 2019 09:44:41 -0600 Received: from DLEE114.ent.ti.com (157.170.170.25) by DLEE103.ent.ti.com (157.170.170.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1591.10; Tue, 8 Jan 2019 09:44:41 -0600 Received: from dflp32.itg.ti.com (10.64.6.15) by DLEE114.ent.ti.com (157.170.170.25) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1591.10 via Frontend Transport; Tue, 8 Jan 2019 09:44:41 -0600 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp32.itg.ti.com (8.14.3/8.13.8) with ESMTP id x08FifZj014927; Tue, 8 Jan 2019 09:44:41 -0600 Date: Tue, 8 Jan 2019 09:44:41 -0600 From: Bin Liu To: Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller Message-ID: <20190108154441.GG25910@uda0271908> Mail-Followup-To: Bin Liu , min.guo@mediatek.com, Rob Herring , Greg Kroah-Hartman , Mark Rutland , Matthias Brugger , Alan Stern , chunfeng.yun@mediatek.com, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Yonglong Wu References: <1545896066-897-1-git-send-email-min.guo@mediatek.com> <1545896066-897-5-git-send-email-min.guo@mediatek.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1545896066-897-5-git-send-email-min.guo@mediatek.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190108_074448_584415_C07531E3 X-CRM114-Status: GOOD ( 40.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Yonglong Wu , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Matthias Brugger , Rob Herring , Alan Stern , chunfeng.yun@mediatek.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, On Thu, Dec 27, 2018 at 03:34:26PM +0800, min.guo@mediatek.com wrote: > From: Min Guo > > This adds support for MediaTek musb controller in > host, peripheral and otg mode > > Signed-off-by: Min Guo > Signed-off-by: Yonglong Wu > --- > drivers/usb/musb/Kconfig | 8 +- > drivers/usb/musb/Makefile | 1 + > drivers/usb/musb/mediatek.c | 562 +++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/musb/musb_core.c | 10 + > drivers/usb/musb/musb_core.h | 1 + > drivers/usb/musb/musb_dma.h | 1 + > drivers/usb/musb/musb_host.c | 79 ++++-- > drivers/usb/musb/musb_regs.h | 6 + > drivers/usb/musb/musbhsdma.c | 34 ++- > 9 files changed, 671 insertions(+), 31 deletions(-) > create mode 100644 drivers/usb/musb/mediatek.c > > diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig > index ad08895..540fc9f 100644 > --- a/drivers/usb/musb/Kconfig > +++ b/drivers/usb/musb/Kconfig > @@ -115,6 +115,12 @@ config USB_MUSB_JZ4740 > depends on USB_MUSB_GADGET > depends on USB_OTG_BLACKLIST_HUB > > +config USB_MUSB_MEDIATEK > + tristate "MediaTek platforms" > + depends on ARCH_MEDIATEK Please also add '|| COMPILE_TEST' to make testing easier. > + depends on NOP_USB_XCEIV > + depends on GENERIC_PHY > + > config USB_MUSB_AM335X_CHILD > tristate > > @@ -141,7 +147,7 @@ config USB_UX500_DMA > > config USB_INVENTRA_DMA > bool 'Inventra' > - depends on USB_MUSB_OMAP2PLUS > + depends on USB_MUSB_OMAP2PLUS || USB_MUSB_MEDIATEK > help > Enable DMA transfers using Mentor's engine. > > diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile > index 3a88c79..63d82d0 100644 > --- a/drivers/usb/musb/Makefile > +++ b/drivers/usb/musb/Makefile > @@ -24,6 +24,7 @@ obj-$(CONFIG_USB_MUSB_DA8XX) += da8xx.o > obj-$(CONFIG_USB_MUSB_UX500) += ux500.o > obj-$(CONFIG_USB_MUSB_JZ4740) += jz4740.o > obj-$(CONFIG_USB_MUSB_SUNXI) += sunxi.o > +obj-$(CONFIG_USB_MUSB_MEDIATEK) += mediatek.o > > > obj-$(CONFIG_USB_MUSB_AM335X_CHILD) += musb_am335x.o > diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c > new file mode 100644 > index 0000000..15a6460 > --- /dev/null > +++ b/drivers/usb/musb/mediatek.c [snip] I will review this section later after we sorted out other things. > diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c > index b7d5627..d60f76f 100644 > --- a/drivers/usb/musb/musb_core.c > +++ b/drivers/usb/musb/musb_core.c > @@ -1028,6 +1028,16 @@ static void musb_disable_interrupts(struct musb *musb) > temp = musb_readb(mbase, MUSB_INTRUSB); > temp = musb_readw(mbase, MUSB_INTRTX); > temp = musb_readw(mbase, MUSB_INTRRX); > + > + /* MediaTek controller interrupt status is W1C */ This W1C doesn't match to the MUSB Programming Guide that I have. Those registers are read-only. Is the difference due to the IP intergration in the mtk platforms? or is it a new version of the MUSB controller? If latter, what is the version? > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { Basically we don't want to use this type of platform specific quirks if possible, so let's try to not use it. > + musb_writeb(mbase, MUSB_INTRUSB, > + musb_readb(mbase, MUSB_INTRUSB)); For this clearing register bit operation, please create platform hooks musb_clearb() and musb_clearw() in struct musb_platform_ops instead, then follow how musb_readb() pointer is assigned in musb_init_controller() to use the W1C version for mtk platform. > + musb_writew(mbase, MUSB_INTRRX, > + musb_readw(mbase, MUSB_INTRRX)); > + musb_writew(mbase, MUSB_INTRTX, > + musb_readw(mbase, MUSB_INTRTX)); > + } > } > > static void musb_enable_interrupts(struct musb *musb) > diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h > index 04203b7..1bf4e9a 100644 > --- a/drivers/usb/musb/musb_core.h > +++ b/drivers/usb/musb/musb_core.h > @@ -138,6 +138,7 @@ enum musb_g_ep0_state { > */ > struct musb_platform_ops { > > +#define MUSB_MTK_QUIRKS BIT(10) > #define MUSB_G_NO_SKB_RESERVE BIT(9) > #define MUSB_DA8XX BIT(8) > #define MUSB_PRESERVE_SESSION BIT(7) > diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h > index 281e75d3..b218210 100644 > --- a/drivers/usb/musb/musb_dma.h > +++ b/drivers/usb/musb/musb_dma.h > @@ -197,6 +197,7 @@ static inline void musb_dma_controller_destroy(struct dma_controller *d) { } > extern struct dma_controller * > musbhs_dma_controller_create(struct musb *musb, void __iomem *base); > extern void musbhs_dma_controller_destroy(struct dma_controller *c); > +extern irqreturn_t dma_controller_irq(int irq, void *private_data); > > extern struct dma_controller * > tusb_dma_controller_create(struct musb *musb, void __iomem *base); > diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c > index b59ce9a..b1b0216 100644 > --- a/drivers/usb/musb/musb_host.c > +++ b/drivers/usb/musb/musb_host.c > @@ -292,20 +292,73 @@ static inline void musb_save_toggle(struct musb_qh *qh, int is_in, > { > void __iomem *epio = qh->hw_ep->regs; > u16 csr; > + struct musb *musb = qh->hw_ep->musb; > > /* > * FIXME: the current Mentor DMA code seems to have > * problems getting toggle correct. > */ > > - if (is_in) > - csr = musb_readw(epio, MUSB_RXCSR) & MUSB_RXCSR_H_DATATOGGLE; > - else > - csr = musb_readw(epio, MUSB_TXCSR) & MUSB_TXCSR_H_DATATOGGLE; > + /* MediaTek controller has private toggle register */ only one toggle register for all endpoints? how does it handle difference toggle values for different endpoints? > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { > + u16 toggle; > + u8 epnum = qh->hw_ep->epnum; > + > + if (is_in) > + toggle = musb_readl(musb->mregs, MUSB_RXTOG); should use musb_readw() instead? MUSB_RXTOG seems to be 16bit. > + else > + toggle = musb_readl(musb->mregs, MUSB_TXTOG); > + > + csr = toggle & (1 << epnum); > + } else { > + if (is_in) > + csr = musb_readw(epio, MUSB_RXCSR) > + & MUSB_RXCSR_H_DATATOGGLE; > + else > + csr = musb_readw(epio, MUSB_TXCSR) > + & MUSB_TXCSR_H_DATATOGGLE; Does this logic still work for the mtk platform even if it has its own private toggle register? If so, we don't need to change here. If not, let's try to not use this quirk flag. Please create a hook musb_platform_get_toggle() in struct musb_platform_ops. > + } > > usb_settoggle(urb->dev, qh->epnum, !is_in, csr ? 1 : 0); > } > > +static inline u16 musb_set_toggle(struct musb_qh *qh, int is_in, > + struct urb *urb) > +{ > + u16 csr = 0; > + u16 toggle = 0; > + struct musb *musb = qh->hw_ep->musb; > + u8 epnum = qh->hw_ep->epnum; > + > + toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); > + > + /* MediaTek controller has private toggle register */ > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) { > + if (is_in) { > + musb_writel(musb->mregs, MUSB_RXTOGEN, (1 << epnum)); > + musb_writel(musb->mregs, MUSB_RXTOG, (toggle << epnum)); > + } else { > + musb_writel(musb->mregs, MUSB_TXTOGEN, (1 << epnum)); > + musb_writel(musb->mregs, MUSB_TXTOG, (toggle << epnum)); > + } > + } else { > + if (is_in) { > + if (toggle) > + csr = MUSB_RXCSR_H_WR_DATATOGGLE > + | MUSB_RXCSR_H_DATATOGGLE; > + else > + csr = 0; > + } else { > + if (toggle) > + csr |= MUSB_TXCSR_H_WR_DATATOGGLE > + | MUSB_TXCSR_H_DATATOGGLE; > + else > + csr |= MUSB_TXCSR_CLRDATATOG; > + } > + } > + return csr; Please create a seperate patch for this musb_set_toggle() without adding the mtk logic. It is a nice cleanup. > +} > + > /* > * Advance this hardware endpoint's queue, completing the specified URB and > * advancing to either the next URB queued to that qh, or else invalidating > @@ -772,13 +825,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum, > ); > csr |= MUSB_TXCSR_MODE; > > - if (!hw_ep->tx_double_buffered) { > - if (usb_gettoggle(urb->dev, qh->epnum, 1)) > - csr |= MUSB_TXCSR_H_WR_DATATOGGLE > - | MUSB_TXCSR_H_DATATOGGLE; > - else > - csr |= MUSB_TXCSR_CLRDATATOG; > - } > + if (!hw_ep->tx_double_buffered) > + csr |= musb_set_toggle(qh, !is_out, urb); > > musb_writew(epio, MUSB_TXCSR, csr); > /* REVISIT may need to clear FLUSHFIFO ... */ > @@ -860,17 +908,12 @@ static void musb_ep_program(struct musb *musb, u8 epnum, > > /* IN/receive */ > } else { > - u16 csr; > + u16 csr = 0; > > if (hw_ep->rx_reinit) { > musb_rx_reinit(musb, qh, epnum); > + csr |= musb_set_toggle(qh, !is_out, urb); > > - /* init new state: toggle and NYET, maybe DMA later */ > - if (usb_gettoggle(urb->dev, qh->epnum, 0)) > - csr = MUSB_RXCSR_H_WR_DATATOGGLE > - | MUSB_RXCSR_H_DATATOGGLE; > - else > - csr = 0; > if (qh->type == USB_ENDPOINT_XFER_INT) > csr |= MUSB_RXCSR_DISNYET; > > diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h > index 5cd7264..ffbe267 100644 > --- a/drivers/usb/musb/musb_regs.h > +++ b/drivers/usb/musb/musb_regs.h > @@ -273,6 +273,12 @@ > #define MUSB_RXHUBADDR 0x06 > #define MUSB_RXHUBPORT 0x07 > > +/* MediaTek controller toggle enable and status reg */ > +#define MUSB_RXTOG 0x80 > +#define MUSB_RXTOGEN 0x82 > +#define MUSB_TXTOG 0x84 > +#define MUSB_TXTOGEN 0x86 Again, these offsets are for different registers in the MUSB version I have, please let me know if you have different version of the MUSB IP. > + > static inline u8 musb_read_configdata(void __iomem *mbase) > { > musb_writeb(mbase, MUSB_INDEX, 0); > diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c > index 824adcb..c545475 100644 > --- a/drivers/usb/musb/musbhsdma.c > +++ b/drivers/usb/musb/musbhsdma.c > @@ -263,7 +263,7 @@ static int dma_channel_abort(struct dma_channel *channel) > return 0; > } > > -static irqreturn_t dma_controller_irq(int irq, void *private_data) > +irqreturn_t dma_controller_irq(int irq, void *private_data) > { > struct musb_dma_controller *controller = private_data; > struct musb *musb = controller->private_data; > @@ -285,6 +285,8 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) > spin_lock_irqsave(&musb->lock, flags); > > int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR); > + if (musb->ops->quirks & MUSB_MTK_QUIRKS) > + musb_writeb(musb->mregs, MUSB_HSDMA_INTR, int_hsdma); you can use musb_clearb() defined above to get rid of this quirk. > > if (!int_hsdma) { > musb_dbg(musb, "spurious DMA irq"); > @@ -377,15 +379,17 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) > spin_unlock_irqrestore(&musb->lock, flags); > return retval; > } > +EXPORT_SYMBOL_GPL(dma_controller_irq); > > void musbhs_dma_controller_destroy(struct dma_controller *c) > { > struct musb_dma_controller *controller = container_of(c, > struct musb_dma_controller, controller); > + struct musb *musb = controller->private_data; > > dma_controller_stop(controller); > > - if (controller->irq) > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS) && controller->irq) > free_irq(controller->irq, c); > > kfree(controller); > @@ -398,11 +402,15 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb, > struct musb_dma_controller *controller; > struct device *dev = musb->controller; > struct platform_device *pdev = to_platform_device(dev); > - int irq = platform_get_irq_byname(pdev, "dma"); > + int irq = -1; > > - if (irq <= 0) { > - dev_err(dev, "No DMA interrupt line!\n"); > - return NULL; > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS)) { > + irq = platform_get_irq_byname(pdev, "dma"); > + > + if (irq < 0) { > + dev_err(dev, "No DMA interrupt line!\n"); > + return NULL; > + } > } Please create musbhs_dma_controller_destroy_noirq() for your platform to not use the quirk. > > controller = kzalloc(sizeof(*controller), GFP_KERNEL); > @@ -418,15 +426,17 @@ struct dma_controller *musbhs_dma_controller_create(struct musb *musb, > controller->controller.channel_program = dma_channel_program; > controller->controller.channel_abort = dma_channel_abort; > > - if (request_irq(irq, dma_controller_irq, 0, > + if (!(musb->ops->quirks & MUSB_MTK_QUIRKS)) { > + if (request_irq(irq, dma_controller_irq, 0, > dev_name(musb->controller), &controller->controller)) { > - dev_err(dev, "request_irq %d failed!\n", irq); > - musb_dma_controller_destroy(&controller->controller); > + dev_err(dev, "request_irq %d failed!\n", irq); > + musb_dma_controller_destroy(&controller->controller); > > - return NULL; > - } > + return NULL; > + } > > - controller->irq = irq; > + controller->irq = irq; > + } > > return &controller->controller; > } Same here, create musbhs_dma_controller_create_noirq(). Then use both new API for the mtk glue driver. Regards, -Bin. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel