xref: /OK3568_Linux_fs/kernel/drivers/tty/serial/rp2.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Driver for Comtrol RocketPort EXPRESS/INFINITY cards
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2012 Kevin Cernekee <cernekee@gmail.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Inspired by, and loosely based on:
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  *   ar933x_uart.c
10*4882a593Smuzhiyun  *     Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *   rocketport_infinity_express-linux-1.20.tar.gz
13*4882a593Smuzhiyun  *     Copyright (C) 2004-2011 Comtrol, Inc.
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <linux/bitops.h>
17*4882a593Smuzhiyun #include <linux/compiler.h>
18*4882a593Smuzhiyun #include <linux/completion.h>
19*4882a593Smuzhiyun #include <linux/console.h>
20*4882a593Smuzhiyun #include <linux/delay.h>
21*4882a593Smuzhiyun #include <linux/firmware.h>
22*4882a593Smuzhiyun #include <linux/init.h>
23*4882a593Smuzhiyun #include <linux/io.h>
24*4882a593Smuzhiyun #include <linux/ioport.h>
25*4882a593Smuzhiyun #include <linux/irq.h>
26*4882a593Smuzhiyun #include <linux/kernel.h>
27*4882a593Smuzhiyun #include <linux/log2.h>
28*4882a593Smuzhiyun #include <linux/module.h>
29*4882a593Smuzhiyun #include <linux/pci.h>
30*4882a593Smuzhiyun #include <linux/serial.h>
31*4882a593Smuzhiyun #include <linux/serial_core.h>
32*4882a593Smuzhiyun #include <linux/slab.h>
33*4882a593Smuzhiyun #include <linux/sysrq.h>
34*4882a593Smuzhiyun #include <linux/tty.h>
35*4882a593Smuzhiyun #include <linux/tty_flip.h>
36*4882a593Smuzhiyun #include <linux/types.h>
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define DRV_NAME			"rp2"
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define RP2_FW_NAME			"rp2.fw"
41*4882a593Smuzhiyun #define RP2_UCODE_BYTES			0x3f
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define PORTS_PER_ASIC			16
44*4882a593Smuzhiyun #define ALL_PORTS_MASK			(BIT(PORTS_PER_ASIC) - 1)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define UART_CLOCK			44236800
47*4882a593Smuzhiyun #define DEFAULT_BAUD_DIV		(UART_CLOCK / (9600 * 16))
48*4882a593Smuzhiyun #define FIFO_SIZE			512
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /* BAR0 registers */
51*4882a593Smuzhiyun #define RP2_FPGA_CTL0			0x110
52*4882a593Smuzhiyun #define RP2_FPGA_CTL1			0x11c
53*4882a593Smuzhiyun #define RP2_IRQ_MASK			0x1ec
54*4882a593Smuzhiyun #define RP2_IRQ_MASK_EN_m		BIT(0)
55*4882a593Smuzhiyun #define RP2_IRQ_STATUS			0x1f0
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* BAR1 registers */
58*4882a593Smuzhiyun #define RP2_ASIC_SPACING		0x1000
59*4882a593Smuzhiyun #define RP2_ASIC_OFFSET(i)		((i) << ilog2(RP2_ASIC_SPACING))
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define RP2_PORT_BASE			0x000
62*4882a593Smuzhiyun #define RP2_PORT_SPACING		0x040
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define RP2_UCODE_BASE			0x400
65*4882a593Smuzhiyun #define RP2_UCODE_SPACING		0x80
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define RP2_CLK_PRESCALER		0xc00
68*4882a593Smuzhiyun #define RP2_CH_IRQ_STAT			0xc04
69*4882a593Smuzhiyun #define RP2_CH_IRQ_MASK			0xc08
70*4882a593Smuzhiyun #define RP2_ASIC_IRQ			0xd00
71*4882a593Smuzhiyun #define RP2_ASIC_IRQ_EN_m		BIT(20)
72*4882a593Smuzhiyun #define RP2_GLOBAL_CMD			0xd0c
73*4882a593Smuzhiyun #define RP2_ASIC_CFG			0xd04
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* port registers */
76*4882a593Smuzhiyun #define RP2_DATA_DWORD			0x000
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define RP2_DATA_BYTE			0x008
79*4882a593Smuzhiyun #define RP2_DATA_BYTE_ERR_PARITY_m	BIT(8)
80*4882a593Smuzhiyun #define RP2_DATA_BYTE_ERR_OVERRUN_m	BIT(9)
81*4882a593Smuzhiyun #define RP2_DATA_BYTE_ERR_FRAMING_m	BIT(10)
82*4882a593Smuzhiyun #define RP2_DATA_BYTE_BREAK_m		BIT(11)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* This lets uart_insert_char() drop bytes received on a !CREAD port */
85*4882a593Smuzhiyun #define RP2_DUMMY_READ			BIT(16)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define RP2_DATA_BYTE_EXCEPTION_MASK	(RP2_DATA_BYTE_ERR_PARITY_m | \
88*4882a593Smuzhiyun 					 RP2_DATA_BYTE_ERR_OVERRUN_m | \
89*4882a593Smuzhiyun 					 RP2_DATA_BYTE_ERR_FRAMING_m | \
90*4882a593Smuzhiyun 					 RP2_DATA_BYTE_BREAK_m)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define RP2_RX_FIFO_COUNT		0x00c
93*4882a593Smuzhiyun #define RP2_TX_FIFO_COUNT		0x00e
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define RP2_CHAN_STAT			0x010
96*4882a593Smuzhiyun #define RP2_CHAN_STAT_RXDATA_m		BIT(0)
97*4882a593Smuzhiyun #define RP2_CHAN_STAT_DCD_m		BIT(3)
98*4882a593Smuzhiyun #define RP2_CHAN_STAT_DSR_m		BIT(4)
99*4882a593Smuzhiyun #define RP2_CHAN_STAT_CTS_m		BIT(5)
100*4882a593Smuzhiyun #define RP2_CHAN_STAT_RI_m		BIT(6)
101*4882a593Smuzhiyun #define RP2_CHAN_STAT_OVERRUN_m		BIT(13)
102*4882a593Smuzhiyun #define RP2_CHAN_STAT_DSR_CHANGED_m	BIT(16)
103*4882a593Smuzhiyun #define RP2_CHAN_STAT_CTS_CHANGED_m	BIT(17)
104*4882a593Smuzhiyun #define RP2_CHAN_STAT_CD_CHANGED_m	BIT(18)
105*4882a593Smuzhiyun #define RP2_CHAN_STAT_RI_CHANGED_m	BIT(22)
106*4882a593Smuzhiyun #define RP2_CHAN_STAT_TXEMPTY_m		BIT(25)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define RP2_CHAN_STAT_MS_CHANGED_MASK	(RP2_CHAN_STAT_DSR_CHANGED_m | \
109*4882a593Smuzhiyun 					 RP2_CHAN_STAT_CTS_CHANGED_m | \
110*4882a593Smuzhiyun 					 RP2_CHAN_STAT_CD_CHANGED_m | \
111*4882a593Smuzhiyun 					 RP2_CHAN_STAT_RI_CHANGED_m)
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define RP2_TXRX_CTL			0x014
114*4882a593Smuzhiyun #define RP2_TXRX_CTL_MSRIRQ_m		BIT(0)
115*4882a593Smuzhiyun #define RP2_TXRX_CTL_RXIRQ_m		BIT(2)
116*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_TRIG_s		3
117*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_TRIG_m		(0x3 << RP2_TXRX_CTL_RX_TRIG_s)
118*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_TRIG_1		(0x1 << RP2_TXRX_CTL_RX_TRIG_s)
119*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_TRIG_256	(0x2 << RP2_TXRX_CTL_RX_TRIG_s)
120*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_TRIG_448	(0x3 << RP2_TXRX_CTL_RX_TRIG_s)
121*4882a593Smuzhiyun #define RP2_TXRX_CTL_RX_EN_m		BIT(5)
122*4882a593Smuzhiyun #define RP2_TXRX_CTL_RTSFLOW_m		BIT(6)
123*4882a593Smuzhiyun #define RP2_TXRX_CTL_DTRFLOW_m		BIT(7)
124*4882a593Smuzhiyun #define RP2_TXRX_CTL_TX_TRIG_s		16
125*4882a593Smuzhiyun #define RP2_TXRX_CTL_TX_TRIG_m		(0x3 << RP2_TXRX_CTL_RX_TRIG_s)
126*4882a593Smuzhiyun #define RP2_TXRX_CTL_DSRFLOW_m		BIT(18)
127*4882a593Smuzhiyun #define RP2_TXRX_CTL_TXIRQ_m		BIT(19)
128*4882a593Smuzhiyun #define RP2_TXRX_CTL_CTSFLOW_m		BIT(23)
129*4882a593Smuzhiyun #define RP2_TXRX_CTL_TX_EN_m		BIT(24)
130*4882a593Smuzhiyun #define RP2_TXRX_CTL_RTS_m		BIT(25)
131*4882a593Smuzhiyun #define RP2_TXRX_CTL_DTR_m		BIT(26)
132*4882a593Smuzhiyun #define RP2_TXRX_CTL_LOOP_m		BIT(27)
133*4882a593Smuzhiyun #define RP2_TXRX_CTL_BREAK_m		BIT(28)
134*4882a593Smuzhiyun #define RP2_TXRX_CTL_CMSPAR_m		BIT(29)
135*4882a593Smuzhiyun #define RP2_TXRX_CTL_nPARODD_m		BIT(30)
136*4882a593Smuzhiyun #define RP2_TXRX_CTL_PARENB_m		BIT(31)
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #define RP2_UART_CTL			0x018
139*4882a593Smuzhiyun #define RP2_UART_CTL_MODE_s		0
140*4882a593Smuzhiyun #define RP2_UART_CTL_MODE_m		(0x7 << RP2_UART_CTL_MODE_s)
141*4882a593Smuzhiyun #define RP2_UART_CTL_MODE_rs232		(0x1 << RP2_UART_CTL_MODE_s)
142*4882a593Smuzhiyun #define RP2_UART_CTL_FLUSH_RX_m		BIT(3)
143*4882a593Smuzhiyun #define RP2_UART_CTL_FLUSH_TX_m		BIT(4)
144*4882a593Smuzhiyun #define RP2_UART_CTL_RESET_CH_m		BIT(5)
145*4882a593Smuzhiyun #define RP2_UART_CTL_XMIT_EN_m		BIT(6)
146*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_s		8
147*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_m		(0x3 << RP2_UART_CTL_DATABITS_s)
148*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_8		(0x3 << RP2_UART_CTL_DATABITS_s)
149*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_7		(0x2 << RP2_UART_CTL_DATABITS_s)
150*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_6		(0x1 << RP2_UART_CTL_DATABITS_s)
151*4882a593Smuzhiyun #define RP2_UART_CTL_DATABITS_5		(0x0 << RP2_UART_CTL_DATABITS_s)
152*4882a593Smuzhiyun #define RP2_UART_CTL_STOPBITS_m		BIT(10)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define RP2_BAUD			0x01c
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /* ucode registers */
157*4882a593Smuzhiyun #define RP2_TX_SWFLOW			0x02
158*4882a593Smuzhiyun #define RP2_TX_SWFLOW_ena		0x81
159*4882a593Smuzhiyun #define RP2_TX_SWFLOW_dis		0x9d
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define RP2_RX_SWFLOW			0x0c
162*4882a593Smuzhiyun #define RP2_RX_SWFLOW_ena		0x81
163*4882a593Smuzhiyun #define RP2_RX_SWFLOW_dis		0x8d
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define RP2_RX_FIFO			0x37
166*4882a593Smuzhiyun #define RP2_RX_FIFO_ena			0x08
167*4882a593Smuzhiyun #define RP2_RX_FIFO_dis			0x81
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun static struct uart_driver rp2_uart_driver = {
170*4882a593Smuzhiyun 	.owner				= THIS_MODULE,
171*4882a593Smuzhiyun 	.driver_name			= DRV_NAME,
172*4882a593Smuzhiyun 	.dev_name			= "ttyRP",
173*4882a593Smuzhiyun 	.nr				= CONFIG_SERIAL_RP2_NR_UARTS,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun struct rp2_card;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun struct rp2_uart_port {
179*4882a593Smuzhiyun 	struct uart_port		port;
180*4882a593Smuzhiyun 	int				idx;
181*4882a593Smuzhiyun 	int				ignore_rx;
182*4882a593Smuzhiyun 	struct rp2_card			*card;
183*4882a593Smuzhiyun 	void __iomem			*asic_base;
184*4882a593Smuzhiyun 	void __iomem			*base;
185*4882a593Smuzhiyun 	void __iomem			*ucode;
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun struct rp2_card {
189*4882a593Smuzhiyun 	struct pci_dev			*pdev;
190*4882a593Smuzhiyun 	struct rp2_uart_port		*ports;
191*4882a593Smuzhiyun 	int				n_ports;
192*4882a593Smuzhiyun 	int				initialized_ports;
193*4882a593Smuzhiyun 	int				minor_start;
194*4882a593Smuzhiyun 	int				smpte;
195*4882a593Smuzhiyun 	void __iomem			*bar0;
196*4882a593Smuzhiyun 	void __iomem			*bar1;
197*4882a593Smuzhiyun 	spinlock_t			card_lock;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define RP_ID(prod) PCI_VDEVICE(RP, (prod))
201*4882a593Smuzhiyun #define RP_CAP(ports, smpte) (((ports) << 8) | ((smpte) << 0))
202*4882a593Smuzhiyun 
rp2_decode_cap(const struct pci_device_id * id,int * ports,int * smpte)203*4882a593Smuzhiyun static inline void rp2_decode_cap(const struct pci_device_id *id,
204*4882a593Smuzhiyun 				  int *ports, int *smpte)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	*ports = id->driver_data >> 8;
207*4882a593Smuzhiyun 	*smpte = id->driver_data & 0xff;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun static DEFINE_SPINLOCK(rp2_minor_lock);
211*4882a593Smuzhiyun static int rp2_minor_next;
212*4882a593Smuzhiyun 
rp2_alloc_ports(int n_ports)213*4882a593Smuzhiyun static int rp2_alloc_ports(int n_ports)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun 	int ret = -ENOSPC;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	spin_lock(&rp2_minor_lock);
218*4882a593Smuzhiyun 	if (rp2_minor_next + n_ports <= CONFIG_SERIAL_RP2_NR_UARTS) {
219*4882a593Smuzhiyun 		/* sorry, no support for hot unplugging individual cards */
220*4882a593Smuzhiyun 		ret = rp2_minor_next;
221*4882a593Smuzhiyun 		rp2_minor_next += n_ports;
222*4882a593Smuzhiyun 	}
223*4882a593Smuzhiyun 	spin_unlock(&rp2_minor_lock);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	return ret;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
port_to_up(struct uart_port * port)228*4882a593Smuzhiyun static inline struct rp2_uart_port *port_to_up(struct uart_port *port)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	return container_of(port, struct rp2_uart_port, port);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
rp2_rmw(struct rp2_uart_port * up,int reg,u32 clr_bits,u32 set_bits)233*4882a593Smuzhiyun static void rp2_rmw(struct rp2_uart_port *up, int reg,
234*4882a593Smuzhiyun 		    u32 clr_bits, u32 set_bits)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	u32 tmp = readl(up->base + reg);
237*4882a593Smuzhiyun 	tmp &= ~clr_bits;
238*4882a593Smuzhiyun 	tmp |= set_bits;
239*4882a593Smuzhiyun 	writel(tmp, up->base + reg);
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun 
rp2_rmw_clr(struct rp2_uart_port * up,int reg,u32 val)242*4882a593Smuzhiyun static void rp2_rmw_clr(struct rp2_uart_port *up, int reg, u32 val)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun 	rp2_rmw(up, reg, val, 0);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
rp2_rmw_set(struct rp2_uart_port * up,int reg,u32 val)247*4882a593Smuzhiyun static void rp2_rmw_set(struct rp2_uart_port *up, int reg, u32 val)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 	rp2_rmw(up, reg, 0, val);
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
rp2_mask_ch_irq(struct rp2_uart_port * up,int ch_num,int is_enabled)252*4882a593Smuzhiyun static void rp2_mask_ch_irq(struct rp2_uart_port *up, int ch_num,
253*4882a593Smuzhiyun 			    int is_enabled)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	unsigned long flags, irq_mask;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	spin_lock_irqsave(&up->card->card_lock, flags);
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	irq_mask = readl(up->asic_base + RP2_CH_IRQ_MASK);
260*4882a593Smuzhiyun 	if (is_enabled)
261*4882a593Smuzhiyun 		irq_mask &= ~BIT(ch_num);
262*4882a593Smuzhiyun 	else
263*4882a593Smuzhiyun 		irq_mask |= BIT(ch_num);
264*4882a593Smuzhiyun 	writel(irq_mask, up->asic_base + RP2_CH_IRQ_MASK);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	spin_unlock_irqrestore(&up->card->card_lock, flags);
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
rp2_uart_tx_empty(struct uart_port * port)269*4882a593Smuzhiyun static unsigned int rp2_uart_tx_empty(struct uart_port *port)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun 	struct rp2_uart_port *up = port_to_up(port);
272*4882a593Smuzhiyun 	unsigned long tx_fifo_bytes, flags;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	/*
275*4882a593Smuzhiyun 	 * This should probably check the transmitter, not the FIFO.
276*4882a593Smuzhiyun 	 * But the TXEMPTY bit doesn't seem to work unless the TX IRQ is
277*4882a593Smuzhiyun 	 * enabled.
278*4882a593Smuzhiyun 	 */
279*4882a593Smuzhiyun 	spin_lock_irqsave(&up->port.lock, flags);
280*4882a593Smuzhiyun 	tx_fifo_bytes = readw(up->base + RP2_TX_FIFO_COUNT);
281*4882a593Smuzhiyun 	spin_unlock_irqrestore(&up->port.lock, flags);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	return tx_fifo_bytes ? 0 : TIOCSER_TEMT;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
rp2_uart_get_mctrl(struct uart_port * port)286*4882a593Smuzhiyun static unsigned int rp2_uart_get_mctrl(struct uart_port *port)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 	struct rp2_uart_port *up = port_to_up(port);
289*4882a593Smuzhiyun 	u32 status;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	status = readl(up->base + RP2_CHAN_STAT);
292*4882a593Smuzhiyun 	return ((status & RP2_CHAN_STAT_DCD_m) ? TIOCM_CAR : 0) |
293*4882a593Smuzhiyun 	       ((status & RP2_CHAN_STAT_DSR_m) ? TIOCM_DSR : 0) |
294*4882a593Smuzhiyun 	       ((status & RP2_CHAN_STAT_CTS_m) ? TIOCM_CTS : 0) |
295*4882a593Smuzhiyun 	       ((status & RP2_CHAN_STAT_RI_m) ? TIOCM_RI : 0);
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun 
rp2_uart_set_mctrl(struct uart_port * port,unsigned int mctrl)298*4882a593Smuzhiyun static void rp2_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun 	rp2_rmw(port_to_up(port), RP2_TXRX_CTL,
301*4882a593Smuzhiyun 		RP2_TXRX_CTL_DTR_m | RP2_TXRX_CTL_RTS_m | RP2_TXRX_CTL_LOOP_m,
302*4882a593Smuzhiyun 		((mctrl & TIOCM_DTR) ? RP2_TXRX_CTL_DTR_m : 0) |
303*4882a593Smuzhiyun 		((mctrl & TIOCM_RTS) ? RP2_TXRX_CTL_RTS_m : 0) |
304*4882a593Smuzhiyun 		((mctrl & TIOCM_LOOP) ? RP2_TXRX_CTL_LOOP_m : 0));
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
rp2_uart_start_tx(struct uart_port * port)307*4882a593Smuzhiyun static void rp2_uart_start_tx(struct uart_port *port)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun 	rp2_rmw_set(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_TXIRQ_m);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
rp2_uart_stop_tx(struct uart_port * port)312*4882a593Smuzhiyun static void rp2_uart_stop_tx(struct uart_port *port)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	rp2_rmw_clr(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_TXIRQ_m);
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
rp2_uart_stop_rx(struct uart_port * port)317*4882a593Smuzhiyun static void rp2_uart_stop_rx(struct uart_port *port)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun 	rp2_rmw_clr(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_RXIRQ_m);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun 
rp2_uart_break_ctl(struct uart_port * port,int break_state)322*4882a593Smuzhiyun static void rp2_uart_break_ctl(struct uart_port *port, int break_state)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun 	unsigned long flags;
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	spin_lock_irqsave(&port->lock, flags);
327*4882a593Smuzhiyun 	rp2_rmw(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_BREAK_m,
328*4882a593Smuzhiyun 		break_state ? RP2_TXRX_CTL_BREAK_m : 0);
329*4882a593Smuzhiyun 	spin_unlock_irqrestore(&port->lock, flags);
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun 
rp2_uart_enable_ms(struct uart_port * port)332*4882a593Smuzhiyun static void rp2_uart_enable_ms(struct uart_port *port)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun 	rp2_rmw_set(port_to_up(port), RP2_TXRX_CTL, RP2_TXRX_CTL_MSRIRQ_m);
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
__rp2_uart_set_termios(struct rp2_uart_port * up,unsigned long cfl,unsigned long ifl,unsigned int baud_div)337*4882a593Smuzhiyun static void __rp2_uart_set_termios(struct rp2_uart_port *up,
338*4882a593Smuzhiyun 				   unsigned long cfl,
339*4882a593Smuzhiyun 				   unsigned long ifl,
340*4882a593Smuzhiyun 				   unsigned int baud_div)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun 	/* baud rate divisor (calculated elsewhere).  0 = divide-by-1 */
343*4882a593Smuzhiyun 	writew(baud_div - 1, up->base + RP2_BAUD);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	/* data bits and stop bits */
346*4882a593Smuzhiyun 	rp2_rmw(up, RP2_UART_CTL,
347*4882a593Smuzhiyun 		RP2_UART_CTL_STOPBITS_m | RP2_UART_CTL_DATABITS_m,
348*4882a593Smuzhiyun 		((cfl & CSTOPB) ? RP2_UART_CTL_STOPBITS_m : 0) |
349*4882a593Smuzhiyun 		(((cfl & CSIZE) == CS8) ? RP2_UART_CTL_DATABITS_8 : 0) |
350*4882a593Smuzhiyun 		(((cfl & CSIZE) == CS7) ? RP2_UART_CTL_DATABITS_7 : 0) |
351*4882a593Smuzhiyun 		(((cfl & CSIZE) == CS6) ? RP2_UART_CTL_DATABITS_6 : 0) |
352*4882a593Smuzhiyun 		(((cfl & CSIZE) == CS5) ? RP2_UART_CTL_DATABITS_5 : 0));
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	/* parity and hardware flow control */
355*4882a593Smuzhiyun 	rp2_rmw(up, RP2_TXRX_CTL,
356*4882a593Smuzhiyun 		RP2_TXRX_CTL_PARENB_m | RP2_TXRX_CTL_nPARODD_m |
357*4882a593Smuzhiyun 		RP2_TXRX_CTL_CMSPAR_m | RP2_TXRX_CTL_DTRFLOW_m |
358*4882a593Smuzhiyun 		RP2_TXRX_CTL_DSRFLOW_m | RP2_TXRX_CTL_RTSFLOW_m |
359*4882a593Smuzhiyun 		RP2_TXRX_CTL_CTSFLOW_m,
360*4882a593Smuzhiyun 		((cfl & PARENB) ? RP2_TXRX_CTL_PARENB_m : 0) |
361*4882a593Smuzhiyun 		((cfl & PARODD) ? 0 : RP2_TXRX_CTL_nPARODD_m) |
362*4882a593Smuzhiyun 		((cfl & CMSPAR) ? RP2_TXRX_CTL_CMSPAR_m : 0) |
363*4882a593Smuzhiyun 		((cfl & CRTSCTS) ? (RP2_TXRX_CTL_RTSFLOW_m |
364*4882a593Smuzhiyun 				    RP2_TXRX_CTL_CTSFLOW_m) : 0));
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	/* XON/XOFF software flow control */
367*4882a593Smuzhiyun 	writeb((ifl & IXON) ? RP2_TX_SWFLOW_ena : RP2_TX_SWFLOW_dis,
368*4882a593Smuzhiyun 	       up->ucode + RP2_TX_SWFLOW);
369*4882a593Smuzhiyun 	writeb((ifl & IXOFF) ? RP2_RX_SWFLOW_ena : RP2_RX_SWFLOW_dis,
370*4882a593Smuzhiyun 	       up->ucode + RP2_RX_SWFLOW);
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun 
rp2_uart_set_termios(struct uart_port * port,struct ktermios * new,struct ktermios * old)373*4882a593Smuzhiyun static void rp2_uart_set_termios(struct uart_port *port,
374*4882a593Smuzhiyun 				 struct ktermios *new,
375*4882a593Smuzhiyun 				 struct ktermios *old)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	struct rp2_uart_port *up = port_to_up(port);
378*4882a593Smuzhiyun 	unsigned long flags;
379*4882a593Smuzhiyun 	unsigned int baud, baud_div;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
382*4882a593Smuzhiyun 	baud_div = uart_get_divisor(port, baud);
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	if (tty_termios_baud_rate(new))
385*4882a593Smuzhiyun 		tty_termios_encode_baud_rate(new, baud, baud);
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	spin_lock_irqsave(&port->lock, flags);
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	/* ignore all characters if CREAD is not set */
390*4882a593Smuzhiyun 	port->ignore_status_mask = (new->c_cflag & CREAD) ? 0 : RP2_DUMMY_READ;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	__rp2_uart_set_termios(up, new->c_cflag, new->c_iflag, baud_div);
393*4882a593Smuzhiyun 	uart_update_timeout(port, new->c_cflag, baud);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	spin_unlock_irqrestore(&port->lock, flags);
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
rp2_rx_chars(struct rp2_uart_port * up)398*4882a593Smuzhiyun static void rp2_rx_chars(struct rp2_uart_port *up)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun 	u16 bytes = readw(up->base + RP2_RX_FIFO_COUNT);
401*4882a593Smuzhiyun 	struct tty_port *port = &up->port.state->port;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	for (; bytes != 0; bytes--) {
404*4882a593Smuzhiyun 		u32 byte = readw(up->base + RP2_DATA_BYTE) | RP2_DUMMY_READ;
405*4882a593Smuzhiyun 		char ch = byte & 0xff;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 		if (likely(!(byte & RP2_DATA_BYTE_EXCEPTION_MASK))) {
408*4882a593Smuzhiyun 			if (!uart_handle_sysrq_char(&up->port, ch))
409*4882a593Smuzhiyun 				uart_insert_char(&up->port, byte, 0, ch,
410*4882a593Smuzhiyun 						 TTY_NORMAL);
411*4882a593Smuzhiyun 		} else {
412*4882a593Smuzhiyun 			char flag = TTY_NORMAL;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 			if (byte & RP2_DATA_BYTE_BREAK_m)
415*4882a593Smuzhiyun 				flag = TTY_BREAK;
416*4882a593Smuzhiyun 			else if (byte & RP2_DATA_BYTE_ERR_FRAMING_m)
417*4882a593Smuzhiyun 				flag = TTY_FRAME;
418*4882a593Smuzhiyun 			else if (byte & RP2_DATA_BYTE_ERR_PARITY_m)
419*4882a593Smuzhiyun 				flag = TTY_PARITY;
420*4882a593Smuzhiyun 			uart_insert_char(&up->port, byte,
421*4882a593Smuzhiyun 					 RP2_DATA_BYTE_ERR_OVERRUN_m, ch, flag);
422*4882a593Smuzhiyun 		}
423*4882a593Smuzhiyun 		up->port.icount.rx++;
424*4882a593Smuzhiyun 	}
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	spin_unlock(&up->port.lock);
427*4882a593Smuzhiyun 	tty_flip_buffer_push(port);
428*4882a593Smuzhiyun 	spin_lock(&up->port.lock);
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun 
rp2_tx_chars(struct rp2_uart_port * up)431*4882a593Smuzhiyun static void rp2_tx_chars(struct rp2_uart_port *up)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun 	u16 max_tx = FIFO_SIZE - readw(up->base + RP2_TX_FIFO_COUNT);
434*4882a593Smuzhiyun 	struct circ_buf *xmit = &up->port.state->xmit;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	if (uart_tx_stopped(&up->port)) {
437*4882a593Smuzhiyun 		rp2_uart_stop_tx(&up->port);
438*4882a593Smuzhiyun 		return;
439*4882a593Smuzhiyun 	}
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	for (; max_tx != 0; max_tx--) {
442*4882a593Smuzhiyun 		if (up->port.x_char) {
443*4882a593Smuzhiyun 			writeb(up->port.x_char, up->base + RP2_DATA_BYTE);
444*4882a593Smuzhiyun 			up->port.x_char = 0;
445*4882a593Smuzhiyun 			up->port.icount.tx++;
446*4882a593Smuzhiyun 			continue;
447*4882a593Smuzhiyun 		}
448*4882a593Smuzhiyun 		if (uart_circ_empty(xmit)) {
449*4882a593Smuzhiyun 			rp2_uart_stop_tx(&up->port);
450*4882a593Smuzhiyun 			break;
451*4882a593Smuzhiyun 		}
452*4882a593Smuzhiyun 		writeb(xmit->buf[xmit->tail], up->base + RP2_DATA_BYTE);
453*4882a593Smuzhiyun 		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
454*4882a593Smuzhiyun 		up->port.icount.tx++;
455*4882a593Smuzhiyun 	}
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
458*4882a593Smuzhiyun 		uart_write_wakeup(&up->port);
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun 
rp2_ch_interrupt(struct rp2_uart_port * up)461*4882a593Smuzhiyun static void rp2_ch_interrupt(struct rp2_uart_port *up)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun 	u32 status;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	spin_lock(&up->port.lock);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun 	/*
468*4882a593Smuzhiyun 	 * The IRQ status bits are clear-on-write.  Other status bits in
469*4882a593Smuzhiyun 	 * this register aren't, so it's harmless to write to them.
470*4882a593Smuzhiyun 	 */
471*4882a593Smuzhiyun 	status = readl(up->base + RP2_CHAN_STAT);
472*4882a593Smuzhiyun 	writel(status, up->base + RP2_CHAN_STAT);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	if (status & RP2_CHAN_STAT_RXDATA_m)
475*4882a593Smuzhiyun 		rp2_rx_chars(up);
476*4882a593Smuzhiyun 	if (status & RP2_CHAN_STAT_TXEMPTY_m)
477*4882a593Smuzhiyun 		rp2_tx_chars(up);
478*4882a593Smuzhiyun 	if (status & RP2_CHAN_STAT_MS_CHANGED_MASK)
479*4882a593Smuzhiyun 		wake_up_interruptible(&up->port.state->port.delta_msr_wait);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	spin_unlock(&up->port.lock);
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun 
rp2_asic_interrupt(struct rp2_card * card,unsigned int asic_id)484*4882a593Smuzhiyun static int rp2_asic_interrupt(struct rp2_card *card, unsigned int asic_id)
485*4882a593Smuzhiyun {
486*4882a593Smuzhiyun 	void __iomem *base = card->bar1 + RP2_ASIC_OFFSET(asic_id);
487*4882a593Smuzhiyun 	int ch, handled = 0;
488*4882a593Smuzhiyun 	unsigned long status = readl(base + RP2_CH_IRQ_STAT) &
489*4882a593Smuzhiyun 			       ~readl(base + RP2_CH_IRQ_MASK);
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	for_each_set_bit(ch, &status, PORTS_PER_ASIC) {
492*4882a593Smuzhiyun 		rp2_ch_interrupt(&card->ports[ch]);
493*4882a593Smuzhiyun 		handled++;
494*4882a593Smuzhiyun 	}
495*4882a593Smuzhiyun 	return handled;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun 
rp2_uart_interrupt(int irq,void * dev_id)498*4882a593Smuzhiyun static irqreturn_t rp2_uart_interrupt(int irq, void *dev_id)
499*4882a593Smuzhiyun {
500*4882a593Smuzhiyun 	struct rp2_card *card = dev_id;
501*4882a593Smuzhiyun 	int handled;
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	handled = rp2_asic_interrupt(card, 0);
504*4882a593Smuzhiyun 	if (card->n_ports >= PORTS_PER_ASIC)
505*4882a593Smuzhiyun 		handled += rp2_asic_interrupt(card, 1);
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	return handled ? IRQ_HANDLED : IRQ_NONE;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun 
rp2_flush_fifos(struct rp2_uart_port * up)510*4882a593Smuzhiyun static inline void rp2_flush_fifos(struct rp2_uart_port *up)
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun 	rp2_rmw_set(up, RP2_UART_CTL,
513*4882a593Smuzhiyun 		    RP2_UART_CTL_FLUSH_RX_m | RP2_UART_CTL_FLUSH_TX_m);
514*4882a593Smuzhiyun 	readl(up->base + RP2_UART_CTL);
515*4882a593Smuzhiyun 	udelay(10);
516*4882a593Smuzhiyun 	rp2_rmw_clr(up, RP2_UART_CTL,
517*4882a593Smuzhiyun 		    RP2_UART_CTL_FLUSH_RX_m | RP2_UART_CTL_FLUSH_TX_m);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun 
rp2_uart_startup(struct uart_port * port)520*4882a593Smuzhiyun static int rp2_uart_startup(struct uart_port *port)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun 	struct rp2_uart_port *up = port_to_up(port);
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	rp2_flush_fifos(up);
525*4882a593Smuzhiyun 	rp2_rmw(up, RP2_TXRX_CTL, RP2_TXRX_CTL_MSRIRQ_m, RP2_TXRX_CTL_RXIRQ_m);
526*4882a593Smuzhiyun 	rp2_rmw(up, RP2_TXRX_CTL, RP2_TXRX_CTL_RX_TRIG_m,
527*4882a593Smuzhiyun 		RP2_TXRX_CTL_RX_TRIG_1);
528*4882a593Smuzhiyun 	rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
529*4882a593Smuzhiyun 	rp2_mask_ch_irq(up, up->idx, 1);
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	return 0;
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun 
rp2_uart_shutdown(struct uart_port * port)534*4882a593Smuzhiyun static void rp2_uart_shutdown(struct uart_port *port)
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun 	struct rp2_uart_port *up = port_to_up(port);
537*4882a593Smuzhiyun 	unsigned long flags;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	rp2_uart_break_ctl(port, 0);
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	spin_lock_irqsave(&port->lock, flags);
542*4882a593Smuzhiyun 	rp2_mask_ch_irq(up, up->idx, 0);
543*4882a593Smuzhiyun 	rp2_rmw(up, RP2_CHAN_STAT, 0, 0);
544*4882a593Smuzhiyun 	spin_unlock_irqrestore(&port->lock, flags);
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun 
rp2_uart_type(struct uart_port * port)547*4882a593Smuzhiyun static const char *rp2_uart_type(struct uart_port *port)
548*4882a593Smuzhiyun {
549*4882a593Smuzhiyun 	return (port->type == PORT_RP2) ? "RocketPort 2 UART" : NULL;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
rp2_uart_release_port(struct uart_port * port)552*4882a593Smuzhiyun static void rp2_uart_release_port(struct uart_port *port)
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun 	/* Nothing to release ... */
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun 
rp2_uart_request_port(struct uart_port * port)557*4882a593Smuzhiyun static int rp2_uart_request_port(struct uart_port *port)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun 	/* UARTs always present */
560*4882a593Smuzhiyun 	return 0;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun 
rp2_uart_config_port(struct uart_port * port,int flags)563*4882a593Smuzhiyun static void rp2_uart_config_port(struct uart_port *port, int flags)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun 	if (flags & UART_CONFIG_TYPE)
566*4882a593Smuzhiyun 		port->type = PORT_RP2;
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun 
rp2_uart_verify_port(struct uart_port * port,struct serial_struct * ser)569*4882a593Smuzhiyun static int rp2_uart_verify_port(struct uart_port *port,
570*4882a593Smuzhiyun 				   struct serial_struct *ser)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	if (ser->type != PORT_UNKNOWN && ser->type != PORT_RP2)
573*4882a593Smuzhiyun 		return -EINVAL;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	return 0;
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun static const struct uart_ops rp2_uart_ops = {
579*4882a593Smuzhiyun 	.tx_empty	= rp2_uart_tx_empty,
580*4882a593Smuzhiyun 	.set_mctrl	= rp2_uart_set_mctrl,
581*4882a593Smuzhiyun 	.get_mctrl	= rp2_uart_get_mctrl,
582*4882a593Smuzhiyun 	.stop_tx	= rp2_uart_stop_tx,
583*4882a593Smuzhiyun 	.start_tx	= rp2_uart_start_tx,
584*4882a593Smuzhiyun 	.stop_rx	= rp2_uart_stop_rx,
585*4882a593Smuzhiyun 	.enable_ms	= rp2_uart_enable_ms,
586*4882a593Smuzhiyun 	.break_ctl	= rp2_uart_break_ctl,
587*4882a593Smuzhiyun 	.startup	= rp2_uart_startup,
588*4882a593Smuzhiyun 	.shutdown	= rp2_uart_shutdown,
589*4882a593Smuzhiyun 	.set_termios	= rp2_uart_set_termios,
590*4882a593Smuzhiyun 	.type		= rp2_uart_type,
591*4882a593Smuzhiyun 	.release_port	= rp2_uart_release_port,
592*4882a593Smuzhiyun 	.request_port	= rp2_uart_request_port,
593*4882a593Smuzhiyun 	.config_port	= rp2_uart_config_port,
594*4882a593Smuzhiyun 	.verify_port	= rp2_uart_verify_port,
595*4882a593Smuzhiyun };
596*4882a593Smuzhiyun 
rp2_reset_asic(struct rp2_card * card,unsigned int asic_id)597*4882a593Smuzhiyun static void rp2_reset_asic(struct rp2_card *card, unsigned int asic_id)
598*4882a593Smuzhiyun {
599*4882a593Smuzhiyun 	void __iomem *base = card->bar1 + RP2_ASIC_OFFSET(asic_id);
600*4882a593Smuzhiyun 	u32 clk_cfg;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	writew(1, base + RP2_GLOBAL_CMD);
603*4882a593Smuzhiyun 	readw(base + RP2_GLOBAL_CMD);
604*4882a593Smuzhiyun 	msleep(100);
605*4882a593Smuzhiyun 	writel(0, base + RP2_CLK_PRESCALER);
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	/* TDM clock configuration */
608*4882a593Smuzhiyun 	clk_cfg = readw(base + RP2_ASIC_CFG);
609*4882a593Smuzhiyun 	clk_cfg = (clk_cfg & ~BIT(8)) | BIT(9);
610*4882a593Smuzhiyun 	writew(clk_cfg, base + RP2_ASIC_CFG);
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun 	/* IRQ routing */
613*4882a593Smuzhiyun 	writel(ALL_PORTS_MASK, base + RP2_CH_IRQ_MASK);
614*4882a593Smuzhiyun 	writel(RP2_ASIC_IRQ_EN_m, base + RP2_ASIC_IRQ);
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun 
rp2_init_card(struct rp2_card * card)617*4882a593Smuzhiyun static void rp2_init_card(struct rp2_card *card)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun 	writel(4, card->bar0 + RP2_FPGA_CTL0);
620*4882a593Smuzhiyun 	writel(0, card->bar0 + RP2_FPGA_CTL1);
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	rp2_reset_asic(card, 0);
623*4882a593Smuzhiyun 	if (card->n_ports >= PORTS_PER_ASIC)
624*4882a593Smuzhiyun 		rp2_reset_asic(card, 1);
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun 	writel(RP2_IRQ_MASK_EN_m, card->bar0 + RP2_IRQ_MASK);
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun 
rp2_init_port(struct rp2_uart_port * up,const struct firmware * fw)629*4882a593Smuzhiyun static void rp2_init_port(struct rp2_uart_port *up, const struct firmware *fw)
630*4882a593Smuzhiyun {
631*4882a593Smuzhiyun 	int i;
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun 	writel(RP2_UART_CTL_RESET_CH_m, up->base + RP2_UART_CTL);
634*4882a593Smuzhiyun 	readl(up->base + RP2_UART_CTL);
635*4882a593Smuzhiyun 	udelay(1);
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun 	writel(0, up->base + RP2_TXRX_CTL);
638*4882a593Smuzhiyun 	writel(0, up->base + RP2_UART_CTL);
639*4882a593Smuzhiyun 	readl(up->base + RP2_UART_CTL);
640*4882a593Smuzhiyun 	udelay(1);
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun 	rp2_flush_fifos(up);
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	for (i = 0; i < min_t(int, fw->size, RP2_UCODE_BYTES); i++)
645*4882a593Smuzhiyun 		writeb(fw->data[i], up->ucode + i);
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun 	__rp2_uart_set_termios(up, CS8 | CREAD | CLOCAL, 0, DEFAULT_BAUD_DIV);
648*4882a593Smuzhiyun 	rp2_uart_set_mctrl(&up->port, 0);
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	writeb(RP2_RX_FIFO_ena, up->ucode + RP2_RX_FIFO);
651*4882a593Smuzhiyun 	rp2_rmw(up, RP2_UART_CTL, RP2_UART_CTL_MODE_m,
652*4882a593Smuzhiyun 		RP2_UART_CTL_XMIT_EN_m | RP2_UART_CTL_MODE_rs232);
653*4882a593Smuzhiyun 	rp2_rmw_set(up, RP2_TXRX_CTL,
654*4882a593Smuzhiyun 		    RP2_TXRX_CTL_TX_EN_m | RP2_TXRX_CTL_RX_EN_m);
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun 
rp2_remove_ports(struct rp2_card * card)657*4882a593Smuzhiyun static void rp2_remove_ports(struct rp2_card *card)
658*4882a593Smuzhiyun {
659*4882a593Smuzhiyun 	int i;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 	for (i = 0; i < card->initialized_ports; i++)
662*4882a593Smuzhiyun 		uart_remove_one_port(&rp2_uart_driver, &card->ports[i].port);
663*4882a593Smuzhiyun 	card->initialized_ports = 0;
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun 
rp2_load_firmware(struct rp2_card * card,const struct firmware * fw)666*4882a593Smuzhiyun static int rp2_load_firmware(struct rp2_card *card, const struct firmware *fw)
667*4882a593Smuzhiyun {
668*4882a593Smuzhiyun 	resource_size_t phys_base;
669*4882a593Smuzhiyun 	int i, rc = 0;
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun 	phys_base = pci_resource_start(card->pdev, 1);
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	for (i = 0; i < card->n_ports; i++) {
674*4882a593Smuzhiyun 		struct rp2_uart_port *rp = &card->ports[i];
675*4882a593Smuzhiyun 		struct uart_port *p;
676*4882a593Smuzhiyun 		int j = (unsigned)i % PORTS_PER_ASIC;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 		rp->asic_base = card->bar1;
679*4882a593Smuzhiyun 		rp->base = card->bar1 + RP2_PORT_BASE + j*RP2_PORT_SPACING;
680*4882a593Smuzhiyun 		rp->ucode = card->bar1 + RP2_UCODE_BASE + j*RP2_UCODE_SPACING;
681*4882a593Smuzhiyun 		rp->card = card;
682*4882a593Smuzhiyun 		rp->idx = j;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 		p = &rp->port;
685*4882a593Smuzhiyun 		p->line = card->minor_start + i;
686*4882a593Smuzhiyun 		p->dev = &card->pdev->dev;
687*4882a593Smuzhiyun 		p->type = PORT_RP2;
688*4882a593Smuzhiyun 		p->iotype = UPIO_MEM32;
689*4882a593Smuzhiyun 		p->uartclk = UART_CLOCK;
690*4882a593Smuzhiyun 		p->regshift = 2;
691*4882a593Smuzhiyun 		p->fifosize = FIFO_SIZE;
692*4882a593Smuzhiyun 		p->ops = &rp2_uart_ops;
693*4882a593Smuzhiyun 		p->irq = card->pdev->irq;
694*4882a593Smuzhiyun 		p->membase = rp->base;
695*4882a593Smuzhiyun 		p->mapbase = phys_base + RP2_PORT_BASE + j*RP2_PORT_SPACING;
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 		if (i >= PORTS_PER_ASIC) {
698*4882a593Smuzhiyun 			rp->asic_base += RP2_ASIC_SPACING;
699*4882a593Smuzhiyun 			rp->base += RP2_ASIC_SPACING;
700*4882a593Smuzhiyun 			rp->ucode += RP2_ASIC_SPACING;
701*4882a593Smuzhiyun 			p->mapbase += RP2_ASIC_SPACING;
702*4882a593Smuzhiyun 		}
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 		rp2_init_port(rp, fw);
705*4882a593Smuzhiyun 		rc = uart_add_one_port(&rp2_uart_driver, p);
706*4882a593Smuzhiyun 		if (rc) {
707*4882a593Smuzhiyun 			dev_err(&card->pdev->dev,
708*4882a593Smuzhiyun 				"error registering port %d: %d\n", i, rc);
709*4882a593Smuzhiyun 			rp2_remove_ports(card);
710*4882a593Smuzhiyun 			break;
711*4882a593Smuzhiyun 		}
712*4882a593Smuzhiyun 		card->initialized_ports++;
713*4882a593Smuzhiyun 	}
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun 	return rc;
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun 
rp2_probe(struct pci_dev * pdev,const struct pci_device_id * id)718*4882a593Smuzhiyun static int rp2_probe(struct pci_dev *pdev,
719*4882a593Smuzhiyun 				   const struct pci_device_id *id)
720*4882a593Smuzhiyun {
721*4882a593Smuzhiyun 	const struct firmware *fw;
722*4882a593Smuzhiyun 	struct rp2_card *card;
723*4882a593Smuzhiyun 	struct rp2_uart_port *ports;
724*4882a593Smuzhiyun 	void __iomem * const *bars;
725*4882a593Smuzhiyun 	int rc;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	card = devm_kzalloc(&pdev->dev, sizeof(*card), GFP_KERNEL);
728*4882a593Smuzhiyun 	if (!card)
729*4882a593Smuzhiyun 		return -ENOMEM;
730*4882a593Smuzhiyun 	pci_set_drvdata(pdev, card);
731*4882a593Smuzhiyun 	spin_lock_init(&card->card_lock);
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun 	rc = pcim_enable_device(pdev);
734*4882a593Smuzhiyun 	if (rc)
735*4882a593Smuzhiyun 		return rc;
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun 	rc = pcim_iomap_regions_request_all(pdev, 0x03, DRV_NAME);
738*4882a593Smuzhiyun 	if (rc)
739*4882a593Smuzhiyun 		return rc;
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun 	bars = pcim_iomap_table(pdev);
742*4882a593Smuzhiyun 	card->bar0 = bars[0];
743*4882a593Smuzhiyun 	card->bar1 = bars[1];
744*4882a593Smuzhiyun 	card->pdev = pdev;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	rp2_decode_cap(id, &card->n_ports, &card->smpte);
747*4882a593Smuzhiyun 	dev_info(&pdev->dev, "found new card with %d ports\n", card->n_ports);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 	card->minor_start = rp2_alloc_ports(card->n_ports);
750*4882a593Smuzhiyun 	if (card->minor_start < 0) {
751*4882a593Smuzhiyun 		dev_err(&pdev->dev,
752*4882a593Smuzhiyun 			"too many ports (try increasing CONFIG_SERIAL_RP2_NR_UARTS)\n");
753*4882a593Smuzhiyun 		return -EINVAL;
754*4882a593Smuzhiyun 	}
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 	rp2_init_card(card);
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun 	ports = devm_kcalloc(&pdev->dev, card->n_ports, sizeof(*ports),
759*4882a593Smuzhiyun 			     GFP_KERNEL);
760*4882a593Smuzhiyun 	if (!ports)
761*4882a593Smuzhiyun 		return -ENOMEM;
762*4882a593Smuzhiyun 	card->ports = ports;
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	rc = request_firmware(&fw, RP2_FW_NAME, &pdev->dev);
765*4882a593Smuzhiyun 	if (rc < 0) {
766*4882a593Smuzhiyun 		dev_err(&pdev->dev, "cannot find '%s' firmware image\n",
767*4882a593Smuzhiyun 			RP2_FW_NAME);
768*4882a593Smuzhiyun 		return rc;
769*4882a593Smuzhiyun 	}
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 	rc = rp2_load_firmware(card, fw);
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	release_firmware(fw);
774*4882a593Smuzhiyun 	if (rc < 0)
775*4882a593Smuzhiyun 		return rc;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun 	rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
778*4882a593Smuzhiyun 			      IRQF_SHARED, DRV_NAME, card);
779*4882a593Smuzhiyun 	if (rc)
780*4882a593Smuzhiyun 		return rc;
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	return 0;
783*4882a593Smuzhiyun }
784*4882a593Smuzhiyun 
rp2_remove(struct pci_dev * pdev)785*4882a593Smuzhiyun static void rp2_remove(struct pci_dev *pdev)
786*4882a593Smuzhiyun {
787*4882a593Smuzhiyun 	struct rp2_card *card = pci_get_drvdata(pdev);
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	rp2_remove_ports(card);
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun static const struct pci_device_id rp2_pci_tbl[] = {
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	/* RocketPort INFINITY cards */
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	{ RP_ID(0x0040), RP_CAP(8,  0) }, /* INF Octa, RJ45, selectable */
797*4882a593Smuzhiyun 	{ RP_ID(0x0041), RP_CAP(32, 0) }, /* INF 32, ext interface */
798*4882a593Smuzhiyun 	{ RP_ID(0x0042), RP_CAP(8,  0) }, /* INF Octa, ext interface */
799*4882a593Smuzhiyun 	{ RP_ID(0x0043), RP_CAP(16, 0) }, /* INF 16, ext interface */
800*4882a593Smuzhiyun 	{ RP_ID(0x0044), RP_CAP(4,  0) }, /* INF Quad, DB, selectable */
801*4882a593Smuzhiyun 	{ RP_ID(0x0045), RP_CAP(8,  0) }, /* INF Octa, DB, selectable */
802*4882a593Smuzhiyun 	{ RP_ID(0x0046), RP_CAP(4,  0) }, /* INF Quad, ext interface */
803*4882a593Smuzhiyun 	{ RP_ID(0x0047), RP_CAP(4,  0) }, /* INF Quad, RJ45 */
804*4882a593Smuzhiyun 	{ RP_ID(0x004a), RP_CAP(4,  0) }, /* INF Plus, Quad */
805*4882a593Smuzhiyun 	{ RP_ID(0x004b), RP_CAP(8,  0) }, /* INF Plus, Octa */
806*4882a593Smuzhiyun 	{ RP_ID(0x004c), RP_CAP(8,  0) }, /* INF III, Octa */
807*4882a593Smuzhiyun 	{ RP_ID(0x004d), RP_CAP(4,  0) }, /* INF III, Quad */
808*4882a593Smuzhiyun 	{ RP_ID(0x004e), RP_CAP(2,  0) }, /* INF Plus, 2, RS232 */
809*4882a593Smuzhiyun 	{ RP_ID(0x004f), RP_CAP(2,  1) }, /* INF Plus, 2, SMPTE */
810*4882a593Smuzhiyun 	{ RP_ID(0x0050), RP_CAP(4,  0) }, /* INF Plus, Quad, RJ45 */
811*4882a593Smuzhiyun 	{ RP_ID(0x0051), RP_CAP(8,  0) }, /* INF Plus, Octa, RJ45 */
812*4882a593Smuzhiyun 	{ RP_ID(0x0052), RP_CAP(8,  1) }, /* INF Octa, SMPTE */
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun 	/* RocketPort EXPRESS cards */
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 	{ RP_ID(0x0060), RP_CAP(8,  0) }, /* EXP Octa, RJ45, selectable */
817*4882a593Smuzhiyun 	{ RP_ID(0x0061), RP_CAP(32, 0) }, /* EXP 32, ext interface */
818*4882a593Smuzhiyun 	{ RP_ID(0x0062), RP_CAP(8,  0) }, /* EXP Octa, ext interface */
819*4882a593Smuzhiyun 	{ RP_ID(0x0063), RP_CAP(16, 0) }, /* EXP 16, ext interface */
820*4882a593Smuzhiyun 	{ RP_ID(0x0064), RP_CAP(4,  0) }, /* EXP Quad, DB, selectable */
821*4882a593Smuzhiyun 	{ RP_ID(0x0065), RP_CAP(8,  0) }, /* EXP Octa, DB, selectable */
822*4882a593Smuzhiyun 	{ RP_ID(0x0066), RP_CAP(4,  0) }, /* EXP Quad, ext interface */
823*4882a593Smuzhiyun 	{ RP_ID(0x0067), RP_CAP(4,  0) }, /* EXP Quad, RJ45 */
824*4882a593Smuzhiyun 	{ RP_ID(0x0068), RP_CAP(8,  0) }, /* EXP Octa, RJ11 */
825*4882a593Smuzhiyun 	{ RP_ID(0x0072), RP_CAP(8,  1) }, /* EXP Octa, SMPTE */
826*4882a593Smuzhiyun 	{ }
827*4882a593Smuzhiyun };
828*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, rp2_pci_tbl);
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun static struct pci_driver rp2_pci_driver = {
831*4882a593Smuzhiyun 	.name		= DRV_NAME,
832*4882a593Smuzhiyun 	.id_table	= rp2_pci_tbl,
833*4882a593Smuzhiyun 	.probe		= rp2_probe,
834*4882a593Smuzhiyun 	.remove		= rp2_remove,
835*4882a593Smuzhiyun };
836*4882a593Smuzhiyun 
rp2_uart_init(void)837*4882a593Smuzhiyun static int __init rp2_uart_init(void)
838*4882a593Smuzhiyun {
839*4882a593Smuzhiyun 	int rc;
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	rc = uart_register_driver(&rp2_uart_driver);
842*4882a593Smuzhiyun 	if (rc)
843*4882a593Smuzhiyun 		return rc;
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun 	rc = pci_register_driver(&rp2_pci_driver);
846*4882a593Smuzhiyun 	if (rc) {
847*4882a593Smuzhiyun 		uart_unregister_driver(&rp2_uart_driver);
848*4882a593Smuzhiyun 		return rc;
849*4882a593Smuzhiyun 	}
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	return 0;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun 
rp2_uart_exit(void)854*4882a593Smuzhiyun static void __exit rp2_uart_exit(void)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun 	pci_unregister_driver(&rp2_pci_driver);
857*4882a593Smuzhiyun 	uart_unregister_driver(&rp2_uart_driver);
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun module_init(rp2_uart_init);
861*4882a593Smuzhiyun module_exit(rp2_uart_exit);
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun MODULE_DESCRIPTION("Comtrol RocketPort EXPRESS/INFINITY driver");
864*4882a593Smuzhiyun MODULE_AUTHOR("Kevin Cernekee <cernekee@gmail.com>");
865*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
866*4882a593Smuzhiyun MODULE_FIRMWARE(RP2_FW_NAME);
867