diff options
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r-- | drivers/tty/serial/8250/8250_bcm2835aux.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c index 829abef2564d..d7a0f271263a 100644 --- a/drivers/tty/serial/8250/8250_bcm2835aux.c +++ b/drivers/tty/serial/8250/8250_bcm2835aux.c @@ -214,17 +214,27 @@ static const struct acpi_device_id bcm2835aux_serial_acpi_match[] = { }; MODULE_DEVICE_TABLE(acpi, bcm2835aux_serial_acpi_match); -static int bcm2835aux_suspend(struct device *dev) +static bool bcm2835aux_can_disable_clock(struct device *dev) { struct bcm2835aux_data *data = dev_get_drvdata(dev); struct uart_8250_port *up = serial8250_get_port(data->line); - serial8250_suspend_port(data->line); - if (device_may_wakeup(dev)) - return 0; + return false; if (uart_console(&up->port) && !console_suspend_enabled) + return false; + + return true; +} + +static int bcm2835aux_suspend(struct device *dev) +{ + struct bcm2835aux_data *data = dev_get_drvdata(dev); + + serial8250_suspend_port(data->line); + + if (!bcm2835aux_can_disable_clock(dev)) return 0; clk_disable_unprepare(data->clk); @@ -236,9 +246,11 @@ static int bcm2835aux_resume(struct device *dev) struct bcm2835aux_data *data = dev_get_drvdata(dev); int ret; - ret = clk_prepare_enable(data->clk); - if (ret) - return ret; + if (bcm2835aux_can_disable_clock(dev)) { + ret = clk_prepare_enable(data->clk); + if (ret) + return ret; + } serial8250_resume_port(data->line); |