Lines Matching refs:chip

56 static void gpiochip_free_hogs(struct gpio_chip *chip);
70 struct gpio_chip *chip; in gpio_to_desc() local
75 list_for_each_entry(chip, &gpio_chips, list) { in gpio_to_desc()
76 if (chip->base <= gpio && chip->base + chip->ngpio > gpio) { in gpio_to_desc()
78 return &chip->desc[gpio - chip->base]; in gpio_to_desc()
94 struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, in gpiochip_get_desc() argument
97 if (hwnum >= chip->ngpio) in gpiochip_get_desc()
100 return &chip->desc[hwnum]; in gpiochip_get_desc()
110 return desc->chip->base + (desc - &desc->chip->desc[0]); in desc_to_gpio()
121 return desc ? desc->chip : NULL; in gpiod_to_chip()
128 struct gpio_chip *chip; in gpiochip_find_base() local
131 list_for_each_entry_reverse(chip, &gpio_chips, list) { in gpiochip_find_base()
133 if (chip->base + chip->ngpio <= base) in gpiochip_find_base()
137 base = chip->base - ngpio; in gpiochip_find_base()
159 struct gpio_chip *chip; in gpiod_get_direction() local
163 chip = gpiod_to_chip(desc); in gpiod_get_direction()
166 if (!chip->get_direction) in gpiod_get_direction()
169 status = chip->get_direction(chip, offset); in gpiod_get_direction()
190 static int gpiochip_add_to_list(struct gpio_chip *chip) in gpiochip_add_to_list() argument
200 if (_chip->base >= chip->base + chip->ngpio) in gpiochip_add_to_list()
207 if (_chip->base + _chip->ngpio > chip->base) { in gpiochip_add_to_list()
208 dev_err(chip->dev, in gpiochip_add_to_list()
215 list_add_tail(&chip->list, pos); in gpiochip_add_to_list()
225 struct gpio_chip *chip; in gpio_name_to_desc() local
230 list_for_each_entry(chip, &gpio_chips, list) { in gpio_name_to_desc()
233 for (i = 0; i != chip->ngpio; ++i) { in gpio_name_to_desc()
234 struct gpio_desc *gpio = &chip->desc[i]; in gpio_name_to_desc()
299 int gpiochip_add(struct gpio_chip *chip) in gpiochip_add() argument
304 int base = chip->base; in gpiochip_add()
307 descs = kcalloc(chip->ngpio, sizeof(descs[0]), GFP_KERNEL); in gpiochip_add()
314 base = gpiochip_find_base(chip->ngpio); in gpiochip_add()
320 chip->base = base; in gpiochip_add()
323 status = gpiochip_add_to_list(chip); in gpiochip_add()
329 for (id = 0; id < chip->ngpio; id++) { in gpiochip_add()
332 desc->chip = chip; in gpiochip_add()
340 desc->flags = !chip->direction_input ? (1 << FLAG_IS_OUT) : 0; in gpiochip_add()
343 chip->desc = descs; in gpiochip_add()
348 INIT_LIST_HEAD(&chip->pin_ranges); in gpiochip_add()
351 if (!chip->owner && chip->dev && chip->dev->driver) in gpiochip_add()
352 chip->owner = chip->dev->driver->owner; in gpiochip_add()
354 status = gpiochip_set_desc_names(chip); in gpiochip_add()
358 status = of_gpiochip_add(chip); in gpiochip_add()
362 acpi_gpiochip_add(chip); in gpiochip_add()
364 status = gpiochip_sysfs_register(chip); in gpiochip_add()
369 chip->base, chip->base + chip->ngpio - 1, in gpiochip_add()
370 chip->label ? : "generic"); in gpiochip_add()
375 acpi_gpiochip_remove(chip); in gpiochip_add()
376 gpiochip_free_hogs(chip); in gpiochip_add()
377 of_gpiochip_remove(chip); in gpiochip_add()
380 list_del(&chip->list); in gpiochip_add()
382 chip->desc = NULL; in gpiochip_add()
388 chip->base, chip->base + chip->ngpio - 1, in gpiochip_add()
389 chip->label ? : "generic"); in gpiochip_add()
400 void gpiochip_remove(struct gpio_chip *chip) in gpiochip_remove() argument
407 gpiochip_sysfs_unregister(chip); in gpiochip_remove()
409 gpiochip_irqchip_remove(chip); in gpiochip_remove()
411 acpi_gpiochip_remove(chip); in gpiochip_remove()
412 gpiochip_remove_pin_ranges(chip); in gpiochip_remove()
413 gpiochip_free_hogs(chip); in gpiochip_remove()
414 of_gpiochip_remove(chip); in gpiochip_remove()
417 for (id = 0; id < chip->ngpio; id++) { in gpiochip_remove()
418 desc = &chip->desc[id]; in gpiochip_remove()
419 desc->chip = NULL; in gpiochip_remove()
423 list_del(&chip->list); in gpiochip_remove()
427 dev_crit(chip->dev, "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n"); in gpiochip_remove()
429 kfree(chip->desc); in gpiochip_remove()
430 chip->desc = NULL; in gpiochip_remove()
446 int (*match)(struct gpio_chip *chip, in gpiochip_find() argument
449 struct gpio_chip *chip; in gpiochip_find() local
453 list_for_each_entry(chip, &gpio_chips, list) in gpiochip_find()
454 if (match(chip, data)) in gpiochip_find()
458 if (&chip->list == &gpio_chips) in gpiochip_find()
459 chip = NULL; in gpiochip_find()
462 return chip; in gpiochip_find()
466 static int gpiochip_match_name(struct gpio_chip *chip, void *data) in gpiochip_match_name() argument
470 return !strcmp(chip->label, name); in gpiochip_match_name()
544 struct gpio_chip *chip = d->host_data; in gpiochip_irq_map() local
546 irq_set_chip_data(irq, chip); in gpiochip_irq_map()
551 irq_set_lockdep_class(irq, chip->lock_key); in gpiochip_irq_map()
552 irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); in gpiochip_irq_map()
554 if (chip->can_sleep && !chip->irq_not_threaded) in gpiochip_irq_map()
562 if (chip->irq_default_type != IRQ_TYPE_NONE) in gpiochip_irq_map()
563 irq_set_irq_type(irq, chip->irq_default_type); in gpiochip_irq_map()
570 struct gpio_chip *chip = d->host_data; in gpiochip_irq_unmap() local
572 if (chip->can_sleep) in gpiochip_irq_unmap()
587 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in gpiochip_irq_reqres() local
589 if (!try_module_get(chip->owner)) in gpiochip_irq_reqres()
592 if (gpiochip_lock_as_irq(chip, d->hwirq)) { in gpiochip_irq_reqres()
593 chip_err(chip, in gpiochip_irq_reqres()
596 module_put(chip->owner); in gpiochip_irq_reqres()
604 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); in gpiochip_irq_relres() local
606 gpiochip_unlock_as_irq(chip, d->hwirq); in gpiochip_irq_relres()
607 module_put(chip->owner); in gpiochip_irq_relres()
610 static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) in gpiochip_to_irq() argument
612 return irq_find_mapping(chip->irqdomain, offset); in gpiochip_to_irq()
754 int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset) in gpiochip_generic_request() argument
756 return pinctrl_request_gpio(chip->base + offset); in gpiochip_generic_request()
765 void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset) in gpiochip_generic_free() argument
767 pinctrl_free_gpio(chip->base + offset); in gpiochip_generic_free()
780 int gpiochip_add_pingroup_range(struct gpio_chip *chip, in gpiochip_add_pingroup_range() argument
789 chip_err(chip, "failed to allocate pin ranges\n"); in gpiochip_add_pingroup_range()
795 pin_range->range.gc = chip; in gpiochip_add_pingroup_range()
796 pin_range->range.name = chip->label; in gpiochip_add_pingroup_range()
797 pin_range->range.base = chip->base + gpio_offset; in gpiochip_add_pingroup_range()
810 chip_dbg(chip, "created GPIO range %d->%d ==> %s PINGRP %s\n", in gpiochip_add_pingroup_range()
814 list_add_tail(&pin_range->node, &chip->pin_ranges); in gpiochip_add_pingroup_range()
829 int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, in gpiochip_add_pin_range() argument
838 chip_err(chip, "failed to allocate pin ranges\n"); in gpiochip_add_pin_range()
844 pin_range->range.gc = chip; in gpiochip_add_pin_range()
845 pin_range->range.name = chip->label; in gpiochip_add_pin_range()
846 pin_range->range.base = chip->base + gpio_offset; in gpiochip_add_pin_range()
853 chip_err(chip, "could not create pin range\n"); in gpiochip_add_pin_range()
857 chip_dbg(chip, "created GPIO range %d->%d ==> %s PIN %d->%d\n", in gpiochip_add_pin_range()
862 list_add_tail(&pin_range->node, &chip->pin_ranges); in gpiochip_add_pin_range()
872 void gpiochip_remove_pin_ranges(struct gpio_chip *chip) in gpiochip_remove_pin_ranges() argument
876 list_for_each_entry_safe(pin_range, tmp, &chip->pin_ranges, node) { in gpiochip_remove_pin_ranges()
893 struct gpio_chip *chip = desc->chip; in __gpiod_request() local
911 if (chip->request) { in __gpiod_request()
914 status = chip->request(chip, gpio_chip_hwgpio(desc)); in __gpiod_request()
923 if (chip->get_direction) { in __gpiod_request()
945 struct gpio_chip *chip; in gpiod_request() local
952 chip = desc->chip; in gpiod_request()
953 if (!chip) in gpiod_request()
956 if (try_module_get(chip->owner)) { in gpiod_request()
959 module_put(chip->owner); in gpiod_request()
973 struct gpio_chip *chip; in __gpiod_free() local
981 chip = desc->chip; in __gpiod_free()
982 if (chip && test_bit(FLAG_REQUESTED, &desc->flags)) { in __gpiod_free()
983 if (chip->free) { in __gpiod_free()
985 might_sleep_if(chip->can_sleep); in __gpiod_free()
986 chip->free(chip, gpio_chip_hwgpio(desc)); in __gpiod_free()
1005 module_put(desc->chip->owner); in gpiod_free()
1023 const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset) in gpiochip_is_requested() argument
1027 if (offset >= chip->ngpio) in gpiochip_is_requested()
1030 desc = &chip->desc[offset]; in gpiochip_is_requested()
1049 struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum, in gpiochip_request_own_desc() argument
1052 struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum); in gpiochip_request_own_desc()
1056 chip_err(chip, "failed to get GPIO descriptor\n"); in gpiochip_request_own_desc()
1102 struct gpio_chip *chip; in gpiod_direction_input() local
1105 if (!desc || !desc->chip) { in gpiod_direction_input()
1110 chip = desc->chip; in gpiod_direction_input()
1111 if (!chip->get || !chip->direction_input) { in gpiod_direction_input()
1118 status = chip->direction_input(chip, gpio_chip_hwgpio(desc)); in gpiod_direction_input()
1130 struct gpio_chip *chip; in _gpiod_direction_output_raw() local
1149 chip = desc->chip; in _gpiod_direction_output_raw()
1150 if (!chip->set || !chip->direction_output) { in _gpiod_direction_output_raw()
1157 status = chip->direction_output(chip, gpio_chip_hwgpio(desc), value); in _gpiod_direction_output_raw()
1178 if (!desc || !desc->chip) { in gpiod_direction_output_raw()
1200 if (!desc || !desc->chip) { in gpiod_direction_output()
1220 struct gpio_chip *chip; in gpiod_set_debounce() local
1222 if (!desc || !desc->chip) { in gpiod_set_debounce()
1227 chip = desc->chip; in gpiod_set_debounce()
1228 if (!chip->set || !chip->set_debounce) { in gpiod_set_debounce()
1235 return chip->set_debounce(chip, gpio_chip_hwgpio(desc), debounce); in gpiod_set_debounce()
1275 struct gpio_chip *chip; in _gpiod_get_raw_value() local
1279 chip = desc->chip; in _gpiod_get_raw_value()
1281 value = chip->get ? chip->get(chip, offset) : -EIO; in _gpiod_get_raw_value()
1308 WARN_ON(desc->chip->can_sleep); in gpiod_get_raw_value()
1329 WARN_ON(desc->chip->can_sleep); in gpiod_get_value()
1350 struct gpio_chip *chip = desc->chip; in _gpio_set_open_drain_value() local
1354 err = chip->direction_input(chip, offset); in _gpio_set_open_drain_value()
1358 err = chip->direction_output(chip, offset, 0); in _gpio_set_open_drain_value()
1377 struct gpio_chip *chip = desc->chip; in _gpio_set_open_source_value() local
1381 err = chip->direction_output(chip, offset, 1); in _gpio_set_open_source_value()
1385 err = chip->direction_input(chip, offset); in _gpio_set_open_source_value()
1398 struct gpio_chip *chip; in _gpiod_set_raw_value() local
1400 chip = desc->chip; in _gpiod_set_raw_value()
1407 chip->set(chip, gpio_chip_hwgpio(desc), value); in _gpiod_set_raw_value()
1419 static void gpio_chip_set_multiple(struct gpio_chip *chip, in gpio_chip_set_multiple() argument
1422 if (chip->set_multiple) { in gpio_chip_set_multiple()
1423 chip->set_multiple(chip, mask, bits); in gpio_chip_set_multiple()
1426 for (i = 0; i < chip->ngpio; i++) { in gpio_chip_set_multiple()
1435 chip->set(chip, i, test_bit(i, bits)); in gpio_chip_set_multiple()
1448 struct gpio_chip *chip = desc_array[i]->chip; in gpiod_set_array_value_priv() local
1449 unsigned long mask[BITS_TO_LONGS(chip->ngpio)]; in gpiod_set_array_value_priv()
1450 unsigned long bits[BITS_TO_LONGS(chip->ngpio)]; in gpiod_set_array_value_priv()
1454 WARN_ON(chip->can_sleep); in gpiod_set_array_value_priv()
1482 } while ((i < array_size) && (desc_array[i]->chip == chip)); in gpiod_set_array_value_priv()
1485 gpio_chip_set_multiple(chip, mask, bits); in gpiod_set_array_value_priv()
1505 WARN_ON(desc->chip->can_sleep); in gpiod_set_raw_value()
1526 WARN_ON(desc->chip->can_sleep); in gpiod_set_value()
1586 return desc->chip->can_sleep; in gpiod_cansleep()
1599 struct gpio_chip *chip; in gpiod_to_irq() local
1604 chip = desc->chip; in gpiod_to_irq()
1606 return chip->to_irq ? chip->to_irq(chip, offset) : -ENXIO; in gpiod_to_irq()
1618 int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset) in gpiochip_lock_as_irq() argument
1620 if (offset >= chip->ngpio) in gpiochip_lock_as_irq()
1623 if (test_bit(FLAG_IS_OUT, &chip->desc[offset].flags)) { in gpiochip_lock_as_irq()
1624 chip_err(chip, in gpiochip_lock_as_irq()
1630 set_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); in gpiochip_lock_as_irq()
1643 void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) in gpiochip_unlock_as_irq() argument
1645 if (offset >= chip->ngpio) in gpiochip_unlock_as_irq()
1648 clear_bit(FLAG_USED_AS_IRQ, &chip->desc[offset].flags); in gpiochip_unlock_as_irq()
1932 struct gpio_chip *chip; in gpiod_find() local
1942 chip = find_chip_by_name(p->chip_label); in gpiod_find()
1944 if (!chip) { in gpiod_find()
1950 if (chip->ngpio <= p->chip_hwnum) { in gpiod_find()
1953 idx, chip->ngpio, chip->label); in gpiod_find()
1957 desc = gpiochip_get_desc(chip, p->chip_hwnum); in gpiod_find()
2284 struct gpio_chip *chip; in gpiod_hog() local
2289 chip = gpiod_to_chip(desc); in gpiod_hog()
2294 local_desc = gpiochip_request_own_desc(chip, hwnum, name); in gpiod_hog()
2297 name, chip->label, hwnum); in gpiod_hog()
2304 name, chip->label, hwnum); in gpiod_hog()
2327 static void gpiochip_free_hogs(struct gpio_chip *chip) in gpiochip_free_hogs() argument
2331 for (id = 0; id < chip->ngpio; id++) { in gpiochip_free_hogs()
2332 if (test_bit(FLAG_IS_HOGGED, &chip->desc[id].flags)) in gpiochip_free_hogs()
2333 gpiochip_free_own_desc(&chip->desc[id]); in gpiochip_free_hogs()
2432 static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) in gpiolib_dbg_show() argument
2435 unsigned gpio = chip->base; in gpiolib_dbg_show()
2436 struct gpio_desc *gdesc = &chip->desc[0]; in gpiolib_dbg_show()
2440 for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) { in gpiolib_dbg_show()
2455 chip->get in gpiolib_dbg_show()
2456 ? (chip->get(chip, i) ? "hi" : "lo") in gpiolib_dbg_show()
2466 struct gpio_chip *chip = NULL; in gpiolib_seq_start() local
2472 list_for_each_entry(chip, &gpio_chips, list) in gpiolib_seq_start()
2475 return chip; in gpiolib_seq_start()
2485 struct gpio_chip *chip = v; in gpiolib_seq_next() local
2489 if (list_is_last(&chip->list, &gpio_chips)) in gpiolib_seq_next()
2492 ret = list_entry(chip->list.next, struct gpio_chip, list); in gpiolib_seq_next()
2507 struct gpio_chip *chip = v; in gpiolib_seq_show() local
2511 chip->base, chip->base + chip->ngpio - 1); in gpiolib_seq_show()
2512 dev = chip->dev; in gpiolib_seq_show()
2516 if (chip->label) in gpiolib_seq_show()
2517 seq_printf(s, ", %s", chip->label); in gpiolib_seq_show()
2518 if (chip->can_sleep) in gpiolib_seq_show()
2522 if (chip->dbg_show) in gpiolib_seq_show()
2523 chip->dbg_show(s, chip); in gpiolib_seq_show()
2525 gpiolib_dbg_show(s, chip); in gpiolib_seq_show()