can: sun4i_can: Add support for the Allwinner D1
authorJohn Watts <contact@jookia.org>
Fri, 21 Jul 2023 22:15:53 +0000 (08:15 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Sep 2023 09:11:02 +0000 (11:11 +0200)
[ Upstream commit 8abb95250ae6af2d51993da8fcae18da2ce24cc4 ]

The controllers present in the D1 are extremely similar to the R40
and require the same reset quirks, but An extra quirk is needed to support
receiving packets.

Signed-off-by: John Watts <contact@jookia.org>
Link: https://lore.kernel.org/all/20230721221552.1973203-6-contact@jookia.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/can/Kconfig
drivers/net/can/sun4i_can.c

index 3048ad7..8236aab 100644 (file)
@@ -174,10 +174,10 @@ config CAN_SLCAN
 
 config CAN_SUN4I
        tristate "Allwinner A10 CAN controller"
-       depends on MACH_SUN4I || MACH_SUN7I || COMPILE_TEST
+       depends on MACH_SUN4I || MACH_SUN7I || RISCV || COMPILE_TEST
        help
          Say Y here if you want to use CAN controller found on Allwinner
-         A10/A20 SoCs.
+         A10/A20/D1 SoCs.
 
          To compile this driver as a module, choose M here: the module will
          be called sun4i_can.
index dd0c6cd..c3a6b02 100644 (file)
@@ -91,6 +91,8 @@
 #define SUN4I_REG_BUF12_ADDR   0x0070  /* CAN Tx/Rx Buffer 12 */
 #define SUN4I_REG_ACPC_ADDR    0x0040  /* CAN Acceptance Code 0 */
 #define SUN4I_REG_ACPM_ADDR    0x0044  /* CAN Acceptance Mask 0 */
+#define SUN4I_REG_ACPC_ADDR_D1 0x0028  /* CAN Acceptance Code 0 on the D1 */
+#define SUN4I_REG_ACPM_ADDR_D1 0x002C  /* CAN Acceptance Mask 0 on the D1 */
 #define SUN4I_REG_RBUF_RBACK_START_ADDR        0x0180  /* CAN transmit buffer start */
 #define SUN4I_REG_RBUF_RBACK_END_ADDR  0x01b0  /* CAN transmit buffer end */
 
@@ -779,6 +781,11 @@ static const struct sun4ican_quirks sun4ican_quirks_r40 = {
        .acp_offset = 0,
 };
 
+static const struct sun4ican_quirks sun4ican_quirks_d1 = {
+       .has_reset = true,
+       .acp_offset = (SUN4I_REG_ACPC_ADDR_D1 - SUN4I_REG_ACPC_ADDR),
+};
+
 static const struct of_device_id sun4ican_of_match[] = {
        {
                .compatible = "allwinner,sun4i-a10-can",
@@ -790,6 +797,9 @@ static const struct of_device_id sun4ican_of_match[] = {
                .compatible = "allwinner,sun8i-r40-can",
                .data = &sun4ican_quirks_r40
        }, {
+               .compatible = "allwinner,sun20i-d1-can",
+               .data = &sun4ican_quirks_d1
+       }, {
                /* sentinel */
        },
 };
@@ -915,4 +925,4 @@ module_platform_driver(sun4i_can_driver);
 MODULE_AUTHOR("Peter Chen <xingkongcp@gmail.com>");
 MODULE_AUTHOR("Gerhard Bertelsmann <info@gerhard-bertelsmann.de>");
 MODULE_LICENSE("Dual BSD/GPL");
-MODULE_DESCRIPTION("CAN driver for Allwinner SoCs (A10/A20)");
+MODULE_DESCRIPTION("CAN driver for Allwinner SoCs (A10/A20/D1)");