]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mfd: tqmx86: Add I2C IRQ support
authorGregor Herburger <gregor.herburger@tq-group.com>
Mon, 11 Nov 2024 14:10:32 +0000 (15:10 +0100)
committerLee Jones <lee@kernel.org>
Tue, 12 Nov 2024 14:47:00 +0000 (14:47 +0000)
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: Gregor Herburger <gregor.herburger@tq-group.com>
Signed-off-by: Matthias 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: Lee Jones <lee@kernel.org>
drivers/mfd/tqmx86.c

index d2704526f9d4b588aaac8a7dd89a35babc1c420f..1cba3b67b0fb9ad9021aaee6a37951037b2fdced 100644 (file)
@@ -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),