diff options
Diffstat (limited to 'drivers/serial/sh-sci.c')
-rw-r--r-- | drivers/serial/sh-sci.c | 59 |
1 files changed, 4 insertions, 55 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 6498bd1fb6dd..ff38dbdb5c6e 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -50,7 +50,6 @@ | |||
50 | #include <linux/list.h> | 50 | #include <linux/list.h> |
51 | 51 | ||
52 | #ifdef CONFIG_SUPERH | 52 | #ifdef CONFIG_SUPERH |
53 | #include <asm/clock.h> | ||
54 | #include <asm/sh_bios.h> | 53 | #include <asm/sh_bios.h> |
55 | #endif | 54 | #endif |
56 | 55 | ||
@@ -79,22 +78,18 @@ struct sci_port { | |||
79 | struct timer_list break_timer; | 78 | struct timer_list break_timer; |
80 | int break_flag; | 79 | int break_flag; |
81 | 80 | ||
82 | #ifdef CONFIG_HAVE_CLK | ||
83 | /* Interface clock */ | 81 | /* Interface clock */ |
84 | struct clk *iclk; | 82 | struct clk *iclk; |
85 | /* Data clock */ | 83 | /* Data clock */ |
86 | struct clk *dclk; | 84 | struct clk *dclk; |
87 | #endif | 85 | |
88 | struct list_head node; | 86 | struct list_head node; |
89 | }; | 87 | }; |
90 | 88 | ||
91 | struct sh_sci_priv { | 89 | struct sh_sci_priv { |
92 | spinlock_t lock; | 90 | spinlock_t lock; |
93 | struct list_head ports; | 91 | struct list_head ports; |
94 | |||
95 | #ifdef CONFIG_HAVE_CLK | ||
96 | struct notifier_block clk_nb; | 92 | struct notifier_block clk_nb; |
97 | #endif | ||
98 | }; | 93 | }; |
99 | 94 | ||
100 | /* Function prototypes */ | 95 | /* Function prototypes */ |
@@ -156,32 +151,6 @@ static void sci_poll_put_char(struct uart_port *port, unsigned char c) | |||
156 | } | 151 | } |
157 | #endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */ | 152 | #endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */ |
158 | 153 | ||
159 | #if defined(__H8300S__) | ||
160 | enum { sci_disable, sci_enable }; | ||
161 | |||
162 | static void h8300_sci_config(struct uart_port *port, unsigned int ctrl) | ||
163 | { | ||
164 | volatile unsigned char *mstpcrl = (volatile unsigned char *)MSTPCRL; | ||
165 | int ch = (port->mapbase - SMR0) >> 3; | ||
166 | unsigned char mask = 1 << (ch+1); | ||
167 | |||
168 | if (ctrl == sci_disable) | ||
169 | *mstpcrl |= mask; | ||
170 | else | ||
171 | *mstpcrl &= ~mask; | ||
172 | } | ||
173 | |||
174 | static void h8300_sci_enable(struct uart_port *port) | ||
175 | { | ||
176 | h8300_sci_config(port, sci_enable); | ||
177 | } | ||
178 | |||
179 | static void h8300_sci_disable(struct uart_port *port) | ||
180 | { | ||
181 | h8300_sci_config(port, sci_disable); | ||
182 | } | ||
183 | #endif | ||
184 | |||
185 | #if defined(__H8300H__) || defined(__H8300S__) | 154 | #if defined(__H8300H__) || defined(__H8300S__) |
186 | static void sci_init_pins(struct uart_port *port, unsigned int cflag) | 155 | static void sci_init_pins(struct uart_port *port, unsigned int cflag) |
187 | { | 156 | { |
@@ -733,7 +702,6 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr) | |||
733 | return ret; | 702 | return ret; |
734 | } | 703 | } |
735 | 704 | ||
736 | #ifdef CONFIG_HAVE_CLK | ||
737 | /* | 705 | /* |
738 | * Here we define a transistion notifier so that we can update all of our | 706 | * Here we define a transistion notifier so that we can update all of our |
739 | * ports' baud rate when the peripheral clock changes. | 707 | * ports' baud rate when the peripheral clock changes. |
@@ -751,7 +719,6 @@ static int sci_notifier(struct notifier_block *self, | |||
751 | spin_lock_irqsave(&priv->lock, flags); | 719 | spin_lock_irqsave(&priv->lock, flags); |
752 | list_for_each_entry(sci_port, &priv->ports, node) | 720 | list_for_each_entry(sci_port, &priv->ports, node) |
753 | sci_port->port.uartclk = clk_get_rate(sci_port->dclk); | 721 | sci_port->port.uartclk = clk_get_rate(sci_port->dclk); |
754 | |||
755 | spin_unlock_irqrestore(&priv->lock, flags); | 722 | spin_unlock_irqrestore(&priv->lock, flags); |
756 | } | 723 | } |
757 | 724 | ||
@@ -778,7 +745,6 @@ static void sci_clk_disable(struct uart_port *port) | |||
778 | 745 | ||
779 | clk_disable(sci_port->dclk); | 746 | clk_disable(sci_port->dclk); |
780 | } | 747 | } |
781 | #endif | ||
782 | 748 | ||
783 | static int sci_request_irq(struct sci_port *port) | 749 | static int sci_request_irq(struct sci_port *port) |
784 | { | 750 | { |
@@ -833,8 +799,8 @@ static void sci_free_irq(struct sci_port *port) | |||
833 | 799 | ||
834 | static unsigned int sci_tx_empty(struct uart_port *port) | 800 | static unsigned int sci_tx_empty(struct uart_port *port) |
835 | { | 801 | { |
836 | /* Can't detect */ | 802 | unsigned short status = sci_in(port, SCxSR); |
837 | return TIOCSER_TEMT; | 803 | return status & SCxSR_TEND(port) ? TIOCSER_TEMT : 0; |
838 | } | 804 | } |
839 | 805 | ||
840 | static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl) | 806 | static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl) |
@@ -1077,21 +1043,10 @@ static void __devinit sci_init_single(struct platform_device *dev, | |||
1077 | sci_port->port.iotype = UPIO_MEM; | 1043 | sci_port->port.iotype = UPIO_MEM; |
1078 | sci_port->port.line = index; | 1044 | sci_port->port.line = index; |
1079 | sci_port->port.fifosize = 1; | 1045 | sci_port->port.fifosize = 1; |
1080 | |||
1081 | #if defined(__H8300H__) || defined(__H8300S__) | ||
1082 | #ifdef __H8300S__ | ||
1083 | sci_port->enable = h8300_sci_enable; | ||
1084 | sci_port->disable = h8300_sci_disable; | ||
1085 | #endif | ||
1086 | sci_port->port.uartclk = CONFIG_CPU_CLOCK; | ||
1087 | #elif defined(CONFIG_HAVE_CLK) | ||
1088 | sci_port->iclk = p->clk ? clk_get(&dev->dev, p->clk) : NULL; | 1046 | sci_port->iclk = p->clk ? clk_get(&dev->dev, p->clk) : NULL; |
1089 | sci_port->dclk = clk_get(&dev->dev, "peripheral_clk"); | 1047 | sci_port->dclk = clk_get(&dev->dev, "peripheral_clk"); |
1090 | sci_port->enable = sci_clk_enable; | 1048 | sci_port->enable = sci_clk_enable; |
1091 | sci_port->disable = sci_clk_disable; | 1049 | sci_port->disable = sci_clk_disable; |
1092 | #else | ||
1093 | #error "Need a valid uartclk" | ||
1094 | #endif | ||
1095 | 1050 | ||
1096 | sci_port->break_timer.data = (unsigned long)sci_port; | 1051 | sci_port->break_timer.data = (unsigned long)sci_port; |
1097 | sci_port->break_timer.function = sci_break_timer; | 1052 | sci_port->break_timer.function = sci_break_timer; |
@@ -1106,7 +1061,6 @@ static void __devinit sci_init_single(struct platform_device *dev, | |||
1106 | sci_port->type = sci_port->port.type = p->type; | 1061 | sci_port->type = sci_port->port.type = p->type; |
1107 | 1062 | ||
1108 | memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs)); | 1063 | memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs)); |
1109 | |||
1110 | } | 1064 | } |
1111 | 1065 | ||
1112 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE | 1066 | #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE |
@@ -1239,14 +1193,11 @@ static int sci_remove(struct platform_device *dev) | |||
1239 | struct sci_port *p; | 1193 | struct sci_port *p; |
1240 | unsigned long flags; | 1194 | unsigned long flags; |
1241 | 1195 | ||
1242 | #ifdef CONFIG_HAVE_CLK | ||
1243 | cpufreq_unregister_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER); | 1196 | cpufreq_unregister_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER); |
1244 | #endif | ||
1245 | 1197 | ||
1246 | spin_lock_irqsave(&priv->lock, flags); | 1198 | spin_lock_irqsave(&priv->lock, flags); |
1247 | list_for_each_entry(p, &priv->ports, node) | 1199 | list_for_each_entry(p, &priv->ports, node) |
1248 | uart_remove_one_port(&sci_uart_driver, &p->port); | 1200 | uart_remove_one_port(&sci_uart_driver, &p->port); |
1249 | |||
1250 | spin_unlock_irqrestore(&priv->lock, flags); | 1201 | spin_unlock_irqrestore(&priv->lock, flags); |
1251 | 1202 | ||
1252 | kfree(priv); | 1203 | kfree(priv); |
@@ -1307,10 +1258,8 @@ static int __devinit sci_probe(struct platform_device *dev) | |||
1307 | spin_lock_init(&priv->lock); | 1258 | spin_lock_init(&priv->lock); |
1308 | platform_set_drvdata(dev, priv); | 1259 | platform_set_drvdata(dev, priv); |
1309 | 1260 | ||
1310 | #ifdef CONFIG_HAVE_CLK | ||
1311 | priv->clk_nb.notifier_call = sci_notifier; | 1261 | priv->clk_nb.notifier_call = sci_notifier; |
1312 | cpufreq_register_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER); | 1262 | cpufreq_register_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER); |
1313 | #endif | ||
1314 | 1263 | ||
1315 | if (dev->id != -1) { | 1264 | if (dev->id != -1) { |
1316 | ret = sci_probe_single(dev, dev->id, p, &sci_ports[dev->id]); | 1265 | ret = sci_probe_single(dev, dev->id, p, &sci_ports[dev->id]); |
@@ -1370,7 +1319,7 @@ static struct dev_pm_ops sci_dev_pm_ops = { | |||
1370 | 1319 | ||
1371 | static struct platform_driver sci_driver = { | 1320 | static struct platform_driver sci_driver = { |
1372 | .probe = sci_probe, | 1321 | .probe = sci_probe, |
1373 | .remove = __devexit_p(sci_remove), | 1322 | .remove = sci_remove, |
1374 | .driver = { | 1323 | .driver = { |
1375 | .name = "sh-sci", | 1324 | .name = "sh-sci", |
1376 | .owner = THIS_MODULE, | 1325 | .owner = THIS_MODULE, |