aboutsummaryrefslogtreecommitdiff
path: root/include/linux/uart
diff options
context:
space:
mode:
authorMeizu OpenSource <patchwork@meizu.com>2016-08-15 10:19:42 +0800
committerMeizu OpenSource <patchwork@meizu.com>2016-08-15 10:19:42 +0800
commitd2e1446d81725c351dc73a03b397ce043fb18452 (patch)
tree4dbc616b7f92aea39cd697a9084205ddb805e344 /include/linux/uart
first commit
Diffstat (limited to 'include/linux/uart')
-rw-r--r--include/linux/uart/mtk_uart.h234
-rw-r--r--include/linux/uart/mtk_uart_intf.h87
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 */