From mboxrd@z Thu Jan 1 00:00:00 1970 From: Min Guo Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller Date: Wed, 9 Jan 2019 20:31:08 +0800 Message-ID: <1547037068.4433.122.camel@mhfsdcap03> References: <1545896066-897-1-git-send-email-min.guo@mediatek.com> <1545896066-897-5-git-send-email-min.guo@mediatek.com> <20190108154441.GG25910@uda0271908> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20190108154441.GG25910@uda0271908> 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: Bin Liu 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 Bin, On Tue, 2019-01-08 at 09:44 -0600, Bin Liu wrote: > 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. Ok > > + 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? This is difference due to the IP intergration in mtk platforms. W1C is easy for CpdeViser debug. > > + 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. I will try my best to avoid using 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. I have tried implementing musb_readb(), musb_readw() interface with interrupt status W1C function in struct musb_platform_ops. But this interface will require a global variable to hold MAC basic address for judgment, and then special handling of the interrupt state. A global variable will make the driver work with only a single instance, so it can't work on some MTK platforms which have two instances. How about creating musb_clearb/w() as following: void (*clearb)(void __iomem *addr, unsigned offset, u8 data); void (*clearw)(void __iomem *addr, unsigned offset, u16 data); > > + 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? MediaTek controller has separate registers to describe TX/RX toggle. > > + 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. Ok > > + 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. Sorry, this logic can not work on mtk platform, bit MUSB_RXCSR_H_DATATOGGLE and MUSB_TXCSR_H_DATATOGGLE are used for other function. > If not, let's try to not use this quirk flag. Please create a hook > musb_platform_get_toggle() in struct musb_platform_ops. Does the method of implement musb_platform_get_toggle() is prepare musb_default_get_toggle with common function, then follow how musb_readb() pointer is assigned in musb_init_controller()? How about creating musb_platform_get_toggle() as following: u16 (*get_toggle)(struct musb* musb, struct musb_qh *qh, int is_in); > > + } > > > > 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. Does this like get toggle implementation, create a hook musb_platform_set_toggle() in struct musb_platform_ops? > > +} > > + > > /* > > * 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. Sorry, these are MediaTek controller private registers used for control toggle. > > + > > 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. OK. > > > > 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. OK. > > > > 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. OK. > 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: min.guo@mediatek.com Message-Id: <1547037068.4433.122.camel@mhfsdcap03> Date: Wed, 9 Jan 2019 20:31:08 +0800 To: Bin Liu 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: SGkgQmluLApPbiBUdWUsIDIwMTktMDEtMDggYXQgMDk6NDQgLTA2MDAsIEJpbiBMaXUgd3JvdGU6 Cj4gSGksCj4gCj4gT24gVGh1LCBEZWMgMjcsIDIwMTggYXQgMDM6MzQ6MjZQTSArMDgwMCwgbWlu Lmd1b0BtZWRpYXRlay5jb20gd3JvdGU6Cj4gPiBGcm9tOiBNaW4gR3VvIDxtaW4uZ3VvQG1lZGlh dGVrLmNvbT4KPiA+IAo+ID4gVGhpcyBhZGRzIHN1cHBvcnQgZm9yIE1lZGlhVGVrIG11c2IgY29u dHJvbGxlciBpbgo+ID4gaG9zdCwgcGVyaXBoZXJhbCBhbmQgb3RnIG1vZGUKPiA+IAo+ID4gU2ln bmVkLW9mZi1ieTogTWluIEd1byA8bWluLmd1b0BtZWRpYXRlay5jb20+Cj4gPiBTaWduZWQtb2Zm LWJ5OiBZb25nbG9uZyBXdSA8eW9uZ2xvbmcud3VAbWVkaWF0ZWsuY29tPgo+ID4gLS0tCj4gPiAg ZHJpdmVycy91c2IvbXVzYi9LY29uZmlnICAgICB8ICAgOCArLQo+ID4gIGRyaXZlcnMvdXNiL211 c2IvTWFrZWZpbGUgICAgfCAgIDEgKwo+ID4gIGRyaXZlcnMvdXNiL211c2IvbWVkaWF0ZWsuYyAg fCA1NjIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIGRy aXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgfCAgMTAgKwo+ID4gIGRyaXZlcnMvdXNiL211c2Iv bXVzYl9jb3JlLmggfCAgIDEgKwo+ID4gIGRyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaCAgfCAg IDEgKwo+ID4gIGRyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgfCAgNzkgKysrKy0tCj4gPiAg ZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaCB8ICAgNiArCj4gPiAgZHJpdmVycy91c2IvbXVz Yi9tdXNiaHNkbWEuYyB8ICAzNCArKy0KPiA+ICA5IGZpbGVzIGNoYW5nZWQsIDY3MSBpbnNlcnRp b25zKCspLCAzMSBkZWxldGlvbnMoLSkKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91 c2IvbXVzYi9tZWRpYXRlay5jCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNi L0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKPiA+IGluZGV4IGFkMDg4OTUuLjU0 MGZjOWYgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKPiA+ICsrKyBi L2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwo+ID4gQEAgLTExNSw2ICsxMTUsMTIgQEAgY29uZmln IFVTQl9NVVNCX0paNDc0MAo+ID4gIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0dBREdFVAo+ID4gIAlk ZXBlbmRzIG9uIFVTQl9PVEdfQkxBQ0tMSVNUX0hVQgo+ID4gIAo+ID4gK2NvbmZpZyBVU0JfTVVT Ql9NRURJQVRFSwo+ID4gKwl0cmlzdGF0ZSAiTWVkaWFUZWsgcGxhdGZvcm1zIgo+ID4gKwlkZXBl bmRzIG9uIEFSQ0hfTUVESUFURUsKPiAKPiBQbGVhc2UgYWxzbyBhZGQgJ3x8IENPTVBJTEVfVEVT VCcgdG8gbWFrZSB0ZXN0aW5nIGVhc2llci4KCk9rCgo+ID4gKwlkZXBlbmRzIG9uIE5PUF9VU0Jf WENFSVYKPiA+ICsJZGVwZW5kcyBvbiBHRU5FUklDX1BIWQo+ID4gKwo+ID4gIGNvbmZpZyBVU0Jf TVVTQl9BTTMzNVhfQ0hJTEQKPiA+ICAJdHJpc3RhdGUKPiA+ICAKPiA+IEBAIC0xNDEsNyArMTQ3 LDcgQEAgY29uZmlnIFVTQl9VWDUwMF9ETUEKPiA+ICAKPiA+ICBjb25maWcgVVNCX0lOVkVOVFJB X0RNQQo+ID4gIAlib29sICdJbnZlbnRyYScKPiA+IC0JZGVwZW5kcyBvbiBVU0JfTVVTQl9PTUFQ MlBMVVMKPiA+ICsJZGVwZW5kcyBvbiBVU0JfTVVTQl9PTUFQMlBMVVMgfHwgVVNCX01VU0JfTUVE SUFURUsKPiA+ICAJaGVscAo+ID4gIAkgIEVuYWJsZSBETUEgdHJhbnNmZXJzIHVzaW5nIE1lbnRv cidzIGVuZ2luZS4KPiA+ICAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL01ha2Vm aWxlIGIvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQo+ID4gaW5kZXggM2E4OGM3OS4uNjNkODJk MCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKPiA+ICsrKyBiL2Ry aXZlcnMvdXNiL211c2IvTWFrZWZpbGUKPiA+IEBAIC0yNCw2ICsyNCw3IEBAIG9iai0kKENPTkZJ R19VU0JfTVVTQl9EQThYWCkJCQkrPSBkYTh4eC5vCj4gPiAgb2JqLSQoQ09ORklHX1VTQl9NVVNC X1VYNTAwKQkJCSs9IHV4NTAwLm8KPiA+ICBvYmotJChDT05GSUdfVVNCX01VU0JfSlo0NzQwKQkJ CSs9IGp6NDc0MC5vCj4gPiAgb2JqLSQoQ09ORklHX1VTQl9NVVNCX1NVTlhJKQkJCSs9IHN1bnhp Lm8KPiA+ICtvYmotJChDT05GSUdfVVNCX01VU0JfTUVESUFURUspICAgICAgCQkrPSBtZWRpYXRl ay5vCj4gPiAgCj4gPiAgCj4gPiAgb2JqLSQoQ09ORklHX1VTQl9NVVNCX0FNMzM1WF9DSElMRCkJ CSs9IG11c2JfYW0zMzV4Lm8KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL21lZGlh dGVrLmMgYi9kcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi4xNWE2NDYwCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysg Yi9kcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMKPiAKPiBbc25pcF0KPiBJIHdpbGwgcmV2aWV3 IHRoaXMgc2VjdGlvbiBsYXRlciBhZnRlciB3ZSBzb3J0ZWQgb3V0IG90aGVyIHRoaW5ncy4KPiAK PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91 c2IvbXVzYi9tdXNiX2NvcmUuYwo+ID4gaW5kZXggYjdkNTYyNy4uZDYwZjc2ZiAxMDA2NDQKPiA+ IC0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKPiA+ICsrKyBiL2RyaXZlcnMvdXNi L211c2IvbXVzYl9jb3JlLmMKPiA+IEBAIC0xMDI4LDYgKzEwMjgsMTYgQEAgc3RhdGljIHZvaWQg bXVzYl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG11c2IgKm11c2IpCj4gPiAgCXRlbXAgPSBt dXNiX3JlYWRiKG1iYXNlLCBNVVNCX0lOVFJVU0IpOwo+ID4gIAl0ZW1wID0gbXVzYl9yZWFkdyht YmFzZSwgTVVTQl9JTlRSVFgpOwo+ID4gIAl0ZW1wID0gbXVzYl9yZWFkdyhtYmFzZSwgTVVTQl9J TlRSUlgpOwo+ID4gKwo+ID4gKwkvKiAgTWVkaWFUZWsgY29udHJvbGxlciBpbnRlcnJ1cHQgc3Rh dHVzIGlzIFcxQyAqLwo+IAo+IFRoaXMgVzFDIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIE1VU0IgUHJv Z3JhbW1pbmcgR3VpZGUgdGhhdCBJIGhhdmUuIFRob3NlCj4gcmVnaXN0ZXJzIGFyZSByZWFkLW9u bHkuCj4gSXMgdGhlIGRpZmZlcmVuY2UgZHVlIHRvIHRoZSBJUCBpbnRlcmdyYXRpb24gaW4gdGhl IG10ayBwbGF0Zm9ybXM/IG9yIGlzCj4gaXQgYSBuZXcgdmVyc2lvbiBvZiB0aGUgTVVTQiBjb250 cm9sbGVyPyBJZiBsYXR0ZXIsIHdoYXQgaXMgdGhlIHZlcnNpb24/CgpUaGlzIGlzIGRpZmZlcmVu Y2UgZHVlIHRvIHRoZSBJUCBpbnRlcmdyYXRpb24gaW4gbXRrIHBsYXRmb3Jtcy4gVzFDIGlzCmVh c3kgZm9yIENwZGVWaXNlciBkZWJ1Zy4KCj4gPiArCWlmIChtdXNiLT5vcHMtPnF1aXJrcyAmIE1V U0JfTVRLX1FVSVJLUykgewo+IAo+IEJhc2ljYWxseSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGlz IHR5cGUgb2YgcGxhdGZvcm0gc3BlY2lmaWMgcXVpcmtzIGlmCj4gcG9zc2libGUsIHNvIGxldCdz IHRyeSB0byBub3QgdXNlIGl0LgoKSSB3aWxsIHRyeSBteSBiZXN0IHRvIGF2b2lkIHVzaW5nIGl0 LgoKPiA+ICsJCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0lOVFJVU0IsCj4gPiArCQkJbXVzYl9y ZWFkYihtYmFzZSwgTVVTQl9JTlRSVVNCKSk7Cj4gCj4gRm9yIHRoaXMgY2xlYXJpbmcgcmVnaXN0 ZXIgYml0IG9wZXJhdGlvbiwgcGxlYXNlIGNyZWF0ZSBwbGF0Zm9ybSBob29rcwo+IG11c2JfY2xl YXJiKCkgYW5kIG11c2JfY2xlYXJ3KCkgaW4gc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzIGluc3Rl YWQsCj4gdGhlbiBmb2xsb3cgaG93IG11c2JfcmVhZGIoKSBwb2ludGVyIGlzIGFzc2lnbmVkIGlu Cj4gbXVzYl9pbml0X2NvbnRyb2xsZXIoKSB0byB1c2UgdGhlIFcxQyB2ZXJzaW9uIGZvciBtdGsg cGxhdGZvcm0uCgpJIGhhdmUgdHJpZWQgaW1wbGVtZW50aW5nIG11c2JfcmVhZGIoKSwgbXVzYl9y ZWFkdygpIGludGVyZmFjZSB3aXRoCmludGVycnVwdCBzdGF0dXMgVzFDIGZ1bmN0aW9uIGluIHN0 cnVjdCBtdXNiX3BsYXRmb3JtX29wcy4gQnV0IHRoaXMKaW50ZXJmYWNlIHdpbGwgcmVxdWlyZSBh IGdsb2JhbCB2YXJpYWJsZSB0byBob2xkIE1BQyBiYXNpYyBhZGRyZXNzIGZvcgpqdWRnbWVudCwg YW5kIHRoZW4gc3BlY2lhbCBoYW5kbGluZyBvZiB0aGUgaW50ZXJydXB0IHN0YXRlLiBBIGdsb2Jh bAp2YXJpYWJsZSB3aWxsIG1ha2UgdGhlIGRyaXZlciB3b3JrIHdpdGggb25seSBhIHNpbmdsZSBp bnN0YW5jZSwgc28gaXQKY2FuJ3Qgd29yayBvbiBzb21lIE1USyBwbGF0Zm9ybXMgd2hpY2ggaGF2 ZSB0d28gaW5zdGFuY2VzLgpIb3cgYWJvdXQgY3JlYXRpbmcgbXVzYl9jbGVhcmIvdygpIGFzIGZv bGxvd2luZzoKdm9pZCAoKmNsZWFyYikodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZz ZXQsIHU4IGRhdGEpOwp2b2lkICgqY2xlYXJ3KSh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVk IG9mZnNldCwgdTE2IGRhdGEpOwoKCj4gPiArCQltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9JTlRS UlgsCj4gPiArCQkJbXVzYl9yZWFkdyhtYmFzZSwgTVVTQl9JTlRSUlgpKTsKPiA+ICsJCW11c2Jf d3JpdGV3KG1iYXNlLCBNVVNCX0lOVFJUWCwKPiA+ICsJCQltdXNiX3JlYWR3KG1iYXNlLCBNVVNC X0lOVFJUWCkpOwo+ID4gKwl9Cj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyB2b2lkIG11c2JfZW5h YmxlX2ludGVycnVwdHMoc3RydWN0IG11c2IgKm11c2IpCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKPiA+ IGluZGV4IDA0MjAzYjcuLjFiZjRlOWEgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNi L211c2JfY29yZS5oCj4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCj4gPiBA QCAtMTM4LDYgKzEzOCw3IEBAIGVudW0gbXVzYl9nX2VwMF9zdGF0ZSB7Cj4gPiAgICovCj4gPiAg c3RydWN0IG11c2JfcGxhdGZvcm1fb3BzIHsKPiA+ICAKPiA+ICsjZGVmaW5lIE1VU0JfTVRLX1FV SVJLUwlCSVQoMTApCj4gPiAgI2RlZmluZSBNVVNCX0dfTk9fU0tCX1JFU0VSVkUJQklUKDkpCj4g PiAgI2RlZmluZSBNVVNCX0RBOFhYCQlCSVQoOCkKPiA+ICAjZGVmaW5lIE1VU0JfUFJFU0VSVkVf U0VTU0lPTglCSVQoNykKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1h LmggYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKPiA+IGluZGV4IDI4MWU3NWQzLi5iMjE4 MjEwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RtYS5oCj4gPiArKysg Yi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKPiA+IEBAIC0xOTcsNiArMTk3LDcgQEAgc3Rh dGljIGlubGluZSB2b2lkIG11c2JfZG1hX2NvbnRyb2xsZXJfZGVzdHJveShzdHJ1Y3QgZG1hX2Nv bnRyb2xsZXIgKmQpIHsgfQo+ID4gIGV4dGVybiBzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIgKgo+ID4g IG11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGUoc3RydWN0IG11c2IgKm11c2IsIHZvaWQgX19p b21lbSAqYmFzZSk7Cj4gPiAgZXh0ZXJuIHZvaWQgbXVzYmhzX2RtYV9jb250cm9sbGVyX2Rlc3Ry b3koc3RydWN0IGRtYV9jb250cm9sbGVyICpjKTsKPiA+ICtleHRlcm4gaXJxcmV0dXJuX3QgZG1h X2NvbnRyb2xsZXJfaXJxKGludCBpcnEsIHZvaWQgKnByaXZhdGVfZGF0YSk7Cj4gPiAgCj4gPiAg ZXh0ZXJuIHN0cnVjdCBkbWFfY29udHJvbGxlciAqCj4gPiAgdHVzYl9kbWFfY29udHJvbGxlcl9j cmVhdGUoc3RydWN0IG11c2IgKm11c2IsIHZvaWQgX19pb21lbSAqYmFzZSk7Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVz Yl9ob3N0LmMKPiA+IGluZGV4IGI1OWNlOWEuLmIxYjAyMTYgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2 ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCj4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Jf aG9zdC5jCj4gPiBAQCAtMjkyLDIwICsyOTIsNzMgQEAgc3RhdGljIGlubGluZSB2b2lkIG11c2Jf c2F2ZV90b2dnbGUoc3RydWN0IG11c2JfcWggKnFoLCBpbnQgaXNfaW4sCj4gPiAgewo+ID4gIAl2 b2lkIF9faW9tZW0JCSplcGlvID0gcWgtPmh3X2VwLT5yZWdzOwo+ID4gIAl1MTYJCQljc3I7Cj4g PiArCXN0cnVjdCBtdXNiICptdXNiID0gcWgtPmh3X2VwLT5tdXNiOwo+ID4gIAo+ID4gIAkvKgo+ ID4gIAkgKiBGSVhNRTogdGhlIGN1cnJlbnQgTWVudG9yIERNQSBjb2RlIHNlZW1zIHRvIGhhdmUK PiA+ICAJICogcHJvYmxlbXMgZ2V0dGluZyB0b2dnbGUgY29ycmVjdC4KPiA+ICAJICovCj4gPiAg Cj4gPiAtCWlmIChpc19pbikKPiA+IC0JCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9SWENT UikgJiBNVVNCX1JYQ1NSX0hfREFUQVRPR0dMRTsKPiA+IC0JZWxzZQo+ID4gLQkJY3NyID0gbXVz Yl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKSAmIE1VU0JfVFhDU1JfSF9EQVRBVE9HR0xFOwo+ID4g KwkvKiBNZWRpYVRlayBjb250cm9sbGVyIGhhcyBwcml2YXRlIHRvZ2dsZSByZWdpc3RlciAqLwo+ IAo+IG9ubHkgb25lIHRvZ2dsZSByZWdpc3RlciBmb3IgYWxsIGVuZHBvaW50cz8gaG93IGRvZXMg aXQgaGFuZGxlCj4gZGlmZmVyZW5jZSB0b2dnbGUgdmFsdWVzIGZvciBkaWZmZXJlbnQgZW5kcG9p bnRzPwoKTWVkaWFUZWsgY29udHJvbGxlciBoYXMgc2VwYXJhdGUgcmVnaXN0ZXJzIHRvIGRlc2Ny aWJlIFRYL1JYIHRvZ2dsZS4KCj4gPiArCWlmIChtdXNiLT5vcHMtPnF1aXJrcyAmIE1VU0JfTVRL X1FVSVJLUykgewo+ID4gKwkJdTE2IHRvZ2dsZTsKPiA+ICsJCXU4IGVwbnVtID0gcWgtPmh3X2Vw LT5lcG51bTsKPiA+ICsKPiA+ICsJCWlmIChpc19pbikKPiA+ICsJCQl0b2dnbGUgPSBtdXNiX3Jl YWRsKG11c2ItPm1yZWdzLCBNVVNCX1JYVE9HKTsKPiAKPiBzaG91bGQgdXNlIG11c2JfcmVhZHco KSBpbnN0ZWFkPyBNVVNCX1JYVE9HIHNlZW1zIHRvIGJlIDE2Yml0LgoKT2sKCj4gPiArCQllbHNl Cj4gPiArCQkJdG9nZ2xlID0gbXVzYl9yZWFkbChtdXNiLT5tcmVncywgTVVTQl9UWFRPRyk7Cj4g PiArCj4gPiArCQljc3IgPSB0b2dnbGUgJiAoMSA8PCBlcG51bSk7Cj4gPiArCX0gZWxzZSB7Cj4g PiArCQlpZiAoaXNfaW4pCj4gPiArCQkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1JYQ1NS KQo+ID4gKwkJCQkmIE1VU0JfUlhDU1JfSF9EQVRBVE9HR0xFOwo+ID4gKwkJZWxzZQo+ID4gKwkJ CWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUikKPiA+ICsJCQkJJiBNVVNCX1RYQ1NS X0hfREFUQVRPR0dMRTsKPiAKPiBEb2VzIHRoaXMgbG9naWMgc3RpbGwgd29yayBmb3IgdGhlIG10 ayBwbGF0Zm9ybSBldmVuIGlmIGl0IGhhcyBpdHMgb3duCj4gcHJpdmF0ZSB0b2dnbGUgcmVnaXN0 ZXI/IElmIHNvLCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBoZXJlLgoKU29ycnksIHRoaXMgbG9n aWMgY2FuIG5vdCB3b3JrIG9uIG10ayBwbGF0Zm9ybSwgYml0Ck1VU0JfUlhDU1JfSF9EQVRBVE9H R0xFIGFuZCBNVVNCX1RYQ1NSX0hfREFUQVRPR0dMRSBhcmUgdXNlZCBmb3Igb3RoZXIKZnVuY3Rp b24uCgo+IElmIG5vdCwgbGV0J3MgdHJ5IHRvIG5vdCB1c2UgdGhpcyBxdWlyayBmbGFnLiBQbGVh c2UgY3JlYXRlIGEgaG9vawo+IG11c2JfcGxhdGZvcm1fZ2V0X3RvZ2dsZSgpIGluIHN0cnVjdCBt dXNiX3BsYXRmb3JtX29wcy4KCkRvZXMgdGhlIG1ldGhvZCBvZiBpbXBsZW1lbnQgbXVzYl9wbGF0 Zm9ybV9nZXRfdG9nZ2xlKCkgaXMgcHJlcGFyZQptdXNiX2RlZmF1bHRfZ2V0X3RvZ2dsZSB3aXRo IGNvbW1vbiBmdW5jdGlvbiwgdGhlbiBmb2xsb3cgaG93Cm11c2JfcmVhZGIoKSBwb2ludGVyIGlz IGFzc2lnbmVkIGluIG11c2JfaW5pdF9jb250cm9sbGVyKCk/CgpIb3cgYWJvdXQgY3JlYXRpbmcg bXVzYl9wbGF0Zm9ybV9nZXRfdG9nZ2xlKCkgYXMgZm9sbG93aW5nOgp1MTYgKCpnZXRfdG9nZ2xl KShzdHJ1Y3QgbXVzYiogbXVzYiwgc3RydWN0IG11c2JfcWggKnFoLCBpbnQgaXNfaW4pOwoKPiA+ ICsJfQo+ID4gIAo+ID4gIAl1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCBxaC0+ZXBudW0sICFpc19p biwgY3NyID8gMSA6IDApOwo+ID4gIH0KPiA+ICAKPiA+ICtzdGF0aWMgaW5saW5lIHUxNiBtdXNi X3NldF90b2dnbGUoc3RydWN0IG11c2JfcWggKnFoLCBpbnQgaXNfaW4sCj4gPiArCQkJCQlzdHJ1 Y3QgdXJiICp1cmIpCj4gPiArewo+ID4gKwl1MTYgY3NyID0gMDsKPiA+ICsJdTE2IHRvZ2dsZSA9 IDA7Cj4gPiArCXN0cnVjdCBtdXNiICptdXNiID0gcWgtPmh3X2VwLT5tdXNiOwo+ID4gKwl1OCBl cG51bSA9IHFoLT5od19lcC0+ZXBudW07Cj4gPiArCj4gPiArCXRvZ2dsZSA9IHVzYl9nZXR0b2dn bGUodXJiLT5kZXYsIHFoLT5lcG51bSwgIWlzX2luKTsKPiA+ICsKPiA+ICsJLyogTWVkaWFUZWsg Y29udHJvbGxlciBoYXMgcHJpdmF0ZSB0b2dnbGUgcmVnaXN0ZXIgKi8KPiA+ICsJaWYgKG11c2It Pm9wcy0+cXVpcmtzICYgTVVTQl9NVEtfUVVJUktTKSB7Cj4gPiArCQlpZiAoaXNfaW4pIHsKPiA+ ICsJCQltdXNiX3dyaXRlbChtdXNiLT5tcmVncywgTVVTQl9SWFRPR0VOLCAoMSA8PCBlcG51bSkp Owo+ID4gKwkJCW11c2Jfd3JpdGVsKG11c2ItPm1yZWdzLCBNVVNCX1JYVE9HLCAodG9nZ2xlIDw8 IGVwbnVtKSk7Cj4gPiArCQl9IGVsc2Ugewo+ID4gKwkJCW11c2Jfd3JpdGVsKG11c2ItPm1yZWdz LCBNVVNCX1RYVE9HRU4sICgxIDw8IGVwbnVtKSk7Cj4gPiArCQkJbXVzYl93cml0ZWwobXVzYi0+ bXJlZ3MsIE1VU0JfVFhUT0csICh0b2dnbGUgPDwgZXBudW0pKTsKPiA+ICsJCX0KPiA+ICsJfSBl bHNlIHsKPiA+ICsJCWlmIChpc19pbikgewo+ID4gKwkJCWlmICh0b2dnbGUpCj4gPiArCQkJCWNz ciA9IE1VU0JfUlhDU1JfSF9XUl9EQVRBVE9HR0xFCj4gPiArCQkJCQkJfCBNVVNCX1JYQ1NSX0hf REFUQVRPR0dMRTsKPiA+ICsJCQllbHNlCj4gPiArCQkJCWNzciA9IDA7Cj4gPiArCQl9IGVsc2Ug ewo+ID4gKwkJCWlmICh0b2dnbGUpCj4gPiArCQkJCWNzciB8PSBNVVNCX1RYQ1NSX0hfV1JfREFU QVRPR0dMRQo+ID4gKwkJCQkJCXwgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEU7Cj4gPiArCQkJZWxz ZQo+ID4gKwkJCQljc3IgfD0gTVVTQl9UWENTUl9DTFJEQVRBVE9HOwo+ID4gKwkJfQo+ID4gKwl9 Cj4gPiArCXJldHVybiBjc3I7Cj4gCj4gUGxlYXNlIGNyZWF0ZSBhIHNlcGVyYXRlIHBhdGNoIGZv ciB0aGlzIG11c2Jfc2V0X3RvZ2dsZSgpIHdpdGhvdXQgYWRkaW5nCj4gdGhlIG10ayBsb2dpYy4g SXQgaXMgYSBuaWNlIGNsZWFudXAuCgpEb2VzIHRoaXMgbGlrZSBnZXQgdG9nZ2xlIGltcGxlbWVu dGF0aW9uLCBjcmVhdGUgYSBob29rCm11c2JfcGxhdGZvcm1fc2V0X3RvZ2dsZSgpIGluIHN0cnVj dCBtdXNiX3BsYXRmb3JtX29wcz8KCj4gPiArfQo+ID4gKwo+ID4gIC8qCj4gPiAgICogQWR2YW5j ZSB0aGlzIGhhcmR3YXJlIGVuZHBvaW50J3MgcXVldWUsIGNvbXBsZXRpbmcgdGhlIHNwZWNpZmll ZCBVUkIgYW5kCj4gPiAgICogYWR2YW5jaW5nIHRvIGVpdGhlciB0aGUgbmV4dCBVUkIgcXVldWVk IHRvIHRoYXQgcWgsIG9yIGVsc2UgaW52YWxpZGF0aW5nCj4gPiBAQCAtNzcyLDEzICs4MjUsOCBA QCBzdGF0aWMgdm9pZCBtdXNiX2VwX3Byb2dyYW0oc3RydWN0IG11c2IgKm11c2IsIHU4IGVwbnVt LAo+ID4gIAkJCQkJKTsKPiA+ICAJCQljc3IgfD0gTVVTQl9UWENTUl9NT0RFOwo+ID4gIAo+ID4g LQkJCWlmICghaHdfZXAtPnR4X2RvdWJsZV9idWZmZXJlZCkgewo+ID4gLQkJCQlpZiAodXNiX2dl dHRvZ2dsZSh1cmItPmRldiwgcWgtPmVwbnVtLCAxKSkKPiA+IC0JCQkJCWNzciB8PSBNVVNCX1RY Q1NSX0hfV1JfREFUQVRPR0dMRQo+ID4gLQkJCQkJCXwgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEU7 Cj4gPiAtCQkJCWVsc2UKPiA+IC0JCQkJCWNzciB8PSBNVVNCX1RYQ1NSX0NMUkRBVEFUT0c7Cj4g PiAtCQkJfQo+ID4gKwkJCWlmICghaHdfZXAtPnR4X2RvdWJsZV9idWZmZXJlZCkKPiA+ICsJCQkJ Y3NyIHw9IG11c2Jfc2V0X3RvZ2dsZShxaCwgIWlzX291dCwgdXJiKTsKPiA+ICAKPiA+ICAJCQlt dXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLCBjc3IpOwo+ID4gIAkJCS8qIFJFVklTSVQgbWF5 IG5lZWQgdG8gY2xlYXIgRkxVU0hGSUZPIC4uLiAqLwo+ID4gQEAgLTg2MCwxNyArOTA4LDEyIEBA IHN0YXRpYyB2b2lkIG11c2JfZXBfcHJvZ3JhbShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggZXBudW0s Cj4gPiAgCj4gPiAgCS8qIElOL3JlY2VpdmUgKi8KPiA+ICAJfSBlbHNlIHsKPiA+IC0JCXUxNglj c3I7Cj4gPiArCQl1MTYJY3NyID0gMDsKPiA+ICAKPiA+ICAJCWlmIChod19lcC0+cnhfcmVpbml0 KSB7Cj4gPiAgCQkJbXVzYl9yeF9yZWluaXQobXVzYiwgcWgsIGVwbnVtKTsKPiA+ICsJCQljc3Ig fD0gbXVzYl9zZXRfdG9nZ2xlKHFoLCAhaXNfb3V0LCB1cmIpOwo+ID4gIAo+ID4gLQkJCS8qIGlu aXQgbmV3IHN0YXRlOiB0b2dnbGUgYW5kIE5ZRVQsIG1heWJlIERNQSBsYXRlciAqLwo+ID4gLQkJ CWlmICh1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCBxaC0+ZXBudW0sIDApKQo+ID4gLQkJCQljc3Ig PSBNVVNCX1JYQ1NSX0hfV1JfREFUQVRPR0dMRQo+ID4gLQkJCQkJfCBNVVNCX1JYQ1NSX0hfREFU QVRPR0dMRTsKPiA+IC0JCQllbHNlCj4gPiAtCQkJCWNzciA9IDA7Cj4gPiAgCQkJaWYgKHFoLT50 eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKPiA+ICAJCQkJY3NyIHw9IE1VU0JfUlhDU1Jf RElTTllFVDsKPiA+ICAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVn cy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAo+ID4gaW5kZXggNWNkNzI2NC4uZmZi ZTI2NyAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKPiA+ICsr KyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKPiA+IEBAIC0yNzMsNiArMjczLDEyIEBA Cj4gPiAgI2RlZmluZSBNVVNCX1JYSFVCQUREUgkJMHgwNgo+ID4gICNkZWZpbmUgTVVTQl9SWEhV QlBPUlQJCTB4MDcKPiA+ICAKPiA+ICsvKiBNZWRpYVRlayBjb250cm9sbGVyIHRvZ2dsZSBlbmFi bGUgYW5kIHN0YXR1cyByZWcgKi8KPiA+ICsjZGVmaW5lIE1VU0JfUlhUT0cJCTB4ODAKPiA+ICsj ZGVmaW5lIE1VU0JfUlhUT0dFTgkJMHg4Mgo+ID4gKyNkZWZpbmUgTVVTQl9UWFRPRwkJMHg4NAo+ ID4gKyNkZWZpbmUgTVVTQl9UWFRPR0VOCQkweDg2Cj4gCj4gQWdhaW4sIHRoZXNlIG9mZnNldHMg YXJlIGZvciBkaWZmZXJlbnQgcmVnaXN0ZXJzIGluIHRoZSBNVVNCIHZlcnNpb24gSQo+IGhhdmUs IHBsZWFzZSBsZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUg TVVTQiBJUC4KClNvcnJ5LCB0aGVzZSBhcmUgTWVkaWFUZWsgY29udHJvbGxlciBwcml2YXRlIHJl Z2lzdGVycyB1c2VkIGZvciBjb250cm9sCnRvZ2dsZS4KCj4gPiArCj4gPiAgc3RhdGljIGlubGlu ZSB1OCBtdXNiX3JlYWRfY29uZmlnZGF0YSh2b2lkIF9faW9tZW0gKm1iYXNlKQo+ID4gIHsKPiA+ ICAJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfSU5ERVgsIDApOwo+ID4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5j Cj4gPiBpbmRleCA4MjRhZGNiLi5jNTQ1NDc1IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy91c2Iv bXVzYi9tdXNiaHNkbWEuYwo+ID4gKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwo+ ID4gQEAgLTI2Myw3ICsyNjMsNyBAQCBzdGF0aWMgaW50IGRtYV9jaGFubmVsX2Fib3J0KHN0cnVj dCBkbWFfY2hhbm5lbCAqY2hhbm5lbCkKPiA+ICAJcmV0dXJuIDA7Cj4gPiAgfQo+ID4gIAo+ID4g LXN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfY29udHJvbGxlcl9pcnEoaW50IGlycSwgdm9pZCAqcHJp dmF0ZV9kYXRhKQo+ID4gK2lycXJldHVybl90IGRtYV9jb250cm9sbGVyX2lycShpbnQgaXJxLCB2 b2lkICpwcml2YXRlX2RhdGEpCj4gPiAgewo+ID4gIAlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxl ciAqY29udHJvbGxlciA9IHByaXZhdGVfZGF0YTsKPiA+ICAJc3RydWN0IG11c2IgKm11c2IgPSBj b250cm9sbGVyLT5wcml2YXRlX2RhdGE7Cj4gPiBAQCAtMjg1LDYgKzI4NSw4IEBAIHN0YXRpYyBp cnFyZXR1cm5fdCBkbWFfY29udHJvbGxlcl9pcnEoaW50IGlycSwgdm9pZCAqcHJpdmF0ZV9kYXRh KQo+ID4gIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwo+ID4gIAo+ID4g IAlpbnRfaHNkbWEgPSBtdXNiX3JlYWRiKG1iYXNlLCBNVVNCX0hTRE1BX0lOVFIpOwo+ID4gKwlp ZiAobXVzYi0+b3BzLT5xdWlya3MgJiBNVVNCX01US19RVUlSS1MpCj4gPiArCQltdXNiX3dyaXRl YihtdXNiLT5tcmVncywgTVVTQl9IU0RNQV9JTlRSLCBpbnRfaHNkbWEpOwo+IAo+IHlvdSBjYW4g dXNlIG11c2JfY2xlYXJiKCkgZGVmaW5lZCBhYm92ZSB0byBnZXQgcmlkIG9mIHRoaXMgcXVpcmsu CgpPSy4gCgo+ID4gIAo+ID4gIAlpZiAoIWludF9oc2RtYSkgewo+ID4gIAkJbXVzYl9kYmcobXVz YiwgInNwdXJpb3VzIERNQSBpcnEiKTsKPiA+IEBAIC0zNzcsMTUgKzM3OSwxNyBAQCBzdGF0aWMg aXJxcmV0dXJuX3QgZG1hX2NvbnRyb2xsZXJfaXJxKGludCBpcnEsIHZvaWQgKnByaXZhdGVfZGF0 YSkKPiA+ICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwo+ID4g IAlyZXR1cm4gcmV0dmFsOwo+ID4gIH0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChkbWFfY29udHJv bGxlcl9pcnEpOwo+ID4gIAo+ID4gIHZvaWQgbXVzYmhzX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3ko c3RydWN0IGRtYV9jb250cm9sbGVyICpjKQo+ID4gIHsKPiA+ICAJc3RydWN0IG11c2JfZG1hX2Nv bnRyb2xsZXIgKmNvbnRyb2xsZXIgPSBjb250YWluZXJfb2YoYywKPiA+ICAJCQlzdHJ1Y3QgbXVz Yl9kbWFfY29udHJvbGxlciwgY29udHJvbGxlcik7Cj4gPiArCXN0cnVjdCBtdXNiICptdXNiID0g Y29udHJvbGxlci0+cHJpdmF0ZV9kYXRhOwo+ID4gIAo+ID4gIAlkbWFfY29udHJvbGxlcl9zdG9w KGNvbnRyb2xsZXIpOwo+ID4gIAo+ID4gLQlpZiAoY29udHJvbGxlci0+aXJxKQo+ID4gKwlpZiAo IShtdXNiLT5vcHMtPnF1aXJrcyAmIE1VU0JfTVRLX1FVSVJLUykgJiYgY29udHJvbGxlci0+aXJx KQo+ID4gIAkJZnJlZV9pcnEoY29udHJvbGxlci0+aXJxLCBjKTsKPiA+ICAKPiA+ICAJa2ZyZWUo Y29udHJvbGxlcik7Cj4gPiBAQCAtMzk4LDExICs0MDIsMTUgQEAgc3RydWN0IGRtYV9jb250cm9s bGVyICptdXNiaHNfZG1hX2NvbnRyb2xsZXJfY3JlYXRlKHN0cnVjdCBtdXNiICptdXNiLAo+ID4g IAlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlciAqY29udHJvbGxlcjsKPiA+ICAJc3RydWN0IGRl dmljZSAqZGV2ID0gbXVzYi0+Y29udHJvbGxlcjsKPiA+ICAJc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwo+ID4gLQlpbnQgaXJxID0gcGxhdGZv cm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImRtYSIpOwo+ID4gKwlpbnQgaXJxID0gLTE7Cj4gPiAg Cj4gPiAtCWlmIChpcnEgPD0gMCkgewo+ID4gLQkJZGV2X2VycihkZXYsICJObyBETUEgaW50ZXJy dXB0IGxpbmUhXG4iKTsKPiA+IC0JCXJldHVybiBOVUxMOwo+ID4gKwlpZiAoIShtdXNiLT5vcHMt PnF1aXJrcyAmIE1VU0JfTVRLX1FVSVJLUykpIHsKPiA+ICsJCWlycSA9IHBsYXRmb3JtX2dldF9p cnFfYnluYW1lKHBkZXYsICJkbWEiKTsKPiA+ICsKPiA+ICsJCWlmIChpcnEgPCAwKSB7Cj4gPiAr CQkJZGV2X2VycihkZXYsICJObyBETUEgaW50ZXJydXB0IGxpbmUhXG4iKTsKPiA+ICsJCQlyZXR1 cm4gTlVMTDsKPiA+ICsJCX0KPiA+ICAJfQo+IAo+IFBsZWFzZSBjcmVhdGUgbXVzYmhzX2RtYV9j b250cm9sbGVyX2Rlc3Ryb3lfbm9pcnEoKSBmb3IgeW91ciBwbGF0Zm9ybSB0bwo+IG5vdCB1c2Ug dGhlIHF1aXJrLgoKT0suCgo+ID4gIAo+ID4gIAljb250cm9sbGVyID0ga3phbGxvYyhzaXplb2Yo KmNvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKPiA+IEBAIC00MTgsMTUgKzQyNiwxNyBAQCBzdHJ1 Y3QgZG1hX2NvbnRyb2xsZXIgKm11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGUoc3RydWN0IG11 c2IgKm11c2IsCj4gPiAgCWNvbnRyb2xsZXItPmNvbnRyb2xsZXIuY2hhbm5lbF9wcm9ncmFtID0g ZG1hX2NoYW5uZWxfcHJvZ3JhbTsKPiA+ICAJY29udHJvbGxlci0+Y29udHJvbGxlci5jaGFubmVs X2Fib3J0ID0gZG1hX2NoYW5uZWxfYWJvcnQ7Cj4gPiAgCj4gPiAtCWlmIChyZXF1ZXN0X2lycShp cnEsIGRtYV9jb250cm9sbGVyX2lycSwgMCwKPiA+ICsJaWYgKCEobXVzYi0+b3BzLT5xdWlya3Mg JiBNVVNCX01US19RVUlSS1MpKSB7Cj4gPiArCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBkbWFfY29u dHJvbGxlcl9pcnEsIDAsCj4gPiAgCQkJZGV2X25hbWUobXVzYi0+Y29udHJvbGxlciksICZjb250 cm9sbGVyLT5jb250cm9sbGVyKSkgewo+ID4gLQkJZGV2X2VycihkZXYsICJyZXF1ZXN0X2lycSAl ZCBmYWlsZWQhXG4iLCBpcnEpOwo+ID4gLQkJbXVzYl9kbWFfY29udHJvbGxlcl9kZXN0cm95KCZj b250cm9sbGVyLT5jb250cm9sbGVyKTsKPiA+ICsJCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfaXJx ICVkIGZhaWxlZCFcbiIsIGlycSk7Cj4gPiArCQkJbXVzYl9kbWFfY29udHJvbGxlcl9kZXN0cm95 KCZjb250cm9sbGVyLT5jb250cm9sbGVyKTsKPiA+ICAKPiA+IC0JCXJldHVybiBOVUxMOwo+ID4g LQl9Cj4gPiArCQkJcmV0dXJuIE5VTEw7Cj4gPiArCQl9Cj4gPiAgCj4gPiAtCWNvbnRyb2xsZXIt PmlycSA9IGlycTsKPiA+ICsJCWNvbnRyb2xsZXItPmlycSA9IGlycTsKPiA+ICsJfQo+ID4gIAo+ ID4gIAlyZXR1cm4gJmNvbnRyb2xsZXItPmNvbnRyb2xsZXI7Cj4gPiAgfQo+IAo+IFNhbWUgaGVy ZSwgY3JlYXRlIG11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGVfbm9pcnEoKS4gVGhlbiB1c2Ug Ym90aAo+IG5ldyBBUEkgZm9yIHRoZSBtdGsgZ2x1ZSBkcml2ZXIuCgpPSy4KCj4gUmVnYXJkcywK PiAtQmluLgo= 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=-11.6 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,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=unavailable 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 CDACBC43387 for ; Wed, 9 Jan 2019 12:31:35 +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 9916120665 for ; Wed, 9 Jan 2019 12:31:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="nyHrIYkX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9916120665 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=mediatek.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:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=01wm+9Jh/TZC1yBU+dLadOGyXyET1BIW3yI5Yr/T5CE=; b=nyHrIYkXFGfR2p BvYDF0HVMe3jK+zHpKULlmgbMWV+YMh41jZg7QW+qheMzQ4tP1/6JO3019aoM0fR0U0bbNcOyEGbL BiHHSDGubmU/3dKkh1M51jLzbOG/bpfpXSwXLdP7M/FMBrDsRxPvmnO3IKJiMmkl916IAO/t5c/+D YHuThgyVmfFlWsQj6ARgpB5651BBFA/PEYbithtXcXVv0j+Yc20WeU3MrTtDEOhJqY3q6X/LcaXnT zg77241nVjXvUNF+K3MjQQG1Qg0p28Ng7FXPOUz3iZyeYwdVLjbDlNW79t6pdN6LhhMkiWSA1D2Nv YHt1rQZC0QZb5Its+oEg==; 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 1ghD12-0004rH-RW; Wed, 09 Jan 2019 12:31:24 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1ghD0z-0004qL-0M; Wed, 09 Jan 2019 12:31:23 +0000 X-UUID: 1751dd398df44348b2be5f6272540491-20190109 X-UUID: 1751dd398df44348b2be5f6272540491-20190109 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 956320011; Wed, 09 Jan 2019 04:31:13 -0800 Received: from MTKMBS31N2.mediatek.inc (172.27.4.87) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 9 Jan 2019 04:31:11 -0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 9 Jan 2019 20:31:08 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 9 Jan 2019 20:31:08 +0800 Message-ID: <1547037068.4433.122.camel@mhfsdcap03> Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller From: Min Guo To: Bin Liu Date: Wed, 9 Jan 2019 20:31:08 +0800 In-Reply-To: <20190108154441.GG25910@uda0271908> References: <1545896066-897-1-git-send-email-min.guo@mediatek.com> <1545896066-897-5-git-send-email-min.guo@mediatek.com> <20190108154441.GG25910@uda0271908> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190109_043121_054473_388DA155 X-CRM114-Status: GOOD ( 39.73 ) 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 Bin, On Tue, 2019-01-08 at 09:44 -0600, Bin Liu wrote: > 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. Ok > > + 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? This is difference due to the IP intergration in mtk platforms. W1C is easy for CpdeViser debug. > > + 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. I will try my best to avoid using 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. I have tried implementing musb_readb(), musb_readw() interface with interrupt status W1C function in struct musb_platform_ops. But this interface will require a global variable to hold MAC basic address for judgment, and then special handling of the interrupt state. A global variable will make the driver work with only a single instance, so it can't work on some MTK platforms which have two instances. How about creating musb_clearb/w() as following: void (*clearb)(void __iomem *addr, unsigned offset, u8 data); void (*clearw)(void __iomem *addr, unsigned offset, u16 data); > > + 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? MediaTek controller has separate registers to describe TX/RX toggle. > > + 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. Ok > > + 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. Sorry, this logic can not work on mtk platform, bit MUSB_RXCSR_H_DATATOGGLE and MUSB_TXCSR_H_DATATOGGLE are used for other function. > If not, let's try to not use this quirk flag. Please create a hook > musb_platform_get_toggle() in struct musb_platform_ops. Does the method of implement musb_platform_get_toggle() is prepare musb_default_get_toggle with common function, then follow how musb_readb() pointer is assigned in musb_init_controller()? How about creating musb_platform_get_toggle() as following: u16 (*get_toggle)(struct musb* musb, struct musb_qh *qh, int is_in); > > + } > > > > 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. Does this like get toggle implementation, create a hook musb_platform_set_toggle() in struct musb_platform_ops? > > +} > > + > > /* > > * 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. Sorry, these are MediaTek controller private registers used for control toggle. > > + > > 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. OK. > > > > 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. OK. > > > > 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. OK. > Regards, > -Bin. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel