|
@@ -9,6 +9,7 @@
|
|
* 2 of the License, or (at your option) any later version.
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
+#include <linux/console.h>
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/delay.h>
|
|
@@ -241,13 +242,48 @@ static int of_platform_serial_remove(struct platform_device *ofdev)
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
#ifdef CONFIG_PM_SLEEP
|
|
-static int of_serial_suspend(struct device *dev)
|
|
|
|
|
|
+#ifdef CONFIG_SERIAL_8250
|
|
|
|
+static void of_serial_suspend_8250(struct of_serial_info *info)
|
|
{
|
|
{
|
|
- struct of_serial_info *info = dev_get_drvdata(dev);
|
|
|
|
|
|
+ struct uart_8250_port *port8250 = serial8250_get_port(info->line);
|
|
|
|
+ struct uart_port *port = &port8250->port;
|
|
|
|
|
|
serial8250_suspend_port(info->line);
|
|
serial8250_suspend_port(info->line);
|
|
- if (info->clk)
|
|
|
|
|
|
+ if (info->clk && (!uart_console(port) || console_suspend_enabled))
|
|
clk_disable_unprepare(info->clk);
|
|
clk_disable_unprepare(info->clk);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void of_serial_resume_8250(struct of_serial_info *info)
|
|
|
|
+{
|
|
|
|
+ struct uart_8250_port *port8250 = serial8250_get_port(info->line);
|
|
|
|
+ struct uart_port *port = &port8250->port;
|
|
|
|
+
|
|
|
|
+ if (info->clk && (!uart_console(port) || console_suspend_enabled))
|
|
|
|
+ clk_prepare_enable(info->clk);
|
|
|
|
+
|
|
|
|
+ serial8250_resume_port(info->line);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline void of_serial_suspend_8250(struct of_serial_info *info)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void of_serial_resume_8250(struct of_serial_info *info)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+static int of_serial_suspend(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct of_serial_info *info = dev_get_drvdata(dev);
|
|
|
|
+
|
|
|
|
+ switch(info->type) {
|
|
|
|
+ case PORT_8250 ... PORT_MAX_8250:
|
|
|
|
+ of_serial_suspend_8250(info);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -256,10 +292,13 @@ static int of_serial_resume(struct device *dev)
|
|
{
|
|
{
|
|
struct of_serial_info *info = dev_get_drvdata(dev);
|
|
struct of_serial_info *info = dev_get_drvdata(dev);
|
|
|
|
|
|
- if (info->clk)
|
|
|
|
- clk_prepare_enable(info->clk);
|
|
|
|
-
|
|
|
|
- serial8250_resume_port(info->line);
|
|
|
|
|
|
+ switch(info->type) {
|
|
|
|
+ case PORT_8250 ... PORT_MAX_8250:
|
|
|
|
+ of_serial_resume_8250(info);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|