Merge branch 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6
* 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6: (63 commits) of/platform: Register of_platform_drivers with an "of:" prefix of/address: Clean up function declarations of/spi: call of_register_spi_devices() from spi core code of: Provide default of_node_to_nid() implementation. of/device: Make of_device_make_bus_id() usable by other code. of/irq: Fix endian issues in parsing interrupt specifiers of: Fix phandle endian issues of/flattree: fix of_flat_dt_is_compatible() to match the full compatible string of: remove of_default_bus_ids of: make of_find_device_by_node generic microblaze: remove references to of_device and to_of_device sparc: remove references to of_device and to_of_device powerpc: remove references to of_device and to_of_device of/device: Replace of_device with platform_device in includes and core code of/device: Protect against binding of_platform_drivers to non-OF devices of: remove asm/of_device.h of: remove asm/of_platform.h of/platform: remove all of_bus_type and of_platform_bus_type references of: Merge of_platform_bus_type with platform_bus_type drivercore/of: Add OF style matching to platform bus ... Fix up trivial conflicts in arch/microblaze/kernel/Makefile due to just some obj-y removals by the devicetree branch, while the microblaze updates added a new file.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -1100,16 +1101,24 @@ int gpiochip_add(struct gpio_chip *chip)
|
||||
}
|
||||
}
|
||||
|
||||
of_gpiochip_add(chip);
|
||||
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&gpio_lock, flags);
|
||||
if (status == 0)
|
||||
status = gpiochip_export(chip);
|
||||
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
status = gpiochip_export(chip);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
/* failures here can mean systems won't boot... */
|
||||
if (status)
|
||||
pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n",
|
||||
chip->base, chip->base + chip->ngpio - 1,
|
||||
chip->label ? : "generic");
|
||||
pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n",
|
||||
chip->base, chip->base + chip->ngpio - 1,
|
||||
chip->label ? : "generic");
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_add);
|
||||
@@ -1128,6 +1137,8 @@ int gpiochip_remove(struct gpio_chip *chip)
|
||||
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
|
||||
of_gpiochip_remove(chip);
|
||||
|
||||
for (id = chip->base; id < chip->base + chip->ngpio; id++) {
|
||||
if (test_bit(FLAG_REQUESTED, &gpio_desc[id].flags)) {
|
||||
status = -EBUSY;
|
||||
@@ -1148,6 +1159,38 @@ int gpiochip_remove(struct gpio_chip *chip)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_remove);
|
||||
|
||||
/**
|
||||
* gpiochip_find() - iterator for locating a specific gpio_chip
|
||||
* @data: data to pass to match function
|
||||
* @callback: Callback function to check gpio_chip
|
||||
*
|
||||
* Similar to bus_find_device. It returns a reference to a gpio_chip as
|
||||
* determined by a user supplied @match callback. The callback should return
|
||||
* 0 if the device doesn't match and non-zero if it does. If the callback is
|
||||
* non-zero, this function will return to the caller and not iterate over any
|
||||
* more gpio_chips.
|
||||
*/
|
||||
struct gpio_chip *gpiochip_find(void *data,
|
||||
int (*match)(struct gpio_chip *chip, void *data))
|
||||
{
|
||||
struct gpio_chip *chip = NULL;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
spin_lock_irqsave(&gpio_lock, flags);
|
||||
for (i = 0; i < ARCH_NR_GPIOS; i++) {
|
||||
if (!gpio_desc[i].chip)
|
||||
continue;
|
||||
|
||||
if (match(gpio_desc[i].chip, data)) {
|
||||
chip = gpio_desc[i].chip;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&gpio_lock, flags);
|
||||
|
||||
return chip;
|
||||
}
|
||||
|
||||
/* These "optional" allocation calls help prevent drivers from stomping
|
||||
* on each other, and help provide better diagnostics in debugfs.
|
||||
|
Reference in New Issue
Block a user