On Wed, Jun 26, 2013 at 11:03:20AM +0100, Grant Likely wrote: > 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. One problem with this method is that every driver that needs or wants the device early has to do it explicitly, but I guess we can't have it all. I find this solution rather appealing because it allows for instance the Marvell Armada 370/XP IRQ chip driver to do this as well so we no longer have to keep around the extra struct device_node * in msi_chip but we can actually reuse the one from struct device instead. Thierry
Attachment:
pgpkEs3yYofWt.pgp
Description: PGP signature