2021-01-08 08:16:23

by Ryan Chen

[permalink] [raw]
Subject: [PATCH 1/1] usb: gadget: aspeed: fix stop dma register setting.

The vhub engine has two dma mode, one is descriptor list, another
is single stage DMA. Each mode has different stop register setting.
Descriptor list operation (bit2) : 0 disable reset, 1: enable reset
Single mode operation (bit0) : 0 : disable, 1: enable

Signed-off-by: Ryan Chen <[email protected]>
---
drivers/usb/gadget/udc/aspeed-vhub/epn.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/udc/aspeed-vhub/epn.c b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
index 0bd6b20435b8..02d8bfae58fb 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/epn.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
@@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep,
u32 state, reg, loops;

/* Stop DMA activity */
- writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
+ if (ep->epn.desc_mode)
+ writel(VHUB_EP_DMA_CTRL_RESET, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
+ else
+ writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);

/* Wait for it to complete */
for (loops = 0; loops < 1000; loops++) {
--
2.17.1


2021-01-08 12:23:05

by Felipe Balbi

[permalink] [raw]
Subject: Re: [PATCH 1/1] usb: gadget: aspeed: fix stop dma register setting.


Hi,

Ryan Chen <[email protected]> writes:
> The vhub engine has two dma mode, one is descriptor list, another
> is single stage DMA. Each mode has different stop register setting.
> Descriptor list operation (bit2) : 0 disable reset, 1: enable reset
> Single mode operation (bit0) : 0 : disable, 1: enable
>
> Signed-off-by: Ryan Chen <[email protected]>

I don't have HW, but FWIW:

Acked-by: Felipe Balbi <[email protected]>

--
balbi

2021-01-11 02:26:36

by Joel Stanley

[permalink] [raw]
Subject: Re: [PATCH 1/1] usb: gadget: aspeed: fix stop dma register setting.

On Fri, 8 Jan 2021 at 08:13, Ryan Chen <[email protected]> wrote:
>
> The vhub engine has two dma mode, one is descriptor list, another
> is single stage DMA. Each mode has different stop register setting.
> Descriptor list operation (bit2) : 0 disable reset, 1: enable reset
> Single mode operation (bit0) : 0 : disable, 1: enable
>
> Signed-off-by: Ryan Chen <[email protected]>
> ---
> drivers/usb/gadget/udc/aspeed-vhub/epn.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/udc/aspeed-vhub/epn.c b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
> index 0bd6b20435b8..02d8bfae58fb 100644
> --- a/drivers/usb/gadget/udc/aspeed-vhub/epn.c
> +++ b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
> @@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep,
> u32 state, reg, loops;
>
> /* Stop DMA activity */
> - writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
> + if (ep->epn.desc_mode)
> + writel(VHUB_EP_DMA_CTRL_RESET, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
> + else
> + writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);

This looks correct, as whenever the driver re-enables DMA it uses
ep->epn.dma_conf for the value of this register. So we're not losing
any configuration by setting it to 0.

Acked-by: Joel Stanley <[email protected]>
Fixes: 7ecca2a4080c ("usb/gadget: Add driver for Aspeed SoC virtual hub")

I've cc'd Ben for his ack too.

Cheers,

Joel

>
> /* Wait for it to complete */
> for (loops = 0; loops < 1000; loops++) {
> --
> 2.17.1
>