The first phase of integration of Hynix HMS30c7202 C_CAN support
[lincan.git] / lincan / include / c_can.h
1 /* c_can.h - Hynix HMS30c7202 ARM generic C_CAN module handling
2  * Linux CAN-bus device driver.
3  * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
4  * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
5  * and Ake Hedman, eurosource, akhe@eurosource.se
6  * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
7  * email:pisa@cmp.felk.cvut.cz
8  * This software is released under the GPL-License.
9  * Version lincan-0.2  9 Jul 2003
10  */
11
12 void hms30c7202_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg);
13
14 u16 hms30c7202_read_reg_w(const struct chip_t *pchip, unsigned reg);
15
16 #ifndef CONFIG_OC_LINCAN_DYNAMICIO
17 /* 
18  * optimized inline version, may it be, that it can be too fast for the chip
19  */
20 extern inline void c_can_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg)
21 {
22         u32 address = pchip->chip_base_addr + reg;
23         writew(data,address);
24 }
25
26 extern inline u16 c_can_read_reg_w(const struct chip_t *pchip, unsigned reg)
27 {
28         u32 address = pchip->chip_base_addr + reg;
29         return readw(address);
30 }
31 #else /*CONFIG_OC_LINCAN_DYNAMICIO*/
32 /* 
33  * the standard routines for register access cannot be used,
34  * because they work only with 8-bit peripherals
35  */
36
37 extern inline void c_can_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg)
38 {
39         hms30c7202_write_reg_w(pchip, data, reg);
40 }
41
42 extern inline u16 c_can_read_reg_w(const struct chip_t *pchip, unsigned reg)
43 {
44         return hms30c7202_read_reg_w(pchip, reg);
45 }
46 #endif /*CONFIG_OC_LINCAN_DYNAMICIO*/
47
48 extern can_spinlock_t c_can_spwlock; // Spin lock for write operations
49 extern can_spinlock_t c_can_sprlock; // Spin lock for read operations
50 extern can_spinlock_t c_can_if1lock; // spin lock for the if1 register
51 extern can_spinlock_t c_can_if2lock; // spin lcok for the if2 register
52
53 int c_can_if1_busycheck(struct chip_t *pchip);
54 int c_can_if2_busycheck(struct chip_t *pchip);
55
56 int c_can_enable_configuration(struct chip_t *pchip);
57 int c_can_disable_configuration(struct chip_t *pchip);
58 int c_can_chip_config(struct chip_t *pchip);
59 int c_can_baud_rate(struct chip_t *chip, int rate, int clock,
60                         int sjw, int sampl_pt, int flags);
61 int c_can_mask(struct msgobj_t *pmsgobj,
62                u32 mask,
63                u16 usedirbit);
64 int c_can_use_mask(struct msgobj_t *pmsgobj,
65                    u16 useflag);
66 int c_can_clear_objects(struct chip_t *pchip);
67 int c_can_config_irqs(struct chip_t *pchip,
68                       u16 irqs);
69 int c_can_pre_read_config(struct chip_t *chip, struct msgobj_t *obj);
70 int c_can_send_msg(struct chip_t *pchip, struct msgobj_t *pmsgobj,
71                         struct canmsg_t *pmsg);
72 int c_can_remote_request(struct chip_t *pchip, struct msgobj_t *pmsgobj );
73 int c_can_set_btregs(struct chip_t *chip,
74                      u16 btr0,
75                      u16 btr1);
76 int c_can_start_chip(struct chip_t *pchip);
77 int c_can_stop_chip(struct chip_t *pchip);
78 int c_can_check_tx_stat(struct chip_t *pchip);
79
80 int c_can_register(struct chipspecops_t *chipspecops);
81
82 void c_can_registerdump(struct chip_t *pchip);
83
84 void c_can_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj);
85
86 can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
87
88 /* BasicCAN mode address map */
89 #define CCCR      0x0000        /* Control Register */
90 #define CCSR            0x0004  /* Status Register */
91 #define CCEC            0x0008  /* Error Counting Register */
92 #define CCBT            0x000C  /* Bit Timing Register */
93 #define CCINTR          0x0010  /* Interrupt Register */
94 #define CCTR            0x0014  /* Test Register */
95 #define CCBRPE  0x0018  /* Baud Rate Prescaler Extension Register */
96 #define CCCE            0x001C  /* CAN Enable Register */
97 #define CCTREQ1         0x0100  /* Transmission Request 1 Register */
98 #define CCTREQ2         0x0104  /* Transmission Request 2 Register */
99 #define CCND1      0x0120       /* New Data 1 Register */
100 #define CCND2      0x0124       /* New Data 2 Register */
101 #define CCINTP1         0x0140  /* Interrupt Pending 1 Register */
102 #define CCINTP2         0x0144  /* Interrupt Pending 2 Register */
103
104 #define CCIF1CR 0x0020  /* Interface 1 Command Request Register */
105 #define CCIF1CM 0x0024  /* IF1 Command Mask Register */
106 #define CCIF1M1 0x0028  /* IF1 Mask 1 Register */
107 #define CCIF1M2 0x002C  /* IF1 Mask 2 Register */
108 #define CCIF1A1 0x0030  /* IF1 Arbitration 1 Register */
109 #define CCIF1A2 0x0034  /* IF1 Arbitration 2 Register */
110 #define CCIF1DMC        0x0038  /* IF1 Message Control Register */
111 #define CCIF1DA1        0x003C  /* IF1 Data A 1 Register */
112 #define CCIF1DA2        0x0040  /* IF1 Data A 2 Register */
113 #define CCIF1DB1        0x0044  /* IF1 Data B 1 Register */
114 #define CCIF1DB2        0x0048  /* IF1 Data B 2 Register */
115
116 #define CCIF2CR 0x0080  /* Interface 2 Command Request Register */
117 #define CCIF2CM 0x0084  /* IF2 Command Mask Register */
118 #define CCIF2M1 0x0088  /* IF2 Mask 1 Register */
119 #define CCIF2M2 0x008C  /* IF2 Mask 2 Register */
120 #define CCIF2A1 0x0090  /* IF2 Arbitration 1 Register */
121 #define CCIF2A2 0x0094  /* IF2 Arbitration 2 Register */
122 #define CCIF2DMC        0x0098  /* IF2 Message Control Register */
123 #define CCIF2DA1        0x009C  /* IF2 Data A 1 Register */
124 #define CCIF2DA2        0x00A0  /* IF2 Data A 2 Register */
125 #define CCIF2DB1        0x00A4  /* IF2 Data B 1 Register */
126 #define CCIF2DB2        0x00A8  /* IF2 Data B 2 Register */
127
128 /* Control register */
129 enum c_can_BASIC_CR
130 {
131    CR_INIT = 1,         // Internal Initialization Pending
132      CR_MIE  = 1<<1,  // Module Interrupt Enable
133      CR_SIE  = 1<<2,    // Status-change Interrupt Enable
134      CR_EIE  = 1<<3,    // Error Interrupt Enable
135      CR_DAR  = 1<<5,    // Disable Automatic Retransmission
136      CR_CCE  = 1<<6,  // Configuration Change Enable
137      CR_TEST = 1<<7   // Test Mode Enable
138 };
139
140 /* Status Register */
141 enum c_can_BASIC_SR
142 {
143    SR_TXOK  = 1<<3,     // Transmitted a Message Successfully
144      SR_RXOK  = 1<<4,   // Received a Message Successfully
145      SR_EPASS = 1<<5,   // Error Passive
146      SR_EWARN = 1<<6,   // Error Warning Status
147      SR_BOFF  = 1<<7,  // Bus Off Status
148 };
149
150 /* Status Register Last Error Codes */
151 enum c_can_BASIC_SRLEC
152 {
153    SRLEC_NE = 0,     // Last Error Code: No Error
154      SRLEC_SE = 1,     // LEC: Stuff Error
155      SRLEC_FE = 2,     // LEC: Form Error
156      SRLEC_AE = 3,     // LEC: Acknowledgement Error
157      SRLEC_B1 = 4,     // LEC: Bit1 Error
158      SRLEC_B0 = 5,     // LEC: Bit0 Error
159      SRLEC_CR = 6      // LEC: CRC Error
160 };
161
162 /* Error Counting Register */
163 enum c_can_BASIC_EC
164 {
165    EC_REP = 1<<15               // Receive Error Passive
166 };
167
168 /* Interrupt Register */
169 enum c_can_BASIC_INT
170 {
171    INT_NOINT = 0,                  // No Interrupt is pending
172      INT_STAT  = 0x8000   // Status Interrupt
173 };
174
175 /* CAN Test Register */
176 enum c_can_BASIC_TR
177 {
178    TR_BASIC = 1<<2,  // Basic Mode
179      TR_SLNT  = 1<<3,  // Silent Mode
180      TR_LOOPB = 1<<4,  // Loop Back Mode
181      TR_RX    = 1<<7   // Receive (CAN_RX Pin)
182 };
183
184 /* CAN Test Register TX Control*/
185 enum c_can_BASIC_TRTX
186 {
187    TRTX_RST = 0,     // Reset value, CAN_TX is controlled by the CAN Core
188      TRTX_MON = 1,     // Sample Point can be monitored at CAN_TX pin
189      TRTX_DOM = 2,     // CAN_TX pin drives a dominant('0') value
190      TRTX_REC = 3      // CAN_TX pin drives a recessive('1') value
191 };
192
193 /* CAN Enable Register */
194 enum c_can_BASIC_CE
195 {
196    CE_EN  = 1                   // CAN Enable Bit
197 };
198
199 /* Interface X Command Request Register */
200 enum c_can_BASIC_IFXCR
201 {
202    IFXCR_BUSY = 1<<15   // Busy Flag (Write Access only when Busy='0')
203 };
204
205 /* Interface X Command Mask Register */
206 enum c_can_BASIC_IFXCM
207 {
208    IFXCM_DB        = 1,         // R/W Data Byte 4-7
209      IFXCM_DA        = 1<<1,    // R/W Data Byte 0-3
210      IFXCM_TRND      = 1<<2,    // Transmit Request (WRRD=1) or Reset New Date Bit (WRRD=0)
211      IFXCM_CLRINTPND = 1<<3,    // Clear Interrupt Pending Bit when reading the Message Object
212      IFXCM_CNTRL     = 1<<4,    // Access Interface X Message Control Bits
213      IFXCM_ARB       = 1<<5,    // Access Interface X Arbitration
214      IFXCM_MASK      = 1<<6,    // Access Interface X Mask Bits
215      IFXCM_WRRD      = 1<<7     // Read/Write (write data from Interface Registers to Message Object if ='1')
216      //            (read data from Message Object to Interface Registers if ='0')
217 };
218
219 /* Interface X Mask 2 Register */
220 enum c_can_BASIC_IFXMSK2
221 {
222    IFXMSK2_MDIR = 1<<14, // Mask Message Direction (message direction bit(RTR) used for acceptance filt. or not)
223      IFXMSK2_MXTD = 1<<15  // Mask Extended Identifier (extended id bit(IDE) used for acceptance filt. or not)
224 };
225
226 /* Interface X Arbitration 2 Register */
227 enum c_can_BASIC_IFXARB2
228 {
229    IFXARB2_DIR  = 1<<13,  // Message Direction (transmit='1')
230      IFXARB2_XTD  = 1<<14,  // Use Extended Identifier
231      IFXARB2_MVAL = 1<<15   // Message Validation
232 };
233
234 /* Interface X Message Control Register */
235 enum c_can_BASIC_IFXMC
236 {
237    IFXMC_EOB    = 1<<7,    // End of Buffer (marks last Message Object of FIFO Buffer)
238      IFXMC_TXRQST = 1<<8,    // Transmit Request
239      IFXMC_RMTEN  = 1<<9,    // Remote Enable
240      IFXMC_RXIE   = 1<<10,   // Receive Interrupt Enable
241      IFXMC_TXIE   = 1<<11,   // Transmit Interrupt Enable
242      IFXMC_UMASK  = 1<<12,   // Use Identifier Mask
243      IFXMC_INTPND = 1<<13,   // Interrupt Pending
244      IFXMC_MSGLST = 1<<14,   // Message Lost (Only valid for direction = receive)
245      IFXMC_NEWDAT = 1<<15    // New Data
246 };
247