Commit 0d3f0739 authored by Gregor Herburger's avatar Gregor Herburger Committed by Lee Jones
Browse files

mfd: tqmx86: Add I2C IRQ support



The i2c-ocores controller can run in interrupt mode on tqmx86 modules.
Add a module parameter to allow configuring the IRQ number, similar to the
handling of the GPIO IRQ.

The new code and module parameter refer to the I2C controller as "I2C1",
as the TQMx86 PLD actually contains a second I2C controller, for which
driver support will be added in the future.

Signed-off-by: default avatarGregor Herburger <gregor.herburger@tq-group.com>
Signed-off-by: default avatarMatthias Schiffer <matthias.schiffer@ew.tq-group.com>
Link: https://lore.kernel.org/r/c1b0769e00a8a4e463cffe725e939b0e5c2992c8.1731325758.git.matthias.schiffer@ew.tq-group.com


Signed-off-by: default avatarLee Jones <lee@kernel.org>
parent 1f86faeb
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@
#define TQMX86_REG_IO_EXT_INT_9			2
#define TQMX86_REG_IO_EXT_INT_12		3
#define TQMX86_REG_IO_EXT_INT_MASK		0x3
#define TQMX86_REG_IO_EXT_INT_I2C1_SHIFT	0
#define TQMX86_REG_IO_EXT_INT_GPIO_SHIFT	4
#define TQMX86_REG_SAUC		0x17

@@ -60,8 +61,19 @@ static uint gpio_irq;
module_param(gpio_irq, uint, 0);
MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (valid parameters: 7, 9, 12)");

static const struct resource tqmx_i2c_soft_resources[] = {
	DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
static uint i2c1_irq;
module_param(i2c1_irq, uint, 0);
MODULE_PARM_DESC(i2c1_irq, "I2C1 IRQ number (valid parameters: 7, 9, 12)");

enum tqmx86_i2c1_resource_type {
	TQMX86_I2C1_IO,
	TQMX86_I2C1_IRQ,
};

static struct resource tqmx_i2c_soft_resources[] = {
	[TQMX86_I2C1_IO] = DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
	/* Placeholder for IRQ resource */
	[TQMX86_I2C1_IRQ] = {},
};

static const struct resource tqmx_watchdog_resources[] = {
@@ -264,6 +276,13 @@ static int tqmx86_probe(struct platform_device *pdev)
	ocores_platform_data.clock_khz = tqmx86_board_id_to_clk_rate(dev, board_id);

	if (i2c_det == TQMX86_REG_I2C_DETECT_SOFT) {
		if (i2c1_irq) {
			err = tqmx86_setup_irq(dev, "I2C1", i2c1_irq, io_base,
					       TQMX86_REG_IO_EXT_INT_I2C1_SHIFT);
			if (!err)
				tqmx_i2c_soft_resources[TQMX86_I2C1_IRQ] = DEFINE_RES_IRQ(i2c1_irq);
		}

		err = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
					   tqmx86_i2c_soft_dev,
					   ARRAY_SIZE(tqmx86_i2c_soft_dev),