162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Synopsys DesignWare 8250 library header file. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/io.h>
562306a36Sopenharmony_ci#include <linux/notifier.h>
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci#include <linux/workqueue.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "8250.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct clk;
1262306a36Sopenharmony_cistruct reset_control;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct dw8250_port_data {
1562306a36Sopenharmony_ci	/* Port properties */
1662306a36Sopenharmony_ci	int			line;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	/* DMA operations */
1962306a36Sopenharmony_ci	struct uart_8250_dma	dma;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	/* Hardware configuration */
2262306a36Sopenharmony_ci	u8			dlf_size;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/* RS485 variables */
2562306a36Sopenharmony_ci	bool			hw_rs485_support;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct dw8250_platform_data {
2962306a36Sopenharmony_ci	u8 usr_reg;
3062306a36Sopenharmony_ci	u32 cpr_val;
3162306a36Sopenharmony_ci	unsigned int quirks;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct dw8250_data {
3562306a36Sopenharmony_ci	struct dw8250_port_data	data;
3662306a36Sopenharmony_ci	const struct dw8250_platform_data *pdata;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	int			msr_mask_on;
3962306a36Sopenharmony_ci	int			msr_mask_off;
4062306a36Sopenharmony_ci	struct clk		*clk;
4162306a36Sopenharmony_ci	struct clk		*pclk;
4262306a36Sopenharmony_ci	struct notifier_block	clk_notifier;
4362306a36Sopenharmony_ci	struct work_struct	clk_work;
4462306a36Sopenharmony_ci	struct reset_control	*rst;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	unsigned int		skip_autocfg:1;
4762306a36Sopenharmony_ci	unsigned int		uart_16550_compatible:1;
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_civoid dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios, const struct ktermios *old);
5162306a36Sopenharmony_civoid dw8250_setup_port(struct uart_port *p);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline struct dw8250_data *to_dw8250_data(struct dw8250_port_data *data)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	return container_of(data, struct dw8250_data, data);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic inline u32 dw8250_readl_ext(struct uart_port *p, int offset)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	if (p->iotype == UPIO_MEM32BE)
6162306a36Sopenharmony_ci		return ioread32be(p->membase + offset);
6262306a36Sopenharmony_ci	return readl(p->membase + offset);
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline void dw8250_writel_ext(struct uart_port *p, int offset, u32 reg)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	if (p->iotype == UPIO_MEM32BE)
6862306a36Sopenharmony_ci		iowrite32be(reg, p->membase + offset);
6962306a36Sopenharmony_ci	else
7062306a36Sopenharmony_ci		writel(reg, p->membase + offset);
7162306a36Sopenharmony_ci}
72