Skip to content

Commit

Permalink
can: sun4i_can: Add acceptance register quirk
Browse files Browse the repository at this point in the history
The Allwinner D1's CAN controllers have the ACPC and ACPM registers
moved down. Compensate for this by adding an offset quirk for the
acceptance registers.

Signed-off-by: John Watts <[email protected]>
Link: https://lore.kernel.org/all/[email protected]
Signed-off-by: Marc Kleine-Budde <[email protected]>
  • Loading branch information
Jookia authored and marckleinebudde committed Jul 28, 2023
1 parent 6ea1ad8 commit 8cda0c6
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions drivers/net/can/sun4i_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,9 +205,11 @@
* struct sun4ican_quirks - Differences between SoC variants.
*
* @has_reset: SoC needs reset deasserted.
* @acp_offset: Offset of ACPC and ACPM registers
*/
struct sun4ican_quirks {
bool has_reset;
int acp_offset;
};

struct sun4ican_priv {
Expand All @@ -216,6 +218,7 @@ struct sun4ican_priv {
struct clk *clk;
struct reset_control *reset;
spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */
int acp_offset;
};

static const struct can_bittiming_const sun4ican_bittiming_const = {
Expand Down Expand Up @@ -338,8 +341,8 @@ static int sun4i_can_start(struct net_device *dev)
}

/* set filters - we accept all */
writel(0x00000000, priv->base + SUN4I_REG_ACPC_ADDR);
writel(0xFFFFFFFF, priv->base + SUN4I_REG_ACPM_ADDR);
writel(0x00000000, priv->base + SUN4I_REG_ACPC_ADDR + priv->acp_offset);
writel(0xFFFFFFFF, priv->base + SUN4I_REG_ACPM_ADDR + priv->acp_offset);

/* clear error counters and error code capture */
writel(0, priv->base + SUN4I_REG_ERRC_ADDR);
Expand Down Expand Up @@ -768,10 +771,12 @@ static const struct ethtool_ops sun4ican_ethtool_ops = {

static const struct sun4ican_quirks sun4ican_quirks_a10 = {
.has_reset = false,
.acp_offset = 0,
};

static const struct sun4ican_quirks sun4ican_quirks_r40 = {
.has_reset = true,
.acp_offset = 0,
};

static const struct of_device_id sun4ican_of_match[] = {
Expand Down Expand Up @@ -870,6 +875,7 @@ static int sun4ican_probe(struct platform_device *pdev)
priv->base = addr;
priv->clk = clk;
priv->reset = reset;
priv->acp_offset = quirks->acp_offset;
spin_lock_init(&priv->cmdreg_lock);

platform_set_drvdata(pdev, dev);
Expand Down

0 comments on commit 8cda0c6

Please sign in to comment.