can: sun4i_can: Add support for the Allwinner D1

[ 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>
This commit is contained in:
John Watts 2023-07-22 08:15:53 +10:00 committed by Greg Kroah-Hartman
parent 4eb79abf91
commit ab0ae0af0a
2 changed files with 13 additions and 3 deletions

View File

@ -174,10 +174,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.

View File

@ -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 = {
.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[] = {
}, { }, {
.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 */
}, },
@ -915,4 +925,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)");