From 65925ebbf04d02a0e69cc695b77dd60e61e946b6 Mon Sep 17 00:00:00 2001 From: Nisarg Bhavsar Date: Tue, 7 Mar 2023 09:18:13 -0800 Subject: [PATCH] disp: msm: dp: check panel state before accessing dp audio registers During DP disable, it is possible for audio and display to race causing the audio to send teardown notification after display driver has disabled all the clocks. This change adds a check for panel state to avoid accessing registers during this callback. Change-Id: I6322726a04745bc6c73338cd33f65cfdbfe42ec7 Signed-off-by: Nisarg Bhavsar --- msm/dp/dp_audio.c | 6 ++++-- msm/dp/dp_panel.c | 10 ++++++++++ msm/dp/dp_panel.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/msm/dp/dp_audio.c b/msm/dp/dp_audio.c index 57d5b74bf6..821d8fe1f0 100644 --- a/msm/dp/dp_audio.c +++ b/msm/dp/dp_audio.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ @@ -362,7 +362,9 @@ static void dp_audio_enable(struct dp_audio_private *audio, bool enable) return; } catalog->data = enable; - catalog->enable(catalog); + + if (audio->panel->get_panel_on(audio->panel)) + catalog->enable(catalog); } diff --git a/msm/dp/dp_panel.c b/msm/dp/dp_panel.c index 2716bb4b88..ddcb5a9951 100644 --- a/msm/dp/dp_panel.c +++ b/msm/dp/dp_panel.c @@ -3126,6 +3126,15 @@ int dp_panel_sink_crc_enable(struct dp_panel *dp_panel, bool enable) return rc; } +bool dp_panel_get_panel_on(struct dp_panel *dp_panel) +{ + struct dp_panel_private *panel; + + panel = container_of(dp_panel, struct dp_panel_private, dp_panel); + + return panel->panel_on; +} + struct dp_panel *dp_panel_get(struct dp_panel_in *in) { int rc = 0; @@ -3204,6 +3213,7 @@ struct dp_panel *dp_panel_get(struct dp_panel_in *in) dp_panel->get_src_crc = dp_panel_get_src_crc; dp_panel->get_sink_crc = dp_panel_get_sink_crc; dp_panel->sink_crc_enable = dp_panel_sink_crc_enable; + dp_panel->get_panel_on = dp_panel_get_panel_on; sde_conn = to_sde_connector(dp_panel->connector); sde_conn->drv_panel = dp_panel; diff --git a/msm/dp/dp_panel.h b/msm/dp/dp_panel.h index 37d4be47c4..259437f2fd 100644 --- a/msm/dp/dp_panel.h +++ b/msm/dp/dp_panel.h @@ -198,6 +198,7 @@ struct dp_panel { int (*sink_crc_enable)(struct dp_panel *dp_panel, bool enable); int (*get_src_crc)(struct dp_panel *dp_panel, u16 *crc); int (*get_sink_crc)(struct dp_panel *dp_panel, u16 *crc); + bool (*get_panel_on)(struct dp_panel *dp_panel); }; struct dp_tu_calc_input {