diff options
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/hvc/hvc_xen.c | 31 | ||||
| -rw-r--r-- | drivers/tty/serial/8250/8250.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/amba-pl011.c | 45 | ||||
| -rw-r--r-- | drivers/tty/serial/serial_txx9.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/sh-sci.c | 38 |
5 files changed, 84 insertions, 34 deletions
diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c index d3d91dae065c..944eaeb8e0cf 100644 --- a/drivers/tty/hvc/hvc_xen.c +++ b/drivers/tty/hvc/hvc_xen.c | |||
| @@ -214,24 +214,24 @@ static int xen_hvm_console_init(void) | |||
| 214 | /* already configured */ | 214 | /* already configured */ |
| 215 | if (info->intf != NULL) | 215 | if (info->intf != NULL) |
| 216 | return 0; | 216 | return 0; |
| 217 | 217 | /* | |
| 218 | * If the toolstack (or the hypervisor) hasn't set these values, the | ||
| 219 | * default value is 0. Even though mfn = 0 and evtchn = 0 are | ||
| 220 | * theoretically correct values, in practice they never are and they | ||
| 221 | * mean that a legacy toolstack hasn't initialized the pv console correctly. | ||
| 222 | */ | ||
| 218 | r = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v); | 223 | r = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v); |
| 219 | if (r < 0) { | 224 | if (r < 0 || v == 0) |
| 220 | kfree(info); | 225 | goto err; |
| 221 | return -ENODEV; | ||
| 222 | } | ||
| 223 | info->evtchn = v; | 226 | info->evtchn = v; |
| 224 | hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v); | 227 | v = 0; |
| 225 | if (r < 0) { | 228 | r = hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v); |
| 226 | kfree(info); | 229 | if (r < 0 || v == 0) |
| 227 | return -ENODEV; | 230 | goto err; |
| 228 | } | ||
| 229 | mfn = v; | 231 | mfn = v; |
| 230 | info->intf = ioremap(mfn << PAGE_SHIFT, PAGE_SIZE); | 232 | info->intf = ioremap(mfn << PAGE_SHIFT, PAGE_SIZE); |
| 231 | if (info->intf == NULL) { | 233 | if (info->intf == NULL) |
| 232 | kfree(info); | 234 | goto err; |
| 233 | return -ENODEV; | ||
| 234 | } | ||
| 235 | info->vtermno = HVC_COOKIE; | 235 | info->vtermno = HVC_COOKIE; |
| 236 | 236 | ||
| 237 | spin_lock(&xencons_lock); | 237 | spin_lock(&xencons_lock); |
| @@ -239,6 +239,9 @@ static int xen_hvm_console_init(void) | |||
| 239 | spin_unlock(&xencons_lock); | 239 | spin_unlock(&xencons_lock); |
| 240 | 240 | ||
| 241 | return 0; | 241 | return 0; |
| 242 | err: | ||
| 243 | kfree(info); | ||
| 244 | return -ENODEV; | ||
| 242 | } | 245 | } |
| 243 | 246 | ||
| 244 | static int xen_pv_console_init(void) | 247 | static int xen_pv_console_init(void) |
diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c index 47d061b9ad4d..6e1958a325bd 100644 --- a/drivers/tty/serial/8250/8250.c +++ b/drivers/tty/serial/8250/8250.c | |||
| @@ -3113,7 +3113,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port * | |||
| 3113 | 3113 | ||
| 3114 | /** | 3114 | /** |
| 3115 | * serial8250_register_8250_port - register a serial port | 3115 | * serial8250_register_8250_port - register a serial port |
| 3116 | * @port: serial port template | 3116 | * @up: serial port template |
| 3117 | * | 3117 | * |
| 3118 | * Configure the serial port specified by the request. If the | 3118 | * Configure the serial port specified by the request. If the |
| 3119 | * port exists and is in use, it is hung up and unregistered | 3119 | * port exists and is in use, it is hung up and unregistered |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 4ad721fb8405..c17923ec6e95 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
| @@ -133,6 +133,10 @@ struct pl011_dmatx_data { | |||
| 133 | struct uart_amba_port { | 133 | struct uart_amba_port { |
| 134 | struct uart_port port; | 134 | struct uart_port port; |
| 135 | struct clk *clk; | 135 | struct clk *clk; |
| 136 | /* Two optional pin states - default & sleep */ | ||
| 137 | struct pinctrl *pinctrl; | ||
| 138 | struct pinctrl_state *pins_default; | ||
| 139 | struct pinctrl_state *pins_sleep; | ||
| 136 | const struct vendor_data *vendor; | 140 | const struct vendor_data *vendor; |
| 137 | unsigned int dmacr; /* dma control reg */ | 141 | unsigned int dmacr; /* dma control reg */ |
| 138 | unsigned int im; /* interrupt mask */ | 142 | unsigned int im; /* interrupt mask */ |
| @@ -1312,6 +1316,14 @@ static int pl011_startup(struct uart_port *port) | |||
| 1312 | unsigned int cr; | 1316 | unsigned int cr; |
| 1313 | int retval; | 1317 | int retval; |
| 1314 | 1318 | ||
| 1319 | /* Optionaly enable pins to be muxed in and configured */ | ||
| 1320 | if (!IS_ERR(uap->pins_default)) { | ||
| 1321 | retval = pinctrl_select_state(uap->pinctrl, uap->pins_default); | ||
| 1322 | if (retval) | ||
| 1323 | dev_err(port->dev, | ||
| 1324 | "could not set default pins\n"); | ||
| 1325 | } | ||
| 1326 | |||
| 1315 | retval = clk_prepare(uap->clk); | 1327 | retval = clk_prepare(uap->clk); |
| 1316 | if (retval) | 1328 | if (retval) |
| 1317 | goto out; | 1329 | goto out; |
| @@ -1420,6 +1432,7 @@ static void pl011_shutdown(struct uart_port *port) | |||
| 1420 | { | 1432 | { |
| 1421 | struct uart_amba_port *uap = (struct uart_amba_port *)port; | 1433 | struct uart_amba_port *uap = (struct uart_amba_port *)port; |
| 1422 | unsigned int cr; | 1434 | unsigned int cr; |
| 1435 | int retval; | ||
| 1423 | 1436 | ||
| 1424 | /* | 1437 | /* |
| 1425 | * disable all interrupts | 1438 | * disable all interrupts |
| @@ -1462,6 +1475,14 @@ static void pl011_shutdown(struct uart_port *port) | |||
| 1462 | */ | 1475 | */ |
| 1463 | clk_disable(uap->clk); | 1476 | clk_disable(uap->clk); |
| 1464 | clk_unprepare(uap->clk); | 1477 | clk_unprepare(uap->clk); |
| 1478 | /* Optionally let pins go into sleep states */ | ||
| 1479 | if (!IS_ERR(uap->pins_sleep)) { | ||
| 1480 | retval = pinctrl_select_state(uap->pinctrl, uap->pins_sleep); | ||
| 1481 | if (retval) | ||
| 1482 | dev_err(port->dev, | ||
| 1483 | "could not set pins to sleep state\n"); | ||
| 1484 | } | ||
| 1485 | |||
| 1465 | 1486 | ||
| 1466 | if (uap->port.dev->platform_data) { | 1487 | if (uap->port.dev->platform_data) { |
| 1467 | struct amba_pl011_data *plat; | 1488 | struct amba_pl011_data *plat; |
| @@ -1792,6 +1813,14 @@ static int __init pl011_console_setup(struct console *co, char *options) | |||
| 1792 | if (!uap) | 1813 | if (!uap) |
| 1793 | return -ENODEV; | 1814 | return -ENODEV; |
| 1794 | 1815 | ||
| 1816 | /* Allow pins to be muxed in and configured */ | ||
| 1817 | if (!IS_ERR(uap->pins_default)) { | ||
| 1818 | ret = pinctrl_select_state(uap->pinctrl, uap->pins_default); | ||
| 1819 | if (ret) | ||
| 1820 | dev_err(uap->port.dev, | ||
| 1821 | "could not set default pins\n"); | ||
| 1822 | } | ||
| 1823 | |||
| 1795 | ret = clk_prepare(uap->clk); | 1824 | ret = clk_prepare(uap->clk); |
| 1796 | if (ret) | 1825 | if (ret) |
| 1797 | return ret; | 1826 | return ret; |
| @@ -1844,7 +1873,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) | |||
| 1844 | { | 1873 | { |
| 1845 | struct uart_amba_port *uap; | 1874 | struct uart_amba_port *uap; |
| 1846 | struct vendor_data *vendor = id->data; | 1875 | struct vendor_data *vendor = id->data; |
| 1847 | struct pinctrl *pinctrl; | ||
| 1848 | void __iomem *base; | 1876 | void __iomem *base; |
| 1849 | int i, ret; | 1877 | int i, ret; |
| 1850 | 1878 | ||
| @@ -1869,11 +1897,20 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) | |||
| 1869 | goto free; | 1897 | goto free; |
| 1870 | } | 1898 | } |
| 1871 | 1899 | ||
| 1872 | pinctrl = devm_pinctrl_get_select_default(&dev->dev); | 1900 | uap->pinctrl = devm_pinctrl_get(&dev->dev); |
| 1873 | if (IS_ERR(pinctrl)) { | 1901 | if (IS_ERR(uap->pinctrl)) { |
| 1874 | ret = PTR_ERR(pinctrl); | 1902 | ret = PTR_ERR(uap->pinctrl); |
| 1875 | goto unmap; | 1903 | goto unmap; |
| 1876 | } | 1904 | } |
| 1905 | uap->pins_default = pinctrl_lookup_state(uap->pinctrl, | ||
| 1906 | PINCTRL_STATE_DEFAULT); | ||
| 1907 | if (IS_ERR(uap->pins_default)) | ||
| 1908 | dev_err(&dev->dev, "could not get default pinstate\n"); | ||
| 1909 | |||
| 1910 | uap->pins_sleep = pinctrl_lookup_state(uap->pinctrl, | ||
| 1911 | PINCTRL_STATE_SLEEP); | ||
| 1912 | if (IS_ERR(uap->pins_sleep)) | ||
| 1913 | dev_dbg(&dev->dev, "could not get sleep pinstate\n"); | ||
| 1877 | 1914 | ||
| 1878 | uap->clk = clk_get(&dev->dev, NULL); | 1915 | uap->clk = clk_get(&dev->dev, NULL); |
| 1879 | if (IS_ERR(uap->clk)) { | 1916 | if (IS_ERR(uap->clk)) { |
diff --git a/drivers/tty/serial/serial_txx9.c b/drivers/tty/serial/serial_txx9.c index 34bd345da775..6ae2a58d62f2 100644 --- a/drivers/tty/serial/serial_txx9.c +++ b/drivers/tty/serial/serial_txx9.c | |||
| @@ -466,7 +466,7 @@ static void serial_txx9_break_ctl(struct uart_port *port, int break_state) | |||
| 466 | spin_unlock_irqrestore(&up->port.lock, flags); | 466 | spin_unlock_irqrestore(&up->port.lock, flags); |
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | #if defined(CONFIG_SERIAL_TXX9_CONSOLE) || (CONFIG_CONSOLE_POLL) | 469 | #if defined(CONFIG_SERIAL_TXX9_CONSOLE) || defined(CONFIG_CONSOLE_POLL) |
| 470 | /* | 470 | /* |
| 471 | * Wait for transmitter & holding register to empty | 471 | * Wait for transmitter & holding register to empty |
| 472 | */ | 472 | */ |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 4604153b7954..1bd9163bc118 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
| @@ -2179,6 +2179,16 @@ static int __devinit sci_init_single(struct platform_device *dev, | |||
| 2179 | return 0; | 2179 | return 0; |
| 2180 | } | 2180 | } |
| 2181 | 2181 | ||
| 2182 | static void sci_cleanup_single(struct sci_port *port) | ||
| 2183 | { | ||
| 2184 | sci_free_gpios(port); | ||
| 2185 | |||
| 2186 | clk_put(port->iclk); | ||
| 2187 | clk_put(port->fclk); | ||
| 2188 | |||
| 2189 | pm_runtime_disable(port->port.dev); | ||
| 2190 | } | ||
| 2191 | |||
| 2182 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE | 2192 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE |
| 2183 | static void serial_console_putchar(struct uart_port *port, int ch) | 2193 | static void serial_console_putchar(struct uart_port *port, int ch) |
| 2184 | { | 2194 | { |
| @@ -2360,14 +2370,10 @@ static int sci_remove(struct platform_device *dev) | |||
| 2360 | cpufreq_unregister_notifier(&port->freq_transition, | 2370 | cpufreq_unregister_notifier(&port->freq_transition, |
| 2361 | CPUFREQ_TRANSITION_NOTIFIER); | 2371 | CPUFREQ_TRANSITION_NOTIFIER); |
| 2362 | 2372 | ||
| 2363 | sci_free_gpios(port); | ||
| 2364 | |||
| 2365 | uart_remove_one_port(&sci_uart_driver, &port->port); | 2373 | uart_remove_one_port(&sci_uart_driver, &port->port); |
| 2366 | 2374 | ||
| 2367 | clk_put(port->iclk); | 2375 | sci_cleanup_single(port); |
| 2368 | clk_put(port->fclk); | ||
| 2369 | 2376 | ||
| 2370 | pm_runtime_disable(&dev->dev); | ||
| 2371 | return 0; | 2377 | return 0; |
| 2372 | } | 2378 | } |
| 2373 | 2379 | ||
| @@ -2385,14 +2391,20 @@ static int __devinit sci_probe_single(struct platform_device *dev, | |||
| 2385 | index+1, SCI_NPORTS); | 2391 | index+1, SCI_NPORTS); |
| 2386 | dev_notice(&dev->dev, "Consider bumping " | 2392 | dev_notice(&dev->dev, "Consider bumping " |
| 2387 | "CONFIG_SERIAL_SH_SCI_NR_UARTS!\n"); | 2393 | "CONFIG_SERIAL_SH_SCI_NR_UARTS!\n"); |
| 2388 | return 0; | 2394 | return -EINVAL; |
| 2389 | } | 2395 | } |
| 2390 | 2396 | ||
| 2391 | ret = sci_init_single(dev, sciport, index, p); | 2397 | ret = sci_init_single(dev, sciport, index, p); |
| 2392 | if (ret) | 2398 | if (ret) |
| 2393 | return ret; | 2399 | return ret; |
| 2394 | 2400 | ||
| 2395 | return uart_add_one_port(&sci_uart_driver, &sciport->port); | 2401 | ret = uart_add_one_port(&sci_uart_driver, &sciport->port); |
| 2402 | if (ret) { | ||
| 2403 | sci_cleanup_single(sciport); | ||
| 2404 | return ret; | ||
| 2405 | } | ||
| 2406 | |||
| 2407 | return 0; | ||
| 2396 | } | 2408 | } |
| 2397 | 2409 | ||
| 2398 | static int __devinit sci_probe(struct platform_device *dev) | 2410 | static int __devinit sci_probe(struct platform_device *dev) |
| @@ -2413,24 +2425,22 @@ static int __devinit sci_probe(struct platform_device *dev) | |||
| 2413 | 2425 | ||
| 2414 | ret = sci_probe_single(dev, dev->id, p, sp); | 2426 | ret = sci_probe_single(dev, dev->id, p, sp); |
| 2415 | if (ret) | 2427 | if (ret) |
| 2416 | goto err_unreg; | 2428 | return ret; |
| 2417 | 2429 | ||
| 2418 | sp->freq_transition.notifier_call = sci_notifier; | 2430 | sp->freq_transition.notifier_call = sci_notifier; |
| 2419 | 2431 | ||
| 2420 | ret = cpufreq_register_notifier(&sp->freq_transition, | 2432 | ret = cpufreq_register_notifier(&sp->freq_transition, |
| 2421 | CPUFREQ_TRANSITION_NOTIFIER); | 2433 | CPUFREQ_TRANSITION_NOTIFIER); |
| 2422 | if (unlikely(ret < 0)) | 2434 | if (unlikely(ret < 0)) { |
| 2423 | goto err_unreg; | 2435 | sci_cleanup_single(sp); |
| 2436 | return ret; | ||
| 2437 | } | ||
| 2424 | 2438 | ||
| 2425 | #ifdef CONFIG_SH_STANDARD_BIOS | 2439 | #ifdef CONFIG_SH_STANDARD_BIOS |
| 2426 | sh_bios_gdb_detach(); | 2440 | sh_bios_gdb_detach(); |
| 2427 | #endif | 2441 | #endif |
| 2428 | 2442 | ||
| 2429 | return 0; | 2443 | return 0; |
| 2430 | |||
| 2431 | err_unreg: | ||
| 2432 | sci_remove(dev); | ||
| 2433 | return ret; | ||
| 2434 | } | 2444 | } |
| 2435 | 2445 | ||
| 2436 | static int sci_suspend(struct device *dev) | 2446 | static int sci_suspend(struct device *dev) |
