aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2014-01-02 13:33:15 -0500
committerOlof Johansson <olof@lixom.net>2014-01-02 13:33:15 -0500
commit615e303e241cafa2ecf6452183532c2aff607920 (patch)
tree2baa5731ddc81d8aeb3ef7aa95e5e8274e7fb189 /drivers/tty
parent5aa88ce1137ca46164cc05dca3d7ee75ddee93d8 (diff)
parentec09c5eb491834d4011c72538e58d8b7096076bd (diff)
Merge tag 'renesas-sh-sci2-for-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas into next/cleanup
From Simon Horman: Second Round of Renesas SH SCI updates for v3.14 * Rework baud rate calculation * Compute overrun_bit without using baud rate algo * Remove unused GPIO request code * Move overrun_bit and error_mask fields out of pdata * Support resources passed through platform resources * Don't check IRQ in verify port operation * Set the UPF_FIXED_PORT flag * Remove duplicate interrupt check in verify port op * Simplify baud rate calculation algorithms * Remove baud rate calculation algorithm 5 * Sort headers alphabetically * tag 'renesas-sh-sci2-for-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas: serial: sh-sci: Rework baud rate calculation serial: sh-sci: Compute overrun_bit without using baud rate algo serial: sh-sci: Remove unused GPIO request code serial: sh-sci: Move overrun_bit and error_mask fields out of pdata serial: sh-sci: Support resources passed through platform resources serial: sh-sci: Don't check IRQ in verify port operation serial: sh-sci: Set the UPF_FIXED_PORT flag serial: sh-sci: Remove duplicate interrupt check in verify port op serial: sh-sci: Simplify baud rate calculation algorithms serial: sh-sci: Remove baud rate calculation algorithm 5 serial: sh-sci: Sort headers alphabetically Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/sh-sci.c281
-rw-r--r--drivers/tty/serial/sh-sci.h2
2 files changed, 132 insertions, 151 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 1a3fc7a2e4db..e4bf0e435af6 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -23,35 +23,34 @@
23 23
24#undef DEBUG 24#undef DEBUG
25 25
26#include <linux/module.h> 26#include <linux/clk.h>
27#include <linux/console.h>
28#include <linux/ctype.h>
29#include <linux/cpufreq.h>
30#include <linux/delay.h>
31#include <linux/dmaengine.h>
32#include <linux/dma-mapping.h>
33#include <linux/err.h>
27#include <linux/errno.h> 34#include <linux/errno.h>
28#include <linux/sh_dma.h> 35#include <linux/init.h>
29#include <linux/timer.h>
30#include <linux/interrupt.h> 36#include <linux/interrupt.h>
31#include <linux/tty.h>
32#include <linux/tty_flip.h>
33#include <linux/serial.h>
34#include <linux/major.h>
35#include <linux/string.h>
36#include <linux/sysrq.h>
37#include <linux/ioport.h> 37#include <linux/ioport.h>
38#include <linux/major.h>
39#include <linux/module.h>
38#include <linux/mm.h> 40#include <linux/mm.h>
39#include <linux/init.h>
40#include <linux/delay.h>
41#include <linux/console.h>
42#include <linux/platform_device.h>
43#include <linux/serial_sci.h>
44#include <linux/notifier.h> 41#include <linux/notifier.h>
42#include <linux/platform_device.h>
45#include <linux/pm_runtime.h> 43#include <linux/pm_runtime.h>
46#include <linux/cpufreq.h>
47#include <linux/clk.h>
48#include <linux/ctype.h>
49#include <linux/err.h>
50#include <linux/dmaengine.h>
51#include <linux/dma-mapping.h>
52#include <linux/scatterlist.h> 44#include <linux/scatterlist.h>
45#include <linux/serial.h>
46#include <linux/serial_sci.h>
47#include <linux/sh_dma.h>
53#include <linux/slab.h> 48#include <linux/slab.h>
54#include <linux/gpio.h> 49#include <linux/string.h>
50#include <linux/sysrq.h>
51#include <linux/timer.h>
52#include <linux/tty.h>
53#include <linux/tty_flip.h>
55 54
56#ifdef CONFIG_SUPERH 55#ifdef CONFIG_SUPERH
57#include <asm/sh_bios.h> 56#include <asm/sh_bios.h>
@@ -64,6 +63,10 @@ struct sci_port {
64 63
65 /* Platform configuration */ 64 /* Platform configuration */
66 struct plat_sci_port *cfg; 65 struct plat_sci_port *cfg;
66 int overrun_bit;
67 unsigned int error_mask;
68 unsigned int sampling_rate;
69
67 70
68 /* Break timer */ 71 /* Break timer */
69 struct timer_list break_timer; 72 struct timer_list break_timer;
@@ -74,8 +77,8 @@ struct sci_port {
74 /* Function clock */ 77 /* Function clock */
75 struct clk *fclk; 78 struct clk *fclk;
76 79
80 int irqs[SCIx_NR_IRQS];
77 char *irqstr[SCIx_NR_IRQS]; 81 char *irqstr[SCIx_NR_IRQS];
78 char *gpiostr[SCIx_NR_FNS];
79 82
80 struct dma_chan *chan_tx; 83 struct dma_chan *chan_tx;
81 struct dma_chan *chan_rx; 84 struct dma_chan *chan_rx;
@@ -759,19 +762,15 @@ static int sci_handle_errors(struct uart_port *port)
759 struct tty_port *tport = &port->state->port; 762 struct tty_port *tport = &port->state->port;
760 struct sci_port *s = to_sci_port(port); 763 struct sci_port *s = to_sci_port(port);
761 764
762 /* 765 /* Handle overruns */
763 * Handle overruns, if supported. 766 if (status & (1 << s->overrun_bit)) {
764 */ 767 port->icount.overrun++;
765 if (s->cfg->overrun_bit != SCIx_NOT_SUPPORTED) {
766 if (status & (1 << s->cfg->overrun_bit)) {
767 port->icount.overrun++;
768 768
769 /* overrun error */ 769 /* overrun error */
770 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN)) 770 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN))
771 copied++; 771 copied++;
772 772
773 dev_notice(port->dev, "overrun error"); 773 dev_notice(port->dev, "overrun error");
774 }
775 } 774 }
776 775
777 if (status & SCxSR_FER(port)) { 776 if (status & SCxSR_FER(port)) {
@@ -833,7 +832,7 @@ static int sci_handle_fifo_overrun(struct uart_port *port)
833 if (!reg->size) 832 if (!reg->size)
834 return 0; 833 return 0;
835 834
836 if ((serial_port_in(port, SCLSR) & (1 << s->cfg->overrun_bit))) { 835 if ((serial_port_in(port, SCLSR) & (1 << s->overrun_bit))) {
837 serial_port_out(port, SCLSR, 0); 836 serial_port_out(port, SCLSR, 0);
838 837
839 port->icount.overrun++; 838 port->icount.overrun++;
@@ -1079,19 +1078,19 @@ static int sci_request_irq(struct sci_port *port)
1079 1078
1080 for (i = j = 0; i < SCIx_NR_IRQS; i++, j++) { 1079 for (i = j = 0; i < SCIx_NR_IRQS; i++, j++) {
1081 struct sci_irq_desc *desc; 1080 struct sci_irq_desc *desc;
1082 unsigned int irq; 1081 int irq;
1083 1082
1084 if (SCIx_IRQ_IS_MUXED(port)) { 1083 if (SCIx_IRQ_IS_MUXED(port)) {
1085 i = SCIx_MUX_IRQ; 1084 i = SCIx_MUX_IRQ;
1086 irq = up->irq; 1085 irq = up->irq;
1087 } else { 1086 } else {
1088 irq = port->cfg->irqs[i]; 1087 irq = port->irqs[i];
1089 1088
1090 /* 1089 /*
1091 * Certain port types won't support all of the 1090 * Certain port types won't support all of the
1092 * available interrupt sources. 1091 * available interrupt sources.
1093 */ 1092 */
1094 if (unlikely(!irq)) 1093 if (unlikely(irq < 0))
1095 continue; 1094 continue;
1096 } 1095 }
1097 1096
@@ -1116,7 +1115,7 @@ static int sci_request_irq(struct sci_port *port)
1116 1115
1117out_noirq: 1116out_noirq:
1118 while (--i >= 0) 1117 while (--i >= 0)
1119 free_irq(port->cfg->irqs[i], port); 1118 free_irq(port->irqs[i], port);
1120 1119
1121out_nomem: 1120out_nomem:
1122 while (--j >= 0) 1121 while (--j >= 0)
@@ -1134,16 +1133,16 @@ static void sci_free_irq(struct sci_port *port)
1134 * IRQ first. 1133 * IRQ first.
1135 */ 1134 */
1136 for (i = 0; i < SCIx_NR_IRQS; i++) { 1135 for (i = 0; i < SCIx_NR_IRQS; i++) {
1137 unsigned int irq = port->cfg->irqs[i]; 1136 int irq = port->irqs[i];
1138 1137
1139 /* 1138 /*
1140 * Certain port types won't support all of the available 1139 * Certain port types won't support all of the available
1141 * interrupt sources. 1140 * interrupt sources.
1142 */ 1141 */
1143 if (unlikely(!irq)) 1142 if (unlikely(irq < 0))
1144 continue; 1143 continue;
1145 1144
1146 free_irq(port->cfg->irqs[i], port); 1145 free_irq(port->irqs[i], port);
1147 kfree(port->irqstr[i]); 1146 kfree(port->irqstr[i]);
1148 1147
1149 if (SCIx_IRQ_IS_MUXED(port)) { 1148 if (SCIx_IRQ_IS_MUXED(port)) {
@@ -1153,67 +1152,6 @@ static void sci_free_irq(struct sci_port *port)
1153 } 1152 }
1154} 1153}
1155 1154
1156static const char *sci_gpio_names[SCIx_NR_FNS] = {
1157 "sck", "rxd", "txd", "cts", "rts",
1158};
1159
1160static const char *sci_gpio_str(unsigned int index)
1161{
1162 return sci_gpio_names[index];
1163}
1164
1165static void sci_init_gpios(struct sci_port *port)
1166{
1167 struct uart_port *up = &port->port;
1168 int i;
1169
1170 if (!port->cfg)
1171 return;
1172
1173 for (i = 0; i < SCIx_NR_FNS; i++) {
1174 const char *desc;
1175 int ret;
1176
1177 if (!port->cfg->gpios[i])
1178 continue;
1179
1180 desc = sci_gpio_str(i);
1181
1182 port->gpiostr[i] = kasprintf(GFP_KERNEL, "%s:%s",
1183 dev_name(up->dev), desc);
1184
1185 /*
1186 * If we've failed the allocation, we can still continue
1187 * on with a NULL string.
1188 */
1189 if (!port->gpiostr[i])
1190 dev_notice(up->dev, "%s string allocation failure\n",
1191 desc);
1192
1193 ret = gpio_request(port->cfg->gpios[i], port->gpiostr[i]);
1194 if (unlikely(ret != 0)) {
1195 dev_notice(up->dev, "failed %s gpio request\n", desc);
1196
1197 /*
1198 * If we can't get the GPIO for whatever reason,
1199 * no point in keeping the verbose string around.
1200 */
1201 kfree(port->gpiostr[i]);
1202 }
1203 }
1204}
1205
1206static void sci_free_gpios(struct sci_port *port)
1207{
1208 int i;
1209
1210 for (i = 0; i < SCIx_NR_FNS; i++)
1211 if (port->cfg->gpios[i]) {
1212 gpio_free(port->cfg->gpios[i]);
1213 kfree(port->gpiostr[i]);
1214 }
1215}
1216
1217static unsigned int sci_tx_empty(struct uart_port *port) 1155static unsigned int sci_tx_empty(struct uart_port *port)
1218{ 1156{
1219 unsigned short status = serial_port_in(port, SCxSR); 1157 unsigned short status = serial_port_in(port, SCxSR);
@@ -1659,7 +1597,7 @@ static void rx_timer_fn(unsigned long arg)
1659 1597
1660 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) { 1598 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
1661 scr &= ~0x4000; 1599 scr &= ~0x4000;
1662 enable_irq(s->cfg->irqs[1]); 1600 enable_irq(s->irqs[SCIx_RXI_IRQ]);
1663 } 1601 }
1664 serial_port_out(port, SCSCR, scr | SCSCR_RIE); 1602 serial_port_out(port, SCSCR, scr | SCSCR_RIE);
1665 dev_dbg(port->dev, "DMA Rx timed out\n"); 1603 dev_dbg(port->dev, "DMA Rx timed out\n");
@@ -1813,20 +1751,21 @@ static void sci_shutdown(struct uart_port *port)
1813 sci_free_irq(s); 1751 sci_free_irq(s);
1814} 1752}
1815 1753
1816static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps, 1754static unsigned int sci_scbrr_calc(struct sci_port *s, unsigned int bps,
1817 unsigned long freq) 1755 unsigned long freq)
1818{ 1756{
1819 switch (algo_id) { 1757 if (s->sampling_rate)
1758 return DIV_ROUND_CLOSEST(freq, s->sampling_rate * bps) - 1;
1759
1760 switch (s->cfg->scbrr_algo_id) {
1820 case SCBRR_ALGO_1: 1761 case SCBRR_ALGO_1:
1821 return ((freq + 16 * bps) / (16 * bps) - 1); 1762 return freq / (16 * bps);
1822 case SCBRR_ALGO_2: 1763 case SCBRR_ALGO_2:
1823 return ((freq + 16 * bps) / (32 * bps) - 1); 1764 return DIV_ROUND_CLOSEST(freq, 32 * bps) - 1;
1824 case SCBRR_ALGO_3: 1765 case SCBRR_ALGO_3:
1825 return (((freq * 2) + 16 * bps) / (16 * bps) - 1); 1766 return freq / (8 * bps);
1826 case SCBRR_ALGO_4: 1767 case SCBRR_ALGO_4:
1827 return (((freq * 2) + 16 * bps) / (32 * bps) - 1); 1768 return DIV_ROUND_CLOSEST(freq, 16 * bps) - 1;
1828 case SCBRR_ALGO_5:
1829 return (((freq * 1000 / 32) / bps) - 1);
1830 } 1769 }
1831 1770
1832 /* Warn, but use a safe default */ 1771 /* Warn, but use a safe default */
@@ -1908,12 +1847,11 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
1908 1847
1909 baud = uart_get_baud_rate(port, termios, old, 0, max_baud); 1848 baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
1910 if (likely(baud && port->uartclk)) { 1849 if (likely(baud && port->uartclk)) {
1911 if (s->cfg->scbrr_algo_id == SCBRR_ALGO_6) { 1850 if (s->cfg->type == PORT_HSCIF) {
1912 sci_baud_calc_hscif(baud, port->uartclk, &t, &srr, 1851 sci_baud_calc_hscif(baud, port->uartclk, &t, &srr,
1913 &cks); 1852 &cks);
1914 } else { 1853 } else {
1915 t = sci_scbrr_calc(s->cfg->scbrr_algo_id, baud, 1854 t = sci_scbrr_calc(s, baud, port->uartclk);
1916 port->uartclk);
1917 for (cks = 0; t >= 256 && cks <= 3; cks++) 1855 for (cks = 0; t >= 256 && cks <= 3; cks++)
1918 t >>= 2; 1856 t >>= 2;
1919 } 1857 }
@@ -2120,10 +2058,6 @@ static void sci_config_port(struct uart_port *port, int flags)
2120 2058
2121static int sci_verify_port(struct uart_port *port, struct serial_struct *ser) 2059static int sci_verify_port(struct uart_port *port, struct serial_struct *ser)
2122{ 2060{
2123 struct sci_port *s = to_sci_port(port);
2124
2125 if (ser->irq != s->cfg->irqs[SCIx_TXI_IRQ] || ser->irq > nr_irqs)
2126 return -EINVAL;
2127 if (ser->baud_base < 2400) 2061 if (ser->baud_base < 2400)
2128 /* No paper tape reader for Mitch.. */ 2062 /* No paper tape reader for Mitch.. */
2129 return -EINVAL; 2063 return -EINVAL;
@@ -2156,11 +2090,13 @@ static struct uart_ops sci_uart_ops = {
2156}; 2090};
2157 2091
2158static int sci_init_single(struct platform_device *dev, 2092static int sci_init_single(struct platform_device *dev,
2159 struct sci_port *sci_port, 2093 struct sci_port *sci_port, unsigned int index,
2160 unsigned int index, 2094 struct plat_sci_port *p, bool early)
2161 struct plat_sci_port *p)
2162{ 2095{
2163 struct uart_port *port = &sci_port->port; 2096 struct uart_port *port = &sci_port->port;
2097 const struct resource *res;
2098 unsigned int sampling_rate;
2099 unsigned int i;
2164 int ret; 2100 int ret;
2165 2101
2166 sci_port->cfg = p; 2102 sci_port->cfg = p;
@@ -2169,31 +2105,90 @@ static int sci_init_single(struct platform_device *dev,
2169 port->iotype = UPIO_MEM; 2105 port->iotype = UPIO_MEM;
2170 port->line = index; 2106 port->line = index;
2171 2107
2108 if (dev->num_resources) {
2109 /* Device has resources, use them. */
2110 res = platform_get_resource(dev, IORESOURCE_MEM, 0);
2111 if (res == NULL)
2112 return -ENOMEM;
2113
2114 port->mapbase = res->start;
2115
2116 for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i)
2117 sci_port->irqs[i] = platform_get_irq(dev, i);
2118
2119 /* The SCI generates several interrupts. They can be muxed
2120 * together or connected to different interrupt lines. In the
2121 * muxed case only one interrupt resource is specified. In the
2122 * non-muxed case three or four interrupt resources are
2123 * specified, as the BRI interrupt is optional.
2124 */
2125 if (sci_port->irqs[0] < 0)
2126 return -ENXIO;
2127
2128 if (sci_port->irqs[1] < 0) {
2129 sci_port->irqs[1] = sci_port->irqs[0];
2130 sci_port->irqs[2] = sci_port->irqs[0];
2131 sci_port->irqs[3] = sci_port->irqs[0];
2132 }
2133 } else {
2134 /* No resources, use old-style platform data. */
2135 port->mapbase = p->mapbase;
2136 for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i)
2137 sci_port->irqs[i] = p->irqs[i] ? p->irqs[i] : -ENXIO;
2138 }
2139
2140 if (p->regtype == SCIx_PROBE_REGTYPE) {
2141 ret = sci_probe_regmap(p);
2142 if (unlikely(ret))
2143 return ret;
2144 }
2145
2172 switch (p->type) { 2146 switch (p->type) {
2173 case PORT_SCIFB: 2147 case PORT_SCIFB:
2174 port->fifosize = 256; 2148 port->fifosize = 256;
2149 sci_port->overrun_bit = 9;
2150 sampling_rate = 16;
2175 break; 2151 break;
2176 case PORT_HSCIF: 2152 case PORT_HSCIF:
2177 port->fifosize = 128; 2153 port->fifosize = 128;
2154 sampling_rate = 0;
2155 sci_port->overrun_bit = 0;
2178 break; 2156 break;
2179 case PORT_SCIFA: 2157 case PORT_SCIFA:
2180 port->fifosize = 64; 2158 port->fifosize = 64;
2159 sci_port->overrun_bit = 9;
2160 sampling_rate = 16;
2181 break; 2161 break;
2182 case PORT_SCIF: 2162 case PORT_SCIF:
2183 port->fifosize = 16; 2163 port->fifosize = 16;
2164 if (p->regtype == SCIx_SH7705_SCIF_REGTYPE) {
2165 sci_port->overrun_bit = 9;
2166 sampling_rate = 16;
2167 } else {
2168 sci_port->overrun_bit = 0;
2169 sampling_rate = 32;
2170 }
2184 break; 2171 break;
2185 default: 2172 default:
2186 port->fifosize = 1; 2173 port->fifosize = 1;
2174 sci_port->overrun_bit = 5;
2175 sampling_rate = 32;
2187 break; 2176 break;
2188 } 2177 }
2189 2178
2190 if (p->regtype == SCIx_PROBE_REGTYPE) { 2179 /* Set the sampling rate if the baud rate calculation algorithm isn't
2191 ret = sci_probe_regmap(p); 2180 * specified.
2192 if (unlikely(ret)) 2181 */
2193 return ret; 2182 if (p->scbrr_algo_id == SCBRR_ALGO_NONE) {
2183 /* SCIFA on sh7723 and sh7724 need a custom sampling rate that
2184 * doesn't match the SoC datasheet, this should be investigated.
2185 * Let platform data override the sampling rate for now.
2186 */
2187 sci_port->sampling_rate = p->sampling_rate ? p->sampling_rate
2188 : sampling_rate;
2194 } 2189 }
2195 2190
2196 if (dev) { 2191 if (!early) {
2197 sci_port->iclk = clk_get(&dev->dev, "sci_ick"); 2192 sci_port->iclk = clk_get(&dev->dev, "sci_ick");
2198 if (IS_ERR(sci_port->iclk)) { 2193 if (IS_ERR(sci_port->iclk)) {
2199 sci_port->iclk = clk_get(&dev->dev, "peripheral_clk"); 2194 sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");
@@ -2213,8 +2208,6 @@ static int sci_init_single(struct platform_device *dev,
2213 2208
2214 port->dev = &dev->dev; 2209 port->dev = &dev->dev;
2215 2210
2216 sci_init_gpios(sci_port);
2217
2218 pm_runtime_enable(&dev->dev); 2211 pm_runtime_enable(&dev->dev);
2219 } 2212 }
2220 2213
@@ -2225,32 +2218,22 @@ static int sci_init_single(struct platform_device *dev,
2225 /* 2218 /*
2226 * Establish some sensible defaults for the error detection. 2219 * Establish some sensible defaults for the error detection.
2227 */ 2220 */
2228 if (!p->error_mask) 2221 sci_port->error_mask = (p->type == PORT_SCI) ?
2229 p->error_mask = (p->type == PORT_SCI) ?
2230 SCI_DEFAULT_ERROR_MASK : SCIF_DEFAULT_ERROR_MASK; 2222 SCI_DEFAULT_ERROR_MASK : SCIF_DEFAULT_ERROR_MASK;
2231 2223
2232 /* 2224 /*
2233 * Establish sensible defaults for the overrun detection, unless 2225 * Establish sensible defaults for the overrun detection, unless
2234 * the part has explicitly disabled support for it. 2226 * the part has explicitly disabled support for it.
2235 */ 2227 */
2236 if (p->overrun_bit != SCIx_NOT_SUPPORTED) {
2237 if (p->type == PORT_SCI)
2238 p->overrun_bit = 5;
2239 else if (p->scbrr_algo_id == SCBRR_ALGO_4)
2240 p->overrun_bit = 9;
2241 else
2242 p->overrun_bit = 0;
2243 2228
2244 /* 2229 /*
2245 * Make the error mask inclusive of overrun detection, if 2230 * Make the error mask inclusive of overrun detection, if
2246 * supported. 2231 * supported.
2247 */ 2232 */
2248 p->error_mask |= (1 << p->overrun_bit); 2233 sci_port->error_mask |= 1 << sci_port->overrun_bit;
2249 }
2250 2234
2251 port->mapbase = p->mapbase;
2252 port->type = p->type; 2235 port->type = p->type;
2253 port->flags = p->flags; 2236 port->flags = UPF_FIXED_PORT | p->flags;
2254 port->regshift = p->regshift; 2237 port->regshift = p->regshift;
2255 2238
2256 /* 2239 /*
@@ -2260,7 +2243,7 @@ static int sci_init_single(struct platform_device *dev,
2260 * 2243 *
2261 * For the muxed case there's nothing more to do. 2244 * For the muxed case there's nothing more to do.
2262 */ 2245 */
2263 port->irq = p->irqs[SCIx_RXI_IRQ]; 2246 port->irq = sci_port->irqs[SCIx_RXI_IRQ];
2264 port->irqflags = 0; 2247 port->irqflags = 0;
2265 2248
2266 port->serial_in = sci_serial_in; 2249 port->serial_in = sci_serial_in;
@@ -2275,8 +2258,6 @@ static int sci_init_single(struct platform_device *dev,
2275 2258
2276static void sci_cleanup_single(struct sci_port *port) 2259static void sci_cleanup_single(struct sci_port *port)
2277{ 2260{
2278 sci_free_gpios(port);
2279
2280 clk_put(port->iclk); 2261 clk_put(port->iclk);
2281 clk_put(port->fclk); 2262 clk_put(port->fclk);
2282 2263
@@ -2392,7 +2373,7 @@ static int sci_probe_earlyprintk(struct platform_device *pdev)
2392 2373
2393 early_serial_console.index = pdev->id; 2374 early_serial_console.index = pdev->id;
2394 2375
2395 sci_init_single(NULL, &sci_ports[pdev->id], pdev->id, cfg); 2376 sci_init_single(pdev, &sci_ports[pdev->id], pdev->id, cfg, true);
2396 2377
2397 serial_console_setup(&early_serial_console, early_serial_buf); 2378 serial_console_setup(&early_serial_console, early_serial_buf);
2398 2379
@@ -2459,7 +2440,7 @@ static int sci_probe_single(struct platform_device *dev,
2459 return -EINVAL; 2440 return -EINVAL;
2460 } 2441 }
2461 2442
2462 ret = sci_init_single(dev, sciport, index, p); 2443 ret = sci_init_single(dev, sciport, index, p, false);
2463 if (ret) 2444 if (ret)
2464 return ret; 2445 return ret;
2465 2446
diff --git a/drivers/tty/serial/sh-sci.h b/drivers/tty/serial/sh-sci.h
index 5aca7364634c..d5db81a0a430 100644
--- a/drivers/tty/serial/sh-sci.h
+++ b/drivers/tty/serial/sh-sci.h
@@ -9,7 +9,7 @@
9#define SCxSR_PER(port) (((port)->type == PORT_SCI) ? SCI_PER : SCIF_PER) 9#define SCxSR_PER(port) (((port)->type == PORT_SCI) ? SCI_PER : SCIF_PER)
10#define SCxSR_BRK(port) (((port)->type == PORT_SCI) ? 0x00 : SCIF_BRK) 10#define SCxSR_BRK(port) (((port)->type == PORT_SCI) ? 0x00 : SCIF_BRK)
11 11
12#define SCxSR_ERRORS(port) (to_sci_port(port)->cfg->error_mask) 12#define SCxSR_ERRORS(port) (to_sci_port(port)->error_mask)
13 13
14#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \ 14#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
15 defined(CONFIG_CPU_SUBTYPE_SH7720) || \ 15 defined(CONFIG_CPU_SUBTYPE_SH7720) || \