Commit | Line | Data |
---|---|---|
b497549a BD |
1 | /* linux/drivers/serial/s3c240.c |
2 | * | |
3 | * Driver for Samsung SoC onboard UARTs. | |
4 | * | |
5 | * Ben Dooks, Copyright (c) 2003-2005 Simtec Electronics | |
6 | * http://armlinux.simtec.co.uk/ | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | */ | |
12 | ||
13 | #include <linux/module.h> | |
14 | #include <linux/ioport.h> | |
15 | #include <linux/io.h> | |
16 | #include <linux/platform_device.h> | |
17 | ||
18 | #include <asm/irq.h> | |
19 | ||
20 | #include <asm/hardware.h> | |
21 | ||
22 | #include <asm/plat-s3c/regs-serial.h> | |
23 | #include <asm/arch/regs-gpio.h> | |
24 | ||
25 | #include "samsung.h" | |
26 | ||
27 | static int s3c2400_serial_getsource(struct uart_port *port, | |
28 | struct s3c24xx_uart_clksrc *clk) | |
29 | { | |
30 | clk->divisor = 1; | |
31 | clk->name = "pclk"; | |
32 | ||
33 | return 0; | |
34 | } | |
35 | ||
36 | static int s3c2400_serial_setsource(struct uart_port *port, | |
37 | struct s3c24xx_uart_clksrc *clk) | |
38 | { | |
39 | return 0; | |
40 | } | |
41 | ||
42 | static int s3c2400_serial_resetport(struct uart_port *port, | |
43 | struct s3c2410_uartcfg *cfg) | |
44 | { | |
45 | dbg("s3c2400_serial_resetport: port=%p (%08lx), cfg=%p\n", | |
46 | port, port->mapbase, cfg); | |
47 | ||
48 | wr_regl(port, S3C2410_UCON, cfg->ucon); | |
49 | wr_regl(port, S3C2410_ULCON, cfg->ulcon); | |
50 | ||
51 | /* reset both fifos */ | |
52 | ||
53 | wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); | |
54 | wr_regl(port, S3C2410_UFCON, cfg->ufcon); | |
55 | ||
56 | return 0; | |
57 | } | |
58 | ||
59 | static struct s3c24xx_uart_info s3c2400_uart_inf = { | |
60 | .name = "Samsung S3C2400 UART", | |
61 | .type = PORT_S3C2400, | |
62 | .fifosize = 16, | |
63 | .rx_fifomask = S3C2410_UFSTAT_RXMASK, | |
64 | .rx_fifoshift = S3C2410_UFSTAT_RXSHIFT, | |
65 | .rx_fifofull = S3C2410_UFSTAT_RXFULL, | |
66 | .tx_fifofull = S3C2410_UFSTAT_TXFULL, | |
67 | .tx_fifomask = S3C2410_UFSTAT_TXMASK, | |
68 | .tx_fifoshift = S3C2410_UFSTAT_TXSHIFT, | |
69 | .get_clksrc = s3c2400_serial_getsource, | |
70 | .set_clksrc = s3c2400_serial_setsource, | |
71 | .reset_port = s3c2400_serial_resetport, | |
72 | }; | |
73 | ||
74 | static int s3c2400_serial_probe(struct platform_device *dev) | |
75 | { | |
76 | return s3c24xx_serial_probe(dev, &s3c2400_uart_inf); | |
77 | } | |
78 | ||
79 | static struct platform_driver s3c2400_serial_drv = { | |
80 | .probe = s3c2400_serial_probe, | |
81 | .remove = s3c24xx_serial_remove, | |
82 | .driver = { | |
83 | .name = "s3c2400-uart", | |
84 | .owner = THIS_MODULE, | |
85 | }, | |
86 | }; | |
87 | ||
88 | s3c24xx_console_init(&s3c2400_serial_drv, &s3c2400_uart_inf); | |
89 | ||
90 | static inline int s3c2400_serial_init(void) | |
91 | { | |
92 | return s3c24xx_serial_init(&s3c2400_serial_drv, &s3c2400_uart_inf); | |
93 | } | |
94 | ||
95 | static inline void s3c2400_serial_exit(void) | |
96 | { | |
97 | platform_driver_unregister(&s3c2400_serial_drv); | |
98 | } | |
99 | ||
100 | module_init(s3c2400_serial_init); | |
101 | module_exit(s3c2400_serial_exit); | |
102 | ||
103 | MODULE_LICENSE("GPL v2"); | |
104 | MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); | |
105 | MODULE_DESCRIPTION("Samsung S3C2400 SoC Serial port driver"); | |
106 | MODULE_ALIAS("platform:s3c2400-uart"); |