177accbf505a073beecf32e60265697517e203beaJesper Nilsson/*
277accbf505a073beecf32e60265697517e203beaJesper Nilsson * serial.h: Arch-dep definitions for the Etrax100 serial driver.
377accbf505a073beecf32e60265697517e203beaJesper Nilsson *
477accbf505a073beecf32e60265697517e203beaJesper Nilsson * Copyright (C) 1998-2007 Axis Communications AB
577accbf505a073beecf32e60265697517e203beaJesper Nilsson */
677accbf505a073beecf32e60265697517e203beaJesper Nilsson
777accbf505a073beecf32e60265697517e203beaJesper Nilsson#ifndef _ETRAX_SERIAL_H
877accbf505a073beecf32e60265697517e203beaJesper Nilsson#define _ETRAX_SERIAL_H
977accbf505a073beecf32e60265697517e203beaJesper Nilsson
1077accbf505a073beecf32e60265697517e203beaJesper Nilsson#include <linux/circ_buf.h>
1177accbf505a073beecf32e60265697517e203beaJesper Nilsson#include <asm/termios.h>
1277accbf505a073beecf32e60265697517e203beaJesper Nilsson#include <asm/dma.h>
13556dcee7b829e5c350c3ffdbdb87a8b15aa3c5d3Jesper Nilsson#include <arch/io_interface_mux.h>
1477accbf505a073beecf32e60265697517e203beaJesper Nilsson
1577accbf505a073beecf32e60265697517e203beaJesper Nilsson/* Software state per channel */
1677accbf505a073beecf32e60265697517e203beaJesper Nilsson
1777accbf505a073beecf32e60265697517e203beaJesper Nilsson#ifdef __KERNEL__
1877accbf505a073beecf32e60265697517e203beaJesper Nilsson/*
1977accbf505a073beecf32e60265697517e203beaJesper Nilsson * This is our internal structure for each serial port's state.
2077accbf505a073beecf32e60265697517e203beaJesper Nilsson *
2177accbf505a073beecf32e60265697517e203beaJesper Nilsson * Many fields are paralleled by the structure used by the serial_struct
2277accbf505a073beecf32e60265697517e203beaJesper Nilsson * structure.
2377accbf505a073beecf32e60265697517e203beaJesper Nilsson *
2477accbf505a073beecf32e60265697517e203beaJesper Nilsson * For definitions of the flags field, see tty.h
2577accbf505a073beecf32e60265697517e203beaJesper Nilsson */
2677accbf505a073beecf32e60265697517e203beaJesper Nilsson
2777accbf505a073beecf32e60265697517e203beaJesper Nilsson#define SERIAL_RECV_DESCRIPTORS 8
2877accbf505a073beecf32e60265697517e203beaJesper Nilsson
2977accbf505a073beecf32e60265697517e203beaJesper Nilssonstruct etrax_recv_buffer {
3077accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct etrax_recv_buffer *next;
3177accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned short length;
3277accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned char error;
3377accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned char pad;
3477accbf505a073beecf32e60265697517e203beaJesper Nilsson
3577accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned char buffer[0];
3677accbf505a073beecf32e60265697517e203beaJesper Nilsson};
3777accbf505a073beecf32e60265697517e203beaJesper Nilsson
3877accbf505a073beecf32e60265697517e203beaJesper Nilssonstruct e100_serial {
39d7283353221e73a793847252d063ff9186885160Alan Cox	struct tty_port port;
4077accbf505a073beecf32e60265697517e203beaJesper Nilsson	int baud;
41d7283353221e73a793847252d063ff9186885160Alan Cox	volatile u8	*ioport;	/* R_SERIALx_CTRL */
4277accbf505a073beecf32e60265697517e203beaJesper Nilsson	u32		irq;	/* bitnr in R_IRQ_MASK2 for dmaX_descr */
4377accbf505a073beecf32e60265697517e203beaJesper Nilsson
4477accbf505a073beecf32e60265697517e203beaJesper Nilsson	/* Output registers */
4577accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u8 *oclrintradr;	/* adr to R_DMA_CHx_CLR_INTR */
4677accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u32 *ofirstadr;	/* adr to R_DMA_CHx_FIRST */
4777accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u8 *ocmdadr;		/* adr to R_DMA_CHx_CMD */
4877accbf505a073beecf32e60265697517e203beaJesper Nilsson	const volatile u8 *ostatusadr;	/* adr to R_DMA_CHx_STATUS */
4977accbf505a073beecf32e60265697517e203beaJesper Nilsson
5077accbf505a073beecf32e60265697517e203beaJesper Nilsson	/* Input registers */
5177accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u8 *iclrintradr;	/* adr to R_DMA_CHx_CLR_INTR */
5277accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u32 *ifirstadr;	/* adr to R_DMA_CHx_FIRST */
5377accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u8 *icmdadr;		/* adr to R_DMA_CHx_CMD */
5477accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile u32 *idescradr;	/* adr to R_DMA_CHx_DESCR */
5577accbf505a073beecf32e60265697517e203beaJesper Nilsson
5677accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8 rx_ctrl;	/* shadow for R_SERIALx_REC_CTRL */
5777accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8 tx_ctrl;	/* shadow for R_SERIALx_TR_CTRL */
5877accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8 iseteop;	/* bit number for R_SET_EOP for the input dma */
5977accbf505a073beecf32e60265697517e203beaJesper Nilsson	int enabled;	/* Set to 1 if the port is enabled in HW config */
6077accbf505a073beecf32e60265697517e203beaJesper Nilsson
6177accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8 dma_out_enabled;	/* Set to 1 if DMA should be used */
6277accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8 dma_in_enabled;	/* Set to 1 if DMA should be used */
6377accbf505a073beecf32e60265697517e203beaJesper Nilsson
6477accbf505a073beecf32e60265697517e203beaJesper Nilsson	/* end of fields defined in rs_table[] in .c-file */
6577accbf505a073beecf32e60265697517e203beaJesper Nilsson	int		dma_owner;
6677accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int	dma_in_nbr;
6777accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int	dma_out_nbr;
6877accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int	dma_in_irq_nbr;
6977accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int	dma_out_irq_nbr;
7077accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long	dma_in_irq_flags;
7177accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long	dma_out_irq_flags;
7277accbf505a073beecf32e60265697517e203beaJesper Nilsson	char		*dma_in_irq_description;
7377accbf505a073beecf32e60265697517e203beaJesper Nilsson	char		*dma_out_irq_description;
7477accbf505a073beecf32e60265697517e203beaJesper Nilsson
7577accbf505a073beecf32e60265697517e203beaJesper Nilsson	enum cris_io_interface io_if;
7677accbf505a073beecf32e60265697517e203beaJesper Nilsson	char            *io_if_description;
7777accbf505a073beecf32e60265697517e203beaJesper Nilsson
7877accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8		uses_dma_in;  /* Set to 1 if DMA is used */
7977accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8		uses_dma_out; /* Set to 1 if DMA is used */
8077accbf505a073beecf32e60265697517e203beaJesper Nilsson	u8		forced_eop;   /* a fifo eop has been forced */
8177accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			baud_base;     /* For special baudrates */
8277accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			custom_divisor; /* For special baudrates */
8377accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct etrax_dma_descr	tr_descr;
8477accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct etrax_dma_descr	rec_descr[SERIAL_RECV_DESCRIPTORS];
8577accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			cur_rec_descr;
8677accbf505a073beecf32e60265697517e203beaJesper Nilsson
8777accbf505a073beecf32e60265697517e203beaJesper Nilsson	volatile int		tr_running; /* 1 if output is running */
8877accbf505a073beecf32e60265697517e203beaJesper Nilsson
8977accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			x_char;	/* xon/xoff character */
9077accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long		event;
9177accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			line;
9277accbf505a073beecf32e60265697517e203beaJesper Nilsson	int			type;  /* PORT_ETRAX */
9377accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct circ_buf		xmit;
9477accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct etrax_recv_buffer *first_recv_buffer;
9577accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct etrax_recv_buffer *last_recv_buffer;
9677accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int		recv_cnt;
9777accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned int		max_recv_cnt;
9877accbf505a073beecf32e60265697517e203beaJesper Nilsson
9977accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct work_struct	work;
10077accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct async_icount	icount;   /* error-statistics etc.*/
10177accbf505a073beecf32e60265697517e203beaJesper Nilsson	struct ktermios		normal_termios;
10277accbf505a073beecf32e60265697517e203beaJesper Nilsson
10377accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long char_time_usec;       /* The time for 1 char, in usecs */
10477accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long flush_time_usec;      /* How often we should flush */
10577accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long last_tx_active_usec;  /* Last tx usec in the jiffies */
10677accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long last_tx_active;       /* Last tx time in jiffies */
10777accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long last_rx_active_usec;  /* Last rx usec in the jiffies */
10877accbf505a073beecf32e60265697517e203beaJesper Nilsson	unsigned long last_rx_active;       /* Last rx time in jiffies */
10977accbf505a073beecf32e60265697517e203beaJesper Nilsson
11077accbf505a073beecf32e60265697517e203beaJesper Nilsson	int break_detected_cnt;
11177accbf505a073beecf32e60265697517e203beaJesper Nilsson	int errorcode;
11277accbf505a073beecf32e60265697517e203beaJesper Nilsson
11377accbf505a073beecf32e60265697517e203beaJesper Nilsson#ifdef CONFIG_ETRAX_RS485
1146fd1af4cf98936f4034caf8f132c7826a6ffd0faClaudio Scordino	struct serial_rs485	rs485;  /* RS-485 support */
11577accbf505a073beecf32e60265697517e203beaJesper Nilsson#endif
11677accbf505a073beecf32e60265697517e203beaJesper Nilsson};
11777accbf505a073beecf32e60265697517e203beaJesper Nilsson
11877accbf505a073beecf32e60265697517e203beaJesper Nilsson/* this PORT is not in the standard serial.h. it's not actually used for
11977accbf505a073beecf32e60265697517e203beaJesper Nilsson * anything since we only have one type of async serial-port anyway in this
12077accbf505a073beecf32e60265697517e203beaJesper Nilsson * system.
12177accbf505a073beecf32e60265697517e203beaJesper Nilsson */
12277accbf505a073beecf32e60265697517e203beaJesper Nilsson
12377accbf505a073beecf32e60265697517e203beaJesper Nilsson#define PORT_ETRAX 1
12477accbf505a073beecf32e60265697517e203beaJesper Nilsson
12577accbf505a073beecf32e60265697517e203beaJesper Nilsson/*
12677accbf505a073beecf32e60265697517e203beaJesper Nilsson * Events are used to schedule things to happen at timer-interrupt
12777accbf505a073beecf32e60265697517e203beaJesper Nilsson * time, instead of at rs interrupt time.
12877accbf505a073beecf32e60265697517e203beaJesper Nilsson */
12977accbf505a073beecf32e60265697517e203beaJesper Nilsson#define RS_EVENT_WRITE_WAKEUP	0
13077accbf505a073beecf32e60265697517e203beaJesper Nilsson
13177accbf505a073beecf32e60265697517e203beaJesper Nilsson#endif /* __KERNEL__ */
13277accbf505a073beecf32e60265697517e203beaJesper Nilsson
13377accbf505a073beecf32e60265697517e203beaJesper Nilsson#endif /* !_ETRAX_SERIAL_H */
134