aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2011-01-21 02:19:53 -0500
committerPaul Mundt <lethal@linux-sh.org>2011-01-21 02:19:53 -0500
commit906b17dc089f7fa87e37a9cfe6ee185efc90e0da (patch)
treebc763167f3a1554d4de7210ea720c5e9d908cf7b
parent1020520e41965eb11759a0c40e6ab66297340df6 (diff)
serial: sh-sci: Kill off the special earlyprintk device.
This reworks some of the code a bit so that we always wrap in to the global port array instead of flipping between it and the special early device. This will make it easier to split the initialization in to early and late parts where we can simply initialize the remaining bits of the partially-initialized port coming off of the early console later in the boot process. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r--drivers/serial/sh-sci.c49
1 files changed, 12 insertions, 37 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
index abf144eed072..0257fd5ede52 100644
--- a/drivers/serial/sh-sci.c
+++ b/drivers/serial/sh-sci.c
@@ -1781,13 +1781,6 @@ static int __devinit sci_init_single(struct platform_device *dev,
1781} 1781}
1782 1782
1783#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE 1783#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
1784static struct tty_driver *serial_console_device(struct console *co, int *index)
1785{
1786 struct uart_driver *p = &sci_uart_driver;
1787 *index = co->index;
1788 return p->tty_driver;
1789}
1790
1791static void serial_console_putchar(struct uart_port *port, int ch) 1784static void serial_console_putchar(struct uart_port *port, int ch)
1792{ 1785{
1793 sci_poll_put_char(port, ch); 1786 sci_poll_put_char(port, ch);
@@ -1800,8 +1793,8 @@ static void serial_console_putchar(struct uart_port *port, int ch)
1800static void serial_console_write(struct console *co, const char *s, 1793static void serial_console_write(struct console *co, const char *s,
1801 unsigned count) 1794 unsigned count)
1802{ 1795{
1803 struct uart_port *port = co->data; 1796 struct sci_port *sci_port = &sci_ports[co->index];
1804 struct sci_port *sci_port = to_sci_port(port); 1797 struct uart_port *port = &sci_port->port;
1805 unsigned short bits; 1798 unsigned short bits;
1806 1799
1807 if (sci_port->enable) 1800 if (sci_port->enable)
@@ -1829,31 +1822,14 @@ static int __devinit serial_console_setup(struct console *co, char *options)
1829 int ret; 1822 int ret;
1830 1823
1831 /* 1824 /*
1832 * Check whether an invalid uart number has been specified, and 1825 * Refuse to handle any bogus ports.
1833 * if so, search for the first available port that does have
1834 * console support.
1835 */
1836 if (co->index >= SCI_NPORTS)
1837 co->index = 0;
1838
1839 if (co->data) {
1840 port = co->data;
1841 sci_port = to_sci_port(port);
1842 } else {
1843 sci_port = &sci_ports[co->index];
1844 port = &sci_port->port;
1845 co->data = port;
1846 }
1847
1848 /*
1849 * Also need to check port->type, we don't actually have any
1850 * UPIO_PORT ports, but uart_report_port() handily misreports
1851 * it anyways if we don't have a port available by the time this is
1852 * called.
1853 */ 1826 */
1854 if (!port->type) 1827 if (co->index < 0 || co->index >= SCI_NPORTS)
1855 return -ENODEV; 1828 return -ENODEV;
1856 1829
1830 sci_port = &sci_ports[co->index];
1831 port = &sci_port->port;
1832
1857 ret = sci_remap_port(port); 1833 ret = sci_remap_port(port);
1858 if (unlikely(ret != 0)) 1834 if (unlikely(ret != 0))
1859 return ret; 1835 return ret;
@@ -1876,11 +1852,12 @@ static int __devinit serial_console_setup(struct console *co, char *options)
1876 1852
1877static struct console serial_console = { 1853static struct console serial_console = {
1878 .name = "ttySC", 1854 .name = "ttySC",
1879 .device = serial_console_device, 1855 .device = uart_console_device,
1880 .write = serial_console_write, 1856 .write = serial_console_write,
1881 .setup = serial_console_setup, 1857 .setup = serial_console_setup,
1882 .flags = CON_PRINTBUFFER, 1858 .flags = CON_PRINTBUFFER,
1883 .index = -1, 1859 .index = -1,
1860 .data = &sci_uart_driver,
1884}; 1861};
1885 1862
1886static int __init sci_console_init(void) 1863static int __init sci_console_init(void)
@@ -1890,12 +1867,11 @@ static int __init sci_console_init(void)
1890} 1867}
1891console_initcall(sci_console_init); 1868console_initcall(sci_console_init);
1892 1869
1893static struct sci_port early_serial_port;
1894
1895static struct console early_serial_console = { 1870static struct console early_serial_console = {
1896 .name = "early_ttySC", 1871 .name = "early_ttySC",
1897 .write = serial_console_write, 1872 .write = serial_console_write,
1898 .flags = CON_PRINTBUFFER, 1873 .flags = CON_PRINTBUFFER,
1874 .index = -1,
1899}; 1875};
1900 1876
1901static char early_serial_buf[32]; 1877static char early_serial_buf[32];
@@ -1908,9 +1884,8 @@ static int __devinit sci_probe_earlyprintk(struct platform_device *pdev)
1908 return -EEXIST; 1884 return -EEXIST;
1909 1885
1910 early_serial_console.index = pdev->id; 1886 early_serial_console.index = pdev->id;
1911 early_serial_console.data = &early_serial_port.port;
1912 1887
1913 sci_init_single(NULL, &early_serial_port, pdev->id, cfg); 1888 sci_init_single(NULL, &sci_ports[pdev->id], pdev->id, cfg);
1914 1889
1915 serial_console_setup(&early_serial_console, early_serial_buf); 1890 serial_console_setup(&early_serial_console, early_serial_buf);
1916 1891
@@ -2001,7 +1976,7 @@ static int __devinit sci_probe(struct platform_device *dev)
2001 1976
2002 platform_set_drvdata(dev, sp); 1977 platform_set_drvdata(dev, sp);
2003 1978
2004 ret = sci_probe_single(dev, dev->id, p, &sci_ports[dev->id]); 1979 ret = sci_probe_single(dev, dev->id, p, sp);
2005 if (ret) 1980 if (ret)
2006 goto err_unreg; 1981 goto err_unreg;
2007 1982