1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Registration of Cobalt UART platform device. |
4 | * |
5 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
6 | */ |
7 | #include <linux/errno.h> |
8 | #include <linux/init.h> |
9 | #include <linux/ioport.h> |
10 | #include <linux/platform_device.h> |
11 | #include <linux/serial_8250.h> |
12 | |
13 | #include <cobalt.h> |
14 | #include <irq.h> |
15 | |
16 | static struct resource cobalt_uart_resource[] __initdata = { |
17 | { |
18 | .start = 0x1c800000, |
19 | .end = 0x1c800007, |
20 | .flags = IORESOURCE_MEM, |
21 | }, |
22 | { |
23 | .start = SERIAL_IRQ, |
24 | .end = SERIAL_IRQ, |
25 | .flags = IORESOURCE_IRQ, |
26 | }, |
27 | }; |
28 | |
29 | static struct plat_serial8250_port cobalt_serial8250_port[] = { |
30 | { |
31 | .irq = SERIAL_IRQ, |
32 | .uartclk = 18432000, |
33 | .iotype = UPIO_MEM, |
34 | .flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, |
35 | .mapbase = 0x1c800000, |
36 | }, |
37 | {}, |
38 | }; |
39 | |
40 | static __init int cobalt_uart_add(void) |
41 | { |
42 | struct platform_device *pdev; |
43 | int retval; |
44 | |
45 | /* |
46 | * Cobalt Qube1 has no UART. |
47 | */ |
48 | if (cobalt_board_id == COBALT_BRD_ID_QUBE1) |
49 | return 0; |
50 | |
51 | pdev = platform_device_alloc(name: "serial8250" , id: -1); |
52 | if (!pdev) |
53 | return -ENOMEM; |
54 | |
55 | pdev->id = PLAT8250_DEV_PLATFORM; |
56 | pdev->dev.platform_data = cobalt_serial8250_port; |
57 | |
58 | retval = platform_device_add_resources(pdev, cobalt_uart_resource, ARRAY_SIZE(cobalt_uart_resource)); |
59 | if (retval) |
60 | goto err_free_device; |
61 | |
62 | retval = platform_device_add(pdev); |
63 | if (retval) |
64 | goto err_free_device; |
65 | |
66 | return 0; |
67 | |
68 | err_free_device: |
69 | platform_device_put(pdev); |
70 | |
71 | return retval; |
72 | } |
73 | device_initcall(cobalt_uart_add); |
74 | |