Initial commit: Linux kernel 4.19 for Unplugged OS

This commit is contained in:
ziv committed 2025-10-06 13:52:42 +00:00
commit d30235b04c
80519 files changed
+35800681

No files matched your search

@@ -0,0 +1,244 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MTK_UART_H__
#define __MTK_UART_H__
#include <mt-plat/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
*****************************************************************************
*/
enum {
UART_NON_DMA,
UART_TX_DMA,
UART_TX_VFIFO_DMA,
UART_RX_VFIFO_DMA,
};
/*---------------------------------------------------------------------------*/
enum {
UART_TX_VFIFO,
UART_RX_VFIFO,
UART_VFIFO_NUM
};
/*---------------------------------------------------------------------------*/
/* 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;
unsigned long uart_phys_base;
unsigned long irq_flags;
#if !defined(CONFIG_MTK_LEGACY)
struct clk *clk_uart_main;
#endif /* !defined(CONFIG_MTK_LEGACY) */
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;
bool support_33bits;
};
/*---------------------------------------------------------------------------*/
#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 */
/* FCR register is a write only register */
unsigned int fcr_back_up;
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) (*(unsigned char *)(REG))
#define UART_READ16(REG) (*(unsigned short *)(REG))
#define UART_READ32(REG) (*(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) ((*(u32 *)(REG)) |= (u32)(BS))
#define UART_CLR_BITS(BS, REG) ((*(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 mtk_uart mtk_uarts[UART_NR];
#ifdef CONFIG_FIQ_DEBUGGER
extern struct resource fiq_resource[];
#endif /* CONFIG_FIQ_DEBUGGER */
#endif /* MTK_UART_H */
@@ -0,0 +1,15 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MTK_UART_EXPORTED_API__
#define __MTK_UART_EXPORTED_API__
int request_uart_to_sleep(void);
int request_uart_to_wakeup(void);
void stop_log(void);
void dump_uart_history(void);
#endif /* __MTK_UART_EXPORTED_API__ */
@@ -0,0 +1,50 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MTK_UART_INTERNAL__
#define __MTK_UART_INTERNAL__
/* define sysfs entry for configuring debug level and sysrq */
ssize_t mtk_uart_attr_show(struct kobject *kobj,
struct attribute *attr, char *buffer);
ssize_t mtk_uart_attr_store(struct kobject *kobj,
struct attribute *attr, const char *buffer, size_t size);
ssize_t mtk_uart_debug_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_debug_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_sysrq_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_sysrq_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_vffsz_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_vffsz_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_conse_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_conse_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_vff_en_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_vff_en_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_lsr_status_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_lsr_status_store(struct kobject *kobj,
const char *page, size_t size);
ssize_t mtk_uart_history_show(struct kobject *kobj, char *page);
ssize_t mtk_uart_history_store(struct kobject *kobj,
const char *page, size_t size);
/*
*#if defined(CONFIG_MTK_HDMI_SUPPORT)
*#include "hdmi_cust.h"
*extern bool is_hdmi_active(void);
*extern void hdmi_force_on(int from_uart_drv);
*#endif
*/
#ifndef CONFIG_FIQ_DEBUGGER
#ifdef CONFIG_MTK_PRINTK_UART_CONSOLE
extern int printk_disable_uart;
extern int mt_need_uart_console;
#endif
#endif
#endif /* #ifndef __MTK_UART_INTERNAL__ */
@@ -0,0 +1,98 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#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);
void *get_apdma_uart0_base(void);
unsigned int get_uart_vfifo_irq_id(int idx);
void set_uart_default_settings(int idx);
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[]);
#if !defined(CONFIG_MTK_LEGACY)
void set_uart_dma_clk(int port_id, struct clk *dma_clk);
void set_uart_pinctrl(int idx, struct pinctrl *ppinctrl);
#endif /* !defined(CONFIG_MTK_LEGACY) */
#endif /* MTK_UART_INTF_H */