Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jan 2012 23:45:29 -0800
From:      Oleksandr Tymoshenko <gonzo@bluezbox.com>
To:        freebsd-arch@freebsd.org
Cc:        Ben Gray <ben.r.gray@gmail.com>
Subject:   Re: Extending sys/dev/mii
Message-ID:  <EDEACD17-6B1A-4F80-B20B-84ADB559092E@bluezbox.com>
In-Reply-To: <4F1A3B58.7040001@freebsd.org>
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> <4F1A3B58.7040001@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 2012-01-20, at 8:13 PM, Oleksandr Tymoshenko wrote:

> On 20/01/2012 5:43 PM, Warner Losh wrote:
>>=20
>> 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?
>>=20
>> 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?
>=20
>    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:
>=20
>    int omap_prcm_clk_enable(clk_ident_t clk)
>    {
>        device_t prcm_dev;
>=20
>        prcm_dev =3D devclass_get_device(devclass_find("omap_prcm"), =
0);
>        if (prcm_dev =3D=3D NULL) {
>            printf("Error: failed to get the PRCM device\n");
>            return (EINVAL);
>        }
>=20
>        return OMAP_PRCM_CLK_ENABLE(prcm_dev, clk);
>    }
>=20
> 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.


I tinkered a little bit with this idea and here is what I've come up =
with so far:

http://people.freebsd.org/~gonzo/patches/horizontal-api.diff

this patch adds one more available declaration to .m files: APIMETHOD
In addition to usual kobj method declaration one more function is =
generated.
This function gets first device in devclass with the same name as =
declared
interface and uses it as object for respective method call.=20

Also if there is at least one APIMETHOD in interface one more function =
called=20
XXXX_available() is generated. It returns 1 if there is device of =
required devclass.

Usage example:
       int maxpin;

       printf("GPIO available: %d\n", gpio_available());
       if (gpio_available()) {
           gpio_pin_max(&maxpin);
           printf("GPIO pins: %d\n", maxpin);
        }

Possible improvements: instead of using devclass for identifying kobj,=20=

create way for device to explicitly register/deregister as an API =
"provider".=20


Comments, ideas?=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?EDEACD17-6B1A-4F80-B20B-84ADB559092E>