diff options
| author | Meizu OpenSource <patchwork@meizu.com> | 2016-08-15 10:19:42 +0800 |
|---|---|---|
| committer | Meizu OpenSource <patchwork@meizu.com> | 2016-08-15 10:19:42 +0800 |
| commit | d2e1446d81725c351dc73a03b397ce043fb18452 (patch) | |
| tree | 4dbc616b7f92aea39cd697a9084205ddb805e344 /include/linux/uart | |
first commit
Diffstat (limited to 'include/linux/uart')
| -rw-r--r-- | include/linux/uart/mtk_uart.h | 234 | ||||
| -rw-r--r-- | include/linux/uart/mtk_uart_intf.h | 87 |
2 files changed, 321 insertions, 0 deletions
diff --git a/include/linux/uart/mtk_uart.h b/include/linux/uart/mtk_uart.h new file mode 100644 index 000000000..108e890dc --- /dev/null +++ b/include/linux/uart/mtk_uart.h @@ -0,0 +1,234 @@ +#ifndef __MTK_UART_H__ +#define __MTK_UART_H__ + +#include <mach/hardware.h> +#ifndef CONFIG_OF +#include <mach/mt_reg_base.h> +#endif +#include <mach/sync_write.h> +#include "platform_uart.h" + +/*---------------------------------------------------------------------------*/ +#if defined(ENABLE_VFIFO_DEBUG) +/*---------------------------------------------------------------------------*/ +#define DGBUF_INIT(v) \ + do { \ + if (UART_DEBUG_EVT(DBG_EVT_BUF)) { \ + v->dbgidx = (v->dbgidx+1)%(ARRAY_SIZE(v->dbg)); \ + v->cur = &v->dbg[v->dbgidx]; \ + v->cur->idx = 0; \ + } \ + } while (0) +/*---------------------------------------------------------------------------*/ +#define DGBUF_PUSH_CH(v, c) \ + do { \ + if (UART_DEBUG_EVT(DBG_EVT_BUF)) \ + v->cur->dat[v->cur->idx++] = (char)(c); \ + } while (0) +/*---------------------------------------------------------------------------*/ +#define DGBUF_PUSH_STR(v, s, l) \ + do { \ + if (UART_DEBUG_EVT(DBG_EVT_BUF)) {\ + memcpy(&v->cur->dat[v->cur->idx], (s), (l)); \ + v->cur->idx += (l); \ + } \ + } while (0) +#else +/*---------------------------------------------------------------------------*/ +#define DGBUF_INIT(v) +#define DGBUF_PUSH_CH(v, c) +#define DGBUF_PUSH_STR(v, s, l) +#endif + +/****************************************************************************** + * ENUM & STRUCT +******************************************************************************/ +typedef enum { + UART_NON_DMA, + UART_TX_DMA, + UART_TX_VFIFO_DMA, + UART_RX_VFIFO_DMA, +} UART_DMA_TYPE; +/*---------------------------------------------------------------------------*/ +typedef enum { + UART_TX_VFIFO, + UART_RX_VFIFO, + + UART_VFIFO_NUM +} UART_VFF_TYPE; +/*---------------------------------------------------------------------------*/ +/* uart dma mode */ +enum { + UART_DMA_MODE_0, + UART_DMA_MODE_1, +}; +/*---------------------------------------------------------------------------*/ +/* flow control mode */ +enum { + UART_FC_NONE, /*NO flow control */ + UART_FC_SW, /*MTK SW Flow Control, differs from Linux Flow Control */ + UART_FC_HW, /*HW Flow Control */ +}; +/*---------------------------------------------------------------------------*/ +struct mtk_uart_setting { + u8 tx_mode; + u8 rx_mode; + u8 dma_mode; + u8 sysrq; + + int tx_trig; + int rx_trig; + unsigned long uart_base; +#ifdef CONFIG_OF + unsigned long uart_phys_base; + + unsigned long irq_flags; +#endif + u8 irq_num; + u8 irq_sen; + u8 set_bit; /*APMCU_CG_SET0 */ + u8 clr_bit; /*APMCU_CG_CLR0 */ + int pll_id; + + u8 hw_flow; /*support hardware flow control or not?! */ + u8 vff; /*support vfifo or not!? */ + u16 _align; +}; +/*---------------------------------------------------------------------------*/ +#define C_UART_DEBUG_BUF_NUM (5) +/*---------------------------------------------------------------------------*/ +struct mtk_uart_buf { + unsigned char *dat; + unsigned int idx; + unsigned int len; +}; +/*---------------------------------------------------------------------------*/ +struct mtk_uart_vfifo { + struct mtk_uart_dma *dma; /* vfifo dma owner */ + + /*configuration */ + u16 ch; + u16 size; + u16 trig; + u16 type; /*UART_RX_VFIFO / UART_TX_VFIFO */ + void *base; + void *port; /*only tx */ + void *addr; + + atomic_t reg_cb; + atomic_t entry; /* entry count */ + spinlock_t iolock; + struct timer_list timer; /* vfifo timer */ + struct hrtimer flush; + dma_addr_t dmahd; /* dma handle */ + + struct tasklet_struct flush_tasklet; + + struct mtk_uart_buf dbg[C_UART_DEBUG_BUF_NUM]; + struct mtk_uart_buf *cur; + int dbgidx; + unsigned int irq_id; +}; +/*---------------------------------------------------------------------------*/ +struct mtk_uart_dma { + struct mtk_uart *uart; /* dma uart */ + atomic_t free; /* dma channel free */ + unsigned short mode; /* dma mode */ + unsigned short dir; /* dma transfer direction */ + struct tasklet_struct tasklet; /* dma handling tasklet */ + struct completion done; /* dma transfer done */ + struct mtk_uart_vfifo *vfifo; /* dma vfifo */ +}; +/*---------------------------------------------------------------------------*/ +struct mtk_uart_register { + unsigned int dll; + unsigned int dlh; + unsigned int ier; + unsigned int lcr; + unsigned int mcr; + unsigned int fcr; + unsigned int lsr; + unsigned int efr; + unsigned int highspeed; + unsigned int sample_count; + unsigned int sample_point; + unsigned int fracdiv_l; + unsigned int fracdiv_m; + unsigned int escape_en; + unsigned int guard; + unsigned int rx_sel; +}; +/*---------------------------------------------------------------------------*/ +struct mtk_uart { + struct uart_port port; + unsigned long base; + int nport; + unsigned int old_status; + unsigned int tx_stop; + unsigned int rx_stop; + unsigned int ms_enable; + unsigned int auto_baud; + unsigned int line_status; + unsigned int ignore_rx; + unsigned int flow_ctrl; + unsigned long pending_tx_reqs; + unsigned long tx_trig; /* tx fifo trigger level */ + unsigned long rx_trig; /* rx fifo trigger level */ + unsigned long sysclk; + unsigned long evt_mask; + unsigned long lsr_status; + int baudrate; /*current baudrate */ + int custom_baud; /*custom baudrate passed from serial_struct */ + + int dma_mode; + int tx_mode; + int rx_mode; + int fctl_mode; /*flow control */ + int poweron_count; + int timeout_count; /*for console write */ + + unsigned int fcr_back_up; /* FCR register is a write only register */ + + struct mtk_uart_register registers; + struct mtk_uart_dma dma_tx; + struct mtk_uart_dma dma_rx; + struct mtk_uart_vfifo *tx_vfifo; + struct mtk_uart_vfifo *rx_vfifo; + + struct mtk_uart_setting *setting; + + unsigned int (*write_allow) (struct mtk_uart *uart); + unsigned int (*read_allow) (struct mtk_uart *uart); + void (*write_byte) (struct mtk_uart *uart, unsigned int byte); + unsigned int (*read_byte) (struct mtk_uart *uart); + unsigned int (*read_status) (struct mtk_uart *uart); +}; +/*---------------------------------------------------------------------------*/ +/* fiq debugger */ +/*---------------------------------------------------------------------------*/ +struct fiq_dbg_event { + u32 iir; + int data; +}; +/*---------------------------------------------------------------------------*/ +/* #define UART_READ8(REG) __raw_readb(REG) */ +/* #define UART_READ16(REG) __raw_readw(REG) */ +/* #define UART_READ32(REG) __raw_readl(REG) */ +#define UART_READ8(REG) (*(volatile unsigned char*)(REG)) +#define UART_READ16(REG) (*(volatile unsigned short*)(REG)) +#define UART_READ32(REG) (*(volatile unsigned int*)(REG)) +#define reg_sync_writeb(v, a) mt_reg_sync_writeb(v, a) +#define reg_sync_writel(v, a) mt_reg_sync_writel(v, a) +/*---------------------------------------------------------------------------*/ +#define UART_SET_BITS(BS, REG) ((*(volatile u32*)(REG)) |= (u32)(BS)) +#define UART_CLR_BITS(BS, REG) ((*(volatile u32*)(REG)) &= ~((u32)(BS))) +/*---------------------------------------------------------------------------*/ +extern spinlock_t mtk_console_lock; +extern struct mtk_uart *console_port; +unsigned int mtk_uart_pdn_enable(char *port, int enable); +extern void update_history_byte(char is_tx, int nport, unsigned char byte); +extern void update_history_time(char is_tx, int nport); +extern void update_history_bulk(char is_tx, int nport, unsigned char *chars, int count); + +extern struct resource fiq_resource[]; +#endif /* MTK_UART_H */ diff --git a/include/linux/uart/mtk_uart_intf.h b/include/linux/uart/mtk_uart_intf.h new file mode 100644 index 000000000..1cacf1e48 --- /dev/null +++ b/include/linux/uart/mtk_uart_intf.h @@ -0,0 +1,87 @@ +#ifndef __MTK_UART_INTF_H__ +#define __MTK_UART_INTF_H__ + +#include "platform_uart.h" +#include <linux/platform_device.h> +/*---------------------------------------------------------------------------*/ +/* fiq debugger */ +/*---------------------------------------------------------------------------*/ +int fiq_uart_getc(struct platform_device *pdev); +void fiq_uart_putc(struct platform_device *pdev, unsigned int c); +void fiq_uart_fixup(int uart_port); +irqreturn_t mt_debug_signal_irq(int irq, void *dev_id); +int mt_fiq_init(void *arg); +/*---------------------------------------------------------------------------*/ +struct mtk_uart_setting *get_uart_default_settings(int idx); +#ifdef CONFIG_OF +void* get_apdma_uart0_base(void); +unsigned int get_uart_vfifo_irq_id(int idx); +void set_uart_default_settings(int idx); +#endif +unsigned long get_uart_evt_mask(int idx); +void mtk_uart_switch_tx_to_gpio(struct mtk_uart *uart); +void mtk_uart_switch_to_tx(struct mtk_uart *uart); +void mtk_uart_switch_rx_to_gpio(struct mtk_uart *uart); +void mtk_uart_switch_to_rx(struct mtk_uart *uart); +void set_uart_evt_mask(int idx, int value); +unsigned long get_uart_lsr_status(int idx); +void set_uart_lsr_status(int idx, int value); +unsigned char get_modem_status(int idx); +void dump_uart_reg(void); +void mtk_uart_console_setting_switch(struct mtk_uart *uart); +int mtk_uart_vfifo_is_empty(struct mtk_uart_vfifo *vfifo); +void mtk_uart_tx_vfifo_flush(struct mtk_uart *uart, int timeout); +int mtk_uart_vfifo_get_counts(struct mtk_uart_vfifo *vfifo); +void mtk_uart_dma_vfifo_tx_tasklet(unsigned long arg); +void mtk_uart_dma_vfifo_rx_tasklet(unsigned long arg); +int mtk_uart_vfifo_enable(struct mtk_uart *uart, struct mtk_uart_vfifo *vfifo); +int mtk_uart_vfifo_disable(struct mtk_uart *uart, struct mtk_uart_vfifo *vfifo); +void mtk_uart_vfifo_enable_tx_intr(struct mtk_uart *uart); +void mtk_uart_vfifo_disable_tx_intr(struct mtk_uart *uart); +void mtk_uart_vfifo_enable_rx_intr(struct mtk_uart *uart); +void mtk_uart_vfifo_disable_rx_intr(struct mtk_uart *uart); +unsigned int mtk_uart_write_allow(struct mtk_uart *uart); +void mtk_uart_enable_intrs(struct mtk_uart *uart, long mask); +void mtk_uart_disable_intrs(struct mtk_uart *uart, long mask); +int mtk_uart_vfifo_is_full(struct mtk_uart_vfifo *vfifo); +void mtk_uart_stop_dma(struct mtk_uart_dma *dma); +void mtk_uart_reset_dma(struct mtk_uart_dma *dma); +void mtk_uart_set_mode(struct mtk_uart *uart, int mode); +void mtk_uart_set_auto_baud(struct mtk_uart *uart); +void mtk_uart_baud_setting(struct mtk_uart *uart, int baudrate); +void mtk_uart_dma_setup(struct mtk_uart *uart, struct mtk_uart_dma *dma); +int mtk_uart_dma_start(struct mtk_uart *uart, struct mtk_uart_dma *dma); +void mtk_uart_vfifo_write_byte(struct mtk_uart *uart, unsigned int byte); +unsigned int mtk_uart_vfifo_read_byte(struct mtk_uart *uart); +unsigned int mtk_uart_read_status(struct mtk_uart *uart); +unsigned int mtk_uart_read_allow(struct mtk_uart *uart); +unsigned int mtk_uart_read_byte(struct mtk_uart *uart); +void mtk_uart_write_byte(struct mtk_uart *uart, unsigned int byte); +unsigned int mtk_uart_filter_line_status(struct mtk_uart *uart); +void mtk_uart_fifo_set_trig(struct mtk_uart *uart, int tx_level, int rx_level); +void mtk_uart_enable_sleep(struct mtk_uart *uart); +void mtk_uart_fifo_init(struct mtk_uart *uart); +void mtk_uart_fifo_flush(struct mtk_uart *uart); +int mtk_uart_data_ready(struct mtk_uart *uart); +void mtk_uart_config(struct mtk_uart *uart, int datalen, int stop, int parity); +void mtk_uart_set_flow_ctrl(struct mtk_uart *uart, int mode); +void mtk_uart_power_up(struct mtk_uart *uart); +void mtk_uart_power_down(struct mtk_uart *uart); +void mtk_uart_get_modem_status(struct mtk_uart *uart); +void mtk_uart_rx_pre_handler(struct mtk_uart *uart, int intrs); +int mtk_uart_get_interrupt(struct mtk_uart *uart); +void mtk_uart_intr_last_check(struct mtk_uart *uart, int intrs); +void mtk_uart_set_mctrl(struct uart_port *port, unsigned int mctrl); +unsigned int mtk_uart_get_mctrl(struct uart_port *port); +void mtk_uart_stop_rx(struct uart_port *port); +void mtk_uart_break_ctl(struct uart_port *port, int break_state); +void mtk_uart_save(struct mtk_uart *uart); +void mtk_uart_restore(void); +void mtk_uart_vfifo_clear_tx_intr(struct mtk_uart_vfifo *vfifo); +void mtk_uart_vfifo_clear_rx_intr(struct mtk_uart_vfifo *vfifo); +void mtk_uart_init_debug_spinlock(void); +void reset_tx_raw_data(struct mtk_uart *uart); +void mtk_uart_enable_dpidle(struct mtk_uart *uart); +void mtk_uart_disable_dpidle(struct mtk_uart *uart); +int mtk_uart_plat_info_query(const char str[]); +#endif /* MTK_UART_INTF_H */ |
