]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: mcp251xfd: only configure PIN1 when rx_int is set
authorGregor Herburger <gregor.herburger@ew.tq-group.com>
Wed, 1 Oct 2025 09:10:04 +0000 (14:40 +0530)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 12 Nov 2025 18:30:32 +0000 (19:30 +0100)
When rx_int is used th mcp251xfd_chip_rx_int_enable and
mcp251xfd_chip_rx_int_disable function configure both PIN0 and PIN1. To
prepare the support of the GPIOS only configure PIN1 with
regmap_update_bits.

This way PIN0 can be used as GPIO while PIN1 is used as rx_int
interrupt.

Signed-off-by: Gregor Herburger <gregor.herburger@ew.tq-group.com>
Tested-by: Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com>
Signed-off-by: Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com>
Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/20251001091006.4003841-5-viken.dadhaniya@oss.qualcomm.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/spi/mcp251xfd/mcp251xfd.h

index 9104561e099527a266796c57d15c46517076cf3c..565327bf9c43783013a6fd27b7602b5ebd8d0300 100644 (file)
@@ -608,23 +608,21 @@ static int mcp251xfd_set_bittiming(const struct mcp251xfd_priv *priv)
 
 static int mcp251xfd_chip_rx_int_enable(const struct mcp251xfd_priv *priv)
 {
-       u32 val;
+       u32 val, mask;
 
        if (!priv->rx_int)
                return 0;
 
-       /* Configure GPIOs:
-        * - PIN0: GPIO Input
-        * - PIN1: GPIO Input/RX Interrupt
+       /* Configure PIN1 as RX Interrupt:
         *
         * PIN1 must be Input, otherwise there is a glitch on the
         * rx-INT line. It happens between setting the PIN as output
         * (in the first byte of the SPI transfer) and configuring the
         * PIN as interrupt (in the last byte of the SPI transfer).
         */
-       val = MCP251XFD_REG_IOCON_PM0 | MCP251XFD_REG_IOCON_TRIS1 |
-               MCP251XFD_REG_IOCON_TRIS0;
-       return regmap_write(priv->map_reg, MCP251XFD_REG_IOCON, val);
+       val = MCP251XFD_REG_IOCON_TRIS(1);
+       mask = MCP251XFD_REG_IOCON_TRIS(1) | MCP251XFD_REG_IOCON_PM(1);
+       return regmap_update_bits(priv->map_reg, MCP251XFD_REG_IOCON, mask, val);
 }
 
 static int mcp251xfd_chip_rx_int_disable(const struct mcp251xfd_priv *priv)
@@ -634,13 +632,9 @@ static int mcp251xfd_chip_rx_int_disable(const struct mcp251xfd_priv *priv)
        if (!priv->rx_int)
                return 0;
 
-       /* Configure GPIOs:
-        * - PIN0: GPIO Input
-        * - PIN1: GPIO Input
-        */
-       val = MCP251XFD_REG_IOCON_PM1 | MCP251XFD_REG_IOCON_PM0 |
-               MCP251XFD_REG_IOCON_TRIS1 | MCP251XFD_REG_IOCON_TRIS0;
-       return regmap_write(priv->map_reg, MCP251XFD_REG_IOCON, val);
+       /* Configure PIN1 as GPIO Input */
+       val = MCP251XFD_REG_IOCON_PM(1) | MCP251XFD_REG_IOCON_TRIS(1);
+       return regmap_update_bits(priv->map_reg, MCP251XFD_REG_IOCON, val, val);
 }
 
 static int mcp251xfd_chip_ecc_init(struct mcp251xfd_priv *priv)
index e63034fd59471ab730b13680e2ea21c44f358008..bd28510a65839384869e4ccfbcbadf0be03febf0 100644 (file)
 #define MCP251XFD_REG_IOCON_TXCANOD BIT(28)
 #define MCP251XFD_REG_IOCON_PM1 BIT(25)
 #define MCP251XFD_REG_IOCON_PM0 BIT(24)
+#define MCP251XFD_REG_IOCON_PM(n) (MCP251XFD_REG_IOCON_PM0 << (n))
 #define MCP251XFD_REG_IOCON_GPIO1 BIT(17)
 #define MCP251XFD_REG_IOCON_GPIO0 BIT(16)
+#define MCP251XFD_REG_IOCON_GPIO(n) (MCP251XFD_REG_IOCON_GPIO0 << (n))
 #define MCP251XFD_REG_IOCON_GPIO_MASK GENMASK(17, 16)
 #define MCP251XFD_REG_IOCON_LAT1 BIT(9)
 #define MCP251XFD_REG_IOCON_LAT0 BIT(8)
+#define MCP251XFD_REG_IOCON_LAT(n) (MCP251XFD_REG_IOCON_LAT0 << (n))
+#define MCP251XFD_REG_IOCON_LAT_MASK GENMASK(9, 8)
 #define MCP251XFD_REG_IOCON_XSTBYEN BIT(6)
 #define MCP251XFD_REG_IOCON_TRIS1 BIT(1)
 #define MCP251XFD_REG_IOCON_TRIS0 BIT(0)
+#define MCP251XFD_REG_IOCON_TRIS(n) (MCP251XFD_REG_IOCON_TRIS0 << (n))
 
 #define MCP251XFD_REG_CRC 0xe08
 #define MCP251XFD_REG_CRC_FERRIE BIT(25)