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=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY 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 7E9D0C43387 for ; Thu, 10 Jan 2019 07:25:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 464B8206B7 for ; Thu, 10 Jan 2019 07:25:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727311AbfAJHZC (ORCPT ); Thu, 10 Jan 2019 02:25:02 -0500 Received: from Mailgw01.mediatek.com ([1.203.163.78]:28652 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726605AbfAJHZB (ORCPT ); Thu, 10 Jan 2019 02:25:01 -0500 X-UUID: 84658294262c466a88eab89fc24255e3-20190110 X-UUID: 84658294262c466a88eab89fc24255e3-20190110 Received: from mtkcas35.mediatek.inc [(172.27.4.250)] by mailgw01.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 1357864204; Thu, 10 Jan 2019 15:24:24 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31DR.mediatek.inc (172.27.6.102) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Thu, 10 Jan 2019 15:24:23 +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; Thu, 10 Jan 2019 15:24:22 +0800 Message-ID: <1547105062.4433.144.camel@mhfsdcap03> Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller From: Min Guo To: Bin Liu CC: Rob Herring , Greg Kroah-Hartman , Mark Rutland , "Matthias Brugger" , Alan Stern , , , , , , , Yonglong Wu Date: Thu, 10 Jan 2019 15:24:22 +0800 In-Reply-To: <20190109140144.GI25910@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> <1547037068.4433.122.camel@mhfsdcap03> <20190109140144.GI25910@uda0271908> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Bin, On Wed, 2019-01-09 at 08:01 -0600, Bin Liu wrote: > Hi Min, > > On Wed, Jan 09, 2019 at 08:31:08PM +0800, Min Guo wrote: > > 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. > > Thanks. > > > > > > > + 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. > > I didn't mean to modify musb_read*(), but > > > 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); > > this is what I was asking for, similar to what musb_readb/w() is > implemented. I will prepare a patch for musb_clearb/w(). > > > > > > > > + 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. > > Is it one register per endpoint? MUSB_RXTOG/MUSB_TXTOG is common register, each bit reflects the toggle state of an endpoint. bit[0] not used,bit[1~8] corresponds to ep[1~8] > > > > > > + 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); > > this line seems telling there is just *one* register for all endpoints. Yes, all endpoint share this register, endpoint and bit are one-to-one correspondence. > > > > > > 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. > > Is there a different controller RTL version we can use to > differentiate? Sorry, there is no controller RTL version can be used to indicate the differences. > > > > > 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()? > > Yes, similar to musb_readb() implementation. OK. > > How about creating musb_platform_get_toggle() as following: > > u16 (*get_toggle)(struct musb* musb, struct musb_qh *qh, int is_in); > > yes, it is part of the implementation, then add it in struct musb_io. I will prepare a patch for (*get_toggle). > > > > > > + } > > > > > > > > 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; > > '? :' operation probably is better than 'if else' here. OK. > > > > + } > > > > + } > > > > + 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? > > You did the code cleanup by creating musb_set_toggle(), please make it > in a separate patch, like > > static u16 musb_set_toggle(struct musb_qh *qh, int is_in, struct urb *urb) > { > toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); > if (is_in) > csr = toggle ? > (MUSB_RXCSR_H_WR_DATATOGGLE | MUSB_RXCSR_H_DATATOGGLE) : > 0; > else > csr = toggle ? > MUSB_TXCSR_H_WR_DATATOGGLE | MUSB_TXCSR_H_DATATOGGLE : > MUSB_TXCSR_CLRDATATOG; > return csr; > } > > /* use musb_set_toggle() in the two instances */ > > then in this patch you add the mtk implementation similar as > *get_toggle() discussed above. OK. > > > > > > +} > > > > + > > > > /* > > > > * 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. > > Okay. Once the platform get/set_toggle() are implemented, those > registers can be defined in the mtk glue driver instead of here. OK. > Regards, > -Bin. 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: Thu, 10 Jan 2019 15:24:22 +0800 Message-ID: <1547105062.4433.144.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> <1547037068.4433.122.camel@mhfsdcap03> <20190109140144.GI25910@uda0271908> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20190109140144.GI25910@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: devicetree@vger.kernel.org Hi Bin, On Wed, 2019-01-09 at 08:01 -0600, Bin Liu wrote: > Hi Min, > > On Wed, Jan 09, 2019 at 08:31:08PM +0800, Min Guo wrote: > > 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. > > Thanks. > > > > > > > + 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. > > I didn't mean to modify musb_read*(), but > > > 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); > > this is what I was asking for, similar to what musb_readb/w() is > implemented. I will prepare a patch for musb_clearb/w(). > > > > > > > > + 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. > > Is it one register per endpoint? MUSB_RXTOG/MUSB_TXTOG is common register, each bit reflects the toggle state of an endpoint. bit[0] not used,bit[1~8] corresponds to ep[1~8] > > > > > > + 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); > > this line seems telling there is just *one* register for all endpoints. Yes, all endpoint share this register, endpoint and bit are one-to-one correspondence. > > > > > > 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. > > Is there a different controller RTL version we can use to > differentiate? Sorry, there is no controller RTL version can be used to indicate the differences. > > > > > 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()? > > Yes, similar to musb_readb() implementation. OK. > > How about creating musb_platform_get_toggle() as following: > > u16 (*get_toggle)(struct musb* musb, struct musb_qh *qh, int is_in); > > yes, it is part of the implementation, then add it in struct musb_io. I will prepare a patch for (*get_toggle). > > > > > > + } > > > > > > > > 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; > > '? :' operation probably is better than 'if else' here. OK. > > > > + } > > > > + } > > > > + 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? > > You did the code cleanup by creating musb_set_toggle(), please make it > in a separate patch, like > > static u16 musb_set_toggle(struct musb_qh *qh, int is_in, struct urb *urb) > { > toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); > if (is_in) > csr = toggle ? > (MUSB_RXCSR_H_WR_DATATOGGLE | MUSB_RXCSR_H_DATATOGGLE) : > 0; > else > csr = toggle ? > MUSB_TXCSR_H_WR_DATATOGGLE | MUSB_TXCSR_H_DATATOGGLE : > MUSB_TXCSR_CLRDATATOG; > return csr; > } > > /* use musb_set_toggle() in the two instances */ > > then in this patch you add the mtk implementation similar as > *get_toggle() discussed above. OK. > > > > > > +} > > > > + > > > > /* > > > > * 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. > > Okay. Once the platform get/set_toggle() are implemented, those > registers can be defined in the mtk glue driver instead of here. 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: <1547105062.4433.144.camel@mhfsdcap03> Date: Thu, 10 Jan 2019 15:24:22 +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: SGkgQmluLAoKT24gV2VkLCAyMDE5LTAxLTA5IGF0IDA4OjAxIC0wNjAwLCBCaW4gTGl1IHdyb3Rl Ogo+IEhpIE1pbiwKPiAKPiBPbiBXZWQsIEphbiAwOSwgMjAxOSBhdCAwODozMTowOFBNICswODAw LCBNaW4gR3VvIHdyb3RlOgo+ID4gSGkgQmluLAo+ID4gT24gVHVlLCAyMDE5LTAxLTA4IGF0IDA5 OjQ0IC0wNjAwLCBCaW4gTGl1IHdyb3RlOgo+ID4gPiBIaSwKPiA+ID4gCj4gPiA+IE9uIFRodSwg RGVjIDI3LCAyMDE4IGF0IDAzOjM0OjI2UE0gKzA4MDAsIG1pbi5ndW9AbWVkaWF0ZWsuY29tIHdy b3RlOgo+ID4gPiA+IEZyb206IE1pbiBHdW8gPG1pbi5ndW9AbWVkaWF0ZWsuY29tPgo+ID4gPiA+ IAo+ID4gPiA+IFRoaXMgYWRkcyBzdXBwb3J0IGZvciBNZWRpYVRlayBtdXNiIGNvbnRyb2xsZXIg aW4KPiA+ID4gPiBob3N0LCBwZXJpcGhlcmFsIGFuZCBvdGcgbW9kZQo+ID4gPiA+IAo+ID4gPiA+ IFNpZ25lZC1vZmYtYnk6IE1pbiBHdW8gPG1pbi5ndW9AbWVkaWF0ZWsuY29tPgo+ID4gPiA+IFNp Z25lZC1vZmYtYnk6IFlvbmdsb25nIFd1IDx5b25nbG9uZy53dUBtZWRpYXRlay5jb20+Cj4gPiA+ ID4gLS0tCj4gPiA+ID4gIGRyaXZlcnMvdXNiL211c2IvS2NvbmZpZyAgICAgfCAgIDggKy0KPiA+ ID4gPiAgZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZSAgICB8ICAgMSArCj4gPiA+ID4gIGRyaXZl cnMvdXNiL211c2IvbWVkaWF0ZWsuYyAgfCA1NjIgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwo+ID4gPiA+ICBkcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIHwg IDEwICsKPiA+ID4gPiAgZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCB8ICAgMSArCj4gPiA+ ID4gIGRyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaCAgfCAgIDEgKwo+ID4gPiA+ICBkcml2ZXJz L3VzYi9tdXNiL211c2JfaG9zdC5jIHwgIDc5ICsrKystLQo+ID4gPiA+ICBkcml2ZXJzL3VzYi9t dXNiL211c2JfcmVncy5oIHwgICA2ICsKPiA+ID4gPiAgZHJpdmVycy91c2IvbXVzYi9tdXNiaHNk bWEuYyB8ICAzNCArKy0KPiA+ID4gPiAgOSBmaWxlcyBjaGFuZ2VkLCA2NzEgaW5zZXJ0aW9ucygr KSwgMzEgZGVsZXRpb25zKC0pCj4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3Vz Yi9tdXNiL21lZGlhdGVrLmMKPiA+ID4gPiAKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvbXVzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCj4gPiA+ID4gaW5kZXgg YWQwODg5NS4uNTQwZmM5ZiAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tj b25maWcKPiA+ID4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKPiA+ID4gPiBAQCAt MTE1LDYgKzExNSwxMiBAQCBjb25maWcgVVNCX01VU0JfSlo0NzQwCj4gPiA+ID4gIAlkZXBlbmRz IG9uIFVTQl9NVVNCX0dBREdFVAo+ID4gPiA+ICAJZGVwZW5kcyBvbiBVU0JfT1RHX0JMQUNLTElT VF9IVUIKPiA+ID4gPiAgCj4gPiA+ID4gK2NvbmZpZyBVU0JfTVVTQl9NRURJQVRFSwo+ID4gPiA+ ICsJdHJpc3RhdGUgIk1lZGlhVGVrIHBsYXRmb3JtcyIKPiA+ID4gPiArCWRlcGVuZHMgb24gQVJD SF9NRURJQVRFSwo+ID4gPiAKPiA+ID4gUGxlYXNlIGFsc28gYWRkICd8fCBDT01QSUxFX1RFU1Qn IHRvIG1ha2UgdGVzdGluZyBlYXNpZXIuCj4gPiAKPiA+IE9rCj4gPiAKPiA+ID4gPiArCWRlcGVu ZHMgb24gTk9QX1VTQl9YQ0VJVgo+ID4gPiA+ICsJZGVwZW5kcyBvbiBHRU5FUklDX1BIWQo+ID4g PiA+ICsKPiA+ID4gPiAgY29uZmlnIFVTQl9NVVNCX0FNMzM1WF9DSElMRAo+ID4gPiA+ICAJdHJp c3RhdGUKPiA+ID4gPiAgCj4gPiA+ID4gQEAgLTE0MSw3ICsxNDcsNyBAQCBjb25maWcgVVNCX1VY NTAwX0RNQQo+ID4gPiA+ICAKPiA+ID4gPiAgY29uZmlnIFVTQl9JTlZFTlRSQV9ETUEKPiA+ID4g PiAgCWJvb2wgJ0ludmVudHJhJwo+ID4gPiA+IC0JZGVwZW5kcyBvbiBVU0JfTVVTQl9PTUFQMlBM VVMKPiA+ID4gPiArCWRlcGVuZHMgb24gVVNCX01VU0JfT01BUDJQTFVTIHx8IFVTQl9NVVNCX01F RElBVEVLCj4gPiA+ID4gIAloZWxwCj4gPiA+ID4gIAkgIEVuYWJsZSBETUEgdHJhbnNmZXJzIHVz aW5nIE1lbnRvcidzIGVuZ2luZS4KPiA+ID4gPiAgCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvdXNiL211c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCj4gPiA+ID4g aW5kZXggM2E4OGM3OS4uNjNkODJkMCAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3VzYi9t dXNiL01ha2VmaWxlCj4gPiA+ID4gKysrIGIvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQo+ID4g PiA+IEBAIC0yNCw2ICsyNCw3IEBAIG9iai0kKENPTkZJR19VU0JfTVVTQl9EQThYWCkJCQkrPSBk YTh4eC5vCj4gPiA+ID4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9VWDUwMCkJCQkrPSB1eDUwMC5v Cj4gPiA+ID4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9KWjQ3NDApCQkJKz0gano0NzQwLm8KPiA+ ID4gPiAgb2JqLSQoQ09ORklHX1VTQl9NVVNCX1NVTlhJKQkJCSs9IHN1bnhpLm8KPiA+ID4gPiAr b2JqLSQoQ09ORklHX1VTQl9NVVNCX01FRElBVEVLKSAgICAgIAkJKz0gbWVkaWF0ZWsubwo+ID4g PiA+ICAKPiA+ID4gPiAgCj4gPiA+ID4gIG9iai0kKENPTkZJR19VU0JfTVVTQl9BTTMzNVhfQ0hJ TEQpCQkrPSBtdXNiX2FtMzM1eC5vCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211 c2IvbWVkaWF0ZWsuYyBiL2RyaXZlcnMvdXNiL211c2IvbWVkaWF0ZWsuYwo+ID4gPiA+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gPiA+ID4gaW5kZXggMDAwMDAwMC4uMTVhNjQ2MAo+ID4gPiA+IC0t LSAvZGV2L251bGwKPiA+ID4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMKPiA+ ID4gCj4gPiA+IFtzbmlwXQo+ID4gPiBJIHdpbGwgcmV2aWV3IHRoaXMgc2VjdGlvbiBsYXRlciBh ZnRlciB3ZSBzb3J0ZWQgb3V0IG90aGVyIHRoaW5ncy4KPiA+ID4gCj4gPiA+ID4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Jf Y29yZS5jCj4gPiA+ID4gaW5kZXggYjdkNTYyNy4uZDYwZjc2ZiAxMDA2NDQKPiA+ID4gPiAtLS0g YS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCj4gPiA+ID4gKysrIGIvZHJpdmVycy91c2Iv bXVzYi9tdXNiX2NvcmUuYwo+ID4gPiA+IEBAIC0xMDI4LDYgKzEwMjgsMTYgQEAgc3RhdGljIHZv aWQgbXVzYl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG11c2IgKm11c2IpCj4gPiA+ID4gIAl0 ZW1wID0gbXVzYl9yZWFkYihtYmFzZSwgTVVTQl9JTlRSVVNCKTsKPiA+ID4gPiAgCXRlbXAgPSBt dXNiX3JlYWR3KG1iYXNlLCBNVVNCX0lOVFJUWCk7Cj4gPiA+ID4gIAl0ZW1wID0gbXVzYl9yZWFk dyhtYmFzZSwgTVVTQl9JTlRSUlgpOwo+ID4gPiA+ICsKPiA+ID4gPiArCS8qICBNZWRpYVRlayBj b250cm9sbGVyIGludGVycnVwdCBzdGF0dXMgaXMgVzFDICovCj4gPiA+IAo+ID4gPiBUaGlzIFcx QyBkb2Vzbid0IG1hdGNoIHRvIHRoZSBNVVNCIFByb2dyYW1taW5nIEd1aWRlIHRoYXQgSSBoYXZl LiBUaG9zZQo+ID4gPiByZWdpc3RlcnMgYXJlIHJlYWQtb25seS4KPiA+ID4gSXMgdGhlIGRpZmZl cmVuY2UgZHVlIHRvIHRoZSBJUCBpbnRlcmdyYXRpb24gaW4gdGhlIG10ayBwbGF0Zm9ybXM/IG9y IGlzCj4gPiA+IGl0IGEgbmV3IHZlcnNpb24gb2YgdGhlIE1VU0IgY29udHJvbGxlcj8gSWYgbGF0 dGVyLCB3aGF0IGlzIHRoZSB2ZXJzaW9uPwo+ID4gCj4gPiBUaGlzIGlzIGRpZmZlcmVuY2UgZHVl IHRvIHRoZSBJUCBpbnRlcmdyYXRpb24gaW4gbXRrIHBsYXRmb3Jtcy4gVzFDIGlzCj4gPiBlYXN5 IGZvciBDcGRlVmlzZXIgZGVidWcuCj4gPiAKPiA+ID4gPiArCWlmIChtdXNiLT5vcHMtPnF1aXJr cyAmIE1VU0JfTVRLX1FVSVJLUykgewo+ID4gPiAKPiA+ID4gQmFzaWNhbGx5IHdlIGRvbid0IHdh bnQgdG8gdXNlIHRoaXMgdHlwZSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBxdWlya3MgaWYKPiA+ID4g cG9zc2libGUsIHNvIGxldCdzIHRyeSB0byBub3QgdXNlIGl0Lgo+ID4gCj4gPiBJIHdpbGwgdHJ5 IG15IGJlc3QgdG8gYXZvaWQgdXNpbmcgaXQuCj4gCj4gVGhhbmtzLgo+IAo+ID4gCj4gPiA+ID4g KwkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfSU5UUlVTQiwKPiA+ID4gPiArCQkJbXVzYl9yZWFk YihtYmFzZSwgTVVTQl9JTlRSVVNCKSk7Cj4gPiA+IAo+ID4gPiBGb3IgdGhpcyBjbGVhcmluZyBy ZWdpc3RlciBiaXQgb3BlcmF0aW9uLCBwbGVhc2UgY3JlYXRlIHBsYXRmb3JtIGhvb2tzCj4gPiA+ IG11c2JfY2xlYXJiKCkgYW5kIG11c2JfY2xlYXJ3KCkgaW4gc3RydWN0IG11c2JfcGxhdGZvcm1f b3BzIGluc3RlYWQsCj4gPiA+IHRoZW4gZm9sbG93IGhvdyBtdXNiX3JlYWRiKCkgcG9pbnRlciBp cyBhc3NpZ25lZCBpbgo+ID4gPiBtdXNiX2luaXRfY29udHJvbGxlcigpIHRvIHVzZSB0aGUgVzFD IHZlcnNpb24gZm9yIG10ayBwbGF0Zm9ybS4KPiA+IAo+ID4gSSBoYXZlIHRyaWVkIGltcGxlbWVu dGluZyBtdXNiX3JlYWRiKCksIG11c2JfcmVhZHcoKSBpbnRlcmZhY2Ugd2l0aAo+ID4gaW50ZXJy dXB0IHN0YXR1cyBXMUMgZnVuY3Rpb24gaW4gc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzLiBCdXQg dGhpcwo+ID4gaW50ZXJmYWNlIHdpbGwgcmVxdWlyZSBhIGdsb2JhbCB2YXJpYWJsZSB0byBob2xk IE1BQyBiYXNpYyBhZGRyZXNzIGZvcgo+ID4ganVkZ21lbnQsIGFuZCB0aGVuIHNwZWNpYWwgaGFu ZGxpbmcgb2YgdGhlIGludGVycnVwdCBzdGF0ZS4gQSBnbG9iYWwKPiA+IHZhcmlhYmxlIHdpbGwg bWFrZSB0aGUgZHJpdmVyIHdvcmsgd2l0aCBvbmx5IGEgc2luZ2xlIGluc3RhbmNlLCBzbyBpdAo+ ID4gY2FuJ3Qgd29yayBvbiBzb21lIE1USyBwbGF0Zm9ybXMgd2hpY2ggaGF2ZSB0d28gaW5zdGFu Y2VzLgo+IAo+IEkgZGlkbid0IG1lYW4gdG8gbW9kaWZ5IG11c2JfcmVhZCooKSwgYnV0Cj4gCj4g PiBIb3cgYWJvdXQgY3JlYXRpbmcgbXVzYl9jbGVhcmIvdygpIGFzIGZvbGxvd2luZzoKPiA+IHZv aWQgKCpjbGVhcmIpKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LCB1OCBkYXRh KTsKPiA+IHZvaWQgKCpjbGVhcncpKHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0 LCB1MTYgZGF0YSk7Cj4gCj4gdGhpcyBpcyB3aGF0IEkgd2FzIGFza2luZyBmb3IsIHNpbWlsYXIg dG8gd2hhdCBtdXNiX3JlYWRiL3coKSBpcwo+IGltcGxlbWVudGVkLgoKSSB3aWxsIHByZXBhcmUg YSBwYXRjaCBmb3IgbXVzYl9jbGVhcmIvdygpLgoKPiA+IAo+ID4gCj4gPiA+ID4gKwkJbXVzYl93 cml0ZXcobWJhc2UsIE1VU0JfSU5UUlJYLAo+ID4gPiA+ICsJCQltdXNiX3JlYWR3KG1iYXNlLCBN VVNCX0lOVFJSWCkpOwo+ID4gPiA+ICsJCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX0lOVFJUWCwK PiA+ID4gPiArCQkJbXVzYl9yZWFkdyhtYmFzZSwgTVVTQl9JTlRSVFgpKTsKPiA+ID4gPiArCX0K PiA+ID4gPiAgfQo+ID4gPiA+ICAKPiA+ID4gPiAgc3RhdGljIHZvaWQgbXVzYl9lbmFibGVfaW50 ZXJydXB0cyhzdHJ1Y3QgbXVzYiAqbXVzYikKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKPiA+ID4g PiBpbmRleCAwNDIwM2I3Li4xYmY0ZTlhIDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvdXNi L211c2IvbXVzYl9jb3JlLmgKPiA+ID4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29y ZS5oCj4gPiA+ID4gQEAgLTEzOCw2ICsxMzgsNyBAQCBlbnVtIG11c2JfZ19lcDBfc3RhdGUgewo+ ID4gPiA+ICAgKi8KPiA+ID4gPiAgc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzIHsKPiA+ID4gPiAg Cj4gPiA+ID4gKyNkZWZpbmUgTVVTQl9NVEtfUVVJUktTCUJJVCgxMCkKPiA+ID4gPiAgI2RlZmlu ZSBNVVNCX0dfTk9fU0tCX1JFU0VSVkUJQklUKDkpCj4gPiA+ID4gICNkZWZpbmUgTVVTQl9EQThY WAkJQklUKDgpCj4gPiA+ID4gICNkZWZpbmUgTVVTQl9QUkVTRVJWRV9TRVNTSU9OCUJJVCg3KQo+ ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmggYi9kcml2ZXJz L3VzYi9tdXNiL211c2JfZG1hLmgKPiA+ID4gPiBpbmRleCAyODFlNzVkMy4uYjIxODIxMCAxMDA2 NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKPiA+ID4gPiArKysg Yi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKPiA+ID4gPiBAQCAtMTk3LDYgKzE5Nyw3IEBA IHN0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3koc3RydWN0IGRt YV9jb250cm9sbGVyICpkKSB7IH0KPiA+ID4gPiAgZXh0ZXJuIHN0cnVjdCBkbWFfY29udHJvbGxl ciAqCj4gPiA+ID4gIG11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGUoc3RydWN0IG11c2IgKm11 c2IsIHZvaWQgX19pb21lbSAqYmFzZSk7Cj4gPiA+ID4gIGV4dGVybiB2b2lkIG11c2Joc19kbWFf Y29udHJvbGxlcl9kZXN0cm95KHN0cnVjdCBkbWFfY29udHJvbGxlciAqYyk7Cj4gPiA+ID4gK2V4 dGVybiBpcnFyZXR1cm5fdCBkbWFfY29udHJvbGxlcl9pcnEoaW50IGlycSwgdm9pZCAqcHJpdmF0 ZV9kYXRhKTsKPiA+ID4gPiAgCj4gPiA+ID4gIGV4dGVybiBzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIg Kgo+ID4gPiA+ICB0dXNiX2RtYV9jb250cm9sbGVyX2NyZWF0ZShzdHJ1Y3QgbXVzYiAqbXVzYiwg dm9pZCBfX2lvbWVtICpiYXNlKTsKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVz Yi9tdXNiX2hvc3QuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKPiA+ID4gPiBpbmRl eCBiNTljZTlhLi5iMWIwMjE2IDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZlcnMvdXNiL211c2Iv bXVzYl9ob3N0LmMKPiA+ID4gPiArKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCj4g PiA+ID4gQEAgLTI5MiwyMCArMjkyLDczIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3NhdmVf dG9nZ2xlKHN0cnVjdCBtdXNiX3FoICpxaCwgaW50IGlzX2luLAo+ID4gPiA+ICB7Cj4gPiA+ID4g IAl2b2lkIF9faW9tZW0JCSplcGlvID0gcWgtPmh3X2VwLT5yZWdzOwo+ID4gPiA+ICAJdTE2CQkJ Y3NyOwo+ID4gPiA+ICsJc3RydWN0IG11c2IgKm11c2IgPSBxaC0+aHdfZXAtPm11c2I7Cj4gPiA+ ID4gIAo+ID4gPiA+ICAJLyoKPiA+ID4gPiAgCSAqIEZJWE1FOiB0aGUgY3VycmVudCBNZW50b3Ig RE1BIGNvZGUgc2VlbXMgdG8gaGF2ZQo+ID4gPiA+ICAJICogcHJvYmxlbXMgZ2V0dGluZyB0b2dn bGUgY29ycmVjdC4KPiA+ID4gPiAgCSAqLwo+ID4gPiA+ICAKPiA+ID4gPiAtCWlmIChpc19pbikK PiA+ID4gPiAtCQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfUlhDU1IpICYgTVVTQl9SWENT Ul9IX0RBVEFUT0dHTEU7Cj4gPiA+ID4gLQllbHNlCj4gPiA+ID4gLQkJY3NyID0gbXVzYl9yZWFk dyhlcGlvLCBNVVNCX1RYQ1NSKSAmIE1VU0JfVFhDU1JfSF9EQVRBVE9HR0xFOwo+ID4gPiA+ICsJ LyogTWVkaWFUZWsgY29udHJvbGxlciBoYXMgcHJpdmF0ZSB0b2dnbGUgcmVnaXN0ZXIgKi8KPiA+ ID4gCj4gPiA+IG9ubHkgb25lIHRvZ2dsZSByZWdpc3RlciBmb3IgYWxsIGVuZHBvaW50cz8gaG93 IGRvZXMgaXQgaGFuZGxlCj4gPiA+IGRpZmZlcmVuY2UgdG9nZ2xlIHZhbHVlcyBmb3IgZGlmZmVy ZW50IGVuZHBvaW50cz8KPiA+IAo+ID4gTWVkaWFUZWsgY29udHJvbGxlciBoYXMgc2VwYXJhdGUg cmVnaXN0ZXJzIHRvIGRlc2NyaWJlIFRYL1JYIHRvZ2dsZS4KPiAKPiBJcyBpdCBvbmUgcmVnaXN0 ZXIgcGVyIGVuZHBvaW50PwoKTVVTQl9SWFRPRy9NVVNCX1RYVE9HIGlzIGNvbW1vbiByZWdpc3Rl ciwgZWFjaCBiaXQgcmVmbGVjdHMgdGhlIHRvZ2dsZQpzdGF0ZSBvZiBhbiBlbmRwb2ludC4gYml0 WzBdIG5vdCB1c2VkLGJpdFsxfjhdIGNvcnJlc3BvbmRzIHRvIGVwWzF+OF0KCj4gPiAKPiA+ID4g PiArCWlmIChtdXNiLT5vcHMtPnF1aXJrcyAmIE1VU0JfTVRLX1FVSVJLUykgewo+ID4gPiA+ICsJ CXUxNiB0b2dnbGU7Cj4gPiA+ID4gKwkJdTggZXBudW0gPSBxaC0+aHdfZXAtPmVwbnVtOwo+ID4g PiA+ICsKPiA+ID4gPiArCQlpZiAoaXNfaW4pCj4gPiA+ID4gKwkJCXRvZ2dsZSA9IG11c2JfcmVh ZGwobXVzYi0+bXJlZ3MsIE1VU0JfUlhUT0cpOwo+IAo+IHRoaXMgbGluZSBzZWVtcyB0ZWxsaW5n IHRoZXJlIGlzIGp1c3QgKm9uZSogcmVnaXN0ZXIgZm9yIGFsbCBlbmRwb2ludHMuCgpZZXMsIGFs bCBlbmRwb2ludCBzaGFyZSB0aGlzIHJlZ2lzdGVyLCBlbmRwb2ludCBhbmQgYml0IGFyZSBvbmUt dG8tb25lCmNvcnJlc3BvbmRlbmNlLgoKPiA+ID4gCj4gPiA+IHNob3VsZCB1c2UgbXVzYl9yZWFk dygpIGluc3RlYWQ/IE1VU0JfUlhUT0cgc2VlbXMgdG8gYmUgMTZiaXQuCj4gPiAKPiA+IE9rCj4g PiAKPiA+ID4gPiArCQllbHNlCj4gPiA+ID4gKwkJCXRvZ2dsZSA9IG11c2JfcmVhZGwobXVzYi0+ bXJlZ3MsIE1VU0JfVFhUT0cpOwo+ID4gPiA+ICsKPiA+ID4gPiArCQljc3IgPSB0b2dnbGUgJiAo MSA8PCBlcG51bSk7Cj4gPiA+ID4gKwl9IGVsc2Ugewo+ID4gPiA+ICsJCWlmIChpc19pbikKPiA+ ID4gPiArCQkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1JYQ1NSKQo+ID4gPiA+ICsJCQkJ JiBNVVNCX1JYQ1NSX0hfREFUQVRPR0dMRTsKPiA+ID4gPiArCQllbHNlCj4gPiA+ID4gKwkJCWNz ciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUikKPiA+ID4gPiArCQkJCSYgTVVTQl9UWENT Ul9IX0RBVEFUT0dHTEU7Cj4gPiA+IAo+ID4gPiBEb2VzIHRoaXMgbG9naWMgc3RpbGwgd29yayBm b3IgdGhlIG10ayBwbGF0Zm9ybSBldmVuIGlmIGl0IGhhcyBpdHMgb3duCj4gPiA+IHByaXZhdGUg dG9nZ2xlIHJlZ2lzdGVyPyBJZiBzbywgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgaGVyZS4KPiA+ IAo+ID4gU29ycnksIHRoaXMgbG9naWMgY2FuIG5vdCB3b3JrIG9uIG10ayBwbGF0Zm9ybSwgYml0 Cj4gPiBNVVNCX1JYQ1NSX0hfREFUQVRPR0dMRSBhbmQgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEUg YXJlIHVzZWQgZm9yIG90aGVyCj4gPiBmdW5jdGlvbi4KPiAKPiBJcyB0aGVyZSBhIGRpZmZlcmVu dCBjb250cm9sbGVyIFJUTCB2ZXJzaW9uIHdlIGNhbiB1c2UgdG8KPiBkaWZmZXJlbnRpYXRlPwoK U29ycnksIHRoZXJlIGlzIG5vIGNvbnRyb2xsZXIgUlRMIHZlcnNpb24gY2FuIGJlIHVzZWQgdG8g aW5kaWNhdGUgdGhlCmRpZmZlcmVuY2VzLgoKPiA+IAo+ID4gPiBJZiBub3QsIGxldCdzIHRyeSB0 byBub3QgdXNlIHRoaXMgcXVpcmsgZmxhZy4gUGxlYXNlIGNyZWF0ZSBhIGhvb2sKPiA+ID4gbXVz Yl9wbGF0Zm9ybV9nZXRfdG9nZ2xlKCkgaW4gc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzLgo+ID4g Cj4gPiBEb2VzIHRoZSBtZXRob2Qgb2YgaW1wbGVtZW50IG11c2JfcGxhdGZvcm1fZ2V0X3RvZ2ds ZSgpIGlzIHByZXBhcmUKPiA+IG11c2JfZGVmYXVsdF9nZXRfdG9nZ2xlIHdpdGggY29tbW9uIGZ1 bmN0aW9uLCB0aGVuIGZvbGxvdyBob3cKPiA+IG11c2JfcmVhZGIoKSBwb2ludGVyIGlzIGFzc2ln bmVkIGluIG11c2JfaW5pdF9jb250cm9sbGVyKCk/Cj4gCj4gWWVzLCBzaW1pbGFyIHRvIG11c2Jf cmVhZGIoKSBpbXBsZW1lbnRhdGlvbi4KCk9LLgoKPiA+IEhvdyBhYm91dCBjcmVhdGluZyBtdXNi X3BsYXRmb3JtX2dldF90b2dnbGUoKSBhcyBmb2xsb3dpbmc6Cj4gPiB1MTYgKCpnZXRfdG9nZ2xl KShzdHJ1Y3QgbXVzYiogbXVzYiwgc3RydWN0IG11c2JfcWggKnFoLCBpbnQgaXNfaW4pOwo+IAo+ IHllcywgaXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHRoZW4gYWRkIGl0IGluIHN0 cnVjdCBtdXNiX2lvLgoKSSB3aWxsIHByZXBhcmUgYSBwYXRjaCBmb3IgKCpnZXRfdG9nZ2xlKS4K Cj4gPiAKPiA+ID4gPiArCX0KPiA+ID4gPiAgCj4gPiA+ID4gIAl1c2Jfc2V0dG9nZ2xlKHVyYi0+ ZGV2LCBxaC0+ZXBudW0sICFpc19pbiwgY3NyID8gMSA6IDApOwo+ID4gPiA+ICB9Cj4gPiA+ID4g IAo+ID4gPiA+ICtzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3NldF90b2dnbGUoc3RydWN0IG11c2Jf cWggKnFoLCBpbnQgaXNfaW4sCj4gPiA+ID4gKwkJCQkJc3RydWN0IHVyYiAqdXJiKQo+ID4gPiA+ ICt7Cj4gPiA+ID4gKwl1MTYgY3NyID0gMDsKPiA+ID4gPiArCXUxNiB0b2dnbGUgPSAwOwo+ID4g PiA+ICsJc3RydWN0IG11c2IgKm11c2IgPSBxaC0+aHdfZXAtPm11c2I7Cj4gPiA+ID4gKwl1OCBl cG51bSA9IHFoLT5od19lcC0+ZXBudW07Cj4gPiA+ID4gKwo+ID4gPiA+ICsJdG9nZ2xlID0gdXNi X2dldHRvZ2dsZSh1cmItPmRldiwgcWgtPmVwbnVtLCAhaXNfaW4pOwo+ID4gPiA+ICsKPiA+ID4g PiArCS8qIE1lZGlhVGVrIGNvbnRyb2xsZXIgaGFzIHByaXZhdGUgdG9nZ2xlIHJlZ2lzdGVyICov Cj4gPiA+ID4gKwlpZiAobXVzYi0+b3BzLT5xdWlya3MgJiBNVVNCX01US19RVUlSS1MpIHsKPiA+ ID4gPiArCQlpZiAoaXNfaW4pIHsKPiA+ID4gPiArCQkJbXVzYl93cml0ZWwobXVzYi0+bXJlZ3Ms IE1VU0JfUlhUT0dFTiwgKDEgPDwgZXBudW0pKTsKPiA+ID4gPiArCQkJbXVzYl93cml0ZWwobXVz Yi0+bXJlZ3MsIE1VU0JfUlhUT0csICh0b2dnbGUgPDwgZXBudW0pKTsKPiA+ID4gPiArCQl9IGVs c2Ugewo+ID4gPiA+ICsJCQltdXNiX3dyaXRlbChtdXNiLT5tcmVncywgTVVTQl9UWFRPR0VOLCAo MSA8PCBlcG51bSkpOwo+ID4gPiA+ICsJCQltdXNiX3dyaXRlbChtdXNiLT5tcmVncywgTVVTQl9U WFRPRywgKHRvZ2dsZSA8PCBlcG51bSkpOwo+ID4gPiA+ICsJCX0KPiA+ID4gPiArCX0gZWxzZSB7 Cj4gPiA+ID4gKwkJaWYgKGlzX2luKSB7Cj4gPiA+ID4gKwkJCWlmICh0b2dnbGUpCj4gPiA+ID4g KwkJCQljc3IgPSBNVVNCX1JYQ1NSX0hfV1JfREFUQVRPR0dMRQo+ID4gPiA+ICsJCQkJCQl8IE1V U0JfUlhDU1JfSF9EQVRBVE9HR0xFOwo+ID4gPiA+ICsJCQllbHNlCj4gPiA+ID4gKwkJCQljc3Ig PSAwOwo+ID4gPiA+ICsJCX0gZWxzZSB7Cj4gPiA+ID4gKwkJCWlmICh0b2dnbGUpCj4gPiA+ID4g KwkJCQljc3IgfD0gTVVTQl9UWENTUl9IX1dSX0RBVEFUT0dHTEUKPiA+ID4gPiArCQkJCQkJfCBN VVNCX1RYQ1NSX0hfREFUQVRPR0dMRTsKPiA+ID4gPiArCQkJZWxzZQo+ID4gPiA+ICsJCQkJY3Ny IHw9IE1VU0JfVFhDU1JfQ0xSREFUQVRPRzsKPiAKPiAnPyA6JyBvcGVyYXRpb24gcHJvYmFibHkg aXMgYmV0dGVyIHRoYW4gJ2lmIGVsc2UnIGhlcmUuCgpPSy4KCj4gPiA+ID4gKwkJfQo+ID4gPiA+ ICsJfQo+ID4gPiA+ICsJcmV0dXJuIGNzcjsKPiA+ID4gCj4gPiA+IFBsZWFzZSBjcmVhdGUgYSBz ZXBlcmF0ZSBwYXRjaCBmb3IgdGhpcyBtdXNiX3NldF90b2dnbGUoKSB3aXRob3V0IGFkZGluZwo+ ID4gPiB0aGUgbXRrIGxvZ2ljLiBJdCBpcyBhIG5pY2UgY2xlYW51cC4KPiA+IAo+ID4gRG9lcyB0 aGlzIGxpa2UgZ2V0IHRvZ2dsZSBpbXBsZW1lbnRhdGlvbiwgY3JlYXRlIGEgaG9vawo+ID4gbXVz Yl9wbGF0Zm9ybV9zZXRfdG9nZ2xlKCkgaW4gc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzPwo+IAo+ IFlvdSBkaWQgdGhlIGNvZGUgY2xlYW51cCBieSBjcmVhdGluZyBtdXNiX3NldF90b2dnbGUoKSwg cGxlYXNlIG1ha2UgaXQKPiBpbiBhIHNlcGFyYXRlIHBhdGNoLCBsaWtlCj4gCj4gc3RhdGljIHUx NiBtdXNiX3NldF90b2dnbGUoc3RydWN0IG11c2JfcWggKnFoLCBpbnQgaXNfaW4sIHN0cnVjdCB1 cmIgKnVyYikKPiB7Cj4gCXRvZ2dsZSA9IHVzYl9nZXR0b2dnbGUodXJiLT5kZXYsIHFoLT5lcG51 bSwgIWlzX2luKTsKPiAJaWYgKGlzX2luKQo+IAkJY3NyID0gdG9nZ2xlID8gCj4gCQkJKE1VU0Jf UlhDU1JfSF9XUl9EQVRBVE9HR0xFIHwgTVVTQl9SWENTUl9IX0RBVEFUT0dHTEUpIDoKPiAJCQkw Owo+IAllbHNlCj4gCQljc3IgPSB0b2dnbGUgPwo+IAkJCU1VU0JfVFhDU1JfSF9XUl9EQVRBVE9H R0xFIHwgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEUgOgo+IAkJCU1VU0JfVFhDU1JfQ0xSREFUQVRP RzsKPiAJcmV0dXJuIGNzcjsKPiB9Cj4gCj4gLyogdXNlIG11c2Jfc2V0X3RvZ2dsZSgpIGluIHRo ZSB0d28gaW5zdGFuY2VzICovCj4gCj4gdGhlbiBpbiB0aGlzIHBhdGNoIHlvdSBhZGQgdGhlIG10 ayBpbXBsZW1lbnRhdGlvbiBzaW1pbGFyIGFzCj4gKmdldF90b2dnbGUoKSBkaXNjdXNzZWQgYWJv dmUuCgpPSy4KCj4gPiAKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiAgLyoKPiA+ID4gPiAg ICogQWR2YW5jZSB0aGlzIGhhcmR3YXJlIGVuZHBvaW50J3MgcXVldWUsIGNvbXBsZXRpbmcgdGhl IHNwZWNpZmllZCBVUkIgYW5kCj4gPiA+ID4gICAqIGFkdmFuY2luZyB0byBlaXRoZXIgdGhlIG5l eHQgVVJCIHF1ZXVlZCB0byB0aGF0IHFoLCBvciBlbHNlIGludmFsaWRhdGluZwo+ID4gPiA+IEBA IC03NzIsMTMgKzgyNSw4IEBAIHN0YXRpYyB2b2lkIG11c2JfZXBfcHJvZ3JhbShzdHJ1Y3QgbXVz YiAqbXVzYiwgdTggZXBudW0sCj4gPiA+ID4gIAkJCQkJKTsKPiA+ID4gPiAgCQkJY3NyIHw9IE1V U0JfVFhDU1JfTU9ERTsKPiA+ID4gPiAgCj4gPiA+ID4gLQkJCWlmICghaHdfZXAtPnR4X2RvdWJs ZV9idWZmZXJlZCkgewo+ID4gPiA+IC0JCQkJaWYgKHVzYl9nZXR0b2dnbGUodXJiLT5kZXYsIHFo LT5lcG51bSwgMSkpCj4gPiA+ID4gLQkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfSF9XUl9EQVRBVE9H R0xFCj4gPiA+ID4gLQkJCQkJCXwgTVVTQl9UWENTUl9IX0RBVEFUT0dHTEU7Cj4gPiA+ID4gLQkJ CQllbHNlCj4gPiA+ID4gLQkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfQ0xSREFUQVRPRzsKPiA+ID4g PiAtCQkJfQo+ID4gPiA+ICsJCQlpZiAoIWh3X2VwLT50eF9kb3VibGVfYnVmZmVyZWQpCj4gPiA+ ID4gKwkJCQljc3IgfD0gbXVzYl9zZXRfdG9nZ2xlKHFoLCAhaXNfb3V0LCB1cmIpOwo+ID4gPiA+ ICAKPiA+ID4gPiAgCQkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKPiA+ID4g PiAgCQkJLyogUkVWSVNJVCBtYXkgbmVlZCB0byBjbGVhciBGTFVTSEZJRk8gLi4uICovCj4gPiA+ ID4gQEAgLTg2MCwxNyArOTA4LDEyIEBAIHN0YXRpYyB2b2lkIG11c2JfZXBfcHJvZ3JhbShzdHJ1 Y3QgbXVzYiAqbXVzYiwgdTggZXBudW0sCj4gPiA+ID4gIAo+ID4gPiA+ICAJLyogSU4vcmVjZWl2 ZSAqLwo+ID4gPiA+ICAJfSBlbHNlIHsKPiA+ID4gPiAtCQl1MTYJY3NyOwo+ID4gPiA+ICsJCXUx Ngljc3IgPSAwOwo+ID4gPiA+ICAKPiA+ID4gPiAgCQlpZiAoaHdfZXAtPnJ4X3JlaW5pdCkgewo+ ID4gPiA+ICAJCQltdXNiX3J4X3JlaW5pdChtdXNiLCBxaCwgZXBudW0pOwo+ID4gPiA+ICsJCQlj c3IgfD0gbXVzYl9zZXRfdG9nZ2xlKHFoLCAhaXNfb3V0LCB1cmIpOwo+ID4gPiA+ICAKPiA+ID4g PiAtCQkJLyogaW5pdCBuZXcgc3RhdGU6IHRvZ2dsZSBhbmQgTllFVCwgbWF5YmUgRE1BIGxhdGVy ICovCj4gPiA+ID4gLQkJCWlmICh1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCBxaC0+ZXBudW0sIDAp KQo+ID4gPiA+IC0JCQkJY3NyID0gTVVTQl9SWENTUl9IX1dSX0RBVEFUT0dHTEUKPiA+ID4gPiAt CQkJCQl8IE1VU0JfUlhDU1JfSF9EQVRBVE9HR0xFOwo+ID4gPiA+IC0JCQllbHNlCj4gPiA+ID4g LQkJCQljc3IgPSAwOwo+ID4gPiA+ICAJCQlpZiAocWgtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hG RVJfSU5UKQo+ID4gPiA+ICAJCQkJY3NyIHw9IE1VU0JfUlhDU1JfRElTTllFVDsKPiA+ID4gPiAg Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmggYi9kcml2 ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCj4gPiA+ID4gaW5kZXggNWNkNzI2NC4uZmZiZTI2NyAx MDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCj4gPiA+ID4g KysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAo+ID4gPiA+IEBAIC0yNzMsNiArMjcz LDEyIEBACj4gPiA+ID4gICNkZWZpbmUgTVVTQl9SWEhVQkFERFIJCTB4MDYKPiA+ID4gPiAgI2Rl ZmluZSBNVVNCX1JYSFVCUE9SVAkJMHgwNwo+ID4gPiA+ICAKPiA+ID4gPiArLyogTWVkaWFUZWsg Y29udHJvbGxlciB0b2dnbGUgZW5hYmxlIGFuZCBzdGF0dXMgcmVnICovCj4gPiA+ID4gKyNkZWZp bmUgTVVTQl9SWFRPRwkJMHg4MAo+ID4gPiA+ICsjZGVmaW5lIE1VU0JfUlhUT0dFTgkJMHg4Mgo+ ID4gPiA+ICsjZGVmaW5lIE1VU0JfVFhUT0cJCTB4ODQKPiA+ID4gPiArI2RlZmluZSBNVVNCX1RY VE9HRU4JCTB4ODYKPiA+ID4gCj4gPiA+IEFnYWluLCB0aGVzZSBvZmZzZXRzIGFyZSBmb3IgZGlm ZmVyZW50IHJlZ2lzdGVycyBpbiB0aGUgTVVTQiB2ZXJzaW9uIEkKPiA+ID4gaGF2ZSwgcGxlYXNl IGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoZSBNVVNCIElQ Lgo+ID4gCj4gPiBTb3JyeSwgdGhlc2UgYXJlIE1lZGlhVGVrIGNvbnRyb2xsZXIgcHJpdmF0ZSBy ZWdpc3RlcnMgdXNlZCBmb3IgY29udHJvbAo+ID4gdG9nZ2xlLgo+IAo+IE9rYXkuIE9uY2UgdGhl IHBsYXRmb3JtIGdldC9zZXRfdG9nZ2xlKCkgYXJlIGltcGxlbWVudGVkLCB0aG9zZQo+IHJlZ2lz dGVycyBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgbXRrIGdsdWUgZHJpdmVyIGluc3RlYWQgb2YgaGVy ZS4KCk9LLgoKPiBSZWdhcmRzLAo+IC1CaW4uCg== 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.5 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=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 A8776C43387 for ; Thu, 10 Jan 2019 07:24:41 +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 736F8206B7 for ; Thu, 10 Jan 2019 07:24:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ud/a5Oza" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 736F8206B7 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=pOELlPkkshJOYZmDPBZ5DnovNR9eMI5SrYqNF9xfkzk=; b=ud/a5OzayC92RY ZLrRnBhC6blFaz8bmRGaMfloWknaOyAfJMdbp31FAJiunY7CqQ1kl1UguoSNvplrcTzxEmgDnd7XL J9K61qm4PJJzhwhg3mUwoDL6OeNcG6wyhq/n64kbQkC/CoBoIeGURvb1qEJJj6mA+PQZ+dcOInZIr blXfCgePQlnFEL0/ozSpui2F8QiZbksi00i72038OPe4ox2tdZCdq2JU4s09BiMUBsszZWPx5BMuA J5UWbLbj6aBoQITOISnPc/BocZAGe+wUItwlXcgM+q8sksnW28aWSgkkUVlV6OHA5eWn7CP8GO/bV LjnTQWdX3TfKBMJZHItA==; 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 1ghUhj-0008B9-VB; Thu, 10 Jan 2019 07:24:39 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1ghUhe-00089n-Qs; Thu, 10 Jan 2019 07:24:37 +0000 X-UUID: d6c8c01e3ba740a9b7e071005b1aebe7-20190109 X-UUID: d6c8c01e3ba740a9b7e071005b1aebe7-20190109 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1773024293; Wed, 09 Jan 2019 23:24:27 -0800 Received: from MTKMBS31DR.mediatek.inc (172.27.6.102) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 9 Jan 2019 23:24:25 -0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31DR.mediatek.inc (172.27.6.102) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Thu, 10 Jan 2019 15:24:23 +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; Thu, 10 Jan 2019 15:24:22 +0800 Message-ID: <1547105062.4433.144.camel@mhfsdcap03> Subject: Re: [PATCH 4/4] usb: musb: Add support for MediaTek musb controller From: Min Guo To: Bin Liu Date: Thu, 10 Jan 2019 15:24:22 +0800 In-Reply-To: <20190109140144.GI25910@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> <1547037068.4433.122.camel@mhfsdcap03> <20190109140144.GI25910@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_232434_898882_6C710DBC X-CRM114-Status: GOOD ( 47.01 ) 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 Wed, 2019-01-09 at 08:01 -0600, Bin Liu wrote: > Hi Min, > > On Wed, Jan 09, 2019 at 08:31:08PM +0800, Min Guo wrote: > > 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. > > Thanks. > > > > > > > + 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. > > I didn't mean to modify musb_read*(), but > > > 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); > > this is what I was asking for, similar to what musb_readb/w() is > implemented. I will prepare a patch for musb_clearb/w(). > > > > > > > > + 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. > > Is it one register per endpoint? MUSB_RXTOG/MUSB_TXTOG is common register, each bit reflects the toggle state of an endpoint. bit[0] not used,bit[1~8] corresponds to ep[1~8] > > > > > > + 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); > > this line seems telling there is just *one* register for all endpoints. Yes, all endpoint share this register, endpoint and bit are one-to-one correspondence. > > > > > > 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. > > Is there a different controller RTL version we can use to > differentiate? Sorry, there is no controller RTL version can be used to indicate the differences. > > > > > 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()? > > Yes, similar to musb_readb() implementation. OK. > > How about creating musb_platform_get_toggle() as following: > > u16 (*get_toggle)(struct musb* musb, struct musb_qh *qh, int is_in); > > yes, it is part of the implementation, then add it in struct musb_io. I will prepare a patch for (*get_toggle). > > > > > > + } > > > > > > > > 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; > > '? :' operation probably is better than 'if else' here. OK. > > > > + } > > > > + } > > > > + 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? > > You did the code cleanup by creating musb_set_toggle(), please make it > in a separate patch, like > > static u16 musb_set_toggle(struct musb_qh *qh, int is_in, struct urb *urb) > { > toggle = usb_gettoggle(urb->dev, qh->epnum, !is_in); > if (is_in) > csr = toggle ? > (MUSB_RXCSR_H_WR_DATATOGGLE | MUSB_RXCSR_H_DATATOGGLE) : > 0; > else > csr = toggle ? > MUSB_TXCSR_H_WR_DATATOGGLE | MUSB_TXCSR_H_DATATOGGLE : > MUSB_TXCSR_CLRDATATOG; > return csr; > } > > /* use musb_set_toggle() in the two instances */ > > then in this patch you add the mtk implementation similar as > *get_toggle() discussed above. OK. > > > > > > +} > > > > + > > > > /* > > > > * 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. > > Okay. Once the platform get/set_toggle() are implemented, those > registers can be defined in the mtk glue driver instead of here. OK. > Regards, > -Bin. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel