summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver F. Brown <oliver.brown@oss.nxp.com>2022-08-04 10:54:07 -0500
committerFrancesco Dolcini <francesco.dolcini@toradex.com>2024-02-14 14:05:26 +0000
commitb7c8b9d876f53c72628d1c786b68f87e521228e0 (patch)
treee6db46badcbb24985f4e2965dcb8e2f01462fec0
parent7ddc76ba2b4af8564c09460a173cae43a93c562a (diff)
LF-7930: drm: bridge: cadence: Add missing mutex calls in cadence API
Several cadence API functions are missing mutex protection. Adding the missing mutex calls in cadence API functions to prevent unstable display behavior. Signed-off-by: Oliver F. Brown <oliver.brown@oss.nxp.com> Upstream-Status: Inappropriate [other] Upstream does not have a driver for the cadence HDMI IP. Cherry picked from NXP downstream commit ce02e24ef317a3bb24b056cbb650e0e314663ffc. Neither the missing mutex calls nor the double mutex unlock in an error path were showing negative effects in our known use cases. Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
-rw-r--r--drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c1
-rw-r--r--drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c10
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c
index 35a37f6b6d6f..9edf6772d160 100644
--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c
+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c
@@ -309,7 +309,6 @@ err_reg_read:
mutex_unlock(&mhdp->api_lock);
DRM_DEV_ERROR(mhdp->dev, "Failed to read register.\n");
-mutex_unlock(&mhdp->api_lock);
return ret;
}
EXPORT_SYMBOL(cdns_mhdp_reg_read);
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c
index 47c853781d84..e64a36bd58b4 100644
--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c
+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c
@@ -54,6 +54,8 @@ int cdns_hdmi_get_edid_block(void *data, u8 *edid,
u8 msg[2], reg[5], i;
int ret;
+ mutex_lock(&mhdp->api_lock);
+
for (i = 0; i < 4; i++) {
msg[0] = block / 2;
msg[1] = block % 2;
@@ -80,6 +82,8 @@ int cdns_hdmi_get_edid_block(void *data, u8 *edid,
break;
}
+ mutex_unlock(&mhdp->api_lock);
+
if (ret)
DRM_ERROR("get block[%d] edid failed: %d\n", block, ret);
return ret;
@@ -90,6 +94,8 @@ int cdns_hdmi_scdc_read(struct cdns_mhdp_device *mhdp, u8 addr, u8 *data)
u8 msg[4], reg[6];
int ret;
+ mutex_lock(&mhdp->api_lock);
+
msg[0] = 0x54;
msg[1] = addr;
msg[2] = 0;
@@ -111,6 +117,7 @@ int cdns_hdmi_scdc_read(struct cdns_mhdp_device *mhdp, u8 addr, u8 *data)
*data = reg[5];
err_scdc_read:
+ mutex_unlock(&mhdp->api_lock);
if (ret)
DRM_ERROR("scdc read failed: %d\n", ret);
return ret;
@@ -121,6 +128,8 @@ int cdns_hdmi_scdc_write(struct cdns_mhdp_device *mhdp, u8 addr, u8 value)
u8 msg[5], reg[5];
int ret;
+ mutex_lock(&mhdp->api_lock);
+
msg[0] = 0x54;
msg[1] = addr;
msg[2] = 0;
@@ -144,6 +153,7 @@ int cdns_hdmi_scdc_write(struct cdns_mhdp_device *mhdp, u8 addr, u8 value)
ret = -EINVAL;
err_scdc_write:
+ mutex_unlock(&mhdp->api_lock);
if (ret)
DRM_ERROR("scdc write failed: %d\n", ret);
return ret;