Unverified Commit 4d60cac9 authored by William Breathitt Gray's avatar William Breathitt Gray Committed by Mark Brown
Browse files

regmap-irq: Add no_status support



Some devices lack status registers, yet expect to handle interrupts.
Introduce a no_status flag to indicate such a configuration, where
rather than read a status register to verify, all interrupts received
are assumed to be active.

Cc: Mark Brown <broonie@kernel.org>
Signed-off-by: default avatarWilliam Breathitt Gray <william.gray@linaro.org>
Link: https://lore.kernel.org/r/bd501b4b5ff88da24d467f75e8c71b4e0e6f21e2.1677515341.git.william.gray@linaro.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fe15c26e
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -433,7 +433,10 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
	 * possible in order to reduce the I/O overheads.
	 */

	if (chip->num_main_regs) {
	if (chip->no_status) {
		/* no status register so default to all active */
		memset32(data->status_buf, GENMASK(31, 0), chip->num_regs);
	} else if (chip->num_main_regs) {
		unsigned int max_main_bits;
		unsigned long size;

@@ -949,6 +952,10 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
			continue;

		/* Ack masked but set interrupts */
		if (d->chip->no_status) {
			/* no status register so default to all active */
			d->status_buf[i] = GENMASK(31, 0);
		} else {
			reg = d->get_irq_reg(d, d->chip->status_base, i);
			ret = regmap_read(map, reg, &d->status_buf[i]);
			if (ret != 0) {
@@ -956,6 +963,7 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
					ret);
				goto err_alloc;
			}
		}

		if (chip->status_invert)
			d->status_buf[i] = ~d->status_buf[i];
+2 −0
Original line number Diff line number Diff line
@@ -1567,6 +1567,7 @@ struct regmap_irq_chip_data;
 *		      the need for a @sub_reg_offsets table.
 * @status_invert: Inverted status register: cleared bits are active interrupts.
 * @runtime_pm:  Hold a runtime PM lock on the device when accessing it.
 * @no_status: No status register: all interrupts assumed generated by device.
 *
 * @num_regs:    Number of registers in each control bank.
 * @irqs:        Descriptors for individual IRQs.  Interrupt numbers are
@@ -1631,6 +1632,7 @@ struct regmap_irq_chip {
	unsigned int clear_on_unmask:1;
	unsigned int not_fixed_stride:1;
	unsigned int status_invert:1;
	unsigned int no_status:1;

	int num_regs;