|
@@ -22,96 +22,13 @@
|
|
#include <linux/can/dev.h>
|
|
#include <linux/can/dev.h>
|
|
#include <linux/can/error.h>
|
|
#include <linux/can/error.h>
|
|
|
|
|
|
|
|
+#include <asm/bfin_can.h>
|
|
#include <asm/portmux.h>
|
|
#include <asm/portmux.h>
|
|
|
|
|
|
#define DRV_NAME "bfin_can"
|
|
#define DRV_NAME "bfin_can"
|
|
#define BFIN_CAN_TIMEOUT 100
|
|
#define BFIN_CAN_TIMEOUT 100
|
|
#define TX_ECHO_SKB_MAX 1
|
|
#define TX_ECHO_SKB_MAX 1
|
|
|
|
|
|
-/*
|
|
|
|
- * transmit and receive channels
|
|
|
|
- */
|
|
|
|
-#define TRANSMIT_CHL 24
|
|
|
|
-#define RECEIVE_STD_CHL 0
|
|
|
|
-#define RECEIVE_EXT_CHL 4
|
|
|
|
-#define RECEIVE_RTR_CHL 8
|
|
|
|
-#define RECEIVE_EXT_RTR_CHL 12
|
|
|
|
-#define MAX_CHL_NUMBER 32
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * bfin can registers layout
|
|
|
|
- */
|
|
|
|
-struct bfin_can_mask_regs {
|
|
|
|
- u16 aml;
|
|
|
|
- u16 dummy1;
|
|
|
|
- u16 amh;
|
|
|
|
- u16 dummy2;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-struct bfin_can_channel_regs {
|
|
|
|
- u16 data[8];
|
|
|
|
- u16 dlc;
|
|
|
|
- u16 dummy1;
|
|
|
|
- u16 tsv;
|
|
|
|
- u16 dummy2;
|
|
|
|
- u16 id0;
|
|
|
|
- u16 dummy3;
|
|
|
|
- u16 id1;
|
|
|
|
- u16 dummy4;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-struct bfin_can_regs {
|
|
|
|
- /*
|
|
|
|
- * global control and status registers
|
|
|
|
- */
|
|
|
|
- u16 mc1; /* offset 0 */
|
|
|
|
- u16 dummy1;
|
|
|
|
- u16 md1; /* offset 4 */
|
|
|
|
- u16 rsv1[13];
|
|
|
|
- u16 mbtif1; /* offset 0x20 */
|
|
|
|
- u16 dummy2;
|
|
|
|
- u16 mbrif1; /* offset 0x24 */
|
|
|
|
- u16 dummy3;
|
|
|
|
- u16 mbim1; /* offset 0x28 */
|
|
|
|
- u16 rsv2[11];
|
|
|
|
- u16 mc2; /* offset 0x40 */
|
|
|
|
- u16 dummy4;
|
|
|
|
- u16 md2; /* offset 0x44 */
|
|
|
|
- u16 dummy5;
|
|
|
|
- u16 trs2; /* offset 0x48 */
|
|
|
|
- u16 rsv3[11];
|
|
|
|
- u16 mbtif2; /* offset 0x60 */
|
|
|
|
- u16 dummy6;
|
|
|
|
- u16 mbrif2; /* offset 0x64 */
|
|
|
|
- u16 dummy7;
|
|
|
|
- u16 mbim2; /* offset 0x68 */
|
|
|
|
- u16 rsv4[11];
|
|
|
|
- u16 clk; /* offset 0x80 */
|
|
|
|
- u16 dummy8;
|
|
|
|
- u16 timing; /* offset 0x84 */
|
|
|
|
- u16 rsv5[3];
|
|
|
|
- u16 status; /* offset 0x8c */
|
|
|
|
- u16 dummy9;
|
|
|
|
- u16 cec; /* offset 0x90 */
|
|
|
|
- u16 dummy10;
|
|
|
|
- u16 gis; /* offset 0x94 */
|
|
|
|
- u16 dummy11;
|
|
|
|
- u16 gim; /* offset 0x98 */
|
|
|
|
- u16 rsv6[3];
|
|
|
|
- u16 ctrl; /* offset 0xa0 */
|
|
|
|
- u16 dummy12;
|
|
|
|
- u16 intr; /* offset 0xa4 */
|
|
|
|
- u16 rsv7[7];
|
|
|
|
- u16 esr; /* offset 0xb4 */
|
|
|
|
- u16 rsv8[37];
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * channel(mailbox) mask and message registers
|
|
|
|
- */
|
|
|
|
- struct bfin_can_mask_regs msk[MAX_CHL_NUMBER]; /* offset 0x100 */
|
|
|
|
- struct bfin_can_channel_regs chl[MAX_CHL_NUMBER]; /* offset 0x200 */
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* bfin can private data
|
|
* bfin can private data
|
|
*/
|
|
*/
|
|
@@ -163,7 +80,7 @@ static int bfin_can_set_bittiming(struct net_device *dev)
|
|
if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
|
|
if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
|
|
timing |= SAM;
|
|
timing |= SAM;
|
|
|
|
|
|
- bfin_write16(®->clk, clk);
|
|
|
|
|
|
+ bfin_write16(®->clock, clk);
|
|
bfin_write16(®->timing, timing);
|
|
bfin_write16(®->timing, timing);
|
|
|
|
|
|
dev_info(dev->dev.parent, "setting CLOCK=0x%04x TIMING=0x%04x\n",
|
|
dev_info(dev->dev.parent, "setting CLOCK=0x%04x TIMING=0x%04x\n",
|
|
@@ -185,11 +102,11 @@ static void bfin_can_set_reset_mode(struct net_device *dev)
|
|
bfin_write16(®->gim, 0);
|
|
bfin_write16(®->gim, 0);
|
|
|
|
|
|
/* reset can and enter configuration mode */
|
|
/* reset can and enter configuration mode */
|
|
- bfin_write16(®->ctrl, SRS | CCR);
|
|
|
|
|
|
+ bfin_write16(®->control, SRS | CCR);
|
|
SSYNC();
|
|
SSYNC();
|
|
- bfin_write16(®->ctrl, CCR);
|
|
|
|
|
|
+ bfin_write16(®->control, CCR);
|
|
SSYNC();
|
|
SSYNC();
|
|
- while (!(bfin_read16(®->ctrl) & CCA)) {
|
|
|
|
|
|
+ while (!(bfin_read16(®->control) & CCA)) {
|
|
udelay(10);
|
|
udelay(10);
|
|
if (--timeout == 0) {
|
|
if (--timeout == 0) {
|
|
dev_err(dev->dev.parent,
|
|
dev_err(dev->dev.parent,
|
|
@@ -244,7 +161,7 @@ static void bfin_can_set_normal_mode(struct net_device *dev)
|
|
/*
|
|
/*
|
|
* leave configuration mode
|
|
* leave configuration mode
|
|
*/
|
|
*/
|
|
- bfin_write16(®->ctrl, bfin_read16(®->ctrl) & ~CCR);
|
|
|
|
|
|
+ bfin_write16(®->control, bfin_read16(®->control) & ~CCR);
|
|
|
|
|
|
while (bfin_read16(®->status) & CCA) {
|
|
while (bfin_read16(®->status) & CCA) {
|
|
udelay(10);
|
|
udelay(10);
|
|
@@ -726,7 +643,7 @@ static int bfin_can_suspend(struct platform_device *pdev, pm_message_t mesg)
|
|
|
|
|
|
if (netif_running(dev)) {
|
|
if (netif_running(dev)) {
|
|
/* enter sleep mode */
|
|
/* enter sleep mode */
|
|
- bfin_write16(®->ctrl, bfin_read16(®->ctrl) | SMR);
|
|
|
|
|
|
+ bfin_write16(®->control, bfin_read16(®->control) | SMR);
|
|
SSYNC();
|
|
SSYNC();
|
|
while (!(bfin_read16(®->intr) & SMACK)) {
|
|
while (!(bfin_read16(®->intr) & SMACK)) {
|
|
udelay(10);
|
|
udelay(10);
|