linux/drivers/base/regmap
Guru Das Srinagesh 1066cfbdfa
regmap-irq: Extend sub-irq to support non-fixed reg strides
Qualcomm's MFD chips have a top level interrupt status register and
sub-irqs (peripherals).  When a bit in the main status register goes
high, it means that the peripheral corresponding to that bit has an
unserviced interrupt. If the bit is not set, this means that the
corresponding peripheral does not.

Commit a2d21848d9 ("regmap: regmap-irq: Add main status register
support") introduced the sub-irq logic that is currently applied only
when reading status registers, but not for any other functions like acking
or masking. Extend the use of sub-irq to all other functions, with two
caveats regarding the specification of offsets:

- Each member of the sub_reg_offsets array should be of length 1
- The specified offsets should be the unequal strides for each sub-irq
  device.

In QCOM's case, all the *_base registers are to be configured to the
base addresses of the first sub-irq group, with offsets of each
subsequent group calculated as a difference from these addresses.

Continuing from the example mentioned in the cover letter:

	/*
	 * Address of MISC_INT_MASK		= 0x1011
	 * Address of TEMP_ALARM_INT_MASK	= 0x2011
	 * Address of GPIO01_INT_MASK		= 0x3011
	 *
	 * Calculate offsets as:
	 * offset_0 = 0x1011 - 0x1011 = 0       (to access MISC's
	 * 					 registers)
	 * offset_1 = 0x2011 - 0x1011 = 0x1000
	 * offset_2 = 0x3011 - 0x1011 = 0x2000
	 */

	static unsigned int sub_unit0_offsets[] = {0};
	static unsigned int sub_unit1_offsets[] = {0x1000};
	static unsigned int sub_unit2_offsets[] = {0x2000};

	static struct regmap_irq_sub_irq_map chip_sub_irq_offsets[] = {
		REGMAP_IRQ_MAIN_REG_OFFSET(sub_unit0_offsets),
		REGMAP_IRQ_MAIN_REG_OFFSET(sub_unit0_offsets),
		REGMAP_IRQ_MAIN_REG_OFFSET(sub_unit0_offsets),
	};

	static struct regmap_irq_chip chip_irq_chip = {
	--------8<--------
	.not_fixed_stride = true,
	.mask_base	  = MISC_INT_MASK,
	.type_base	  = MISC_INT_TYPE,
	.ack_base	  = MISC_INT_ACK,
	.sub_reg_offsets  = chip_sub_irq_offsets,
	--------8<--------
	};

Signed-off-by: Guru Das Srinagesh <gurus@codeaurora.org>
Link: https://lore.kernel.org/r/526562423eaa58b4075362083f561841f1d6956c.1615423027.git.gurus@codeaurora.org
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-03-18 13:55:33 +00:00
..
internal.h Merge remote-tracking branch 'regmap/for-5.10' into regmap-next 2020-10-05 18:53:24 +01:00
Kconfig regmap/SoundWire: sdw: add support for SoundWire 1.2 MBQ 2020-11-26 13:19:59 +00:00
Makefile regmap/SoundWire: sdw: add support for SoundWire 1.2 MBQ 2020-11-26 13:19:59 +00:00
regcache-flat.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regcache-lzo.c regmap: lzo: Switch to bitmap_zalloc() 2019-06-17 15:18:44 +01:00
regcache-rbtree.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regcache.c regmap: Assign boolean values to a bool variable 2021-01-21 12:42:20 +00:00
regmap-ac97.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-debugfs.c regmap: set debugfs_name to NULL after it is freed 2021-03-10 12:20:54 +00:00
regmap-i2c.c regmap-i2c: add 16-bit width registers support 2020-04-24 14:32:07 +01:00
regmap-i3c.c regmap: add i3c bus support 2019-06-07 13:09:55 +01:00
regmap-irq.c regmap-irq: Extend sub-irq to support non-fixed reg strides 2021-03-18 13:55:33 +00:00
regmap-mmio.c regmap: mmio: add config option to allow relaxed MMIO accesses 2020-10-26 19:54:59 +00:00
regmap-sccb.c regmap: sccb: fix typo and sort headers alphabetically 2018-07-23 18:05:08 +01:00
regmap-sdw-mbq.c regmap: sdw-mbq: use MODULE_LICENSE("GPL") 2021-02-11 10:54:00 +05:30
regmap-sdw.c regmap: sdw: use _no_pm functions in regmap_read/write 2021-02-11 10:54:00 +05:30
regmap-slimbus.c regmap: slimbus: add support to multi read/write 2018-07-11 11:58:04 +01:00
regmap-spi-avmm.c regmap: add Intel SPI Slave to AVMM Bus Bridge support 2020-08-26 19:46:38 +01:00
regmap-spi.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-spmi.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-w1.c regmap: regmap-w1: Drop unreachable code 2019-11-19 13:09:20 +00:00
regmap.c regmap: Fix order of regmap write log 2020-11-12 16:05:17 +00:00
trace.h regmap: Remove duplicate type field from regmap regcache_sync trace event 2020-11-24 14:14:00 +00:00