forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/tty/serial/lantiq.c
....@@ -8,24 +8,23 @@
88 * Copyright (C) 2010 Thomas Langer, <thomas.langer@lantiq.com>
99 */
1010
11
-#include <linux/slab.h>
12
-#include <linux/ioport.h>
13
-#include <linux/init.h>
11
+#include <linux/clk.h>
1412 #include <linux/console.h>
15
-#include <linux/sysrq.h>
1613 #include <linux/device.h>
17
-#include <linux/tty.h>
18
-#include <linux/tty_flip.h>
19
-#include <linux/serial_core.h>
20
-#include <linux/serial.h>
21
-#include <linux/of_platform.h>
14
+#include <linux/init.h>
15
+#include <linux/io.h>
16
+#include <linux/ioport.h>
17
+#include <linux/lantiq.h>
18
+#include <linux/module.h>
2219 #include <linux/of_address.h>
2320 #include <linux/of_irq.h>
24
-#include <linux/io.h>
25
-#include <linux/clk.h>
26
-#include <linux/gpio.h>
27
-
28
-#include <lantiq_soc.h>
21
+#include <linux/of_platform.h>
22
+#include <linux/serial.h>
23
+#include <linux/serial_core.h>
24
+#include <linux/slab.h>
25
+#include <linux/sysrq.h>
26
+#include <linux/tty.h>
27
+#include <linux/tty_flip.h>
2928
3029 #define PORT_LTQ_ASC 111
3130 #define MAXPORTS 2
....@@ -58,6 +57,7 @@
5857 #define ASC_IRNCR_TIR 0x1
5958 #define ASC_IRNCR_RIR 0x2
6059 #define ASC_IRNCR_EIR 0x4
60
+#define ASC_IRNCR_MASK GENMASK(2, 0)
6161
6262 #define ASCOPT_CSIZE 0x3
6363 #define TXFIFO_FL 1
....@@ -100,18 +100,34 @@
100100 static void lqasc_tx_chars(struct uart_port *port);
101101 static struct ltq_uart_port *lqasc_port[MAXPORTS];
102102 static struct uart_driver lqasc_reg;
103
-static DEFINE_SPINLOCK(ltq_asc_lock);
103
+
104
+struct ltq_soc_data {
105
+ int (*fetch_irq)(struct device *dev, struct ltq_uart_port *ltq_port);
106
+ int (*request_irq)(struct uart_port *port);
107
+ void (*free_irq)(struct uart_port *port);
108
+};
104109
105110 struct ltq_uart_port {
106111 struct uart_port port;
107112 /* clock used to derive divider */
108
- struct clk *fpiclk;
113
+ struct clk *freqclk;
109114 /* clock gating of the ASC core */
110115 struct clk *clk;
111116 unsigned int tx_irq;
112117 unsigned int rx_irq;
113118 unsigned int err_irq;
119
+ unsigned int common_irq;
120
+ spinlock_t lock; /* exclusive access for multi core */
121
+
122
+ const struct ltq_soc_data *soc;
114123 };
124
+
125
+static inline void asc_update_bits(u32 clear, u32 set, void __iomem *reg)
126
+{
127
+ u32 tmp = __raw_readl(reg);
128
+
129
+ __raw_writel((tmp & ~clear) | set, reg);
130
+}
115131
116132 static inline struct
117133 ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
....@@ -129,16 +145,18 @@
129145 lqasc_start_tx(struct uart_port *port)
130146 {
131147 unsigned long flags;
132
- spin_lock_irqsave(&ltq_asc_lock, flags);
148
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
149
+
150
+ spin_lock_irqsave(&ltq_port->lock, flags);
133151 lqasc_tx_chars(port);
134
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
152
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
135153 return;
136154 }
137155
138156 static void
139157 lqasc_stop_rx(struct uart_port *port)
140158 {
141
- ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
159
+ __raw_writel(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
142160 }
143161
144162 static int
....@@ -147,11 +165,12 @@
147165 struct tty_port *tport = &port->state->port;
148166 unsigned int ch = 0, rsr = 0, fifocnt;
149167
150
- fifocnt = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
168
+ fifocnt = __raw_readl(port->membase + LTQ_ASC_FSTAT) &
169
+ ASCFSTAT_RXFFLMASK;
151170 while (fifocnt--) {
152171 u8 flag = TTY_NORMAL;
153
- ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
154
- rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
172
+ ch = readb(port->membase + LTQ_ASC_RBUF);
173
+ rsr = (__raw_readl(port->membase + LTQ_ASC_STATE)
155174 & ASCSTATE_ANY) | UART_DUMMY_UER_RX;
156175 tty_flip_buffer_push(tport);
157176 port->icount.rx++;
....@@ -163,16 +182,16 @@
163182 if (rsr & ASCSTATE_ANY) {
164183 if (rsr & ASCSTATE_PE) {
165184 port->icount.parity++;
166
- ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
185
+ asc_update_bits(0, ASCWHBSTATE_CLRPE,
167186 port->membase + LTQ_ASC_WHBSTATE);
168187 } else if (rsr & ASCSTATE_FE) {
169188 port->icount.frame++;
170
- ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
189
+ asc_update_bits(0, ASCWHBSTATE_CLRFE,
171190 port->membase + LTQ_ASC_WHBSTATE);
172191 }
173192 if (rsr & ASCSTATE_ROE) {
174193 port->icount.overrun++;
175
- ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
194
+ asc_update_bits(0, ASCWHBSTATE_CLRROE,
176195 port->membase + LTQ_ASC_WHBSTATE);
177196 }
178197
....@@ -211,10 +230,10 @@
211230 return;
212231 }
213232
214
- while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
233
+ while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) &
215234 ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
216235 if (port->x_char) {
217
- ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
236
+ writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
218237 port->icount.tx++;
219238 port->x_char = 0;
220239 continue;
....@@ -223,7 +242,7 @@
223242 if (uart_circ_empty(xmit))
224243 break;
225244
226
- ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
245
+ writeb(port->state->xmit.buf[port->state->xmit.tail],
227246 port->membase + LTQ_ASC_TBUF);
228247 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
229248 port->icount.tx++;
....@@ -238,9 +257,11 @@
238257 {
239258 unsigned long flags;
240259 struct uart_port *port = (struct uart_port *)_port;
241
- spin_lock_irqsave(&ltq_asc_lock, flags);
242
- ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
243
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
260
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
261
+
262
+ spin_lock_irqsave(&ltq_port->lock, flags);
263
+ __raw_writel(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
264
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
244265 lqasc_start_tx(port);
245266 return IRQ_HANDLED;
246267 }
....@@ -250,11 +271,13 @@
250271 {
251272 unsigned long flags;
252273 struct uart_port *port = (struct uart_port *)_port;
253
- spin_lock_irqsave(&ltq_asc_lock, flags);
274
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
275
+
276
+ spin_lock_irqsave(&ltq_port->lock, flags);
254277 /* clear any pending interrupts */
255
- ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
278
+ asc_update_bits(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
256279 ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
257
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
280
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
258281 return IRQ_HANDLED;
259282 }
260283
....@@ -263,10 +286,37 @@
263286 {
264287 unsigned long flags;
265288 struct uart_port *port = (struct uart_port *)_port;
266
- spin_lock_irqsave(&ltq_asc_lock, flags);
267
- ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
289
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
290
+
291
+ spin_lock_irqsave(&ltq_port->lock, flags);
292
+ __raw_writel(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
268293 lqasc_rx_chars(port);
269
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
294
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
295
+ return IRQ_HANDLED;
296
+}
297
+
298
+static irqreturn_t lqasc_irq(int irq, void *p)
299
+{
300
+ unsigned long flags;
301
+ u32 stat;
302
+ struct uart_port *port = p;
303
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
304
+
305
+ spin_lock_irqsave(&ltq_port->lock, flags);
306
+ stat = readl(port->membase + LTQ_ASC_IRNCR);
307
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
308
+ if (!(stat & ASC_IRNCR_MASK))
309
+ return IRQ_NONE;
310
+
311
+ if (stat & ASC_IRNCR_TIR)
312
+ lqasc_tx_int(irq, p);
313
+
314
+ if (stat & ASC_IRNCR_RIR)
315
+ lqasc_rx_int(irq, p);
316
+
317
+ if (stat & ASC_IRNCR_EIR)
318
+ lqasc_err_int(irq, p);
319
+
270320 return IRQ_HANDLED;
271321 }
272322
....@@ -274,7 +324,8 @@
274324 lqasc_tx_empty(struct uart_port *port)
275325 {
276326 int status;
277
- status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
327
+ status = __raw_readl(port->membase + LTQ_ASC_FSTAT) &
328
+ ASCFSTAT_TXFFLMASK;
278329 return status ? 0 : TIOCSER_TEMT;
279330 }
280331
....@@ -299,20 +350,22 @@
299350 {
300351 struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
301352 int retval;
353
+ unsigned long flags;
302354
303355 if (!IS_ERR(ltq_port->clk))
304
- clk_enable(ltq_port->clk);
305
- port->uartclk = clk_get_rate(ltq_port->fpiclk);
356
+ clk_prepare_enable(ltq_port->clk);
357
+ port->uartclk = clk_get_rate(ltq_port->freqclk);
306358
307
- ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
359
+ spin_lock_irqsave(&ltq_port->lock, flags);
360
+ asc_update_bits(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
308361 port->membase + LTQ_ASC_CLC);
309362
310
- ltq_w32(0, port->membase + LTQ_ASC_PISEL);
311
- ltq_w32(
363
+ __raw_writel(0, port->membase + LTQ_ASC_PISEL);
364
+ __raw_writel(
312365 ((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
313366 ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
314367 port->membase + LTQ_ASC_TXFCON);
315
- ltq_w32(
368
+ __raw_writel(
316369 ((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
317370 | ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
318371 port->membase + LTQ_ASC_RXFCON);
....@@ -320,38 +373,17 @@
320373 * setting enable bits
321374 */
322375 wmb();
323
- ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
376
+ asc_update_bits(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
324377 ASCCON_ROEN, port->membase + LTQ_ASC_CON);
325378
326
- retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
327
- 0, "asc_tx", port);
328
- if (retval) {
329
- pr_err("failed to request lqasc_tx_int\n");
379
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
380
+
381
+ retval = ltq_port->soc->request_irq(port);
382
+ if (retval)
330383 return retval;
331
- }
332384
333
- retval = request_irq(ltq_port->rx_irq, lqasc_rx_int,
334
- 0, "asc_rx", port);
335
- if (retval) {
336
- pr_err("failed to request lqasc_rx_int\n");
337
- goto err1;
338
- }
339
-
340
- retval = request_irq(ltq_port->err_irq, lqasc_err_int,
341
- 0, "asc_err", port);
342
- if (retval) {
343
- pr_err("failed to request lqasc_err_int\n");
344
- goto err2;
345
- }
346
-
347
- ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
385
+ __raw_writel(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
348386 port->membase + LTQ_ASC_IRNREN);
349
- return 0;
350
-
351
-err2:
352
- free_irq(ltq_port->rx_irq, port);
353
-err1:
354
- free_irq(ltq_port->tx_irq, port);
355387 return retval;
356388 }
357389
....@@ -359,17 +391,19 @@
359391 lqasc_shutdown(struct uart_port *port)
360392 {
361393 struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
362
- free_irq(ltq_port->tx_irq, port);
363
- free_irq(ltq_port->rx_irq, port);
364
- free_irq(ltq_port->err_irq, port);
394
+ unsigned long flags;
365395
366
- ltq_w32(0, port->membase + LTQ_ASC_CON);
367
- ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
396
+ ltq_port->soc->free_irq(port);
397
+
398
+ spin_lock_irqsave(&ltq_port->lock, flags);
399
+ __raw_writel(0, port->membase + LTQ_ASC_CON);
400
+ asc_update_bits(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
368401 port->membase + LTQ_ASC_RXFCON);
369
- ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
402
+ asc_update_bits(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
370403 port->membase + LTQ_ASC_TXFCON);
404
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
371405 if (!IS_ERR(ltq_port->clk))
372
- clk_disable(ltq_port->clk);
406
+ clk_disable_unprepare(ltq_port->clk);
373407 }
374408
375409 static void
....@@ -382,6 +416,7 @@
382416 unsigned int baud;
383417 unsigned int con = 0;
384418 unsigned long flags;
419
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
385420
386421 cflag = new->c_cflag;
387422 iflag = new->c_iflag;
....@@ -435,10 +470,10 @@
435470 /* set error signals - framing, parity and overrun, enable receiver */
436471 con |= ASCCON_FEN | ASCCON_TOEN | ASCCON_ROEN;
437472
438
- spin_lock_irqsave(&ltq_asc_lock, flags);
473
+ spin_lock_irqsave(&ltq_port->lock, flags);
439474
440475 /* set up CON */
441
- ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
476
+ asc_update_bits(0, con, port->membase + LTQ_ASC_CON);
442477
443478 /* Set baud rate - take a divider of 2 into account */
444479 baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
....@@ -446,24 +481,24 @@
446481 divisor = divisor / 2 - 1;
447482
448483 /* disable the baudrate generator */
449
- ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
484
+ asc_update_bits(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
450485
451486 /* make sure the fractional divider is off */
452
- ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
487
+ asc_update_bits(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
453488
454489 /* set up to use divisor of 2 */
455
- ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
490
+ asc_update_bits(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
456491
457492 /* now we can write the new baudrate into the register */
458
- ltq_w32(divisor, port->membase + LTQ_ASC_BG);
493
+ __raw_writel(divisor, port->membase + LTQ_ASC_BG);
459494
460495 /* turn the baudrate generator back on */
461
- ltq_w32_mask(0, ASCCON_R, port->membase + LTQ_ASC_CON);
496
+ asc_update_bits(0, ASCCON_R, port->membase + LTQ_ASC_CON);
462497
463498 /* enable rx */
464
- ltq_w32(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE);
499
+ __raw_writel(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE);
465500
466
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
501
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
467502
468503 /* Don't rewrite B0 */
469504 if (tty_termios_baud_rate(new))
....@@ -514,7 +549,7 @@
514549 }
515550
516551 if (port->flags & UPF_IOREMAP) {
517
- port->membase = devm_ioremap_nocache(&pdev->dev,
552
+ port->membase = devm_ioremap(&pdev->dev,
518553 port->mapbase, size);
519554 if (port->membase == NULL)
520555 return -ENOMEM;
....@@ -563,6 +598,7 @@
563598 .verify_port = lqasc_verify_port,
564599 };
565600
601
+#ifdef CONFIG_SERIAL_LANTIQ_CONSOLE
566602 static void
567603 lqasc_console_putchar(struct uart_port *port, int ch)
568604 {
....@@ -572,26 +608,23 @@
572608 return;
573609
574610 do {
575
- fifofree = (ltq_r32(port->membase + LTQ_ASC_FSTAT)
611
+ fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT)
576612 & ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF;
577613 } while (fifofree == 0);
578
- ltq_w8(ch, port->membase + LTQ_ASC_TBUF);
614
+ writeb(ch, port->membase + LTQ_ASC_TBUF);
579615 }
580616
581617 static void lqasc_serial_port_write(struct uart_port *port, const char *s,
582618 u_int count)
583619 {
584
- unsigned long flags;
585
-
586
- spin_lock_irqsave(&ltq_asc_lock, flags);
587620 uart_console_write(port, s, count, lqasc_console_putchar);
588
- spin_unlock_irqrestore(&ltq_asc_lock, flags);
589621 }
590622
591623 static void
592624 lqasc_console_write(struct console *co, const char *s, u_int count)
593625 {
594626 struct ltq_uart_port *ltq_port;
627
+ unsigned long flags;
595628
596629 if (co->index >= MAXPORTS)
597630 return;
....@@ -600,7 +633,9 @@
600633 if (!ltq_port)
601634 return;
602635
636
+ spin_lock_irqsave(&ltq_port->lock, flags);
603637 lqasc_serial_port_write(&ltq_port->port, s, count);
638
+ spin_unlock_irqrestore(&ltq_port->lock, flags);
604639 }
605640
606641 static int __init
....@@ -623,9 +658,9 @@
623658 port = &ltq_port->port;
624659
625660 if (!IS_ERR(ltq_port->clk))
626
- clk_enable(ltq_port->clk);
661
+ clk_prepare_enable(ltq_port->clk);
627662
628
- port->uartclk = clk_get_rate(ltq_port->fpiclk);
663
+ port->uartclk = clk_get_rate(ltq_port->freqclk);
629664
630665 if (options)
631666 uart_parse_options(options, &baud, &parity, &bits, &flow);
....@@ -669,7 +704,16 @@
669704 device->con->write = lqasc_serial_early_console_write;
670705 return 0;
671706 }
672
-OF_EARLYCON_DECLARE(lantiq, DRVNAME, lqasc_serial_early_console_setup);
707
+OF_EARLYCON_DECLARE(lantiq, "lantiq,asc", lqasc_serial_early_console_setup);
708
+OF_EARLYCON_DECLARE(lantiq, "intel,lgm-asc", lqasc_serial_early_console_setup);
709
+
710
+#define LANTIQ_SERIAL_CONSOLE (&lqasc_console)
711
+
712
+#else
713
+
714
+#define LANTIQ_SERIAL_CONSOLE NULL
715
+
716
+#endif /* CONFIG_SERIAL_LANTIQ_CONSOLE */
673717
674718 static struct uart_driver lqasc_reg = {
675719 .owner = THIS_MODULE,
....@@ -678,42 +722,155 @@
678722 .major = 0,
679723 .minor = 0,
680724 .nr = MAXPORTS,
681
- .cons = &lqasc_console,
725
+ .cons = LANTIQ_SERIAL_CONSOLE,
682726 };
683727
684
-static int __init
685
-lqasc_probe(struct platform_device *pdev)
728
+static int fetch_irq_lantiq(struct device *dev, struct ltq_uart_port *ltq_port)
729
+{
730
+ struct uart_port *port = &ltq_port->port;
731
+ struct resource irqres[3];
732
+ int ret;
733
+
734
+ ret = of_irq_to_resource_table(dev->of_node, irqres, 3);
735
+ if (ret != 3) {
736
+ dev_err(dev,
737
+ "failed to get IRQs for serial port\n");
738
+ return -ENODEV;
739
+ }
740
+ ltq_port->tx_irq = irqres[0].start;
741
+ ltq_port->rx_irq = irqres[1].start;
742
+ ltq_port->err_irq = irqres[2].start;
743
+ port->irq = irqres[0].start;
744
+
745
+ return 0;
746
+}
747
+
748
+static int request_irq_lantiq(struct uart_port *port)
749
+{
750
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
751
+ int retval;
752
+
753
+ retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
754
+ 0, "asc_tx", port);
755
+ if (retval) {
756
+ dev_err(port->dev, "failed to request asc_tx\n");
757
+ return retval;
758
+ }
759
+
760
+ retval = request_irq(ltq_port->rx_irq, lqasc_rx_int,
761
+ 0, "asc_rx", port);
762
+ if (retval) {
763
+ dev_err(port->dev, "failed to request asc_rx\n");
764
+ goto err1;
765
+ }
766
+
767
+ retval = request_irq(ltq_port->err_irq, lqasc_err_int,
768
+ 0, "asc_err", port);
769
+ if (retval) {
770
+ dev_err(port->dev, "failed to request asc_err\n");
771
+ goto err2;
772
+ }
773
+ return 0;
774
+
775
+err2:
776
+ free_irq(ltq_port->rx_irq, port);
777
+err1:
778
+ free_irq(ltq_port->tx_irq, port);
779
+ return retval;
780
+}
781
+
782
+static void free_irq_lantiq(struct uart_port *port)
783
+{
784
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
785
+
786
+ free_irq(ltq_port->tx_irq, port);
787
+ free_irq(ltq_port->rx_irq, port);
788
+ free_irq(ltq_port->err_irq, port);
789
+}
790
+
791
+static int fetch_irq_intel(struct device *dev, struct ltq_uart_port *ltq_port)
792
+{
793
+ struct uart_port *port = &ltq_port->port;
794
+ int ret;
795
+
796
+ ret = of_irq_get(dev->of_node, 0);
797
+ if (ret < 0) {
798
+ dev_err(dev, "failed to fetch IRQ for serial port\n");
799
+ return ret;
800
+ }
801
+ ltq_port->common_irq = ret;
802
+ port->irq = ret;
803
+
804
+ return 0;
805
+}
806
+
807
+static int request_irq_intel(struct uart_port *port)
808
+{
809
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
810
+ int retval;
811
+
812
+ retval = request_irq(ltq_port->common_irq, lqasc_irq, 0,
813
+ "asc_irq", port);
814
+ if (retval)
815
+ dev_err(port->dev, "failed to request asc_irq\n");
816
+
817
+ return retval;
818
+}
819
+
820
+static void free_irq_intel(struct uart_port *port)
821
+{
822
+ struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
823
+
824
+ free_irq(ltq_port->common_irq, port);
825
+}
826
+
827
+static int lqasc_probe(struct platform_device *pdev)
686828 {
687829 struct device_node *node = pdev->dev.of_node;
688830 struct ltq_uart_port *ltq_port;
689831 struct uart_port *port;
690
- struct resource *mmres, irqres[3];
691
- int line = 0;
832
+ struct resource *mmres;
833
+ int line;
692834 int ret;
693835
694836 mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
695
- ret = of_irq_to_resource_table(node, irqres, 3);
696
- if (!mmres || (ret != 3)) {
837
+ if (!mmres) {
697838 dev_err(&pdev->dev,
698
- "failed to get memory/irq for serial port\n");
839
+ "failed to get memory for serial port\n");
699840 return -ENODEV;
700841 }
701842
702
- /* check if this is the console port */
703
- if (mmres->start != CPHYSADDR(LTQ_EARLY_ASC))
704
- line = 1;
843
+ ltq_port = devm_kzalloc(&pdev->dev, sizeof(struct ltq_uart_port),
844
+ GFP_KERNEL);
845
+ if (!ltq_port)
846
+ return -ENOMEM;
847
+
848
+ port = &ltq_port->port;
849
+
850
+ ltq_port->soc = of_device_get_match_data(&pdev->dev);
851
+ ret = ltq_port->soc->fetch_irq(&pdev->dev, ltq_port);
852
+ if (ret)
853
+ return ret;
854
+
855
+ /* get serial id */
856
+ line = of_alias_get_id(node, "serial");
857
+ if (line < 0) {
858
+ if (IS_ENABLED(CONFIG_LANTIQ)) {
859
+ if (mmres->start == CPHYSADDR(LTQ_EARLY_ASC))
860
+ line = 0;
861
+ else
862
+ line = 1;
863
+ } else {
864
+ dev_err(&pdev->dev, "failed to get alias id, errno %d\n",
865
+ line);
866
+ return line;
867
+ }
868
+ }
705869
706870 if (lqasc_port[line]) {
707871 dev_err(&pdev->dev, "port %d already allocated\n", line);
708872 return -EBUSY;
709873 }
710
-
711
- ltq_port = devm_kzalloc(&pdev->dev, sizeof(struct ltq_uart_port),
712
- GFP_KERNEL);
713
- if (!ltq_port)
714
- return -ENOMEM;
715
-
716
- port = &ltq_port->port;
717874
718875 port->iotype = SERIAL_IO_MEM;
719876 port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
....@@ -723,22 +880,26 @@
723880 port->line = line;
724881 port->dev = &pdev->dev;
725882 /* unused, just to be backward-compatible */
726
- port->irq = irqres[0].start;
727883 port->mapbase = mmres->start;
728884
729
- ltq_port->fpiclk = clk_get_fpi();
730
- if (IS_ERR(ltq_port->fpiclk)) {
885
+ if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
886
+ ltq_port->freqclk = clk_get_fpi();
887
+ else
888
+ ltq_port->freqclk = devm_clk_get(&pdev->dev, "freq");
889
+
890
+
891
+ if (IS_ERR(ltq_port->freqclk)) {
731892 pr_err("failed to get fpi clk\n");
732893 return -ENOENT;
733894 }
734895
735896 /* not all asc ports have clock gates, lets ignore the return code */
736
- ltq_port->clk = clk_get(&pdev->dev, NULL);
897
+ if (IS_ENABLED(CONFIG_LANTIQ) && !IS_ENABLED(CONFIG_COMMON_CLK))
898
+ ltq_port->clk = clk_get(&pdev->dev, NULL);
899
+ else
900
+ ltq_port->clk = devm_clk_get(&pdev->dev, "asc");
737901
738
- ltq_port->tx_irq = irqres[0].start;
739
- ltq_port->rx_irq = irqres[1].start;
740
- ltq_port->err_irq = irqres[2].start;
741
-
902
+ spin_lock_init(&ltq_port->lock);
742903 lqasc_port[line] = ltq_port;
743904 platform_set_drvdata(pdev, ltq_port);
744905
....@@ -747,19 +908,42 @@
747908 return ret;
748909 }
749910
750
-static const struct of_device_id ltq_asc_match[] = {
751
- { .compatible = DRVNAME },
752
- {},
911
+static int lqasc_remove(struct platform_device *pdev)
912
+{
913
+ struct uart_port *port = platform_get_drvdata(pdev);
914
+
915
+ return uart_remove_one_port(&lqasc_reg, port);
916
+}
917
+
918
+static const struct ltq_soc_data soc_data_lantiq = {
919
+ .fetch_irq = fetch_irq_lantiq,
920
+ .request_irq = request_irq_lantiq,
921
+ .free_irq = free_irq_lantiq,
753922 };
754923
924
+static const struct ltq_soc_data soc_data_intel = {
925
+ .fetch_irq = fetch_irq_intel,
926
+ .request_irq = request_irq_intel,
927
+ .free_irq = free_irq_intel,
928
+};
929
+
930
+static const struct of_device_id ltq_asc_match[] = {
931
+ { .compatible = "lantiq,asc", .data = &soc_data_lantiq },
932
+ { .compatible = "intel,lgm-asc", .data = &soc_data_intel },
933
+ {},
934
+};
935
+MODULE_DEVICE_TABLE(of, ltq_asc_match);
936
+
755937 static struct platform_driver lqasc_driver = {
938
+ .probe = lqasc_probe,
939
+ .remove = lqasc_remove,
756940 .driver = {
757941 .name = DRVNAME,
758942 .of_match_table = ltq_asc_match,
759943 },
760944 };
761945
762
-int __init
946
+static int __init
763947 init_lqasc(void)
764948 {
765949 int ret;
....@@ -768,10 +952,21 @@
768952 if (ret != 0)
769953 return ret;
770954
771
- ret = platform_driver_probe(&lqasc_driver, lqasc_probe);
955
+ ret = platform_driver_register(&lqasc_driver);
772956 if (ret != 0)
773957 uart_unregister_driver(&lqasc_reg);
774958
775959 return ret;
776960 }
777
-device_initcall(init_lqasc);
961
+
962
+static void __exit exit_lqasc(void)
963
+{
964
+ platform_driver_unregister(&lqasc_driver);
965
+ uart_unregister_driver(&lqasc_reg);
966
+}
967
+
968
+module_init(init_lqasc);
969
+module_exit(exit_lqasc);
970
+
971
+MODULE_DESCRIPTION("Serial driver for Lantiq & Intel gateway SoCs");
972
+MODULE_LICENSE("GPL v2");