Hi, John Youn <John.Youn@xxxxxxxxxxxx> writes: >> John Youn <John.Youn@xxxxxxxxxxxx> writes: >>>>>>> @@ -1229,7 +1229,8 @@ static inline void dwc2_hcd_connect(struct dwc2_hsotg *hsotg) {} >>>>>>> static inline void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force) {} >>>>>>> static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {} >>>>>>> static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {} >>>>>>> -static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq) >>>>>>> +static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, >>>>>>> + struct resource *res) >>>>>>> { return 0; } >>>>>>> static inline int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg) >>>>>>> { return 0; } >>>>>>> diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c >>>>>>> index 911c3b36..2cfbd10e 100644 >>>>>>> --- a/drivers/usb/dwc2/hcd.c >>>>>>> +++ b/drivers/usb/dwc2/hcd.c >>>>>>> @@ -4964,7 +4964,7 @@ static void dwc2_hcd_release(struct dwc2_hsotg *hsotg) >>>>>>> * USB bus with the core and calls the hc_driver->start() function. It returns >>>>>>> * a negative error on failure. >>>>>>> */ >>>>>>> -int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq) >>>>>>> +int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, struct resource *res) >>>>>>> { >>>>>>> struct usb_hcd *hcd; >>>>>>> struct dwc2_host_chan *channel; >>>>>>> @@ -5021,6 +5021,9 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq) >>>>>>> >>>>>>> hcd->has_tt = 1; >>>>>>> >>>>>>> + hcd->rsrc_start = res->start; >>>>>>> + hcd->rsrc_len = resource_size(res); >>>>>>> + >>>>>>> ((struct wrapper_priv_data *) &hcd->hcd_priv)->hsotg = hsotg; >>>>>>> hsotg->priv = hcd; >>>>>>> >>>>>>> diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h >>>>>>> index 1ed5fa2b..2305b5fb 100644 >>>>>>> --- a/drivers/usb/dwc2/hcd.h >>>>>>> +++ b/drivers/usb/dwc2/hcd.h >>>>>>> @@ -521,7 +521,8 @@ static inline u8 dwc2_hcd_is_pipe_out(struct dwc2_hcd_pipe_info *pipe) >>>>>>> return !dwc2_hcd_is_pipe_in(pipe); >>>>>>> } >>>>>>> >>>>>>> -extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq); >>>>>>> +extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, >>>>>>> + struct resource *res); >>>>>>> extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg); >>>>>>> >>>>>>> /* Transaction Execution Functions */ >>>>>>> diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c >>>>>>> index 4fc8c603..5ddc8860 100644 >>>>>>> --- a/drivers/usb/dwc2/platform.c >>>>>>> +++ b/drivers/usb/dwc2/platform.c >>>>>>> @@ -445,7 +445,7 @@ static int dwc2_driver_probe(struct platform_device *dev) >>>>>>> } >>>>>>> >>>>>>> if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) { >>>>>>> - retval = dwc2_hcd_init(hsotg, hsotg->irq); >>>>>>> + retval = dwc2_hcd_init(hsotg, hsotg->irq, res); >>>>>> >>>>>> This is a good idea, but there's more work that can come out of this, if >>>>>> you're interested: >>>>>> >>>>>> i) devm_ioremap_resource() could be called by the generic layer >>>>>> ii) devm_request_irq() could be move to the generic layer >>>>>> iii) dwc2_hcd_init() could also be called generically as long as dr_mode >>>>>> is set properly. >>>>>> iv) dwc2_debugfs_init() could be called generically as well >>>>>> >>>>>> IOW, dwc2_driver_probe() could be as minimal as: >>>>>> >>>>>> static int dwc2_driver_probe(struct platform_device *dev) >>>>>> { >>>>>> struct dwc2_hsotg *hsotg; >>>>>> struct resource *res; >>>>>> int retval; >>>>>> >>>>>> hsotg = devm_kzalloc(&dev->dev, sizeof(*hsotg), GFP_KERNEL); >>>>>> if (!hsotg) >>>>>> return -ENOMEM; >>>>>> >>>>>> hsotg->dev = &dev->dev; >>>>>> >>>>>> if (!dev->dev.dma_mask) >>>>>> dev->dev.dma_mask = &dev->dev.coherent_dma_mask; >>>>>> >>>>>> retval = dma_set_coherent_mask(&dev->dev, DMA_BIT_MASK(32)); >>>>>> if (retval) >>>>>> return retval; >>>>>> >>>>>> hsotg->res = platform_get_resource(dev, IORESOURCE_MEM, 0); >>>>>> hsotg->irq = platform_get_irq(dev, 0); >>>>>> >>>>>> retval = dwc2_get_dr_mode(hsotg); >>>>>> if (retval) >>>>>> return retval; >>>>>> >>>>>> retval = dwc2_get_hwparams(hsotg); >>>>>> if (retval) >>>>>> return retval; >>>>>> >>>>>> platform_set_drvdata(dev, hsotg); >>>>>> >>>>>> retval = dwc2_core_init(hsotg); >>>>>> if (retval) >>>>>> return retval; >>>>>> >>>>>> return 0; >>>>>> } >>>>>> >>>>>> dwc2_core_init() needs to implemented, of course, but it could hide all >>>>>> details about what to do with IRQs and resources and what not. Assuming >>>>>> you can properly initialize clocks, it could even handle clocks >>>>>> generically for you. >>>>>> >>>>> I see what you mean. I'm just a little confused about the term "generic" here: >>>>> For me something generic has more than one user. Here we seem to speak just >>>>> about factoring out some code from the probe function, or? >>>> >>>> :-) by generic, I mean moving some of that code to >>>> drivers/usb/dwc2/core.c so it can be used by both PCI and non-PCI >>>> systems. >>>> >>>>> Your proposal for reducing the probe function would mean to reorder some calls >>>>> like the ones to dwc2_lowlevel_hw_init and dwc2_lowlevel_hw_enable. >>>>> At a first glance this seems to be ok, but I'm not 100% sure. >>>> >>>> right, it needs to be carefully considered. But to me it looks totally >>>> doable and it would remove code from both platform.c and pci.c >>>> >>> >>> Hi Felipe, >>> >>> I believe what you are asking for here is already done. >>> >>> The platform driver does everything generically and works for both pci >>> and non-pci. The PCI driver is just a glue layer which adds a platform >>> device similar to dwc3-pci. >> >> not really. We still have code requesting the IRQ in both PCI and >> platform.c, we also have code ioremapping the memory resource, >> etc... All of those could be moved into the core driver. >> > > Hi Felipe, > > No please check again. There are only two drivers dwc2 (core platform > driver) and dwc2-pci (pci glue driver). > > The platform.c file is part of the dwc2 core driver. All the work is > done *only* in this driver. oh, understood now. So it's pretty similar to dwc3 in that sense. I thought platform.c was completely separate and PCI didn't make use of that. thanks for clarifying -- balbi
Attachment:
signature.asc
Description: PGP signature