Thread (27 messages) flat view 27 messages, 5 authors, 2012-03-09

[PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()

From: tony@atomide.com (Tony Lindgren)
Date: 2012-03-02 17:03:33
Also in: linux-mmc, linux-omap, lkml

Hi,

Correcting a typo in the LKML address..

* Grant Likely [off-list ref] [120302 01:00]:
On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren [off-list ref] wrote:
quoted
Currently there is no way for drivers to request a GPIO on a particular
gpio chip. This makes it hard to support multiple GPIO controllers
with dynamic GPIO and interrupt numbering, such as with CONFIG_SPARSE_IRQ.

Make it easier for device drivers to find GPIOs on a specific gpio_chip
by adding two functions: gpiochip_find_by_name() and gpio_find_by_chip_name().

Note that as gpiochip_find() is already exported, we may as well
export gpiochip_find_by_name() too.
How is the device going to know the name of the gpio controller?  I
don't particularly like interfaces that find devices by-names since
I don't think device names can be relied to be stable when devices
are instantiated from device tree data.
The gpio_chip name + gpio offset is coming from pdata until things
are converted over to use DT.

For DT, this should not be needed, this is needed for removing callbacks
in pdata so we can clean up some drivers and keep them working with
both pdata and DT until things are converted over to DT.
quoted
+static int match_name(struct gpio_chip *chip, void *data)
Even though this is a static, please keep the prefix to avoid
namespace conflicts.  gpiochip_match_name()
quoted
+{
+	const char *name = data;
This is unnecessary; the void* can be passed directly to sysfs_streq...
but why is sysfs_streq being used here instead of strcmp?  This is 
not sysfs related code.
That comes from the bus code, will take a look.
 
quoted
+
+	return sysfs_streq(name, chip->label);
+}
+
+/**
+ * gpiochip_find_by_name() - iterator for locating a gpio_chip by name
+ * @name: name of the gpio_chip
+ *
+ * Similar to bus_find_device_by_name. It returns a reference to the
+ * first gpio_chip with matching name. It ignores NULL and empty names.
+ * If you need to do something more complex, then use gpiochip_find.
+ */
+struct gpio_chip *gpiochip_find_by_name(const char *name)
+{
+	if (!name || !strcmp(name, ""))
+		return NULL;
+
+	return gpiochip_find((void *)name, match_name);
Nasty cast.  Can the signature for gpiochip_find be changed to accept
a (const void *)?
I think so, this too comes from the bus code.

Regards,

Tony 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help