diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-05 18:57:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-05 18:57:35 -0400 |
commit | 03c0c29aff7e56b722eb6c47eace222b140d0377 (patch) | |
tree | 47267a19b523159cf36a050ef3c35f4dbdb33016 /drivers/gpio | |
parent | c60c6a96b7bb0f1f8bb635fdfcf5b592aaf062b4 (diff) | |
parent | 7fb8f881c54beb05dd4d2c947dada1c636581d87 (diff) |
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.
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpiolib.c | 55 | ||||
-rw-r--r-- | drivers/gpio/xilinx_gpio.c | 15 |
2 files changed, 55 insertions, 15 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 4e51fe3c1fc..6a6bd569e1f 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/debugfs.h> | 8 | #include <linux/debugfs.h> |
9 | #include <linux/seq_file.h> | 9 | #include <linux/seq_file.h> |
10 | #include <linux/gpio.h> | 10 | #include <linux/gpio.h> |
11 | #include <linux/of_gpio.h> | ||
11 | #include <linux/idr.h> | 12 | #include <linux/idr.h> |
12 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
13 | 14 | ||
@@ -1100,16 +1101,24 @@ int gpiochip_add(struct gpio_chip *chip) | |||
1100 | } | 1101 | } |
1101 | } | 1102 | } |
1102 | 1103 | ||
1104 | of_gpiochip_add(chip); | ||
1105 | |||
1103 | unlock: | 1106 | unlock: |
1104 | spin_unlock_irqrestore(&gpio_lock, flags); | 1107 | spin_unlock_irqrestore(&gpio_lock, flags); |
1105 | if (status == 0) | 1108 | |
1106 | status = gpiochip_export(chip); | 1109 | if (status) |
1110 | goto fail; | ||
1111 | |||
1112 | status = gpiochip_export(chip); | ||
1113 | if (status) | ||
1114 | goto fail; | ||
1115 | |||
1116 | return 0; | ||
1107 | fail: | 1117 | fail: |
1108 | /* failures here can mean systems won't boot... */ | 1118 | /* failures here can mean systems won't boot... */ |
1109 | if (status) | 1119 | pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n", |
1110 | pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n", | 1120 | chip->base, chip->base + chip->ngpio - 1, |
1111 | chip->base, chip->base + chip->ngpio - 1, | 1121 | chip->label ? : "generic"); |
1112 | chip->label ? : "generic"); | ||
1113 | return status; | 1122 | return status; |
1114 | } | 1123 | } |
1115 | EXPORT_SYMBOL_GPL(gpiochip_add); | 1124 | EXPORT_SYMBOL_GPL(gpiochip_add); |
@@ -1128,6 +1137,8 @@ int gpiochip_remove(struct gpio_chip *chip) | |||
1128 | 1137 | ||
1129 | spin_lock_irqsave(&gpio_lock, flags); | 1138 | spin_lock_irqsave(&gpio_lock, flags); |
1130 | 1139 | ||
1140 | of_gpiochip_remove(chip); | ||
1141 | |||
1131 | for (id = chip->base; id < chip->base + chip->ngpio; id++) { | 1142 | for (id = chip->base; id < chip->base + chip->ngpio; id++) { |
1132 | if (test_bit(FLAG_REQUESTED, &gpio_desc[id].flags)) { | 1143 | if (test_bit(FLAG_REQUESTED, &gpio_desc[id].flags)) { |
1133 | status = -EBUSY; | 1144 | status = -EBUSY; |
@@ -1148,6 +1159,38 @@ int gpiochip_remove(struct gpio_chip *chip) | |||
1148 | } | 1159 | } |
1149 | EXPORT_SYMBOL_GPL(gpiochip_remove); | 1160 | EXPORT_SYMBOL_GPL(gpiochip_remove); |
1150 | 1161 | ||
1162 | /** | ||
1163 | * gpiochip_find() - iterator for locating a specific gpio_chip | ||
1164 | * @data: data to pass to match function | ||
1165 | * @callback: Callback function to check gpio_chip | ||
1166 | * | ||
1167 | * Similar to bus_find_device. It returns a reference to a gpio_chip as | ||
1168 | * determined by a user supplied @match callback. The callback should return | ||
1169 | * 0 if the device doesn't match and non-zero if it does. If the callback is | ||
1170 | * non-zero, this function will return to the caller and not iterate over any | ||
1171 | * more gpio_chips. | ||
1172 | */ | ||
1173 | struct gpio_chip *gpiochip_find(void *data, | ||
1174 | int (*match)(struct gpio_chip *chip, void *data)) | ||
1175 | { | ||
1176 | struct gpio_chip *chip = NULL; | ||
1177 | unsigned long flags; | ||
1178 | int i; | ||
1179 | |||
1180 | spin_lock_irqsave(&gpio_lock, flags); | ||
1181 | for (i = 0; i < ARCH_NR_GPIOS; i++) { | ||
1182 | if (!gpio_desc[i].chip) | ||
1183 | continue; | ||
1184 | |||
1185 | if (match(gpio_desc[i].chip, data)) { | ||
1186 | chip = gpio_desc[i].chip; | ||
1187 | break; | ||
1188 | } | ||
1189 | } | ||
1190 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
1191 | |||
1192 | return chip; | ||
1193 | } | ||
1151 | 1194 | ||
1152 | /* These "optional" allocation calls help prevent drivers from stomping | 1195 | /* These "optional" allocation calls help prevent drivers from stomping |
1153 | * on each other, and help provide better diagnostics in debugfs. | 1196 | * on each other, and help provide better diagnostics in debugfs. |
diff --git a/drivers/gpio/xilinx_gpio.c b/drivers/gpio/xilinx_gpio.c index b8fa65b5bfc..709690995d0 100644 --- a/drivers/gpio/xilinx_gpio.c +++ b/drivers/gpio/xilinx_gpio.c | |||
@@ -161,14 +161,12 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc) | |||
161 | static int __devinit xgpio_of_probe(struct device_node *np) | 161 | static int __devinit xgpio_of_probe(struct device_node *np) |
162 | { | 162 | { |
163 | struct xgpio_instance *chip; | 163 | struct xgpio_instance *chip; |
164 | struct of_gpio_chip *ofchip; | ||
165 | int status = 0; | 164 | int status = 0; |
166 | const u32 *tree_info; | 165 | const u32 *tree_info; |
167 | 166 | ||
168 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); | 167 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); |
169 | if (!chip) | 168 | if (!chip) |
170 | return -ENOMEM; | 169 | return -ENOMEM; |
171 | ofchip = &chip->mmchip.of_gc; | ||
172 | 170 | ||
173 | /* Update GPIO state shadow register with default value */ | 171 | /* Update GPIO state shadow register with default value */ |
174 | tree_info = of_get_property(np, "xlnx,dout-default", NULL); | 172 | tree_info = of_get_property(np, "xlnx,dout-default", NULL); |
@@ -182,21 +180,20 @@ static int __devinit xgpio_of_probe(struct device_node *np) | |||
182 | chip->gpio_dir = *tree_info; | 180 | chip->gpio_dir = *tree_info; |
183 | 181 | ||
184 | /* Check device node and parent device node for device width */ | 182 | /* Check device node and parent device node for device width */ |
185 | ofchip->gc.ngpio = 32; /* By default assume full GPIO controller */ | 183 | chip->mmchip.gc.ngpio = 32; /* By default assume full GPIO controller */ |
186 | tree_info = of_get_property(np, "xlnx,gpio-width", NULL); | 184 | tree_info = of_get_property(np, "xlnx,gpio-width", NULL); |
187 | if (!tree_info) | 185 | if (!tree_info) |
188 | tree_info = of_get_property(np->parent, | 186 | tree_info = of_get_property(np->parent, |
189 | "xlnx,gpio-width", NULL); | 187 | "xlnx,gpio-width", NULL); |
190 | if (tree_info) | 188 | if (tree_info) |
191 | ofchip->gc.ngpio = *tree_info; | 189 | chip->mmchip.gc.ngpio = *tree_info; |
192 | 190 | ||
193 | spin_lock_init(&chip->gpio_lock); | 191 | spin_lock_init(&chip->gpio_lock); |
194 | 192 | ||
195 | ofchip->gpio_cells = 2; | 193 | chip->mmchip.gc.direction_input = xgpio_dir_in; |
196 | ofchip->gc.direction_input = xgpio_dir_in; | 194 | chip->mmchip.gc.direction_output = xgpio_dir_out; |
197 | ofchip->gc.direction_output = xgpio_dir_out; | 195 | chip->mmchip.gc.get = xgpio_get; |
198 | ofchip->gc.get = xgpio_get; | 196 | chip->mmchip.gc.set = xgpio_set; |
199 | ofchip->gc.set = xgpio_set; | ||
200 | 197 | ||
201 | chip->mmchip.save_regs = xgpio_save_regs; | 198 | chip->mmchip.save_regs = xgpio_save_regs; |
202 | 199 | ||