Message ID | 20191210171110.62141-2-paul@crapouillou.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3,1/7] usb: musb: dma: Correct parameter passed to IRQ handler | expand |
On Tue, Dec 10, 2019 at 06:11:05PM +0100, Paul Cercueil wrote: > The implementation of the Inventra IP in some of the Ingenic JZ47xx SoCs > does not use a separate IRQ line for DMA transfers. > > Allow these SoCs to be supported by adding a flag 'dma_share_usb_irq' > in the struct musb. If set, no extra IRQ line is required, and the musb > glue will need to call the API function musbhs_dma_controller_irq() > within its interrupt handler. > > Signed-off-by: Paul Cercueil <paul@crapouillou.net> > Tested-by: Artur Rojek <contact@artur-rojek.eu> > --- Queued for usb-next. Thanks. -Bin.
Hi Paul, On Wed, Dec 11, 2019 at 12:52:24PM -0600, Bin Liu wrote: > On Tue, Dec 10, 2019 at 06:11:05PM +0100, Paul Cercueil wrote: > > The implementation of the Inventra IP in some of the Ingenic JZ47xx SoCs > > does not use a separate IRQ line for DMA transfers. > > > > Allow these SoCs to be supported by adding a flag 'dma_share_usb_irq' > > in the struct musb. If set, no extra IRQ line is required, and the musb > > glue will need to call the API function musbhs_dma_controller_irq() > > within its interrupt handler. > > > > Signed-off-by: Paul Cercueil <paul@crapouillou.net> > > Tested-by: Artur Rojek <contact@artur-rojek.eu> > > --- > > Queued for usb-next. Thanks. I removed this and the next patch [3/7] in this series from my queue. Sorry. Ming Guo has posted a series "Add MediaTek MUSB Controller Driver" which has done the similar implementation [1] but without adding the flag in struct musb. Can you please check if you can use Ming's implementation instead? The patch of his musb glue driver which uses the implementation is [2], just for your reference. [1] https://marc.info/?l=linux-usb&m=157602930627195&w=2 [2] https://marc.info/?l=linux-usb&m=157602932427210&w=2 Thanks, -Bin.
Hi Bin, Le mar., déc. 17, 2019 at 08:42, Bin Liu <b-liu@ti.com> a écrit : > Hi Paul, > > On Wed, Dec 11, 2019 at 12:52:24PM -0600, Bin Liu wrote: >> On Tue, Dec 10, 2019 at 06:11:05PM +0100, Paul Cercueil wrote: >> > The implementation of the Inventra IP in some of the Ingenic >> JZ47xx SoCs >> > does not use a separate IRQ line for DMA transfers. >> > >> > Allow these SoCs to be supported by adding a flag >> 'dma_share_usb_irq' >> > in the struct musb. If set, no extra IRQ line is required, and >> the musb >> > glue will need to call the API function >> musbhs_dma_controller_irq() >> > within its interrupt handler. >> > >> > Signed-off-by: Paul Cercueil <paul@crapouillou.net> >> > Tested-by: Artur Rojek <contact@artur-rojek.eu> >> > --- >> >> Queued for usb-next. Thanks. > > I removed this and the next patch [3/7] in this series from my queue. > Sorry. Ming Guo has posted a series "Add MediaTek MUSB Controller > Driver" which has done the similar implementation [1] but without > adding > the flag in struct musb. Can you please check if you can use Ming's > implementation instead? The patch of his musb glue driver which uses > the > implementation is [2], just for your reference. Sure. Were these patches merged? What tree do they apply to? They don't apply cleanly on -rc2. -Paul > > [1] https://marc.info/?l=linux-usb&m=157602930627195&w=2 > [2] https://marc.info/?l=linux-usb&m=157602932427210&w=2 > > Thanks, > -Bin.
On Tue, Dec 17, 2019 at 10:04:38PM +0100, Paul Cercueil wrote: > Hi Bin, > > > Le mar., déc. 17, 2019 at 08:42, Bin Liu <b-liu@ti.com> a écrit : > > Hi Paul, > > > > On Wed, Dec 11, 2019 at 12:52:24PM -0600, Bin Liu wrote: > > > On Tue, Dec 10, 2019 at 06:11:05PM +0100, Paul Cercueil wrote: > > > > The implementation of the Inventra IP in some of the Ingenic > > > JZ47xx SoCs > > > > does not use a separate IRQ line for DMA transfers. > > > > > > > > Allow these SoCs to be supported by adding a flag > > > 'dma_share_usb_irq' > > > > in the struct musb. If set, no extra IRQ line is required, and > > > the musb > > > > glue will need to call the API function > > > musbhs_dma_controller_irq() > > > > within its interrupt handler. > > > > > > > > Signed-off-by: Paul Cercueil <paul@crapouillou.net> > > > > Tested-by: Artur Rojek <contact@artur-rojek.eu> > > > > --- > > > > > > Queued for usb-next. Thanks. > > > > I removed this and the next patch [3/7] in this series from my queue. > > Sorry. Ming Guo has posted a series "Add MediaTek MUSB Controller > > Driver" which has done the similar implementation [1] but without adding > > the flag in struct musb. Can you please check if you can use Ming's > > implementation instead? The patch of his musb glue driver which uses the > > implementation is [2], just for your reference. > > Sure. Were these patches merged? What tree do they apply to? They don't > apply cleanly on -rc2. I am currently doing the last round review and test on those patches, applying them to Greg's -next branch. Yes, they don't apply cleanly on -rc2, but manual apply doesn't have any issue. -Bin.
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 04203b7126d5..b7c31c717800 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -392,6 +392,8 @@ struct musb { unsigned flush_irq_work:1; + unsigned dma_share_usb_irq:1; + u8 address; u8 test_mode_nr; u16 ackpend; /* ep0 */ diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h index 8f60271c0a9d..b3f65016a972 100644 --- a/drivers/usb/musb/musb_dma.h +++ b/drivers/usb/musb/musb_dma.h @@ -191,6 +191,7 @@ extern void (*musb_dma_controller_destroy)(struct dma_controller *); 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 musbhs_dma_controller_irq(struct dma_controller *c); extern struct dma_controller * tusb_dma_controller_create(struct musb *musb, void __iomem *base); diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 2d3751d885b4..898856e9974e 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c @@ -268,7 +268,7 @@ static int dma_channel_abort(struct dma_channel *channel) return 0; } -static irqreturn_t dma_controller_irq(int irq, void *private_data) +static irqreturn_t dma_controller_irq_cb(int irq, void *private_data) { struct musb_dma_controller *controller = private_data; struct musb *musb = controller->private_data; @@ -292,6 +292,9 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR); if (!int_hsdma) { + if (musb->dma_share_usb_irq) + goto done; + musb_dbg(musb, "spurious DMA irq"); for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) { @@ -384,6 +387,15 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) return retval; } +irqreturn_t musbhs_dma_controller_irq(struct dma_controller *c) +{ + struct musb_dma_controller *controller = container_of(c, + struct musb_dma_controller, controller); + + return dma_controller_irq_cb(controller->irq, controller); +} +EXPORT_SYMBOL_GPL(musbhs_dma_controller_irq); + void musbhs_dma_controller_destroy(struct dma_controller *c) { struct musb_dma_controller *controller = container_of(c, @@ -404,9 +416,14 @@ 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; + + if (musb->dma_share_usb_irq) + irq = 0; + else + irq = platform_get_irq_byname(pdev, "dma"); - if (irq <= 0) { + if (irq < 0) { dev_err(dev, "No DMA interrupt line!\n"); return NULL; } @@ -424,8 +441,8 @@ 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, - dev_name(musb->controller), controller)) { + if (irq > 0 && request_irq(irq, dma_controller_irq_cb, 0, + dev_name(musb->controller), controller)) { dev_err(dev, "request_irq %d failed!\n", irq); musb_dma_controller_destroy(&controller->controller);