[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACRpkdYqCQc0Er1JR_eVzZPCycvKjd0Pph8Dcay0FbU3Q64D8A@mail.gmail.com>
Date: Wed, 7 Nov 2012 22:24:19 +0100
From: Linus Walleij <linus.walleij@...aro.org>
To: Alex Courbot <acourbot@...dia.com>
Cc: Stephen Warren <swarren@...dotorg.org>,
Grant Likely <grant.likely@...retlab.ca>,
"devicetree-discuss@...ts.ozlabs.org"
<devicetree-discuss@...ts.ozlabs.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
Thomas Gleixner <tglx@...utronix.de>
Subject: Re: How about a gpio_get(device *, char *) function?
On Tue, Nov 6, 2012 at 2:33 AM, Alex Courbot <acourbot@...dia.com> wrote:
> How about, in a first time (and because I'd also like to get the power seqs
> moving on), a typedef from int to gpio_handle_t and a first implementation of
> the gpio_handle_*() API that would just call the existing integer-based API
> (apart from gpio_handle_get())? That way things will not break when we switch
> to a real handle.
I'm afraid of typedef:ing gpio_handle_t to int because it sort of
encourages non-handlers to be used mixed with the old integers.
I would prefer to create, e.g. in <linux/gpio/consumer.h>
something like:
struct gpio;
struct gpio *gpio_get(struct device *dev, const char *name);
int gpio_get_value(struct gpio *g);
Nothing more! I.e. struct gpio is an opaque cookie, nothing to be known
about it.
And then have the drivers using this *ONLY* include <linux/gpio/consumer.h>
and not <linux/gpio.h>. So drivers have no clue what struct gpio is and
will only operate on it using functions.
This follows the pattern set by Thomas Gleixner for e.g. IRQ descriptors,
and the style was also used in the redesign of the struct clk *.
Of course the cross-referencing implementation can in e.g.
drivers/gpio/gpiodev.c internally define that like this:
#include <linux/gpio.h>
/**
* @gpio: pointer to global GPIO number
*/
struct gpio {
int gpio;
};
struct gpio *gpio_get(struct device *dev, const char *name)
{
/* Lookup in cross-ref table etc */
}
int gpioh_get_value(struct gpio *g)
{
return gpio_get_value(g->gpio);
}
(...)
Then we can work from there. I think it adds the proper
opaqueness factor.
I don't really like the "gpioh_*" prefix instead of just gpio_* but
I guess there is not polymorphism to exploit as transition
path here :-P
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists