127 lines
3.9 KiB
C
127 lines
3.9 KiB
C
|
/* MN10300 On-chip serial port driver definitions
|
||
|
*
|
||
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||
|
* Written by David Howells (dhowells@redhat.com)
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public Licence
|
||
|
* as published by the Free Software Foundation; either version
|
||
|
* 2 of the Licence, or (at your option) any later version.
|
||
|
*/
|
||
|
#ifndef _MN10300_SERIAL_H
|
||
|
#define _MN10300_SERIAL_H
|
||
|
|
||
|
#ifndef __ASSEMBLY__
|
||
|
#include <linux/serial_core.h>
|
||
|
#include <linux/termios.h>
|
||
|
#endif
|
||
|
|
||
|
#include <asm/page.h>
|
||
|
#include <asm/serial-regs.h>
|
||
|
|
||
|
#define NR_PORTS 3 /* should be set 3 or 9 or 16 */
|
||
|
|
||
|
#define MNSC_BUFFER_SIZE +(PAGE_SIZE / 2)
|
||
|
|
||
|
/* intr_flags bits */
|
||
|
#define MNSCx_RX_AVAIL 0x01
|
||
|
#define MNSCx_RX_OVERF 0x02
|
||
|
#define MNSCx_TX_SPACE 0x04
|
||
|
#define MNSCx_TX_EMPTY 0x08
|
||
|
|
||
|
#ifndef __ASSEMBLY__
|
||
|
|
||
|
struct mn10300_serial_port {
|
||
|
char *rx_buffer; /* reception buffer base */
|
||
|
unsigned rx_inp; /* pointer to rx input offset */
|
||
|
unsigned rx_outp; /* pointer to rx output offset */
|
||
|
u8 tx_xchar; /* high-priority XON/XOFF buffer */
|
||
|
u8 tx_break; /* transmit break request */
|
||
|
u8 intr_flags; /* interrupt flags */
|
||
|
volatile u16 *rx_icr; /* Rx interrupt control register */
|
||
|
volatile u16 *tx_icr; /* Tx interrupt control register */
|
||
|
int rx_irq; /* reception IRQ */
|
||
|
int tx_irq; /* transmission IRQ */
|
||
|
int tm_irq; /* timer IRQ */
|
||
|
|
||
|
const char *name; /* name of serial port */
|
||
|
const char *rx_name; /* Rx interrupt handler name of serial port */
|
||
|
const char *tx_name; /* Tx interrupt handler name of serial port */
|
||
|
const char *tm_name; /* Timer interrupt handler name */
|
||
|
unsigned short type; /* type of serial port */
|
||
|
unsigned char isconsole; /* T if it's a console */
|
||
|
volatile void *_iobase; /* pointer to base of I/O control regs */
|
||
|
volatile u16 *_control; /* control register pointer */
|
||
|
volatile u8 *_status; /* status register pointer */
|
||
|
volatile u8 *_intr; /* interrupt register pointer */
|
||
|
volatile void *_rxb; /* receive buffer register pointer */
|
||
|
volatile void *_txb; /* transmit buffer register pointer */
|
||
|
volatile u16 *_tmicr; /* timer interrupt control register */
|
||
|
volatile u8 *_tmxmd; /* baud rate timer mode register */
|
||
|
volatile u16 *_tmxbr; /* baud rate timer base register */
|
||
|
|
||
|
/* this must come down here so that assembly can use BSET to access the
|
||
|
* above fields */
|
||
|
struct uart_port uart;
|
||
|
|
||
|
unsigned short rx_brk; /* current break reception status */
|
||
|
u16 tx_cts; /* current CTS status */
|
||
|
int gdbstub; /* preemptively stolen by GDB stub */
|
||
|
|
||
|
u8 clock_src; /* clock source */
|
||
|
#define MNSCx_CLOCK_SRC_IOCLK 0
|
||
|
#define MNSCx_CLOCK_SRC_IOBCLK 1
|
||
|
|
||
|
u8 div_timer; /* timer used as divisor */
|
||
|
#define MNSCx_DIV_TIMER_16BIT 0
|
||
|
#define MNSCx_DIV_TIMER_8BIT 1
|
||
|
|
||
|
u16 options; /* options */
|
||
|
#define MNSCx_OPT_CTS 0x0001
|
||
|
|
||
|
unsigned long ioclk; /* base clock rate */
|
||
|
};
|
||
|
|
||
|
#ifdef CONFIG_MN10300_TTYSM0
|
||
|
extern struct mn10300_serial_port mn10300_serial_port_sif0;
|
||
|
#endif
|
||
|
|
||
|
#ifdef CONFIG_MN10300_TTYSM1
|
||
|
extern struct mn10300_serial_port mn10300_serial_port_sif1;
|
||
|
#endif
|
||
|
|
||
|
#ifdef CONFIG_MN10300_TTYSM2
|
||
|
extern struct mn10300_serial_port mn10300_serial_port_sif2;
|
||
|
#endif
|
||
|
|
||
|
extern struct mn10300_serial_port *mn10300_serial_ports[];
|
||
|
|
||
|
struct mn10300_serial_int {
|
||
|
struct mn10300_serial_port *port;
|
||
|
asmlinkage void (*vdma)(void);
|
||
|
};
|
||
|
|
||
|
extern struct mn10300_serial_int mn10300_serial_int_tbl[];
|
||
|
|
||
|
extern asmlinkage void mn10300_serial_vdma_interrupt(void);
|
||
|
extern asmlinkage void mn10300_serial_vdma_rx_handler(void);
|
||
|
extern asmlinkage void mn10300_serial_vdma_tx_handler(void);
|
||
|
|
||
|
#endif /* __ASSEMBLY__ */
|
||
|
|
||
|
#if defined(CONFIG_GDBSTUB_ON_TTYSM0)
|
||
|
#define SCgSTR SC0STR
|
||
|
#define SCgRXB SC0RXB
|
||
|
#define SCgRXIRQ SC0RXIRQ
|
||
|
#elif defined(CONFIG_GDBSTUB_ON_TTYSM1)
|
||
|
#define SCgSTR SC1STR
|
||
|
#define SCgRXB SC1RXB
|
||
|
#define SCgRXIRQ SC1RXIRQ
|
||
|
#elif defined(CONFIG_GDBSTUB_ON_TTYSM2)
|
||
|
#define SCgSTR SC2STR
|
||
|
#define SCgRXB SC2RXB
|
||
|
#define SCgRXIRQ SC2RXIRQ
|
||
|
#endif
|
||
|
|
||
|
#endif /* _MN10300_SERIAL_H */
|