On 01/20/2017 09:17 PM, Bin Liu wrote: > On Thu, Jan 19, 2017 at 11:06:59AM +0100, Alexandre Bailon wrote: >> Despite the CPPI 4.1 is a generic DMA, it is tied to USB. >> On the dsps, CPPI 4.1 interrupt's registers are in USBSS (the MUSB glue). >> Currently, to enable / disable and clear interrupts, the CPPI 4.1 driver >> maps and accesses to USBSS's register, which making CPPI 4.1 driver not >> really generic. >> Move the interrupt management to dsps driver. >> >> Signed-off-by: Alexandre Bailon <abai...@baylibre.com> >> --- >> drivers/dma/cppi41.c | 28 ++++------------ >> drivers/usb/musb/musb_dsps.c | 77 >> ++++++++++++++++++++++++++++++++++++++++++-- >> 2 files changed, 82 insertions(+), 23 deletions(-) > > This patch touches both dma and musb modules, I know it makes review > easier, but how we get it merged? One maintainer ACK it and the other > pick it up? Sorry for the dumb question, I am new as a maintainer... > >> >> diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c >> index d5ba43a..4999e7d 100644 >> --- a/drivers/dma/cppi41.c >> +++ b/drivers/dma/cppi41.c > > [...] > >> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c >> index 9f125e1..9dad3a6 100644 >> --- a/drivers/usb/musb/musb_dsps.c >> +++ b/drivers/usb/musb/musb_dsps.c >> @@ -121,6 +121,7 @@ struct dsps_glue { >> struct timer_list timer; /* otg_workaround timer */ >> unsigned long last_timer; /* last timer data for each instance */ >> bool sw_babble_enabled; >> + void __iomem *usbss_base; >> >> struct dsps_context context; >> struct debugfs_regset32 regset; >> @@ -145,6 +146,13 @@ static const struct debugfs_reg32 dsps_musb_regs[] = { >> { "mode", 0xe8 }, >> }; >> >> +/* USBSS / USB AM335x */ >> +#define USBSS_IRQ_STATUS 0x28 >> +#define USBSS_IRQ_ENABLER 0x2c >> +#define USBSS_IRQ_CLEARR 0x30 >> + >> +#define USBSS_IRQ_PD_COMP (1 << 2) > > Please fix the double white spaces bwteen '<' and '2' this time. > >> + >> /** >> * dsps_musb_enable - enable interrupts >> */ >> @@ -619,14 +627,72 @@ static void dsps_read_fifo32(struct musb_hw_ep *hw_ep, >> u16 len, u8 *dst) >> } >> } >> >> +#ifdef CONFIG_USB_TI_CPPI41_DMA >> +static void dsps_dma_controller_callback(struct dma_controller *c) >> +{ >> + struct musb *musb = c->musb; >> + struct dsps_glue *glue = dev_get_drvdata(musb->controller->parent); >> + void __iomem *usbss_base = glue->usbss_base; >> + u32 status; >> + >> + status = musb_readl(usbss_base, USBSS_IRQ_STATUS); >> + if (status & USBSS_IRQ_PD_COMP) >> + musb_writel(usbss_base, USBSS_IRQ_STATUS, USBSS_IRQ_PD_COMP); >> +} >> + >> +static struct dma_controller * >> +dsps_dma_controller_create(struct musb *musb, void __iomem *base) >> +{ >> + struct dma_controller *controller; >> + struct dsps_glue *glue = dev_get_drvdata(musb->controller->parent); >> + void __iomem *usbss_base = glue->usbss_base; >> + >> + controller = cppi41_dma_controller_create(musb, base); >> + if (IS_ERR_OR_NULL(controller)) >> + return controller; >> + >> + musb_writel(usbss_base, USBSS_IRQ_ENABLER, USBSS_IRQ_PD_COMP); >> + controller->dma_callback = dsps_dma_controller_callback; >> + >> + return controller; >> +} >> + >> +static void dsps_dma_controller_destroy(struct dma_controller *c) >> +{ >> + struct musb *musb = c->musb; >> + struct dsps_glue *glue = dev_get_drvdata(musb->controller->parent); >> + void __iomem *usbss_base = glue->usbss_base; >> + >> + musb_writel(usbss_base, USBSS_IRQ_CLEARR, USBSS_IRQ_PD_COMP); >> + cppi41_dma_controller_destroy(c); >> +} >> + >> +static void dsps_dma_controller_suspend(struct dsps_glue *glue) >> +{ >> + void __iomem *usbss_base = glue->usbss_base; >> + >> + musb_writel(usbss_base, USBSS_IRQ_CLEARR, USBSS_IRQ_PD_COMP); >> +} >> + >> +static void dsps_dma_controller_resume(struct dsps_glue *glue) >> +{ >> + void __iomem *usbss_base = glue->usbss_base; >> + >> + musb_writel(usbss_base, USBSS_IRQ_ENABLER, USBSS_IRQ_PD_COMP); >> +} > > The two functions above need to be wrapped in CONFIG_PM_SLEEP. > >> +#else >> +static void dsps_dma_controller_suspend(struct dsps_glue *glue) {} >> +static void dsps_dma_controller_resume(struct dsps_glue *glue) {} >> +#endif >> + >> static struct musb_platform_ops dsps_ops = { >> .quirks = MUSB_DMA_CPPI41 | MUSB_INDEXED_EP, >> .init = dsps_musb_init, >> .exit = dsps_musb_exit, >> >> #ifdef CONFIG_USB_TI_CPPI41_DMA >> - .dma_init = cppi41_dma_controller_create, >> - .dma_exit = cppi41_dma_controller_destroy, >> + .dma_init = dsps_dma_controller_create, >> + .dma_exit = dsps_dma_controller_destroy, >> #endif >> .enable = dsps_musb_enable, >> .disable = dsps_musb_disable, >> @@ -792,6 +858,9 @@ static int dsps_probe(struct platform_device *pdev) >> >> glue->dev = &pdev->dev; >> glue->wrp = wrp; >> + glue->usbss_base = of_iomap(pdev->dev.parent->of_node, 0); >> + if (!glue->usbss_base) > > use IS_ERR()? I don't we can use it here. As far I know, of_iomap() only return NULL in the case of error. > >> + return -ENXIO; > > and return PTR_ERR()? Again, I don't think we can use it here. THough, may be -ENXIO is not the best error code to return. I used it because it was the used in DMA driver. > > Regards, > -Bin. > Regards, Alexandre
-- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html