[PATCH v10 45/69] drm/vc4: hdmi: Convert to common HDMI 2.0 scrambling infrastructure
Cristian Ciocaltea
cristian.ciocaltea at collabora.com
Thu Aug 20 12:23:01 PDT 2026
On 8/20/26 2:24 PM, Maxime Ripard wrote:
> On Fri, Jul 31, 2026 at 07:19:52PM +0300, Cristian Ciocaltea wrote:
>> Replace driver local scrambling logic with the newly introduced common
>> HDMI 2.0 scrambling support:
>>
>> - Advertise source-side scrambling capability by setting supported HDMI
>> version based on the variant's max_pixel_clock.
>>
>> - Provide minimal .scrambler_{enable,disable} connector callbacks that
>> only toggle the VC5 HDMI_SCRAMBLER_CTL register, while delegating
>> sink-side SCDC programming and periodic status monitoring to
>> drm_connector_hdmi_{enable,disable}_scrambling().
>>
>> - Drop vc4_hdmi_reset_link() and vc4_hdmi_handle_hotplug(), switching
>> the .detect_ctx() path to drm_atomic_helper_connector_hdmi_hotplug()
>> which internally calls drm_connector_hdmi_sync_scdc() to trigger a
>> CRTC reset on reconnection.
>>
>> - Drop the local scrambling_work delayed workqueue and scdc_enabled
>> flag, now tracked by the common drm_connector_hdmi layer, as well as
>> the now unused output_{bpc,color_format} driver data members.
>>
>> No functional change intended.
>>
>> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
>> ---
[...]
>> +static int vc4_hdmi_scrambler_enable(struct drm_connector *connector)
>> {
>> - struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
>> - struct drm_connector *connector = &vc4_hdmi->connector;
>> + struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
>> struct drm_device *drm = connector->dev;
>> - const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
>> unsigned long flags;
>> int idx;
>>
>> - lockdep_assert_held(&vc4_hdmi->mutex);
>> -
>> - if (!vc4_hdmi_supports_scrambling(vc4_hdmi))
>> - return;
>> -
>> - if (!drm_hdmi_mode_needs_scrambling(mode,
>> - vc4_hdmi->output_bpc,
>> - vc4_hdmi->output_format))
>> - return;
>> -
>> if (!drm_dev_enter(drm, &idx))
>> - return;
>> -
>> - drm_scdc_set_high_tmds_clock_ratio(connector, true);
>> - drm_scdc_set_scrambling(connector, true);
>> + return -ENODEV;
>
> Not being able to acquire the device isn't an error, it's something we should ignore.
Ack, will return 0 in both cases.
>
>>
>> spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
>> HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) |
>> @@ -793,59 +659,27 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
>>
>> drm_dev_exit(idx);
>>
>> - vc4_hdmi->scdc_enabled = true;
>> -
>> - queue_delayed_work(system_percpu_wq, &vc4_hdmi->scrambling_work,
>> - msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
>> + return 0;
>> }
>>
>> -static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
>> +static int vc4_hdmi_scrambler_disable(struct drm_connector *connector)
>> {
>> - struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
>> - struct drm_connector *connector = &vc4_hdmi->connector;
>> + struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
>> struct drm_device *drm = connector->dev;
>> unsigned long flags;
>> int idx;
>>
>> - lockdep_assert_held(&vc4_hdmi->mutex);
>> -
>> - if (!vc4_hdmi->scdc_enabled)
>> - return;
>> -
>> - vc4_hdmi->scdc_enabled = false;
>> -
>> - if (delayed_work_pending(&vc4_hdmi->scrambling_work))
>> - cancel_delayed_work_sync(&vc4_hdmi->scrambling_work);
>> -
>> if (!drm_dev_enter(drm, &idx))
>> - return;
>> + return -ENODEV;
>
> Ditto
>
> Maxime
More information about the Linux-rockchip
mailing list