diff options
author | Oliver F. Brown <oliver.brown@oss.nxp.com> | 2022-08-04 10:54:07 -0500 |
---|---|---|
committer | Francesco Dolcini <francesco.dolcini@toradex.com> | 2024-02-14 14:05:26 +0000 |
commit | b7c8b9d876f53c72628d1c786b68f87e521228e0 (patch) | |
tree | e6db46badcbb24985f4e2965dcb8e2f01462fec0 | |
parent | 7ddc76ba2b4af8564c09460a173cae43a93c562a (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.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c | 10 |
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; |