[PATCH] serial: 8250_bcm2835aux: Fix clock imbalance in PM resume

Stefan Wahren wahrenst at gmx.net
Sat Aug 31 02:16:54 PDT 2024


Hi,

Am 18.08.24 um 19:49 schrieb Stefan Wahren:
> During review Ulf Hansson discovered a clock imbalance in the recently
> introduced PM resume code. The driver should enable the clock only in
> case it has been disabled in suspend before. In order to make the
> conditions easier to read, refactor this into a separate function.
>
> Reported-by: Ulf Hansson <ulf.hansson at linaro.org>
> Closes: https://lore.kernel.org/linux-arm-kernel/CAPDyKFoJh3j8xSeXZ9o031YZLTCDYVA+dgvURuwozjDpU_aauA@mail.gmail.com/
> Fixes: 0e1d8780526f ("serial: 8250_bcm2835aux: add PM suspend/resume support")
> Signed-off-by: Stefan Wahren <wahrenst at gmx.net>
i missed to mention that this is for tty-next.

Now i can take the chance for a gentle ping ...
> ---
>   drivers/tty/serial/8250/8250_bcm2835aux.c | 26 +++++++++++++++++------
>   1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c
> index 36e2bb34d82b..e6b42ca6151e 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);
>
> --
> 2.34.1
>




More information about the linux-arm-kernel mailing list