FYI: It looks like the CC for Stephen and Arnd was messed up, so I fixed.
On 04/23/2018 01:38 PM, Bartosz Golaszewski wrote:
From: Bartosz Golaszewski <[email protected]> Hi David, Sekhar, since platform devices are generally considered more desirable than CLK_OF_DECLARE, TIMER_OF_DECLARE etc. and we need to figure out how to handle the clocks that need to be initialized early in the boot process on DaVinci, I thought that I could give the early_platform mechanism a try. This API is only used on one architecture (sh) but seems to work just fine on ARM. It allows to register early platform drivers and then probe them early in the boot process. So far only machine code is supported but with a bit of hacking I was able to probe a DT device. This is a very dirty and far-from-upstream proof of concept that allows to probe the (so far dummy) davinci timer platform device during the call to init_time (from machine_desc). The idea is to have a special compatible fallback string: "earlydev" that similarily to "syscon" would be added to device nodes that need early probing. Then we'd call the of_early_platform_populate() function that would find all compatible nodes and populate them long before all the "normal" nodes.
FWIW, "earlydev" sounds like a driver implementation detail, so not something that should be included in the device tree. We only need this because Linux needs a clocksource early on, but that doesn't mean that all device tree users need to do the same. I'm sure it makes things easier for a proof of concept though. :-)
This would allow us to make the davinci timer a normal platform device and possibly also probe the psc and pll drivers earlier than we do now. The early platform API even allows us to check if we're being probed early in probe() so we can possibly probe the driver twice if needed: only doing the critical stuff first and then completing the process later. If you think this is a good idea, I would like to continue on that and eventually make it an alternative to OF_DECLARE macros. For a quick conversion of the davinci timer to a platform driver I image we'd need to use platform data lookup that would be passed to of_early_platform_populate().
On the surface, it certainly sounds like a good idea to me. Do we have access to struct device of the platform device when using this early platform device? I remember when I was working on the clock drivers, I tried registering a platform device in the init_time callback but the kernel crashed because kobj stuff was not initialized yet. I'm guessing that the early platform device somehow works around this.

