Date: Fri, 20 Jan 2012 20:13:12 -0800 From: Oleksandr Tymoshenko <gonzo@freebsd.org> To: freebsd-arch@freebsd.org, Ben Gray <ben.r.gray@gmail.com> Subject: Re: Extending sys/dev/mii Message-ID: <4F1A3B58.7040001@freebsd.org> In-Reply-To: <8EF24110-C985-400F-ADDF-B1D63C4E304B@bsdimp.com> References: <8D025847-4BE4-4B2C-87D7-97E72CC9D325@lassitu.de> <20120104215930.GM90831@alchemy.franken.de> <47ABA638-7E08-4350-A03C-3D4A23BF2D7E@lassitu.de> <1763C3FF-1EA0-4DC0-891D-63816EBF4A04@lassitu.de> <20120106182756.GA88161@alchemy.franken.de> <95372FB3-406F-46C2-8684-4FDB672D9FCF@lassitu.de> <20120106214741.GB88161@alchemy.franken.de> <F60B2B70-049F-4497-BBA8-3C421088C1EA@lassitu.de> <20120108130039.GG88161@alchemy.franken.de> <23477898-8D85-498C-8E30-192810BD68A8@lassitu.de> <20120111193738.GB44286@alchemy.franken.de> <66DDA0A2-F878-43FF-8824-54868F493B18@lassitu.de> <8EF24110-C985-400F-ADDF-B1D63C4E304B@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 20/01/2012 5:43 PM, Warner Losh wrote: > > On Jan 20, 2012, at 5:08 PM, Stefan Bethke wrote: >> The second problem is that there's currently no way to express a dependency between two devices other than a parent-child relationship. I would be interested to learn why this appears to be so uncommon that I could not find any discussion of such a feature. Has it really never before come up? > > Sure there is: you can do it by name. I wrote a driver that attached to the ISA bus, but also needed to talk to the ppbus that was attached to the printer. My solution was to have a post-attach name-lookup so that it could then call methods on the other driver's device_t. I wonder why we can't do that here? I've been thinking about it recently in regard to GPIO subsystem. And the same issue appeared during OMAP code import: there are at least two subsystems that are used by the rest of the drivers. Ben's suggested following solution: define kobj interface if_SUBSYTEM.m and then provide API call in form: int omap_prcm_clk_enable(clk_ident_t clk) { device_t prcm_dev; prcm_dev = devclass_get_device(devclass_find("omap_prcm"), 0); if (prcm_dev == NULL) { printf("Error: failed to get the PRCM device\n"); return (EINVAL); } return OMAP_PRCM_CLK_ENABLE(prcm_dev, clk); } So it might make sense to create some kind of upper-level API for defining this kind of subsystems' APIs since every implementation would duplicate a lot of code: look for instance of specific devclass, check if it exists. Not sure how to do it at the moment though.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F1A3B58.7040001>