/*
 * serial.h: Arch-dep definitions for the Etrax100 serial driver.
 *
 * Copyright (C) 1998-2007 Axis Communications AB
 */

#ifndef _ETRAX_SERIAL_H
#define _ETRAX_SERIAL_H

#include <linux/circ_buf.h>
#include <asm/termios.h>
#include <asm/dma.h>
#include <arch/io_interface_mux.h>

/* Software state per channel */

#ifdef __KERNEL__
/*
 * This is our internal structure for each serial port's state.
 *
 * Many fields are paralleled by the structure used by the serial_struct
 * structure.
 *
 * For definitions of the flags field, see tty.h
 */

#define SERIAL_RECV_DESCRIPTORS 8

struct etrax_recv_buffer {
	struct etrax_recv_buffer *next;
	unsigned short length;
	unsigned char error;
	unsigned char pad;

	unsigned char buffer[0];
};

struct e100_serial {
	struct tty_port port;
	int baud;
	volatile u8	*ioport;	/* R_SERIALx_CTRL */
	u32		irq;	/* bitnr in R_IRQ_MASK2 for dmaX_descr */

	/* Output registers */
	volatile u8 *oclrintradr;	/* adr to R_DMA_CHx_CLR_INTR */
	volatile u32 *ofirstadr;	/* adr to R_DMA_CHx_FIRST */
	volatile u8 *ocmdadr;		/* adr to R_DMA_CHx_CMD */
	const volatile u8 *ostatusadr;	/* adr to R_DMA_CHx_STATUS */

	/* Input registers */
	volatile u8 *iclrintradr;	/* adr to R_DMA_CHx_CLR_INTR */
	volatile u32 *ifirstadr;	/* adr to R_DMA_CHx_FIRST */
	volatile u8 *icmdadr;		/* adr to R_DMA_CHx_CMD */
	volatile u32 *idescradr;	/* adr to R_DMA_CHx_DESCR */

	int flags;	/* defined in tty.h */

	u8 rx_ctrl;	/* shadow for R_SERIALx_REC_CTRL */
	u8 tx_ctrl;	/* shadow for R_SERIALx_TR_CTRL */
	u8 iseteop;	/* bit number for R_SET_EOP for the input dma */
	int enabled;	/* Set to 1 if the port is enabled in HW config */

	u8 dma_out_enabled;	/* Set to 1 if DMA should be used */
	u8 dma_in_enabled;	/* Set to 1 if DMA should be used */

	/* end of fields defined in rs_table[] in .c-file */
	int		dma_owner;
	unsigned int	dma_in_nbr;
	unsigned int	dma_out_nbr;
	unsigned int	dma_in_irq_nbr;
	unsigned int	dma_out_irq_nbr;
	unsigned long	dma_in_irq_flags;
	unsigned long	dma_out_irq_flags;
	char		*dma_in_irq_description;
	char		*dma_out_irq_description;

	enum cris_io_interface io_if;
	char            *io_if_description;

	u8		uses_dma_in;  /* Set to 1 if DMA is used */
	u8		uses_dma_out; /* Set to 1 if DMA is used */
	u8		forced_eop;   /* a fifo eop has been forced */
	int			baud_base;     /* For special baudrates */
	int			custom_divisor; /* For special baudrates */
	struct etrax_dma_descr	tr_descr;
	struct etrax_dma_descr	rec_descr[SERIAL_RECV_DESCRIPTORS];
	int			cur_rec_descr;

	volatile int		tr_running; /* 1 if output is running */

	struct tty_struct	*tty;
	int			read_status_mask;
	int			ignore_status_mask;
	int			x_char;	/* xon/xoff character */
	int			close_delay;
	unsigned short		closing_wait;
	unsigned short		closing_wait2;
	unsigned long		event;
	unsigned long		last_active;
	int			line;
	int			type;  /* PORT_ETRAX */
	int			count;	    /* # of fd on device */
	int			blocked_open; /* # of blocked opens */
	struct circ_buf		xmit;
	struct etrax_recv_buffer *first_recv_buffer;
	struct etrax_recv_buffer *last_recv_buffer;
	unsigned int		recv_cnt;
	unsigned int		max_recv_cnt;

	struct work_struct	work;
	struct async_icount	icount;   /* error-statistics etc.*/
	struct ktermios		normal_termios;
	struct ktermios		callout_termios;
	wait_queue_head_t	open_wait;
	wait_queue_head_t	close_wait;

	unsigned long char_time_usec;       /* The time for 1 char, in usecs */
	unsigned long flush_time_usec;      /* How often we should flush */
	unsigned long last_tx_active_usec;  /* Last tx usec in the jiffies */
	unsigned long last_tx_active;       /* Last tx time in jiffies */
	unsigned long last_rx_active_usec;  /* Last rx usec in the jiffies */
	unsigned long last_rx_active;       /* Last rx time in jiffies */

	int break_detected_cnt;
	int errorcode;

#ifdef CONFIG_ETRAX_RS485
	struct serial_rs485	rs485;  /* RS-485 support */
#endif
};

/* this PORT is not in the standard serial.h. it's not actually used for
 * anything since we only have one type of async serial-port anyway in this
 * system.
 */

#define PORT_ETRAX 1

/*
 * Events are used to schedule things to happen at timer-interrupt
 * time, instead of at rs interrupt time.
 */
#define RS_EVENT_WRITE_WAKEUP	0

#endif /* __KERNEL__ */

#endif /* !_ETRAX_SERIAL_H */
