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
12 void hms30c7202_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg);
14 u16 hms30c7202_read_reg_w(const struct chip_t *pchip, unsigned reg);
16 #ifndef CONFIG_OC_LINCAN_DYNAMICIO
18 * optimized inline version, may it be, that it can be too fast for the chip
20 extern inline void c_can_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg)
22 u32 address = pchip->chip_base_addr + reg;
26 extern inline u16 c_can_read_reg_w(const struct chip_t *pchip, unsigned reg)
28 u32 address = pchip->chip_base_addr + reg;
29 return readw(address);
31 #else /*CONFIG_OC_LINCAN_DYNAMICIO*/
33 * the standard routines for register access cannot be used,
34 * because they work only with 8-bit peripherals
37 extern inline void c_can_write_reg_w(const struct chip_t *pchip, u16 data, unsigned reg)
39 hms30c7202_write_reg_w(pchip, data, reg);
42 extern inline u16 c_can_read_reg_w(const struct chip_t *pchip, unsigned reg)
44 return hms30c7202_read_reg_w(pchip, reg);
46 #endif /*CONFIG_OC_LINCAN_DYNAMICIO*/
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
53 int c_can_if1_busycheck(struct chip_t *pchip);
54 int c_can_if2_busycheck(struct chip_t *pchip);
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,
64 int c_can_use_mask(struct msgobj_t *pmsgobj,
66 int c_can_clear_objects(struct chip_t *pchip);
67 int c_can_config_irqs(struct chip_t *pchip,
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,
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);
80 int c_can_register(struct chipspecops_t *chipspecops);
82 void c_can_registerdump(struct chip_t *pchip);
84 void c_can_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj);
86 can_irqreturn_t c_can_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
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 */
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 */
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 */
128 /* Control register */
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
140 /* Status Register */
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
150 /* Status Register Last Error Codes */
151 enum c_can_BASIC_SRLEC
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
162 /* Error Counting Register */
165 EC_REP = 1<<15 // Receive Error Passive
168 /* Interrupt Register */
171 INT_NOINT = 0, // No Interrupt is pending
172 INT_STAT = 0x8000 // Status Interrupt
175 /* CAN Test Register */
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)
184 /* CAN Test Register TX Control*/
185 enum c_can_BASIC_TRTX
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
193 /* CAN Enable Register */
196 CE_EN = 1 // CAN Enable Bit
199 /* Interface X Command Request Register */
200 enum c_can_BASIC_IFXCR
202 IFXCR_BUSY = 1<<15 // Busy Flag (Write Access only when Busy='0')
205 /* Interface X Command Mask Register */
206 enum c_can_BASIC_IFXCM
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')
219 /* Interface X Mask 2 Register */
220 enum c_can_BASIC_IFXMSK2
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)
226 /* Interface X Arbitration 2 Register */
227 enum c_can_BASIC_IFXARB2
229 IFXARB2_DIR = 1<<13, // Message Direction (transmit='1')
230 IFXARB2_XTD = 1<<14, // Use Extended Identifier
231 IFXARB2_MVAL = 1<<15 // Message Validation
234 /* Interface X Message Control Register */
235 enum c_can_BASIC_IFXMC
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