0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef __MSCAN_H__
0010 #define __MSCAN_H__
0011
0012 #include <linux/clk.h>
0013 #include <linux/types.h>
0014
0015
0016 #define MSCAN_RXFRM 0x80
0017 #define MSCAN_RXACT 0x40
0018 #define MSCAN_CSWAI 0x20
0019 #define MSCAN_SYNCH 0x10
0020 #define MSCAN_TIME 0x08
0021 #define MSCAN_WUPE 0x04
0022 #define MSCAN_SLPRQ 0x02
0023 #define MSCAN_INITRQ 0x01
0024
0025
0026 #define MSCAN_CANE 0x80
0027 #define MSCAN_CLKSRC 0x40
0028 #define MSCAN_LOOPB 0x20
0029 #define MSCAN_LISTEN 0x10
0030 #define MSCAN_BORM 0x08
0031 #define MSCAN_WUPM 0x04
0032 #define MSCAN_SLPAK 0x02
0033 #define MSCAN_INITAK 0x01
0034
0035
0036 #ifdef CONFIG_PPC
0037 #define MSCAN_FOR_MPC5XXX
0038 #endif
0039
0040 #ifdef MSCAN_FOR_MPC5XXX
0041 #define MSCAN_CLKSRC_BUS 0
0042 #define MSCAN_CLKSRC_XTAL MSCAN_CLKSRC
0043 #define MSCAN_CLKSRC_IPS MSCAN_CLKSRC
0044 #else
0045 #define MSCAN_CLKSRC_BUS MSCAN_CLKSRC
0046 #define MSCAN_CLKSRC_XTAL 0
0047 #endif
0048
0049
0050 #define MSCAN_WUPIF 0x80
0051 #define MSCAN_CSCIF 0x40
0052 #define MSCAN_RSTAT1 0x20
0053 #define MSCAN_RSTAT0 0x10
0054 #define MSCAN_TSTAT1 0x08
0055 #define MSCAN_TSTAT0 0x04
0056 #define MSCAN_OVRIF 0x02
0057 #define MSCAN_RXF 0x01
0058 #define MSCAN_ERR_IF (MSCAN_OVRIF | MSCAN_CSCIF)
0059 #define MSCAN_RSTAT_MSK (MSCAN_RSTAT1 | MSCAN_RSTAT0)
0060 #define MSCAN_TSTAT_MSK (MSCAN_TSTAT1 | MSCAN_TSTAT0)
0061 #define MSCAN_STAT_MSK (MSCAN_RSTAT_MSK | MSCAN_TSTAT_MSK)
0062
0063 #define MSCAN_STATE_BUS_OFF (MSCAN_RSTAT1 | MSCAN_RSTAT0 | \
0064 MSCAN_TSTAT1 | MSCAN_TSTAT0)
0065 #define MSCAN_STATE_TX(canrflg) (((canrflg)&MSCAN_TSTAT_MSK)>>2)
0066 #define MSCAN_STATE_RX(canrflg) (((canrflg)&MSCAN_RSTAT_MSK)>>4)
0067 #define MSCAN_STATE_ACTIVE 0
0068 #define MSCAN_STATE_WARNING 1
0069 #define MSCAN_STATE_PASSIVE 2
0070 #define MSCAN_STATE_BUSOFF 3
0071
0072
0073 #define MSCAN_WUPIE 0x80
0074 #define MSCAN_CSCIE 0x40
0075 #define MSCAN_RSTATE1 0x20
0076 #define MSCAN_RSTATE0 0x10
0077 #define MSCAN_TSTATE1 0x08
0078 #define MSCAN_TSTATE0 0x04
0079 #define MSCAN_OVRIE 0x02
0080 #define MSCAN_RXFIE 0x01
0081
0082
0083 #define MSCAN_TXE2 0x04
0084 #define MSCAN_TXE1 0x02
0085 #define MSCAN_TXE0 0x01
0086 #define MSCAN_TXE (MSCAN_TXE2 | MSCAN_TXE1 | MSCAN_TXE0)
0087
0088
0089 #define MSCAN_TXIE2 0x04
0090 #define MSCAN_TXIE1 0x02
0091 #define MSCAN_TXIE0 0x01
0092 #define MSCAN_TXIE (MSCAN_TXIE2 | MSCAN_TXIE1 | MSCAN_TXIE0)
0093
0094
0095 #define MSCAN_ABTRQ2 0x04
0096 #define MSCAN_ABTRQ1 0x02
0097 #define MSCAN_ABTRQ0 0x01
0098
0099
0100 #define MSCAN_ABTAK2 0x04
0101 #define MSCAN_ABTAK1 0x02
0102 #define MSCAN_ABTAK0 0x01
0103
0104
0105 #define MSCAN_TX2 0x04
0106 #define MSCAN_TX1 0x02
0107 #define MSCAN_TX0 0x01
0108
0109
0110 #define MSCAN_IDAM1 0x20
0111 #define MSCAN_IDAM0 0x10
0112 #define MSCAN_IDHIT2 0x04
0113 #define MSCAN_IDHIT1 0x02
0114 #define MSCAN_IDHIT0 0x01
0115
0116 #define MSCAN_AF_32BIT 0x00
0117 #define MSCAN_AF_16BIT MSCAN_IDAM0
0118 #define MSCAN_AF_8BIT MSCAN_IDAM1
0119 #define MSCAN_AF_CLOSED (MSCAN_IDAM0|MSCAN_IDAM1)
0120 #define MSCAN_AF_MASK (~(MSCAN_IDAM0|MSCAN_IDAM1))
0121
0122
0123 #define MSCAN_BOHOLD 0x01
0124
0125
0126 #define MSCAN_SFF_RTR_SHIFT 4
0127 #define MSCAN_EFF_RTR_SHIFT 0
0128 #define MSCAN_EFF_FLAGS 0x18
0129
0130 #ifdef MSCAN_FOR_MPC5XXX
0131 #define _MSCAN_RESERVED_(n, num) u8 _res##n[num]
0132 #define _MSCAN_RESERVED_DSR_SIZE 2
0133 #else
0134 #define _MSCAN_RESERVED_(n, num)
0135 #define _MSCAN_RESERVED_DSR_SIZE 0
0136 #endif
0137
0138
0139 struct mscan_regs {
0140
0141 u8 canctl0;
0142 u8 canctl1;
0143 _MSCAN_RESERVED_(1, 2);
0144 u8 canbtr0;
0145 u8 canbtr1;
0146 _MSCAN_RESERVED_(2, 2);
0147 u8 canrflg;
0148 u8 canrier;
0149 _MSCAN_RESERVED_(3, 2);
0150 u8 cantflg;
0151 u8 cantier;
0152 _MSCAN_RESERVED_(4, 2);
0153 u8 cantarq;
0154 u8 cantaak;
0155 _MSCAN_RESERVED_(5, 2);
0156 u8 cantbsel;
0157 u8 canidac;
0158 u8 reserved;
0159 _MSCAN_RESERVED_(6, 2);
0160 u8 canmisc;
0161 _MSCAN_RESERVED_(7, 2);
0162 u8 canrxerr;
0163 u8 cantxerr;
0164 _MSCAN_RESERVED_(8, 2);
0165 u16 canidar1_0;
0166 _MSCAN_RESERVED_(9, 2);
0167 u16 canidar3_2;
0168 _MSCAN_RESERVED_(10, 2);
0169 u16 canidmr1_0;
0170 _MSCAN_RESERVED_(11, 2);
0171 u16 canidmr3_2;
0172 _MSCAN_RESERVED_(12, 2);
0173 u16 canidar5_4;
0174 _MSCAN_RESERVED_(13, 2);
0175 u16 canidar7_6;
0176 _MSCAN_RESERVED_(14, 2);
0177 u16 canidmr5_4;
0178 _MSCAN_RESERVED_(15, 2);
0179 u16 canidmr7_6;
0180 _MSCAN_RESERVED_(16, 2);
0181 struct {
0182 u16 idr1_0;
0183 _MSCAN_RESERVED_(17, 2);
0184 u16 idr3_2;
0185 _MSCAN_RESERVED_(18, 2);
0186 u16 dsr1_0;
0187 _MSCAN_RESERVED_(19, 2);
0188 u16 dsr3_2;
0189 _MSCAN_RESERVED_(20, 2);
0190 u16 dsr5_4;
0191 _MSCAN_RESERVED_(21, 2);
0192 u16 dsr7_6;
0193 _MSCAN_RESERVED_(22, 2);
0194 u8 dlr;
0195 u8 reserved;
0196 _MSCAN_RESERVED_(23, 2);
0197 u16 time;
0198 } rx;
0199 _MSCAN_RESERVED_(24, 2);
0200 struct {
0201 u16 idr1_0;
0202 _MSCAN_RESERVED_(25, 2);
0203 u16 idr3_2;
0204 _MSCAN_RESERVED_(26, 2);
0205 u16 dsr1_0;
0206 _MSCAN_RESERVED_(27, 2);
0207 u16 dsr3_2;
0208 _MSCAN_RESERVED_(28, 2);
0209 u16 dsr5_4;
0210 _MSCAN_RESERVED_(29, 2);
0211 u16 dsr7_6;
0212 _MSCAN_RESERVED_(30, 2);
0213 u8 dlr;
0214 u8 tbpr;
0215 _MSCAN_RESERVED_(31, 2);
0216 u16 time;
0217 } tx;
0218 _MSCAN_RESERVED_(32, 2);
0219 } __packed;
0220
0221 #undef _MSCAN_RESERVED_
0222 #define MSCAN_REGION sizeof(struct mscan)
0223
0224 #define MSCAN_NORMAL_MODE 0
0225 #define MSCAN_SLEEP_MODE MSCAN_SLPRQ
0226 #define MSCAN_INIT_MODE (MSCAN_INITRQ | MSCAN_SLPRQ)
0227 #define MSCAN_POWEROFF_MODE (MSCAN_CSWAI | MSCAN_SLPRQ)
0228 #define MSCAN_SET_MODE_RETRIES 255
0229 #define MSCAN_ECHO_SKB_MAX 3
0230 #define MSCAN_RX_INTS_ENABLE (MSCAN_OVRIE | MSCAN_RXFIE | MSCAN_CSCIE | \
0231 MSCAN_RSTATE1 | MSCAN_RSTATE0 | \
0232 MSCAN_TSTATE1 | MSCAN_TSTATE0)
0233
0234
0235 enum {
0236 MSCAN_TYPE_MPC5200,
0237 MSCAN_TYPE_MPC5121
0238 };
0239
0240 #define BTR0_BRP_MASK 0x3f
0241 #define BTR0_SJW_SHIFT 6
0242 #define BTR0_SJW_MASK (0x3 << BTR0_SJW_SHIFT)
0243
0244 #define BTR1_TSEG1_MASK 0xf
0245 #define BTR1_TSEG2_SHIFT 4
0246 #define BTR1_TSEG2_MASK (0x7 << BTR1_TSEG2_SHIFT)
0247 #define BTR1_SAM_SHIFT 7
0248
0249 #define BTR0_SET_BRP(brp) (((brp) - 1) & BTR0_BRP_MASK)
0250 #define BTR0_SET_SJW(sjw) ((((sjw) - 1) << BTR0_SJW_SHIFT) & \
0251 BTR0_SJW_MASK)
0252
0253 #define BTR1_SET_TSEG1(tseg1) (((tseg1) - 1) & BTR1_TSEG1_MASK)
0254 #define BTR1_SET_TSEG2(tseg2) ((((tseg2) - 1) << BTR1_TSEG2_SHIFT) & \
0255 BTR1_TSEG2_MASK)
0256 #define BTR1_SET_SAM(sam) ((sam) ? 1 << BTR1_SAM_SHIFT : 0)
0257
0258 #define F_RX_PROGRESS 0
0259 #define F_TX_PROGRESS 1
0260 #define F_TX_WAIT_ALL 2
0261
0262 #define TX_QUEUE_SIZE 3
0263
0264 struct tx_queue_entry {
0265 struct list_head list;
0266 u8 mask;
0267 u8 id;
0268 };
0269
0270 struct mscan_priv {
0271 struct can_priv can;
0272 unsigned int type;
0273 unsigned long flags;
0274 void __iomem *reg_base;
0275 struct clk *clk_ipg;
0276 struct clk *clk_can;
0277 u8 shadow_statflg;
0278 u8 shadow_canrier;
0279 u8 cur_pri;
0280 u8 prev_buf_id;
0281 u8 tx_active;
0282
0283 struct list_head tx_head;
0284 struct tx_queue_entry tx_queue[TX_QUEUE_SIZE];
0285 struct napi_struct napi;
0286 };
0287
0288 struct net_device *alloc_mscandev(void);
0289 int register_mscandev(struct net_device *dev, int mscan_clksrc);
0290 void unregister_mscandev(struct net_device *dev);
0291
0292 #endif