Commit 8abb9525 authored by John Watts's avatar John Watts Committed by Marc Kleine-Budde

can: sun4i_can: Add support for the Allwinner D1

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: default avatarJohn Watts <contact@jookia.org>
Link: https://lore.kernel.org/all/20230721221552.1973203-6-contact@jookia.orgSigned-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 8cda0c6d
...@@ -190,10 +190,10 @@ config CAN_SLCAN ...@@ -190,10 +190,10 @@ config CAN_SLCAN
config CAN_SUN4I config CAN_SUN4I
tristate "Allwinner A10 CAN controller" tristate "Allwinner A10 CAN controller"
depends on MACH_SUN4I || MACH_SUN7I || COMPILE_TEST depends on MACH_SUN4I || MACH_SUN7I || RISCV || COMPILE_TEST
help help
Say Y here if you want to use CAN controller found on Allwinner 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 To compile this driver as a module, choose M here: the module will
be called sun4i_can. be called sun4i_can.
......
...@@ -91,6 +91,8 @@ ...@@ -91,6 +91,8 @@
#define SUN4I_REG_BUF12_ADDR 0x0070 /* CAN Tx/Rx Buffer 12 */ #define SUN4I_REG_BUF12_ADDR 0x0070 /* CAN Tx/Rx Buffer 12 */
#define SUN4I_REG_ACPC_ADDR 0x0040 /* CAN Acceptance Code 0 */ #define SUN4I_REG_ACPC_ADDR 0x0040 /* CAN Acceptance Code 0 */
#define SUN4I_REG_ACPM_ADDR 0x0044 /* CAN Acceptance Mask 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_START_ADDR 0x0180 /* CAN transmit buffer start */
#define SUN4I_REG_RBUF_RBACK_END_ADDR 0x01b0 /* CAN transmit buffer end */ #define SUN4I_REG_RBUF_RBACK_END_ADDR 0x01b0 /* CAN transmit buffer end */
...@@ -779,6 +781,11 @@ static const struct sun4ican_quirks sun4ican_quirks_r40 = { ...@@ -779,6 +781,11 @@ static const struct sun4ican_quirks sun4ican_quirks_r40 = {
.acp_offset = 0, .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[] = { static const struct of_device_id sun4ican_of_match[] = {
{ {
.compatible = "allwinner,sun4i-a10-can", .compatible = "allwinner,sun4i-a10-can",
...@@ -789,6 +796,9 @@ static const struct of_device_id sun4ican_of_match[] = { ...@@ -789,6 +796,9 @@ static const struct of_device_id sun4ican_of_match[] = {
}, { }, {
.compatible = "allwinner,sun8i-r40-can", .compatible = "allwinner,sun8i-r40-can",
.data = &sun4ican_quirks_r40 .data = &sun4ican_quirks_r40
}, {
.compatible = "allwinner,sun20i-d1-can",
.data = &sun4ican_quirks_d1
}, { }, {
/* sentinel */ /* sentinel */
}, },
...@@ -913,4 +923,4 @@ module_platform_driver(sun4i_can_driver); ...@@ -913,4 +923,4 @@ module_platform_driver(sun4i_can_driver);
MODULE_AUTHOR("Peter Chen <xingkongcp@gmail.com>"); MODULE_AUTHOR("Peter Chen <xingkongcp@gmail.com>");
MODULE_AUTHOR("Gerhard Bertelsmann <info@gerhard-bertelsmann.de>"); MODULE_AUTHOR("Gerhard Bertelsmann <info@gerhard-bertelsmann.de>");
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("CAN driver for Allwinner SoCs (A10/A20)"); MODULE_DESCRIPTION("CAN driver for Allwinner SoCs (A10/A20/D1)");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment