* [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions
@ 2024-11-04 11:13 Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 1/5] mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and TQMxE41S Matthias Schiffer
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Matthias Schiffer
Patch 1 adds support for 3 new TQMx86 COMs. GPIO support on SMARC
modules is currently limited (not all GPIOs can be controlled, pins use
incorrect default directions, IRQ configuration is handled incorrectly),
however this is a preexisting issue also effecting the TQMxE39S and
TQMxE40S, not only the new TQMxE41S. This will be addressed by a future
patch series involving both the TQMx86 MFD and GPIO drivers.
Patches 2-5 improve module parameter description and error handling of
GPIO IRQ configuration and add support for configuring an IRQ for the
TQMx86's OpenCores I2C controller in the same way.
Changelog:
v2: improve module parameter description (new patch 2, adjusted patch 5)
v3: replace IRQ 0 resource entries with empty placeholders to simplify
error handling (patches 4 and 5)
v4: remove tqmx86_irq_to_irq_cfg() function (patch 3)
v5: move placeholders to the end of the resource arrays, use defines for
index (patches 4 and 5)
v6: remove obsolete comment; refer to I2C controller as I2C1 (patch 5)
Gregor Herburger (1):
mfd: tqmx86: add I2C IRQ support
Matthias Schiffer (4):
mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and
TQMxE41S
mfd: tqmx86: improve gpio_irq module parameter description
mfd: tqmx86: refactor GPIO IRQ setup
mfd: tqmx86: make IRQ setup errors non-fatal
drivers/mfd/tqmx86.c | 105 +++++++++++++++++++++++++++++--------------
1 file changed, 71 insertions(+), 34 deletions(-)
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v6 1/5] mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and TQMxE41S
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
@ 2024-11-04 11:13 ` Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 2/5] mfd: tqmx86: improve gpio_irq module parameter description Matthias Schiffer
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Matthias Schiffer
This adds support for 3 new TQMx86 COMs:
- TQMx120UC/TQMx130UC: COM Express Compact Type 6 modules with 12th and
13th Generation Intel Core CPUs ([1, 2])
- TQMxE41S: SMARC 2.1 module with Intel Atom x7000E and compatible CPUs [3]
[1] https://www.tq-group.com/en/products/tq-embedded/x86-architecture/tqmx120uc/
[2] https://www.tq-group.com/en/products/tq-embedded/x86-architecture/tqmx130uc/
[3] https://www.tq-group.com/en/products/tq-embedded/x86-architecture/tqmxe41s/
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
---
v2: no changes
v3: no changes
v4: no changes
v5: no changes
v6: no changes
drivers/mfd/tqmx86.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
index fac02875fe7d9..e15b9be98c2db 100644
--- a/drivers/mfd/tqmx86.c
+++ b/drivers/mfd/tqmx86.c
@@ -35,11 +35,14 @@
#define TQMX86_REG_BOARD_ID_E39C2 7
#define TQMX86_REG_BOARD_ID_70EB 8
#define TQMX86_REG_BOARD_ID_80UC 9
+#define TQMX86_REG_BOARD_ID_120UC 10
#define TQMX86_REG_BOARD_ID_110EB 11
#define TQMX86_REG_BOARD_ID_E40M 12
#define TQMX86_REG_BOARD_ID_E40S 13
#define TQMX86_REG_BOARD_ID_E40C1 14
#define TQMX86_REG_BOARD_ID_E40C2 15
+#define TQMX86_REG_BOARD_ID_130UC 16
+#define TQMX86_REG_BOARD_ID_E41S 19
#define TQMX86_REG_BOARD_REV 0x01
#define TQMX86_REG_IO_EXT_INT 0x06
#define TQMX86_REG_IO_EXT_INT_NONE 0
@@ -132,6 +135,8 @@ static const char *tqmx86_board_id_to_name(u8 board_id, u8 sauc)
return "TQMx70EB";
case TQMX86_REG_BOARD_ID_80UC:
return "TQMx80UC";
+ case TQMX86_REG_BOARD_ID_120UC:
+ return "TQMx120UC";
case TQMX86_REG_BOARD_ID_110EB:
return "TQMx110EB";
case TQMX86_REG_BOARD_ID_E40M:
@@ -142,6 +147,10 @@ static const char *tqmx86_board_id_to_name(u8 board_id, u8 sauc)
return "TQMxE40C1";
case TQMX86_REG_BOARD_ID_E40C2:
return "TQMxE40C2";
+ case TQMX86_REG_BOARD_ID_130UC:
+ return "TQMx130UC";
+ case TQMX86_REG_BOARD_ID_E41S:
+ return "TQMxE41S";
default:
return "Unknown";
}
@@ -154,11 +163,14 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
case TQMX86_REG_BOARD_ID_60EB:
case TQMX86_REG_BOARD_ID_70EB:
case TQMX86_REG_BOARD_ID_80UC:
+ case TQMX86_REG_BOARD_ID_120UC:
case TQMX86_REG_BOARD_ID_110EB:
case TQMX86_REG_BOARD_ID_E40M:
case TQMX86_REG_BOARD_ID_E40S:
case TQMX86_REG_BOARD_ID_E40C1:
case TQMX86_REG_BOARD_ID_E40C2:
+ case TQMX86_REG_BOARD_ID_130UC:
+ case TQMX86_REG_BOARD_ID_E41S:
return 24000;
case TQMX86_REG_BOARD_ID_E39MS:
case TQMX86_REG_BOARD_ID_E39C1:
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v6 2/5] mfd: tqmx86: improve gpio_irq module parameter description
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 1/5] mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and TQMxE41S Matthias Schiffer
@ 2024-11-04 11:13 ` Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 3/5] mfd: tqmx86: refactor GPIO IRQ setup Matthias Schiffer
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Matthias Schiffer
Clarify that "7, 9, 12" refers to the valid arguments that can be
passed as gpio_irq.
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
---
v2: new patch
v3: no changes
v4: no changes
v5: no changes
v6: no changes
drivers/mfd/tqmx86.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
index e15b9be98c2db..7b2f9490a9af5 100644
--- a/drivers/mfd/tqmx86.c
+++ b/drivers/mfd/tqmx86.c
@@ -58,7 +58,7 @@
static uint gpio_irq;
module_param(gpio_irq, uint, 0);
-MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (7, 9, 12)");
+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),
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v6 3/5] mfd: tqmx86: refactor GPIO IRQ setup
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 1/5] mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and TQMxE41S Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 2/5] mfd: tqmx86: improve gpio_irq module parameter description Matthias Schiffer
@ 2024-11-04 11:13 ` Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support Matthias Schiffer
4 siblings, 0 replies; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Matthias Schiffer, Gregor Herburger
Move IRQ setup into a helper function. The string "GPIO" for error
messages is replaced with a label argument to prepare for reusing the
function for the I2C IRQ.
No functional change intended.
Co-developed-by: Gregor Herburger <gregor.herburger@tq-group.com>
Signed-off-by: Gregor Herburger <gregor.herburger@tq-group.com>
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
---
v2: no changes (was patch 2/4)
v3: no changes
v4: drop tqmx86_irq_to_irq_cfg() function, handle IRQ-to-register-value
mapping in tqmx86_setup_irq() instead
v5: no changes
v6: no changes
drivers/mfd/tqmx86.c | 59 +++++++++++++++++++++++++++-----------------
1 file changed, 37 insertions(+), 22 deletions(-)
diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
index 7b2f9490a9af5..8aa448a67c9a5 100644
--- a/drivers/mfd/tqmx86.c
+++ b/drivers/mfd/tqmx86.c
@@ -186,33 +186,52 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
}
}
-static int tqmx86_probe(struct platform_device *pdev)
+static int tqmx86_setup_irq(struct device *dev, const char *label, u8 irq,
+ void __iomem *io_base, u8 reg_shift)
{
- u8 board_id, sauc, rev, i2c_det, io_ext_int_val;
- struct device *dev = &pdev->dev;
- u8 gpio_irq_cfg, readback;
- const char *board_name;
- void __iomem *io_base;
- int err;
+ u8 val, readback;
+ int irq_cfg;
- switch (gpio_irq) {
+ switch (irq) {
case 0:
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_NONE;
+ irq_cfg = TQMX86_REG_IO_EXT_INT_NONE;
break;
case 7:
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_7;
+ irq_cfg = TQMX86_REG_IO_EXT_INT_7;
break;
case 9:
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_9;
+ irq_cfg = TQMX86_REG_IO_EXT_INT_9;
break;
case 12:
- gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_12;
+ irq_cfg = TQMX86_REG_IO_EXT_INT_12;
break;
default:
- pr_err("tqmx86: Invalid GPIO IRQ (%d)\n", gpio_irq);
+ dev_err(dev, "invalid %s IRQ (%d)\n", label, irq);
return -EINVAL;
}
+ val = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
+ val &= ~(TQMX86_REG_IO_EXT_INT_MASK << reg_shift);
+ val |= (irq_cfg & TQMX86_REG_IO_EXT_INT_MASK) << reg_shift;
+
+ iowrite8(val, io_base + TQMX86_REG_IO_EXT_INT);
+ readback = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
+ if (readback != val) {
+ dev_warn(dev, "%s interrupts not supported\n", label);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int tqmx86_probe(struct platform_device *pdev)
+{
+ u8 board_id, sauc, rev, i2c_det;
+ struct device *dev = &pdev->dev;
+ const char *board_name;
+ void __iomem *io_base;
+ int err;
+
io_base = devm_ioport_map(dev, TQMX86_IOBASE, TQMX86_IOSIZE);
if (!io_base)
return -ENOMEM;
@@ -233,15 +252,11 @@ static int tqmx86_probe(struct platform_device *pdev)
*/
i2c_det = inb(TQMX86_REG_I2C_DETECT);
- if (gpio_irq_cfg) {
- io_ext_int_val =
- gpio_irq_cfg << TQMX86_REG_IO_EXT_INT_GPIO_SHIFT;
- iowrite8(io_ext_int_val, io_base + TQMX86_REG_IO_EXT_INT);
- readback = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
- if (readback != io_ext_int_val) {
- dev_warn(dev, "GPIO interrupts not supported.\n");
- return -EINVAL;
- }
+ if (gpio_irq) {
+ err = tqmx86_setup_irq(dev, "GPIO", gpio_irq, io_base,
+ TQMX86_REG_IO_EXT_INT_GPIO_SHIFT);
+ if (err)
+ return err;
/* Assumes the IRQ resource is first. */
tqmx_gpio_resources[0].start = gpio_irq;
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
` (2 preceding siblings ...)
2024-11-04 11:13 ` [PATCH v6 3/5] mfd: tqmx86: refactor GPIO IRQ setup Matthias Schiffer
@ 2024-11-04 11:13 ` Matthias Schiffer
2024-11-06 9:00 ` Lee Jones
2024-11-04 11:13 ` [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support Matthias Schiffer
4 siblings, 1 reply; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Matthias Schiffer
GPIO IRQ setup can fail either because an invalid IRQ was passed as a
parameter, or because the GPIO controller does not support interrupts.
Neither is severe enough to stop the whole probe; simply disable IRQ
support in the GPIO resource when setup fails.
The code is made a bit more robust by introduing a define for the index
of the IRQ resource in the resource list instead of assuming that it is
at index 0.
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
---
v2: no changes (was patch 3/4)
v3: replace IRQ 0 resource with an empty placeholder to simplify error handling
v4: no changes
v5: move placeholder to the end of the resource array, use define for index
v6: no changes
drivers/mfd/tqmx86.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
index 8aa448a67c9a5..1fd2212bf492c 100644
--- a/drivers/mfd/tqmx86.c
+++ b/drivers/mfd/tqmx86.c
@@ -60,6 +60,9 @@ static uint gpio_irq;
module_param(gpio_irq, uint, 0);
MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (valid parameters: 7, 9, 12)");
+/* Index of IRQ placeholder in resource list */
+#define TQMX86_IRQ_GPIO 1
+
static const struct resource tqmx_i2c_soft_resources[] = {
DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
};
@@ -68,13 +71,10 @@ static const struct resource tqmx_watchdog_resources[] = {
DEFINE_RES_IO(TQMX86_IOBASE_WATCHDOG, TQMX86_IOSIZE_WATCHDOG),
};
-/*
- * The IRQ resource must be first, since it is updated with the
- * configured IRQ in the probe function.
- */
static struct resource tqmx_gpio_resources[] = {
- DEFINE_RES_IRQ(0),
DEFINE_RES_IO(TQMX86_IOBASE_GPIO, TQMX86_IOSIZE_GPIO),
+ /* Placeholder for IRQ resource - filled in by the probe function */
+ [TQMX86_IRQ_GPIO] = {},
};
static struct i2c_board_info tqmx86_i2c_devices[] = {
@@ -255,13 +255,8 @@ static int tqmx86_probe(struct platform_device *pdev)
if (gpio_irq) {
err = tqmx86_setup_irq(dev, "GPIO", gpio_irq, io_base,
TQMX86_REG_IO_EXT_INT_GPIO_SHIFT);
- if (err)
- return err;
-
- /* Assumes the IRQ resource is first. */
- tqmx_gpio_resources[0].start = gpio_irq;
- } else {
- tqmx_gpio_resources[0].flags = 0;
+ if (!err)
+ tqmx_gpio_resources[TQMX86_IRQ_GPIO] = DEFINE_RES_IRQ(gpio_irq);
}
ocores_platform_data.clock_khz = tqmx86_board_id_to_clk_rate(dev, board_id);
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
` (3 preceding siblings ...)
2024-11-04 11:13 ` [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal Matthias Schiffer
@ 2024-11-04 11:13 ` Matthias Schiffer
2024-11-06 9:01 ` Lee Jones
4 siblings, 1 reply; 8+ messages in thread
From: Matthias Schiffer @ 2024-11-04 11:13 UTC (permalink / raw)
To: Lee Jones; +Cc: linux, linux-kernel, Gregor Herburger, Matthias Schiffer
From: Gregor Herburger <gregor.herburger@tq-group.com>
The i2c-ocores controller can run in interrupt mode on tqmx86 modules.
Add 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>
---
v2: improve module parameter description (was patch 4/4)
v3: replace IRQ 0 resource with an empty placeholder to simplify error handling
v4: no changes
v5: move placeholder to the end of the resource array, use define for index
v6:
- remove obsolete comment
- refer to I2C controller as "I2C1"
drivers/mfd/tqmx86.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
index 1fd2212bf492c..7dd971b762578 100644
--- a/drivers/mfd/tqmx86.c
+++ b/drivers/mfd/tqmx86.c
@@ -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,11 +61,18 @@ static uint gpio_irq;
module_param(gpio_irq, uint, 0);
MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (valid parameters: 7, 9, 12)");
+static uint i2c1_irq;
+module_param(i2c1_irq, uint, 0);
+MODULE_PARM_DESC(i2c1_irq, "I2C1 IRQ number (valid parameters: 7, 9, 12)");
+
/* Index of IRQ placeholder in resource list */
#define TQMX86_IRQ_GPIO 1
+#define TQMX86_IRQ_I2C1 1
-static const struct resource tqmx_i2c_soft_resources[] = {
+static struct resource tqmx_i2c_soft_resources[] = {
DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
+ /* Placeholder for IRQ resource - filled in by the probe function */
+ [TQMX86_IRQ_I2C1] = {},
};
static const struct resource tqmx_watchdog_resources[] = {
@@ -262,6 +270,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_IRQ_I2C1] = DEFINE_RES_IRQ(i2c1_irq);
+ }
+
err = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
tqmx86_i2c_soft_dev,
ARRAY_SIZE(tqmx86_i2c_soft_dev),
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
https://www.tq-group.com/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal
2024-11-04 11:13 ` [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal Matthias Schiffer
@ 2024-11-06 9:00 ` Lee Jones
0 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2024-11-06 9:00 UTC (permalink / raw)
To: Matthias Schiffer; +Cc: linux, linux-kernel
On Mon, 04 Nov 2024, Matthias Schiffer wrote:
> GPIO IRQ setup can fail either because an invalid IRQ was passed as a
> parameter, or because the GPIO controller does not support interrupts.
> Neither is severe enough to stop the whole probe; simply disable IRQ
> support in the GPIO resource when setup fails.
>
> The code is made a bit more robust by introduing a define for the index
> of the IRQ resource in the resource list instead of assuming that it is
> at index 0.
>
> Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
> ---
>
> v2: no changes (was patch 3/4)
> v3: replace IRQ 0 resource with an empty placeholder to simplify error handling
> v4: no changes
> v5: move placeholder to the end of the resource array, use define for index
> v6: no changes
>
> drivers/mfd/tqmx86.c | 19 +++++++------------
> 1 file changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
> index 8aa448a67c9a5..1fd2212bf492c 100644
> --- a/drivers/mfd/tqmx86.c
> +++ b/drivers/mfd/tqmx86.c
> @@ -60,6 +60,9 @@ static uint gpio_irq;
> module_param(gpio_irq, uint, 0);
> MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (valid parameters: 7, 9, 12)");
>
> +/* Index of IRQ placeholder in resource list */
> +#define TQMX86_IRQ_GPIO 1
> +
> static const struct resource tqmx_i2c_soft_resources[] = {
> DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
> };
> @@ -68,13 +71,10 @@ static const struct resource tqmx_watchdog_resources[] = {
> DEFINE_RES_IO(TQMX86_IOBASE_WATCHDOG, TQMX86_IOSIZE_WATCHDOG),
> };
>
> -/*
> - * The IRQ resource must be first, since it is updated with the
> - * configured IRQ in the probe function.
> - */
> static struct resource tqmx_gpio_resources[] = {
> - DEFINE_RES_IRQ(0),
> DEFINE_RES_IO(TQMX86_IOBASE_GPIO, TQMX86_IOSIZE_GPIO),
> + /* Placeholder for IRQ resource - filled in by the probe function */
Drop the " - filled in ..." part. This is a common practice.
> + [TQMX86_IRQ_GPIO] = {},
Not quite. What happens if someone comes along and inserts a resource
above this one? You need to index all of them. Use an enum.
> };
>
> static struct i2c_board_info tqmx86_i2c_devices[] = {
> @@ -255,13 +255,8 @@ static int tqmx86_probe(struct platform_device *pdev)
> if (gpio_irq) {
> err = tqmx86_setup_irq(dev, "GPIO", gpio_irq, io_base,
> TQMX86_REG_IO_EXT_INT_GPIO_SHIFT);
> - if (err)
> - return err;
> -
> - /* Assumes the IRQ resource is first. */
> - tqmx_gpio_resources[0].start = gpio_irq;
> - } else {
> - tqmx_gpio_resources[0].flags = 0;
> + if (!err)
> + tqmx_gpio_resources[TQMX86_IRQ_GPIO] = DEFINE_RES_IRQ(gpio_irq);
This section just became a lot nicer.
> }
>
> ocores_platform_data.clock_khz = tqmx86_board_id_to_clk_rate(dev, board_id);
> --
> TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
> Amtsgericht München, HRB 105018
> Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
> https://www.tq-group.com/
>
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support
2024-11-04 11:13 ` [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support Matthias Schiffer
@ 2024-11-06 9:01 ` Lee Jones
0 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2024-11-06 9:01 UTC (permalink / raw)
To: Matthias Schiffer; +Cc: linux, linux-kernel, Gregor Herburger
On Mon, 04 Nov 2024, Matthias Schiffer wrote:
> From: Gregor Herburger <gregor.herburger@tq-group.com>
>
> The i2c-ocores controller can run in interrupt mode on tqmx86 modules.
> Add 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>
> ---
>
> v2: improve module parameter description (was patch 4/4)
> v3: replace IRQ 0 resource with an empty placeholder to simplify error handling
> v4: no changes
> v5: move placeholder to the end of the resource array, use define for index
> v6:
> - remove obsolete comment
> - refer to I2C controller as "I2C1"
>
> drivers/mfd/tqmx86.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
> index 1fd2212bf492c..7dd971b762578 100644
> --- a/drivers/mfd/tqmx86.c
> +++ b/drivers/mfd/tqmx86.c
> @@ -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,11 +61,18 @@ static uint gpio_irq;
> module_param(gpio_irq, uint, 0);
> MODULE_PARM_DESC(gpio_irq, "GPIO IRQ number (valid parameters: 7, 9, 12)");
>
> +static uint i2c1_irq;
> +module_param(i2c1_irq, uint, 0);
> +MODULE_PARM_DESC(i2c1_irq, "I2C1 IRQ number (valid parameters: 7, 9, 12)");
> +
> /* Index of IRQ placeholder in resource list */
> #define TQMX86_IRQ_GPIO 1
> +#define TQMX86_IRQ_I2C1 1
>
> -static const struct resource tqmx_i2c_soft_resources[] = {
> +static struct resource tqmx_i2c_soft_resources[] = {
> DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
Same here.
> + /* Placeholder for IRQ resource - filled in by the probe function */
> + [TQMX86_IRQ_I2C1] = {},
> };
>
> static const struct resource tqmx_watchdog_resources[] = {
> @@ -262,6 +270,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_IRQ_I2C1] = DEFINE_RES_IRQ(i2c1_irq);
> + }
> +
> err = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
> tqmx86_i2c_soft_dev,
> ARRAY_SIZE(tqmx86_i2c_soft_dev),
> --
> TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
> Amtsgericht München, HRB 105018
> Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
> https://www.tq-group.com/
>
--
Lee Jones [李琼斯]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-11-06 9:01 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-04 11:13 [PATCH v6 0/5] mfd: tqmx86: new hardware and GPIO/I2C IRQ improvements/additions Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 1/5] mfd: tqmx86: add board definitions for TQMx120UC, TQMx130UC and TQMxE41S Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 2/5] mfd: tqmx86: improve gpio_irq module parameter description Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 3/5] mfd: tqmx86: refactor GPIO IRQ setup Matthias Schiffer
2024-11-04 11:13 ` [PATCH v6 4/5] mfd: tqmx86: make IRQ setup errors non-fatal Matthias Schiffer
2024-11-06 9:00 ` Lee Jones
2024-11-04 11:13 ` [PATCH v6 5/5] mfd: tqmx86: add I2C IRQ support Matthias Schiffer
2024-11-06 9:01 ` Lee Jones
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox