mfd: tqmx86: Correct board names for TQMxE39x
authorMatthias Schiffer <matthias.schiffer@ew.tq-group.com>
Mon, 20 Feb 2023 11:25:46 +0000 (12:25 +0100)
committerLee Jones <lee@kernel.org>
Wed, 26 Apr 2023 10:40:28 +0000 (11:40 +0100)
It seems that this driver was developed based on preliminary documentation.
Report the correct names for all TQMxE39x variants, as they are used by
the released hardware revisions:

- Fix names for TQMxE39C1/C2 board IDs
- Distinguish TQMxE39M and TQMxE39S, which use the same board ID

The TQMxE39M/S are distinguished using the SAUC (Sanctioned Alternate
Uses Configuration) register of the GPIO controller. This also prepares
for the correct handling of the differences between the GPIO controllers
of our COMe and SMARC modules.

Fixes: 2f17dd34ffed ("mfd: tqmx86: IO controller with I2C, Wachdog and GPIO")
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/aca9a7cb42a85181bcb456c437554d2728e708ec.1676892223.git.matthias.schiffer@ew.tq-group.com
drivers/mfd/tqmx86.c

index 958334f..fac0287 100644 (file)
@@ -30,9 +30,9 @@
 #define TQMX86_REG_BOARD_ID_50UC       2
 #define TQMX86_REG_BOARD_ID_E38C       3
 #define TQMX86_REG_BOARD_ID_60EB       4
-#define TQMX86_REG_BOARD_ID_E39M       5
-#define TQMX86_REG_BOARD_ID_E39C       6
-#define TQMX86_REG_BOARD_ID_E39      7
+#define TQMX86_REG_BOARD_ID_E39MS      5
+#define TQMX86_REG_BOARD_ID_E39C1      6
+#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_110EB      11
@@ -48,6 +48,7 @@
 #define TQMX86_REG_IO_EXT_INT_12               3
 #define TQMX86_REG_IO_EXT_INT_MASK             0x3
 #define TQMX86_REG_IO_EXT_INT_GPIO_SHIFT       4
+#define TQMX86_REG_SAUC                0x17
 
 #define TQMX86_REG_I2C_DETECT  0x1a7
 #define TQMX86_REG_I2C_DETECT_SOFT             0xa5
@@ -110,7 +111,7 @@ static const struct mfd_cell tqmx86_devs[] = {
        },
 };
 
-static const char *tqmx86_board_id_to_name(u8 board_id)
+static const char *tqmx86_board_id_to_name(u8 board_id, u8 sauc)
 {
        switch (board_id) {
        case TQMX86_REG_BOARD_ID_E38M:
@@ -121,12 +122,12 @@ static const char *tqmx86_board_id_to_name(u8 board_id)
                return "TQMxE38C";
        case TQMX86_REG_BOARD_ID_60EB:
                return "TQMx60EB";
-       case TQMX86_REG_BOARD_ID_E39M:
-               return "TQMxE39M";
-       case TQMX86_REG_BOARD_ID_E39C:
-               return "TQMxE39C";
-       case TQMX86_REG_BOARD_ID_E39x:
-               return "TQMxE39x";
+       case TQMX86_REG_BOARD_ID_E39MS:
+               return (sauc == 0xff) ? "TQMxE39M" : "TQMxE39S";
+       case TQMX86_REG_BOARD_ID_E39C1:
+               return "TQMxE39C1";
+       case TQMX86_REG_BOARD_ID_E39C2:
+               return "TQMxE39C2";
        case TQMX86_REG_BOARD_ID_70EB:
                return "TQMx70EB";
        case TQMX86_REG_BOARD_ID_80UC:
@@ -159,9 +160,9 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
        case TQMX86_REG_BOARD_ID_E40C1:
        case TQMX86_REG_BOARD_ID_E40C2:
                return 24000;
-       case TQMX86_REG_BOARD_ID_E39M:
-       case TQMX86_REG_BOARD_ID_E39C:
-       case TQMX86_REG_BOARD_ID_E39x:
+       case TQMX86_REG_BOARD_ID_E39MS:
+       case TQMX86_REG_BOARD_ID_E39C1:
+       case TQMX86_REG_BOARD_ID_E39C2:
                return 25000;
        case TQMX86_REG_BOARD_ID_E38M:
        case TQMX86_REG_BOARD_ID_E38C:
@@ -175,7 +176,7 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
 
 static int tqmx86_probe(struct platform_device *pdev)
 {
-       u8 board_id, rev, i2c_det, io_ext_int_val;
+       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;
@@ -205,7 +206,8 @@ static int tqmx86_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        board_id = ioread8(io_base + TQMX86_REG_BOARD_ID);
-       board_name = tqmx86_board_id_to_name(board_id);
+       sauc = ioread8(io_base + TQMX86_REG_SAUC);
+       board_name = tqmx86_board_id_to_name(board_id, sauc);
        rev = ioread8(io_base + TQMX86_REG_BOARD_REV);
 
        dev_info(dev,