On 10/31/2013 03:36 AM, Valentine wrote:
On 10/30/2013 06:12 PM, Greg KH wrote:
On Wed, Oct 30, 2013 at 01:56:25PM +0400, Valentine wrote:
On 10/30/2013 03:57 AM, Greg KH wrote:
On Tue, Oct 29, 2013 at 09:19:09PM +0400, Valentine wrote:
On 10/29/2013 09:00 PM, Laurent Pinchart wrote:
Hi Valentine,

Thank you for the patch.

On Tuesday 29 October 2013 20:21:06 Valentine Barshak wrote:
USB phy controls USB channels 0 and 2 which are shared between
PCI USB host controllers and USBHS/USBSS respectively.

This Initializes USB phy driver earlier because we need it
before PCI USB host controllers are initialized.

Can't you use deferred probing ?

No, unfortunately this doesn't work with PCI.
We need the USB PHY set up before the PCI driver starts.
PCI controllers should be initialized via subsys_initcall and can't be built as 
a module.
Deferred probing is done at late_initcall and that's far too late in this case.

The MXS USB phy uses the similar approach, initializing the driver via 
postcore_initcall.

I _HATE_ this "make this driver later than the others" mess.  I'll not

This is actually "make this driver before the others" mess.

take patches that move drivers to different initcalls, sorry.  Please
fix up the link order, or use deferred probing, as that is why it was
created.


This is needed for the PCI EHCI/OHCI drivers to operate correctly on R-Car Gen 
platform
since it has built-in PCI host controllers that share USB I/O with USBHS/USBSS 
devices.
The phy has to be configured before the PCI EHCI/OHCI devices are probed.

I'd really appreciate if you could give me a hint on how to fix the PCI 
EHCI/OHCI driver
to use deferred probing, or fix the link order without creating a bigger mess.

Just change the PCI driver to use deferred probing, it isn't that hard
to do so.


Do you mean to change usb_hcd_pci_probe() to return -EPROBE_DEFER if the phy is 
not ready?
Or should I defer the whole PCI subsystem initialization (pci_common_int)?

Greg,
the reason I ask is that it doesn't seem that simple to me.

Here's some details:
The h/w is an ARM SoC that has 3 internal PCI controllers with a single 
EHCI/OHCI on each one.
This gives us 3 USB channels as this is called in the h/w manual.
Channel 0 is shared with USBHS (USB function) device.
Channel 2 is shared with USBSS (USB3.0 host).
Both channels are configured by a single USB phy.
USB PHY is a platform device, while EHCI/OCHI are located on the PCI busses.

If PCI USB host is probed before USB phy, the EHCI/OHCI device is detected, but 
nothing works.

We could change the USB HDC PCI driver and make usb_hcd_pci_probe() return 
-EPROBE_DEFER,
but I'm not sure how the condition for that should be phrased.
We could check the PCI vendor/device id, but there's no guarantee the same PCI 
device
is not used on other Renesas h/w which do not require any PHY setup. More over 
we only need
to setup the phy for the USB hosts connected to PCI controller 0/2.

We could try to defer the PCI driver and call pci_common_init() after the USB 
phy is initialized.
However, it seems that it's gonna be a bigger mess.

1. We need to add custom PCI bus scan callback to the hw_pci structure.
We can't use default (pci_scan_root_bus) because it will try to probe/enable 
pci devices before
their resources are fixed up when called late (after the PCI USB host drivers 
are registered).

2. All of the internal PCI controllers are initialized using a single call to 
the pci_common_init_dev().
So we can't easily defer just PCI controller 0/2. Even if we try to defer the 
whole PCI subsystem
initialization, we probably need some sort of a dummy device that will defer 
pci_common_init_dev call
untill USB phy is initialized.

3. The data structures and functions that are used to setup PCI are called at 
subsys_init() and
marked __initdata/__init, so that we can easily get rid of them once the PCI is 
registered.
Using deferred probe we'd need to keep them forever.

Using late_initcall() instead of subsys_initcall() for the PCI registration 
might work
if we implement custom PCI bus scan callback,
But that's just doing the same thing that I've tried to do with USB phy here
with additional PCI bus scan quirk.

On the other hand, postcore_initcall is used in drivers/usb/phy/phy-mxs-usb.c 
which is in your tree.
I agree that it's not that pretty, but it doesn't seem that bad considering 
other options we have.


good luck,

Thanks,
Val.


Please, let me know if you see better options.
Thanks,
Val.


greg k-h



--
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

Reply via email to