Lines Matching refs:chip
50 #define GPIO_OFFSET_VALID(chip, offset) (offset >= 0 && offset < chip->ngpio) argument
57 static void gpiochip_free_hogs(struct gpio_chip *chip);
71 struct gpio_chip *chip; in gpio_to_desc() local
76 list_for_each_entry(chip, &gpio_chips, list) { in gpio_to_desc()
77 if (chip->base <= gpio && chip->base + chip->ngpio > gpio) { in gpio_to_desc()
79 return &chip->desc[gpio - chip->base]; in gpio_to_desc()
95 struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, in gpiochip_get_desc() argument
98 if (hwnum >= chip->ngpio) in gpiochip_get_desc()
101 return &chip->desc[hwnum]; in gpiochip_get_desc()
111 return desc->chip->base + (desc - &desc->chip->desc[0]); in desc_to_gpio()
122 return desc ? desc->chip : NULL; in gpiod_to_chip()
129 struct gpio_chip *chip; in gpiochip_find_base() local
132 list_for_each_entry_reverse(chip, &gpio_chips, list) { in gpiochip_find_base()
134 if (chip->base + chip->ngpio <= base) in gpiochip_find_base()
138 base = chip->base - ngpio; in gpiochip_find_base()
160 struct gpio_chip *chip; in gpiod_get_direction() local
164 chip = gpiod_to_chip(desc); in gpiod_get_direction()
167 if (!chip->get_direction) in gpiod_get_direction()
170 status = chip->get_direction(chip, offset); in gpiod_get_direction()
191 static int gpiochip_add_to_list(struct gpio_chip *chip) in gpiochip_add_to_list() argument
201 if (_chip->base >= chip->base + chip->ngpio) in gpiochip_add_to_list()
208 if (_chip->base + _chip->ngpio > chip->base) { in gpiochip_add_to_list()
209 dev_err(chip->dev, in gpiochip_add_to_list()
216 list_add_tail(&chip->list, pos); in gpiochip_add_to_list()
238 int gpiochip_add(struct gpio_chip *chip) in gpiochip_add() argument
243 int base = chip->base; in gpiochip_add()
246 descs = kcalloc(chip->ngpio, sizeof(descs[0]), GFP_KERNEL); in gpiochip_add()
253 base = gpiochip_find_base(chip->ngpio); in gpiochip_add()
259 chip->base = base; in gpiochip_add()
262 status = gpiochip_add_to_list(chip); in gpiochip_add()
268 for (id = 0; id < chip->ngpio; id++) { in gpiochip_add()
271 desc->chip = chip; in gpiochip_add()
279 desc->flags = !chip->direction_input ? (1 << FLAG_IS_OUT) : 0; in gpiochip_add()
282 chip->desc = descs; in gpiochip_add()
287 INIT_LIST_HEAD(&chip->pin_ranges); in gpiochip_add()
290 of_gpiochip_add(chip); in gpiochip_add()
291 acpi_gpiochip_add(chip); in gpiochip_add()
293 status = gpiochip_export(chip); in gpiochip_add()
298 chip->base, chip->base + chip->ngpio - 1, in gpiochip_add()
299 chip->label ? : "generic"); in gpiochip_add()
304 acpi_gpiochip_remove(chip); in gpiochip_add()
305 gpiochip_free_hogs(chip); in gpiochip_add()
306 of_gpiochip_remove(chip); in gpiochip_add()
308 list_del(&chip->list); in gpiochip_add()
310 chip->desc = NULL; in gpiochip_add()
316 chip->base, chip->base + chip->ngpio - 1, in gpiochip_add()
317 chip->label ? : "generic"); in gpiochip_add()
328 void gpiochip_remove(struct gpio_chip *chip) in gpiochip_remove() argument
333 gpiochip_unexport(chip); in gpiochip_remove()
335 gpiochip_irqchip_remove(chip); in gpiochip_remove()
337 acpi_gpiochip_remove(chip); in gpiochip_remove()
338 gpiochip_remove_pin_ranges(chip); in gpiochip_remove()
339 gpiochip_free_hogs(chip); in gpiochip_remove()
340 of_gpiochip_remove(chip); in gpiochip_remove()
343 for (id = 0; id < chip->ngpio; id++) { in gpiochip_remove()
344 if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) in gpiochip_remove()
345 dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); in gpiochip_remove()
347 for (id = 0; id < chip->ngpio; id++) in gpiochip_remove()
348 chip->desc[id].chip = NULL; in gpiochip_remove()
350 list_del(&chip->list); in gpiochip_remove()
353 kfree(chip->desc); in gpiochip_remove()
354 chip->desc = NULL; in gpiochip_remove()
370 int (*match)(struct gpio_chip *chip, in gpiochip_find() argument
373 struct gpio_chip *chip; in gpiochip_find() local
377 list_for_each_entry(chip, &gpio_chips, list) in gpiochip_find()
378 if (chip && match(chip, data)) in gpiochip_find()
382 if (&chip->list == &gpio_chips) in gpiochip_find()
383 chip = NULL; in gpiochip_find()
386 return chip; in gpiochip_find()
390 static int gpiochip_match_name(struct gpio_chip *chip, void *data) in gpiochip_match_name() argument
394 return !strcmp(chip->label, name); in gpiochip_match_name()
472 struct gpio_chip *chip = d->host_data; in gpiochip_irq_map() local
474 irq_set_chip_data(irq, chip); in gpiochip_irq_map()
476 irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); in gpiochip_irq_map()
478 if (chip->can_sleep && !chip->irq_not_threaded) in gpiochip_irq_map()
489 if (chip->irq_default_type != IRQ_TYPE_NONE) in gpiochip_irq_map()
490 irq_set_irq_type(irq, chip->irq_default_type); in gpiochip_irq_map()
497 struct gpio_chip *chip = d->host_data; in gpiochip_irq_unmap() local
502 if (chip->can_sleep) in gpiochip_irq_unmap()
517 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in gpiochip_irq_reqres() local
519 if (gpiochip_lock_as_irq(chip, d->hwirq)) { in gpiochip_irq_reqres()
520 chip_err(chip, in gpiochip_irq_reqres()
530 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in gpiochip_irq_relres() local
532 gpiochip_unlock_as_irq(chip, d->hwirq); in gpiochip_irq_relres()
535 static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) in gpiochip_to_irq() argument
537 return irq_find_mapping(chip->irqdomain, offset); in gpiochip_to_irq()
667 int gpiochip_add_pingroup_range(struct gpio_chip *chip, in gpiochip_add_pingroup_range() argument
676 chip_err(chip, "failed to allocate pin ranges\n"); in gpiochip_add_pingroup_range()
682 pin_range->range.gc = chip; in gpiochip_add_pingroup_range()
683 pin_range->range.name = chip->label; in gpiochip_add_pingroup_range()
684 pin_range->range.base = chip->base + gpio_offset; in gpiochip_add_pingroup_range()
697 chip_dbg(chip, "created GPIO range %d->%d ==> %s PINGRP %s\n", in gpiochip_add_pingroup_range()
701 list_add_tail(&pin_range->node, &chip->pin_ranges); in gpiochip_add_pingroup_range()
716 int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, in gpiochip_add_pin_range() argument
725 chip_err(chip, "failed to allocate pin ranges\n"); in gpiochip_add_pin_range()
731 pin_range->range.gc = chip; in gpiochip_add_pin_range()
732 pin_range->range.name = chip->label; in gpiochip_add_pin_range()
733 pin_range->range.base = chip->base + gpio_offset; in gpiochip_add_pin_range()
740 chip_err(chip, "could not create pin range\n"); in gpiochip_add_pin_range()
744 chip_dbg(chip, "created GPIO range %d->%d ==> %s PIN %d->%d\n", in gpiochip_add_pin_range()
749 list_add_tail(&pin_range->node, &chip->pin_ranges); in gpiochip_add_pin_range()
759 void gpiochip_remove_pin_ranges(struct gpio_chip *chip) in gpiochip_remove_pin_ranges() argument
763 list_for_each_entry_safe(pin_range, tmp, &chip->pin_ranges, node) { in gpiochip_remove_pin_ranges()
780 struct gpio_chip *chip = desc->chip; in __gpiod_request() local
798 if (chip->request) { in __gpiod_request()
801 status = chip->request(chip, gpio_chip_hwgpio(desc)); in __gpiod_request()
810 if (chip->get_direction) { in __gpiod_request()
824 struct gpio_chip *chip; in gpiod_request() local
831 chip = desc->chip; in gpiod_request()
832 if (!chip) in gpiod_request()
835 if (try_module_get(chip->owner)) { in gpiod_request()
838 module_put(chip->owner); in gpiod_request()
852 struct gpio_chip *chip; in __gpiod_free() local
860 chip = desc->chip; in __gpiod_free()
861 if (chip && test_bit(FLAG_REQUESTED, &desc->flags)) { in __gpiod_free()
862 if (chip->free) { in __gpiod_free()
864 might_sleep_if(chip->can_sleep); in __gpiod_free()
865 chip->free(chip, gpio_chip_hwgpio(desc)); in __gpiod_free()
884 module_put(desc->chip->owner); in gpiod_free()
902 const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset) in gpiochip_is_requested() argument
906 if (!GPIO_OFFSET_VALID(chip, offset)) in gpiochip_is_requested()
909 desc = &chip->desc[offset]; in gpiochip_is_requested()
928 struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum, in gpiochip_request_own_desc() argument
931 struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum); in gpiochip_request_own_desc()
935 chip_err(chip, "failed to get GPIO descriptor\n"); in gpiochip_request_own_desc()
981 struct gpio_chip *chip; in gpiod_direction_input() local
984 if (!desc || !desc->chip) { in gpiod_direction_input()
989 chip = desc->chip; in gpiod_direction_input()
990 if (!chip->get || !chip->direction_input) { in gpiod_direction_input()
997 status = chip->direction_input(chip, gpio_chip_hwgpio(desc)); in gpiod_direction_input()
1009 struct gpio_chip *chip; in _gpiod_direction_output_raw() local
1028 chip = desc->chip; in _gpiod_direction_output_raw()
1029 if (!chip->set || !chip->direction_output) { in _gpiod_direction_output_raw()
1036 status = chip->direction_output(chip, gpio_chip_hwgpio(desc), value); in _gpiod_direction_output_raw()
1057 if (!desc || !desc->chip) { in gpiod_direction_output_raw()
1079 if (!desc || !desc->chip) { in gpiod_direction_output()
1099 struct gpio_chip *chip; in gpiod_set_debounce() local
1101 if (!desc || !desc->chip) { in gpiod_set_debounce()
1106 chip = desc->chip; in gpiod_set_debounce()
1107 if (!chip->set || !chip->set_debounce) { in gpiod_set_debounce()
1114 return chip->set_debounce(chip, gpio_chip_hwgpio(desc), debounce); in gpiod_set_debounce()
1154 struct gpio_chip *chip; in _gpiod_get_raw_value() local
1158 chip = desc->chip; in _gpiod_get_raw_value()
1160 value = chip->get ? chip->get(chip, offset) : false; in _gpiod_get_raw_value()
1180 WARN_ON(desc->chip->can_sleep); in gpiod_get_raw_value()
1201 WARN_ON(desc->chip->can_sleep); in gpiod_get_value()
1219 struct gpio_chip *chip = desc->chip; in _gpio_set_open_drain_value() local
1223 err = chip->direction_input(chip, offset); in _gpio_set_open_drain_value()
1227 err = chip->direction_output(chip, offset, 0); in _gpio_set_open_drain_value()
1246 struct gpio_chip *chip = desc->chip; in _gpio_set_open_source_value() local
1250 err = chip->direction_output(chip, offset, 1); in _gpio_set_open_source_value()
1254 err = chip->direction_input(chip, offset); in _gpio_set_open_source_value()
1267 struct gpio_chip *chip; in _gpiod_set_raw_value() local
1269 chip = desc->chip; in _gpiod_set_raw_value()
1276 chip->set(chip, gpio_chip_hwgpio(desc), value); in _gpiod_set_raw_value()
1288 static void gpio_chip_set_multiple(struct gpio_chip *chip, in gpio_chip_set_multiple() argument
1291 if (chip->set_multiple) { in gpio_chip_set_multiple()
1292 chip->set_multiple(chip, mask, bits); in gpio_chip_set_multiple()
1295 for (i = 0; i < chip->ngpio; i++) { in gpio_chip_set_multiple()
1304 chip->set(chip, i, test_bit(i, bits)); in gpio_chip_set_multiple()
1318 struct gpio_chip *chip = desc_array[i]->chip; in gpiod_set_array_priv() local
1319 unsigned long mask[BITS_TO_LONGS(chip->ngpio)]; in gpiod_set_array_priv()
1320 unsigned long bits[BITS_TO_LONGS(chip->ngpio)]; in gpiod_set_array_priv()
1324 WARN_ON(chip->can_sleep); in gpiod_set_array_priv()
1353 } while ((i < array_size) && (desc_array[i]->chip == chip)); in gpiod_set_array_priv()
1356 gpio_chip_set_multiple(chip, mask, bits); in gpiod_set_array_priv()
1377 WARN_ON(desc->chip->can_sleep); in gpiod_set_raw_value()
1398 WARN_ON(desc->chip->can_sleep); in gpiod_set_value()
1456 return desc->chip->can_sleep; in gpiod_cansleep()
1469 struct gpio_chip *chip; in gpiod_to_irq() local
1474 chip = desc->chip; in gpiod_to_irq()
1476 return chip->to_irq ? chip->to_irq(chip, offset) : -ENXIO; in gpiod_to_irq()
1488 int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset) in gpiochip_lock_as_irq() argument
1490 if (offset >= chip->ngpio) in gpiochip_lock_as_irq()
1493 if (test_bit(FLAG_IS_OUT, &chip->desc[offset].flags)) { in gpiochip_lock_as_irq()
1494 chip_err(chip, in gpiochip_lock_as_irq()
1500 set_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); in gpiochip_lock_as_irq()
1513 void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) in gpiochip_unlock_as_irq() argument
1515 if (offset >= chip->ngpio) in gpiochip_unlock_as_irq()
1518 clear_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); in gpiochip_unlock_as_irq()
1777 struct gpio_chip *chip; in gpiod_find() local
1787 chip = find_chip_by_name(p->chip_label); in gpiod_find()
1789 if (!chip) { in gpiod_find()
1795 if (chip->ngpio <= p->chip_hwnum) { in gpiod_find()
1798 idx, chip->ngpio, chip->label); in gpiod_find()
1802 desc = gpiochip_get_desc(chip, p->chip_hwnum); in gpiod_find()
2111 struct gpio_chip *chip; in gpiod_hog() local
2116 chip = gpiod_to_chip(desc); in gpiod_hog()
2119 local_desc = gpiochip_request_own_desc(chip, hwnum, name); in gpiod_hog()
2150 static void gpiochip_free_hogs(struct gpio_chip *chip) in gpiochip_free_hogs() argument
2154 for (id = 0; id < chip->ngpio; id++) { in gpiochip_free_hogs()
2155 if (test_bit(FLAG_IS_HOGGED, &chip->desc[id].flags)) in gpiochip_free_hogs()
2156 gpiochip_free_own_desc(&chip->desc[id]); in gpiochip_free_hogs()
2255 static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) in gpiolib_dbg_show() argument
2258 unsigned gpio = chip->base; in gpiolib_dbg_show()
2259 struct gpio_desc *gdesc = &chip->desc[0]; in gpiolib_dbg_show()
2263 for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) { in gpiolib_dbg_show()
2273 chip->get in gpiolib_dbg_show()
2274 ? (chip->get(chip, i) ? "hi" : "lo") in gpiolib_dbg_show()
2284 struct gpio_chip *chip = NULL; in gpiolib_seq_start() local
2290 list_for_each_entry(chip, &gpio_chips, list) in gpiolib_seq_start()
2293 return chip; in gpiolib_seq_start()
2303 struct gpio_chip *chip = v; in gpiolib_seq_next() local
2307 if (list_is_last(&chip->list, &gpio_chips)) in gpiolib_seq_next()
2310 ret = list_entry(chip->list.next, struct gpio_chip, list); in gpiolib_seq_next()
2325 struct gpio_chip *chip = v; in gpiolib_seq_show() local
2329 chip->base, chip->base + chip->ngpio - 1); in gpiolib_seq_show()
2330 dev = chip->dev; in gpiolib_seq_show()
2334 if (chip->label) in gpiolib_seq_show()
2335 seq_printf(s, ", %s", chip->label); in gpiolib_seq_show()
2336 if (chip->can_sleep) in gpiolib_seq_show()
2340 if (chip->dbg_show) in gpiolib_seq_show()
2341 chip->dbg_show(s, chip); in gpiolib_seq_show()
2343 gpiolib_dbg_show(s, chip); in gpiolib_seq_show()