diff options
Diffstat (limited to 'drivers/firmware/pcdp.c')
-rw-r--r-- | drivers/firmware/pcdp.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c index ae1fb45dbb40..c37baf9448bc 100644 --- a/drivers/firmware/pcdp.c +++ b/drivers/firmware/pcdp.c | |||
@@ -89,19 +89,20 @@ efi_setup_pcdp_console(char *cmdline) | |||
89 | struct pcdp_uart *uart; | 89 | struct pcdp_uart *uart; |
90 | struct pcdp_device *dev, *end; | 90 | struct pcdp_device *dev, *end; |
91 | int i, serial = 0; | 91 | int i, serial = 0; |
92 | int rc = -ENODEV; | ||
92 | 93 | ||
93 | pcdp = efi.hcdp; | 94 | if (efi.hcdp == EFI_INVALID_TABLE_ADDR) |
94 | if (!pcdp) | ||
95 | return -ENODEV; | 95 | return -ENODEV; |
96 | 96 | ||
97 | printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, __pa(pcdp)); | 97 | pcdp = ioremap(efi.hcdp, 4096); |
98 | printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp); | ||
98 | 99 | ||
99 | if (strstr(cmdline, "console=hcdp")) { | 100 | if (strstr(cmdline, "console=hcdp")) { |
100 | if (pcdp->rev < 3) | 101 | if (pcdp->rev < 3) |
101 | serial = 1; | 102 | serial = 1; |
102 | } else if (strstr(cmdline, "console=")) { | 103 | } else if (strstr(cmdline, "console=")) { |
103 | printk(KERN_INFO "Explicit \"console=\"; ignoring PCDP\n"); | 104 | printk(KERN_INFO "Explicit \"console=\"; ignoring PCDP\n"); |
104 | return -ENODEV; | 105 | goto out; |
105 | } | 106 | } |
106 | 107 | ||
107 | if (pcdp->rev < 3 && efi_uart_console_only()) | 108 | if (pcdp->rev < 3 && efi_uart_console_only()) |
@@ -110,7 +111,8 @@ efi_setup_pcdp_console(char *cmdline) | |||
110 | for (i = 0, uart = pcdp->uart; i < pcdp->num_uarts; i++, uart++) { | 111 | for (i = 0, uart = pcdp->uart; i < pcdp->num_uarts; i++, uart++) { |
111 | if (uart->flags & PCDP_UART_PRIMARY_CONSOLE || serial) { | 112 | if (uart->flags & PCDP_UART_PRIMARY_CONSOLE || serial) { |
112 | if (uart->type == PCDP_CONSOLE_UART) { | 113 | if (uart->type == PCDP_CONSOLE_UART) { |
113 | return setup_serial_console(uart); | 114 | rc = setup_serial_console(uart); |
115 | goto out; | ||
114 | } | 116 | } |
115 | } | 117 | } |
116 | } | 118 | } |
@@ -121,10 +123,13 @@ efi_setup_pcdp_console(char *cmdline) | |||
121 | dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) { | 123 | dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) { |
122 | if (dev->flags & PCDP_PRIMARY_CONSOLE) { | 124 | if (dev->flags & PCDP_PRIMARY_CONSOLE) { |
123 | if (dev->type == PCDP_CONSOLE_VGA) { | 125 | if (dev->type == PCDP_CONSOLE_VGA) { |
124 | return setup_vga_console(dev); | 126 | rc = setup_vga_console(dev); |
127 | goto out; | ||
125 | } | 128 | } |
126 | } | 129 | } |
127 | } | 130 | } |
128 | 131 | ||
129 | return -ENODEV; | 132 | out: |
133 | iounmap(pcdp); | ||
134 | return rc; | ||
130 | } | 135 | } |