On Fri, Feb 14, 2025 at 12:49:56PM +0100, Mathieu Dubois-Briand wrote: > Some GPIO chips allow to rise an IRQ on GPIO level changes but do not > provide an IRQ status for each separate line: only the current gpio > level can be retrieved. > > Add support for these chips, emulating IRQ status by comparing GPIO > levels with the levels during the previous interrupt. Thanks, this will help to convert more drivers to regmap (e.g., gpio-pca953x that seems use similar approach). ... > +static irqreturn_t regmap_irq_thread(int irq, void *d) > +{ > + struct regmap_irq_chip_data *data = d; > + const struct regmap_irq_chip *chip = data->chip; > + struct regmap *map = data->map; > + int ret, i; unsigned int i; ? > + bool handled = false; > + u32 reg; > + > + if (chip->handle_pre_irq) > + chip->handle_pre_irq(chip->irq_drv_data); > + > + if (chip->runtime_pm) { > + ret = pm_runtime_get_sync(map->dev); > + if (ret < 0) { > + dev_err(map->dev, "IRQ thread failed to resume: %d\n", > + ret); Can be one line. > + goto exit; > + } > + } > + > + ret = read_irq_data(data); > + if (ret < 0) > + goto exit; > + > + if (chip->status_is_level) { > + for (i = 0; i < data->chip->num_regs; i++) { > + unsigned int val = data->status_buf[i]; > + > + data->status_buf[i] ^= data->prev_status_buf[i]; > + data->prev_status_buf[i] = val; > + } > + } ... > + for (i = 0; i < d->chip->num_regs; i++) > + d->prev_status_buf[i] = d->status_buf[i]; Hmm... Wouldn't memcpy() suffice? But okay, this seems to be not a hot path and the intention is clear. -- With Best Regards, Andy Shevchenko