forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/drivers/tty/serial/sa1100.c
....@@ -7,10 +7,6 @@
77 * Copyright (C) 2000 Deep Blue Solutions Ltd.
88 */
99
10
-#if defined(CONFIG_SERIAL_SA1100_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
11
-#define SUPPORT_SYSRQ
12
-#endif
13
-
1410 #include <linux/module.h>
1511 #include <linux/ioport.h>
1612 #include <linux/init.h>
....@@ -27,6 +23,8 @@
2723 #include <asm/irq.h>
2824 #include <mach/hardware.h>
2925 #include <mach/irqs.h>
26
+
27
+#include "serial_mctrl_gpio.h"
3028
3129 /* We've been assigned a range on the "Low-density serial ports" major */
3230 #define SERIAL_SA1100_MAJOR 204
....@@ -77,6 +75,7 @@
7775 struct uart_port port;
7876 struct timer_list timer;
7977 unsigned int old_status;
78
+ struct mctrl_gpios *gpios;
8079 };
8180
8281 /*
....@@ -174,6 +173,8 @@
174173 container_of(port, struct sa1100_port, port);
175174
176175 mod_timer(&sport->timer, jiffies);
176
+
177
+ mctrl_gpio_enable_ms(sport->gpios);
177178 }
178179
179180 static void
....@@ -209,9 +210,7 @@
209210 else if (status & UTSR1_TO_SM(UTSR1_FRE))
210211 flg = TTY_FRAME;
211212
212
-#ifdef SUPPORT_SYSRQ
213213 sport->port.sysrq = 0;
214
-#endif
215214 }
216215
217216 if (uart_handle_sysrq_char(&sport->port, ch))
....@@ -322,11 +321,21 @@
322321
323322 static unsigned int sa1100_get_mctrl(struct uart_port *port)
324323 {
325
- return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
324
+ struct sa1100_port *sport =
325
+ container_of(port, struct sa1100_port, port);
326
+ int ret = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
327
+
328
+ mctrl_gpio_get(sport->gpios, &ret);
329
+
330
+ return ret;
326331 }
327332
328333 static void sa1100_set_mctrl(struct uart_port *port, unsigned int mctrl)
329334 {
335
+ struct sa1100_port *sport =
336
+ container_of(port, struct sa1100_port, port);
337
+
338
+ mctrl_gpio_set(sport->gpios, mctrl);
330339 }
331340
332341 /*
....@@ -439,6 +448,8 @@
439448 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
440449 quot = uart_get_divisor(port, baud);
441450
451
+ del_timer_sync(&sport->timer);
452
+
442453 spin_lock_irqsave(&sport->port.lock, flags);
443454
444455 sport->port.read_status_mask &= UTSR0_TO_SM(UTSR0_TFS);
....@@ -468,8 +479,6 @@
468479 sport->port.ignore_status_mask |=
469480 UTSR1_TO_SM(UTSR1_ROR);
470481 }
471
-
472
- del_timer_sync(&sport->timer);
473482
474483 /*
475484 * Update the per-port timeout.
....@@ -842,26 +851,48 @@
842851 return 0;
843852 }
844853
854
+static int sa1100_serial_add_one_port(struct sa1100_port *sport, struct platform_device *dev)
855
+{
856
+ sport->port.dev = &dev->dev;
857
+ sport->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_SA1100_CONSOLE);
858
+
859
+ // mctrl_gpio_init() requires that the GPIO driver supports interrupts,
860
+ // but we need to support GPIO drivers for hardware that has no such
861
+ // interrupts. Use mctrl_gpio_init_noauto() instead.
862
+ sport->gpios = mctrl_gpio_init_noauto(sport->port.dev, 0);
863
+ if (IS_ERR(sport->gpios)) {
864
+ int err = PTR_ERR(sport->gpios);
865
+
866
+ dev_err(sport->port.dev, "failed to get mctrl gpios: %d\n",
867
+ err);
868
+
869
+ if (err == -EPROBE_DEFER)
870
+ return err;
871
+
872
+ sport->gpios = NULL;
873
+ }
874
+
875
+ platform_set_drvdata(dev, sport);
876
+
877
+ return uart_add_one_port(&sa1100_reg, &sport->port);
878
+}
879
+
845880 static int sa1100_serial_probe(struct platform_device *dev)
846881 {
847
- struct resource *res = dev->resource;
882
+ struct resource *res;
848883 int i;
849884
850
- for (i = 0; i < dev->num_resources; i++, res++)
851
- if (res->flags & IORESOURCE_MEM)
852
- break;
885
+ res = platform_get_resource(dev, IORESOURCE_MEM, 0);
886
+ if (!res)
887
+ return -EINVAL;
853888
854
- if (i < dev->num_resources) {
855
- for (i = 0; i < NR_PORTS; i++) {
856
- if (sa1100_ports[i].port.mapbase != res->start)
857
- continue;
858
-
859
- sa1100_ports[i].port.dev = &dev->dev;
860
- uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
861
- platform_set_drvdata(dev, &sa1100_ports[i]);
889
+ for (i = 0; i < NR_PORTS; i++)
890
+ if (sa1100_ports[i].port.mapbase == res->start)
862891 break;
863
- }
864
- }
892
+ if (i == NR_PORTS)
893
+ return -ENODEV;
894
+
895
+ sa1100_serial_add_one_port(&sa1100_ports[i], dev);
865896
866897 return 0;
867898 }