Hello Bartosz, I would like to ask you if you could find some time to look at [PATCH v11 6/8] platform: cznic: turris-omnia-mcu: Add support for MCU provided TRNG https://lore.kernel.org/soc/20240605161851.13911-7-kabel@xxxxxxxxxx/ Andy Shevchenko added you to that conversation asking you about how to correctly do the following part: irq = gpiod_to_irq(gpiochip_get_desc(&mcu->gc, irq_idx)); I am writing this to give some more light into the problem. What is going on: - the turris-omnia-mcu driver provides a gpio chip with interrupts - some lines are gpio + irq, but some lines are interrupt only - later, after the gpiochip is registered, another part of the turris-omnia-mcu driver wants to use one interrupt only line To use the gpiod_to_irq() function, I need gpio descriptor for that line. I can get that with gpiochip_get_desc(), since this is within the driver, I have access to the gpiochip. But this is semantically a little weird, because 1. gpiochip_get_desc() is supposed to be used by gpio driver, not consumer (and the trng part of the turris-omnia-mcu code is a consumer of the gpio) 2. reference counting? Looking at gpiolib, maybe the better function to use would be gpiochip_request_own_desc(). This also is defined in include/gpio/driver.c instead of include/gpio/consumer.c, but at least it's name suggests that it is used by code that also owns the gpiochip... One problem is that gpiochip_request_own_desc() won't work, because the gpiochip initializes valid masks for both gpios and irqs, and the gpiochip_request_own_desc() function calls gpiod_request_commit(), which executes the following code if (guard.gc->request) { offset = gpio_chip_hwgpio(desc); if (gpiochip_line_is_valid(guard.gc, offset)) ret = guard.gc->request(guard.gc, offset); else ret = -EINVAL; ... } So if a gpiochip line is not valid GPIO, only valid IRQchip line, then the GPIO cannot be requested, even for interrupts. What is the proper solution here? Thank you Marek