Commit dccb4d74 authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: hdmi: Use full range helper in csc functions

The CSC callbacks takes a boolean as an argument to tell whether we're
using the full range or limited range RGB.

However, with the upcoming YUV support, the logic will be a bit more
complex. In order to address this, let's make the callbacks take the
entire mode, and call our new helper to tell whether the full or limited
range RGB should be used.
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20220120151625.594595-7-maxime@cerno.tech
parent a649cc82
...@@ -490,7 +490,6 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, ...@@ -490,7 +490,6 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder,
static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
struct drm_connector *connector = &vc4_hdmi->connector; struct drm_connector *connector = &vc4_hdmi->connector;
struct drm_connector_state *cstate = connector->state; struct drm_connector_state *cstate = connector->state;
const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
...@@ -508,9 +507,9 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) ...@@ -508,9 +507,9 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
drm_hdmi_avi_infoframe_quant_range(&frame.avi, drm_hdmi_avi_infoframe_quant_range(&frame.avi,
connector, mode, connector, mode,
vc4_encoder->limited_rgb_range ? vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ?
HDMI_QUANTIZATION_RANGE_LIMITED : HDMI_QUANTIZATION_RANGE_FULL :
HDMI_QUANTIZATION_RANGE_FULL); HDMI_QUANTIZATION_RANGE_LIMITED);
drm_hdmi_avi_infoframe_colorimetry(&frame.avi, cstate); drm_hdmi_avi_infoframe_colorimetry(&frame.avi, cstate);
drm_hdmi_avi_infoframe_bars(&frame.avi, cstate); drm_hdmi_avi_infoframe_bars(&frame.avi, cstate);
...@@ -735,7 +734,8 @@ static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder) ...@@ -735,7 +734,8 @@ static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder)
mutex_unlock(&vc4_hdmi->mutex); mutex_unlock(&vc4_hdmi->mutex);
} }
static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
const struct drm_display_mode *mode)
{ {
unsigned long flags; unsigned long flags;
u32 csc_ctl; u32 csc_ctl;
...@@ -745,7 +745,7 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) ...@@ -745,7 +745,7 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
csc_ctl = VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR, csc_ctl = VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR,
VC4_HD_CSC_CTL_ORDER); VC4_HD_CSC_CTL_ORDER);
if (enable) { if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
/* CEA VICs other than #1 requre limited range RGB /* CEA VICs other than #1 requre limited range RGB
* output unless overridden by an AVI infoframe. * output unless overridden by an AVI infoframe.
* Apply a colorspace conversion to squash 0-255 down * Apply a colorspace conversion to squash 0-255 down
...@@ -775,7 +775,8 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) ...@@ -775,7 +775,8 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
} }
static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
const struct drm_display_mode *mode)
{ {
unsigned long flags; unsigned long flags;
u32 csc_ctl; u32 csc_ctl;
...@@ -784,7 +785,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) ...@@ -784,7 +785,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
if (enable) { if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
/* CEA VICs other than #1 requre limited range RGB /* CEA VICs other than #1 requre limited range RGB
* output unless overridden by an AVI infoframe. * output unless overridden by an AVI infoframe.
* Apply a colorspace conversion to squash 0-255 down * Apply a colorspace conversion to squash 0-255 down
...@@ -1123,22 +1124,12 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder, ...@@ -1123,22 +1124,12 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
unsigned long flags; unsigned long flags;
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);
if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
if (vc4_hdmi->variant->csc_setup)
vc4_hdmi->variant->csc_setup(vc4_hdmi, true);
vc4_encoder->limited_rgb_range = true;
} else {
if (vc4_hdmi->variant->csc_setup) if (vc4_hdmi->variant->csc_setup)
vc4_hdmi->variant->csc_setup(vc4_hdmi, false); vc4_hdmi->variant->csc_setup(vc4_hdmi, mode);
vc4_encoder->limited_rgb_range = false;
}
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N); HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N);
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
struct vc4_hdmi_encoder { struct vc4_hdmi_encoder {
struct vc4_encoder base; struct vc4_encoder base;
bool hdmi_monitor; bool hdmi_monitor;
bool limited_rgb_range;
}; };
static inline struct vc4_hdmi_encoder * static inline struct vc4_hdmi_encoder *
...@@ -77,7 +76,8 @@ struct vc4_hdmi_variant { ...@@ -77,7 +76,8 @@ struct vc4_hdmi_variant {
void (*reset)(struct vc4_hdmi *vc4_hdmi); void (*reset)(struct vc4_hdmi *vc4_hdmi);
/* Callback to enable / disable the CSC */ /* Callback to enable / disable the CSC */
void (*csc_setup)(struct vc4_hdmi *vc4_hdmi, bool enable); void (*csc_setup)(struct vc4_hdmi *vc4_hdmi,
const struct drm_display_mode *mode);
/* Callback to configure the video timings in the HDMI block */ /* Callback to configure the video timings in the HDMI block */
void (*set_timings)(struct vc4_hdmi *vc4_hdmi, void (*set_timings)(struct vc4_hdmi *vc4_hdmi,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment