diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:03:16 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:03:16 -0500 |
| commit | 3a43aaa31790c36b69ebf8a6396f37fade86b531 (patch) | |
| tree | 7c7f8da6219d546f2b44534cb7be1fb5591d6ac4 /drivers/serial/sh-sci.c | |
| parent | aed886ce777590eac87f7ce2897d9f8357754331 (diff) | |
| parent | 6a5a0b9139b19dd1a107870269a35bc9cf18d2dc (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (137 commits)
sh: include empty zero page in romImage
sh: Make associative cache writes fatal on all SH-4A parts.
sh: Drop associative writes for SH-4 cache flushes.
sh: Partial revert of copy/clear_user_highpage() optimizations.
sh: Add default uImage rule for se7724, ap325rxa, and migor.
sh: allow runtime pm without suspend/resume callbacks
sh: mach-ecovec24: Remove un-defined settings for VPU
sh: mach-ecovec24: LCDC drive ability become high
sh: fix sh7724 VEU3F resource size
serial: sh-sci: Fix too early port disabling.
sh: pfc: pr_info() -> pr_debug() cleanups.
sh: pfc: Convert from ctrl_xxx() to __raw_xxx() I/O routines.
sh: Improve kfr2r09 serial port setup code
sh: Break out SuperH PFC code
sh: Move KEYSC header file
sh: convert /proc/cpu/aligmnent, /proc/cpu/kernel_alignment to seq_file
sh: Add CPG save/restore code for sh7724 R-standby
sh: Add SDHI power control support to Ecovec
mfd: Add power control platform data to SDHI driver
sh: mach-ecovec24: modify address map
...
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, |
