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