On Fri, Jun 28, 2013 at 11:38 AM, Thierry Reding <thierry.reding@xxxxxxxxx> wrote: > On Fri, Jun 28, 2013 at 10:49:15AM +0200, Hiroshi Doyu wrote: >> Grant Likely <grant.likely@xxxxxxxxxxxx> wrote @ Wed, 26 Jun 2013 12:03:20 +0200: >> >> > On Wed, Jun 26, 2013 at 7:00 AM, Hiroshi Doyu <hdoyu@xxxxxxxxxx> wrote: >> > > Grant Likely <grant.likely@xxxxxxxxxxxx> wrote @ Tue, 25 Jun 2013 19:52:33 +0200: >> > > >> > >> > Here's my workaround. I need to call of_detach_node() with OF_DYNAMIC >> > >> > to avoid duplicated device registration. >> > >> >> > >> Gah! my eyes! >> > >> >> > >> Don't do that. It is incredibly problematic. Look at inhibiting >> > >> duplicate device creation instead. >> > > >> > > I may not follow this thread correctly, but could anyone point out the >> > > above "inhibiting duplicate device creation" if there's already such >> > > solution? >> > >> > No, the solution doesn't exist yet, but it wouldn't be hard to >> > implement. What you need to do is to add a struct device pointer to >> > struct device_node, and set the pointer to the struct device when >> > of_platform_device_create creates a device. (it would also need to be >> > set for early_platform_device creation, but that's not something that >> > should affect you). You would also add a check to >> > of_platform_device_create to check if the device pointer is already >> > set. If it is, then skip creation of the device. >> >> Implemented as Grant suggested. At least this works for our case, >> where IOMMU needs to be instanciated earlier than other device[1]. >> early_platform_device case still need to be covered. > > I think we arrived at a different conclusion in another branch of this > thread. With the patch below every driver needs to explicitly allocate > the platform device and set the struct device_node's .dev field, which > has other side-effects such as the device hierarchy getting messed up. > > A better alternative would be to have of_platform_populate() run early > such that the .dev field in the struct device_node can be set by core > code, which would not require every driver to be changed. > > I'm not sure exactly what needs to be done to make this work, however. > Grant, can you provide some guidance here as to how this may be fixed? > Where would we have to call of_platform_populate() from and what makes > this break with the current implementation? Try it and see! :-) I cannot give a definite answer, but I suspect that it will fall down when registering the devices on to the platform_bus because it isn't initialized yet. If called early, the code would need to hold the platform_device in some kind of deferred list until the platform bus was initialize, and then have a cleanup function at initcall time to finish the registration of all early devices. g. -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html