[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <9b7a9e9b88ad8c7489ee1b4c70b8751eeb5cf6f9.1720049413.git.dsimic@manjaro.org>
Date: Thu, 4 Jul 2024 01:32:02 +0200
From: Dragan Simic <dsimic@...jaro.org>
To: linux-rockchip@...ts.infradead.org,
dri-devel@...ts.freedesktop.org
Cc: heiko@...ech.de,
hjc@...k-chips.com,
andy.yan@...k-chips.com,
maarten.lankhorst@...ux.intel.com,
mripard@...nel.org,
tzimmermann@...e.de,
airlied@...il.com,
daniel@...ll.ch,
linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org
Subject: [PATCH] drm/rockchip: cdn-dp: Remove redundant workarounds for firmware loading
After the additional firmware-related module information was introduced by
the commit c0677e41a47f ("drm/rockchip: cdn-dp-core: add MODULE_FIRMWARE
macro"), there's no longer need for the firmware-loading workarounds whose
sole purpose was to prevent the missing firmware blob in an initial ramdisk
from causing driver initialization to fail. Thus, delete the workarounds,
which removes a sizable chunk of redundant code.
Various utilities used by Linux distributions to generate initial ramdisks
need to obey the firmware-related module information, so we can rely on the
firmware blob being present in the generated initial ramdisks.
Signed-off-by: Dragan Simic <dsimic@...jaro.org>
---
drivers/gpu/drm/rockchip/cdn-dp-core.c | 53 +++++---------------------
1 file changed, 10 insertions(+), 43 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
index bd7aa891b839..e1a7c6a1172b 100644
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -44,9 +44,9 @@ static inline struct cdn_dp_device *encoder_to_dp(struct drm_encoder *encoder)
#define DPTX_HPD_DEL (2 << 12)
#define DPTX_HPD_SEL_MASK (3 << 28)
-#define CDN_FW_TIMEOUT_MS (64 * 1000)
#define CDN_DPCD_TIMEOUT_MS 5000
#define CDN_DP_FIRMWARE "rockchip/dptx.bin"
+
MODULE_FIRMWARE(CDN_DP_FIRMWARE);
struct cdn_dp_data {
@@ -909,61 +909,28 @@ static int cdn_dp_audio_codec_init(struct cdn_dp_device *dp,
return PTR_ERR_OR_ZERO(dp->audio_pdev);
}
-static int cdn_dp_request_firmware(struct cdn_dp_device *dp)
-{
- int ret;
- unsigned long timeout = jiffies + msecs_to_jiffies(CDN_FW_TIMEOUT_MS);
- unsigned long sleep = 1000;
-
- WARN_ON(!mutex_is_locked(&dp->lock));
-
- if (dp->fw_loaded)
- return 0;
-
- /* Drop the lock before getting the firmware to avoid blocking boot */
- mutex_unlock(&dp->lock);
-
- while (time_before(jiffies, timeout)) {
- ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dp->dev);
- if (ret == -ENOENT) {
- msleep(sleep);
- sleep *= 2;
- continue;
- } else if (ret) {
- DRM_DEV_ERROR(dp->dev,
- "failed to request firmware: %d\n", ret);
- goto out;
- }
-
- dp->fw_loaded = true;
- ret = 0;
- goto out;
- }
-
- DRM_DEV_ERROR(dp->dev, "Timed out trying to load firmware\n");
- ret = -ETIMEDOUT;
-out:
- mutex_lock(&dp->lock);
- return ret;
-}
-
static void cdn_dp_pd_event_work(struct work_struct *work)
{
struct cdn_dp_device *dp = container_of(work, struct cdn_dp_device,
event_work);
struct drm_connector *connector = &dp->connector;
enum drm_connector_status old_status;
-
int ret;
mutex_lock(&dp->lock);
if (dp->suspended)
goto out;
- ret = cdn_dp_request_firmware(dp);
- if (ret)
- goto out;
+ if (!dp->fw_loaded) {
+ ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dp->dev);
+ if (ret) {
+ DRM_DEV_ERROR(dp->dev, "Loading firmware failed: %d\n", ret);
+ goto out;
+ }
+
+ dp->fw_loaded = true;
+ }
dp->connected = true;
Powered by blists - more mailing lists