On 06/01/16 22:05, Gregory Fong wrote: > Hello Florian and Jim, > > On Wed, Jan 6, 2016 at 10:55 AM, Florian Fainelli <f.fainelli@xxxxxxxxx> wrote: >> From: Jim Quinlan <jim2101024@xxxxxxxxx> >> >> Because regulators are started with subsys_initcall(), and gpio references may >> be contained in the regulators, it makes sense to start the brcmstb-gpio's with >> a subsys_initcall(). The order within the drivers/Makefile ensures that the >> gpio initialization happens prior to the regulator's initialization. >> >> We need to unroll module_platform_driver() now to allow this and have custom >> exit and init module functions to control the initialization level. > > If gpio pins are needed for a regulator to come up, wouldn't it be > better to handle this using deferred probe instead of initcall-based > initialization? Deferred probe has its problems, but I was under the > impression that it's the encouraged way to resolve these sort of > initialization order issues. To give you some more context associated with this change, we now have some boards which have GPIO-connected regulators to turn on/off PCIe endpoint devices. In the downstream kernel, and with lack of a better solution for now, we ended-up having the PCIE Root Complex driver to claim these regulator, and flip them on shortly before attempting a bus scan. If we used deferred probing, I am assuming the sequence of events could go like this: - PCIe driver gets initialized, looks for regulators, cannot get a handle on them, gets EPROBE_DEFER (arch_initcall right now) - regulator subsystem gets initialized, does not have a valid GPIO provider driver yet, returns EPROBE_DEFER (subsys_initcall) - GPIO provider (gpio-brcmstb) finally gets probed and registered, regulator get registered and available, PCIe RC driver can now use them and power on the PCIE end point (module_initcall) I suppose this might be working actually, let me go back to the white board and look at this with Jim. -- Florian