1429da1ccSWolfgang Grandegger /* 2429da1ccSWolfgang Grandegger * sja1000.h - Philips SJA1000 network device driver 3429da1ccSWolfgang Grandegger * 4429da1ccSWolfgang Grandegger * Copyright (c) 2003 Matthias Brukner, Trajet Gmbh, Rebenring 33, 5429da1ccSWolfgang Grandegger * 38106 Braunschweig, GERMANY 6429da1ccSWolfgang Grandegger * 7429da1ccSWolfgang Grandegger * Copyright (c) 2002-2007 Volkswagen Group Electronic Research 8429da1ccSWolfgang Grandegger * All rights reserved. 9429da1ccSWolfgang Grandegger * 10429da1ccSWolfgang Grandegger * Redistribution and use in source and binary forms, with or without 11429da1ccSWolfgang Grandegger * modification, are permitted provided that the following conditions 12429da1ccSWolfgang Grandegger * are met: 13429da1ccSWolfgang Grandegger * 1. Redistributions of source code must retain the above copyright 14429da1ccSWolfgang Grandegger * notice, this list of conditions and the following disclaimer. 15429da1ccSWolfgang Grandegger * 2. Redistributions in binary form must reproduce the above copyright 16429da1ccSWolfgang Grandegger * notice, this list of conditions and the following disclaimer in the 17429da1ccSWolfgang Grandegger * documentation and/or other materials provided with the distribution. 18429da1ccSWolfgang Grandegger * 3. Neither the name of Volkswagen nor the names of its contributors 19429da1ccSWolfgang Grandegger * may be used to endorse or promote products derived from this software 20429da1ccSWolfgang Grandegger * without specific prior written permission. 21429da1ccSWolfgang Grandegger * 22429da1ccSWolfgang Grandegger * Alternatively, provided that this notice is retained in full, this 23429da1ccSWolfgang Grandegger * software may be distributed under the terms of the GNU General 24429da1ccSWolfgang Grandegger * Public License ("GPL") version 2, in which case the provisions of the 25429da1ccSWolfgang Grandegger * GPL apply INSTEAD OF those given above. 26429da1ccSWolfgang Grandegger * 27429da1ccSWolfgang Grandegger * The provided data structures and external interfaces from this code 28429da1ccSWolfgang Grandegger * are not restricted to be used by modules with a GPL compatible license. 29429da1ccSWolfgang Grandegger * 30429da1ccSWolfgang Grandegger * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 31429da1ccSWolfgang Grandegger * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 32429da1ccSWolfgang Grandegger * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 33429da1ccSWolfgang Grandegger * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 34429da1ccSWolfgang Grandegger * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 35429da1ccSWolfgang Grandegger * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 36429da1ccSWolfgang Grandegger * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 37429da1ccSWolfgang Grandegger * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 38429da1ccSWolfgang Grandegger * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 39429da1ccSWolfgang Grandegger * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 40429da1ccSWolfgang Grandegger * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 41429da1ccSWolfgang Grandegger * DAMAGE. 42429da1ccSWolfgang Grandegger * 43429da1ccSWolfgang Grandegger * Send feedback to <socketcan-users@lists.berlios.de> 44429da1ccSWolfgang Grandegger * 45429da1ccSWolfgang Grandegger */ 46429da1ccSWolfgang Grandegger 47429da1ccSWolfgang Grandegger #ifndef SJA1000_DEV_H 48429da1ccSWolfgang Grandegger #define SJA1000_DEV_H 49429da1ccSWolfgang Grandegger 50*a6b7a407SAlexey Dobriyan #include <linux/irqreturn.h> 51429da1ccSWolfgang Grandegger #include <linux/can/dev.h> 52429da1ccSWolfgang Grandegger #include <linux/can/platform/sja1000.h> 53429da1ccSWolfgang Grandegger 54a6e4bc53SWolfgang Grandegger #define SJA1000_ECHO_SKB_MAX 1 /* the SJA1000 has one TX buffer object */ 55a6e4bc53SWolfgang Grandegger 56429da1ccSWolfgang Grandegger #define SJA1000_MAX_IRQ 20 /* max. number of interrupts handled in ISR */ 57429da1ccSWolfgang Grandegger 58429da1ccSWolfgang Grandegger /* SJA1000 registers - manual section 6.4 (Pelican Mode) */ 59429da1ccSWolfgang Grandegger #define REG_MOD 0x00 60429da1ccSWolfgang Grandegger #define REG_CMR 0x01 61429da1ccSWolfgang Grandegger #define REG_SR 0x02 62429da1ccSWolfgang Grandegger #define REG_IR 0x03 63429da1ccSWolfgang Grandegger #define REG_IER 0x04 64429da1ccSWolfgang Grandegger #define REG_ALC 0x0B 65429da1ccSWolfgang Grandegger #define REG_ECC 0x0C 66429da1ccSWolfgang Grandegger #define REG_EWL 0x0D 67429da1ccSWolfgang Grandegger #define REG_RXERR 0x0E 68429da1ccSWolfgang Grandegger #define REG_TXERR 0x0F 69429da1ccSWolfgang Grandegger #define REG_ACCC0 0x10 70429da1ccSWolfgang Grandegger #define REG_ACCC1 0x11 71429da1ccSWolfgang Grandegger #define REG_ACCC2 0x12 72429da1ccSWolfgang Grandegger #define REG_ACCC3 0x13 73429da1ccSWolfgang Grandegger #define REG_ACCM0 0x14 74429da1ccSWolfgang Grandegger #define REG_ACCM1 0x15 75429da1ccSWolfgang Grandegger #define REG_ACCM2 0x16 76429da1ccSWolfgang Grandegger #define REG_ACCM3 0x17 77429da1ccSWolfgang Grandegger #define REG_RMC 0x1D 78429da1ccSWolfgang Grandegger #define REG_RBSA 0x1E 79429da1ccSWolfgang Grandegger 80429da1ccSWolfgang Grandegger /* Common registers - manual section 6.5 */ 81429da1ccSWolfgang Grandegger #define REG_BTR0 0x06 82429da1ccSWolfgang Grandegger #define REG_BTR1 0x07 83429da1ccSWolfgang Grandegger #define REG_OCR 0x08 84429da1ccSWolfgang Grandegger #define REG_CDR 0x1F 85429da1ccSWolfgang Grandegger 86429da1ccSWolfgang Grandegger #define REG_FI 0x10 87429da1ccSWolfgang Grandegger #define SFF_BUF 0x13 88429da1ccSWolfgang Grandegger #define EFF_BUF 0x15 89429da1ccSWolfgang Grandegger 90429da1ccSWolfgang Grandegger #define FI_FF 0x80 91429da1ccSWolfgang Grandegger #define FI_RTR 0x40 92429da1ccSWolfgang Grandegger 93429da1ccSWolfgang Grandegger #define REG_ID1 0x11 94429da1ccSWolfgang Grandegger #define REG_ID2 0x12 95429da1ccSWolfgang Grandegger #define REG_ID3 0x13 96429da1ccSWolfgang Grandegger #define REG_ID4 0x14 97429da1ccSWolfgang Grandegger 98429da1ccSWolfgang Grandegger #define CAN_RAM 0x20 99429da1ccSWolfgang Grandegger 100429da1ccSWolfgang Grandegger /* mode register */ 101429da1ccSWolfgang Grandegger #define MOD_RM 0x01 102429da1ccSWolfgang Grandegger #define MOD_LOM 0x02 103429da1ccSWolfgang Grandegger #define MOD_STM 0x04 104429da1ccSWolfgang Grandegger #define MOD_AFM 0x08 105429da1ccSWolfgang Grandegger #define MOD_SM 0x10 106429da1ccSWolfgang Grandegger 107429da1ccSWolfgang Grandegger /* commands */ 108429da1ccSWolfgang Grandegger #define CMD_SRR 0x10 109429da1ccSWolfgang Grandegger #define CMD_CDO 0x08 110429da1ccSWolfgang Grandegger #define CMD_RRB 0x04 111429da1ccSWolfgang Grandegger #define CMD_AT 0x02 112429da1ccSWolfgang Grandegger #define CMD_TR 0x01 113429da1ccSWolfgang Grandegger 114429da1ccSWolfgang Grandegger /* interrupt sources */ 115429da1ccSWolfgang Grandegger #define IRQ_BEI 0x80 116429da1ccSWolfgang Grandegger #define IRQ_ALI 0x40 117429da1ccSWolfgang Grandegger #define IRQ_EPI 0x20 118429da1ccSWolfgang Grandegger #define IRQ_WUI 0x10 119429da1ccSWolfgang Grandegger #define IRQ_DOI 0x08 120429da1ccSWolfgang Grandegger #define IRQ_EI 0x04 121429da1ccSWolfgang Grandegger #define IRQ_TI 0x02 122429da1ccSWolfgang Grandegger #define IRQ_RI 0x01 123429da1ccSWolfgang Grandegger #define IRQ_ALL 0xFF 124429da1ccSWolfgang Grandegger #define IRQ_OFF 0x00 125429da1ccSWolfgang Grandegger 126429da1ccSWolfgang Grandegger /* status register content */ 127429da1ccSWolfgang Grandegger #define SR_BS 0x80 128429da1ccSWolfgang Grandegger #define SR_ES 0x40 129429da1ccSWolfgang Grandegger #define SR_TS 0x20 130429da1ccSWolfgang Grandegger #define SR_RS 0x10 131429da1ccSWolfgang Grandegger #define SR_TCS 0x08 132429da1ccSWolfgang Grandegger #define SR_TBS 0x04 133429da1ccSWolfgang Grandegger #define SR_DOS 0x02 134429da1ccSWolfgang Grandegger #define SR_RBS 0x01 135429da1ccSWolfgang Grandegger 136429da1ccSWolfgang Grandegger #define SR_CRIT (SR_BS|SR_ES) 137429da1ccSWolfgang Grandegger 138429da1ccSWolfgang Grandegger /* ECC register */ 139429da1ccSWolfgang Grandegger #define ECC_SEG 0x1F 140429da1ccSWolfgang Grandegger #define ECC_DIR 0x20 141429da1ccSWolfgang Grandegger #define ECC_ERR 6 142429da1ccSWolfgang Grandegger #define ECC_BIT 0x00 143429da1ccSWolfgang Grandegger #define ECC_FORM 0x40 144429da1ccSWolfgang Grandegger #define ECC_STUFF 0x80 145429da1ccSWolfgang Grandegger #define ECC_MASK 0xc0 146429da1ccSWolfgang Grandegger 147429da1ccSWolfgang Grandegger /* 148429da1ccSWolfgang Grandegger * Flags for sja1000priv.flags 149429da1ccSWolfgang Grandegger */ 150429da1ccSWolfgang Grandegger #define SJA1000_CUSTOM_IRQ_HANDLER 0x1 151429da1ccSWolfgang Grandegger 152429da1ccSWolfgang Grandegger /* 153429da1ccSWolfgang Grandegger * SJA1000 private data structure 154429da1ccSWolfgang Grandegger */ 155429da1ccSWolfgang Grandegger struct sja1000_priv { 156429da1ccSWolfgang Grandegger struct can_priv can; /* must be the first member */ 157429da1ccSWolfgang Grandegger int open_time; 158429da1ccSWolfgang Grandegger struct sk_buff *echo_skb; 159429da1ccSWolfgang Grandegger 160429da1ccSWolfgang Grandegger /* the lower-layer is responsible for appropriate locking */ 161255a9154SWolfgang Grandegger u8 (*read_reg) (const struct sja1000_priv *priv, int reg); 162255a9154SWolfgang Grandegger void (*write_reg) (const struct sja1000_priv *priv, int reg, u8 val); 163255a9154SWolfgang Grandegger void (*pre_irq) (const struct sja1000_priv *priv); 164255a9154SWolfgang Grandegger void (*post_irq) (const struct sja1000_priv *priv); 165429da1ccSWolfgang Grandegger 166429da1ccSWolfgang Grandegger void *priv; /* for board-specific data */ 167429da1ccSWolfgang Grandegger struct net_device *dev; 168429da1ccSWolfgang Grandegger 169255a9154SWolfgang Grandegger void __iomem *reg_base; /* ioremap'ed address to registers */ 170429da1ccSWolfgang Grandegger unsigned long irq_flags; /* for request_irq() */ 17157c8a456SOliver Hartkopp spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */ 172429da1ccSWolfgang Grandegger 173429da1ccSWolfgang Grandegger u16 flags; /* custom mode flags */ 174429da1ccSWolfgang Grandegger u8 ocr; /* output control register */ 175429da1ccSWolfgang Grandegger u8 cdr; /* clock divider register */ 176429da1ccSWolfgang Grandegger }; 177429da1ccSWolfgang Grandegger 178429da1ccSWolfgang Grandegger struct net_device *alloc_sja1000dev(int sizeof_priv); 179429da1ccSWolfgang Grandegger void free_sja1000dev(struct net_device *dev); 180429da1ccSWolfgang Grandegger int register_sja1000dev(struct net_device *dev); 181429da1ccSWolfgang Grandegger void unregister_sja1000dev(struct net_device *dev); 182429da1ccSWolfgang Grandegger 183429da1ccSWolfgang Grandegger irqreturn_t sja1000_interrupt(int irq, void *dev_id); 184429da1ccSWolfgang Grandegger 185429da1ccSWolfgang Grandegger #endif /* SJA1000_DEV_H */ 186