drivers/tty/serial/sprd_serial.c
Source file repositories/reference/linux-study-clean/drivers/tty/serial/sprd_serial.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/tty/serial/sprd_serial.c- Extension
.c- Size
- 31322 bytes
- Lines
- 1307
- Domain
- Driver Families
- Bucket
- drivers/tty
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/clk.hlinux/console.hlinux/delay.hlinux/dmaengine.hlinux/dma-mapping.hlinux/dma/sprd-dma.hlinux/io.hlinux/ioport.hlinux/kernel.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/serial_core.hlinux/serial.hlinux/slab.hlinux/tty.hlinux/tty_flip.h
Detected Declarations
struct sprd_uart_dmastruct sprd_uart_datastruct sprd_uart_portfunction serial_infunction serial_outfunction sprd_tx_emptyfunction sprd_get_mctrlfunction sprd_set_mctrlfunction sprd_stop_rxfunction sprd_uart_dma_enablefunction sprd_stop_tx_dmafunction sprd_tx_buf_remapfunction sprd_complete_tx_dmafunction sprd_uart_dma_submitfunction sprd_tx_dma_configfunction sprd_start_tx_dmafunction sprd_rx_full_thldfunction sprd_rx_alloc_buffunction sprd_rx_free_buffunction sprd_rx_dma_configfunction sprd_uart_dma_rxfunction sprd_uart_dma_irqfunction sprd_complete_rx_dmafunction sprd_start_dma_rxfunction sprd_release_dmafunction sprd_request_dmafunction sprd_stop_txfunction sprd_start_txfunction sprd_break_ctlfunction sprd_rxfunction sprd_txfunction sprd_handle_irqfunction sprd_uart_dma_startupfunction sprd_startupfunction sprd_shutdownfunction sprd_set_termiosfunction sprd_release_portfunction sprd_config_portfunction sprd_verify_portfunction sprd_pmfunction sprd_poll_initfunction sprd_poll_get_charfunction sprd_poll_put_charfunction wait_for_xmitrfunction sprd_console_putcharfunction sprd_console_writefunction sprd_console_setupfunction sprd_serial_console_init
Annotated Snippet
struct sprd_uart_dma {
struct dma_chan *chn;
unsigned char *virt;
dma_addr_t phys_addr;
dma_cookie_t cookie;
u32 trans_len;
bool enable;
};
struct sprd_uart_data {
unsigned int timeout_ien;
unsigned int timeout_iclr;
unsigned int timeout_imsr;
};
struct sprd_uart_port {
struct uart_port port;
char name[16];
struct clk *clk;
struct sprd_uart_dma tx_dma;
struct sprd_uart_dma rx_dma;
dma_addr_t pos;
unsigned char *rx_buf_tail;
const struct sprd_uart_data *pdata;
};
static struct sprd_uart_port *sprd_port[UART_NR_MAX];
static int sprd_ports_num;
static int sprd_start_dma_rx(struct uart_port *port);
static int sprd_tx_dma_config(struct uart_port *port);
static const struct sprd_uart_data sc9836_data = {
.timeout_ien = SPRD_IEN_TIMEOUT,
.timeout_iclr = SPRD_ICLR_TIMEOUT,
.timeout_imsr = SPRD_IMSR_TIMEOUT,
};
static const struct sprd_uart_data sc9632_data = {
.timeout_ien = SPRD_IEN_DATA_TIMEOUT,
.timeout_iclr = SPRD_ICLR_DATA_TIMEOUT,
.timeout_imsr = SPRD_IMSR_DATA_TIMEOUT,
};
static inline unsigned int serial_in(struct uart_port *port,
unsigned int offset)
{
return readl_relaxed(port->membase + offset);
}
static inline void serial_out(struct uart_port *port, unsigned int offset,
int value)
{
writel_relaxed(value, port->membase + offset);
}
static unsigned int sprd_tx_empty(struct uart_port *port)
{
if (serial_in(port, SPRD_STS1) & SPRD_TX_FIFO_CNT_MASK)
return 0;
else
return TIOCSER_TEMT;
}
static unsigned int sprd_get_mctrl(struct uart_port *port)
{
return TIOCM_DSR | TIOCM_CTS;
}
static void sprd_set_mctrl(struct uart_port *port, unsigned int mctrl)
{
u32 val = serial_in(port, SPRD_CTL1);
if (mctrl & TIOCM_LOOP)
val |= SPRD_LOOPBACK_EN;
else
val &= ~SPRD_LOOPBACK_EN;
serial_out(port, SPRD_CTL1, val);
}
static void sprd_stop_rx(struct uart_port *port)
{
struct sprd_uart_port *sp =
container_of(port, struct sprd_uart_port, port);
unsigned int ien, iclr;
if (sp->rx_dma.enable)
dmaengine_terminate_all(sp->rx_dma.chn);
Annotation
- Immediate include surface: `linux/clk.h`, `linux/console.h`, `linux/delay.h`, `linux/dmaengine.h`, `linux/dma-mapping.h`, `linux/dma/sprd-dma.h`, `linux/io.h`, `linux/ioport.h`.
- Detected declarations: `struct sprd_uart_dma`, `struct sprd_uart_data`, `struct sprd_uart_port`, `function serial_in`, `function serial_out`, `function sprd_tx_empty`, `function sprd_get_mctrl`, `function sprd_set_mctrl`, `function sprd_stop_rx`, `function sprd_uart_dma_enable`.
- Atlas domain: Driver Families / drivers/tty.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.