diff options
Diffstat (limited to 'drivers/tty/serial/sh-sci.c')
-rw-r--r-- | drivers/tty/serial/sh-sci.c | 38 |
1 files changed, 24 insertions, 14 deletions
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) |