Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (C) 2015 Broadcom
0004  * Copyright (c) 2014 The Linux Foundation. All rights reserved.
0005  * Copyright (C) 2013 Red Hat
0006  * Author: Rob Clark <robdclark@gmail.com>
0007  */
0008 
0009 /**
0010  * DOC: VC4 Falcon HDMI module
0011  *
0012  * The HDMI core has a state machine and a PHY.  On BCM2835, most of
0013  * the unit operates off of the HSM clock from CPRMAN.  It also
0014  * internally uses the PLLH_PIX clock for the PHY.
0015  *
0016  * HDMI infoframes are kept within a small packet ram, where each
0017  * packet can be individually enabled for including in a frame.
0018  *
0019  * HDMI audio is implemented entirely within the HDMI IP block.  A
0020  * register in the HDMI encoder takes SPDIF frames from the DMA engine
0021  * and transfers them over an internal MAI (multi-channel audio
0022  * interconnect) bus to the encoder side for insertion into the video
0023  * blank regions.
0024  *
0025  * The driver's HDMI encoder does not yet support power management.
0026  * The HDMI encoder's power domain and the HSM/pixel clocks are kept
0027  * continuously running, and only the HDMI logic and packet ram are
0028  * powered off/on at disable/enable time.
0029  *
0030  * The driver does not yet support CEC control, though the HDMI
0031  * encoder block has CEC support.
0032  */
0033 
0034 #include <drm/display/drm_hdmi_helper.h>
0035 #include <drm/display/drm_scdc_helper.h>
0036 #include <drm/drm_atomic_helper.h>
0037 #include <drm/drm_probe_helper.h>
0038 #include <drm/drm_simple_kms_helper.h>
0039 #include <linux/clk.h>
0040 #include <linux/component.h>
0041 #include <linux/gpio/consumer.h>
0042 #include <linux/i2c.h>
0043 #include <linux/of_address.h>
0044 #include <linux/of_gpio.h>
0045 #include <linux/of_platform.h>
0046 #include <linux/pm_runtime.h>
0047 #include <linux/rational.h>
0048 #include <linux/reset.h>
0049 #include <sound/dmaengine_pcm.h>
0050 #include <sound/hdmi-codec.h>
0051 #include <sound/pcm_drm_eld.h>
0052 #include <sound/pcm_params.h>
0053 #include <sound/soc.h>
0054 #include "media/cec.h"
0055 #include "vc4_drv.h"
0056 #include "vc4_hdmi.h"
0057 #include "vc4_hdmi_regs.h"
0058 #include "vc4_regs.h"
0059 
0060 #define VC5_HDMI_HORZA_HFP_SHIFT        16
0061 #define VC5_HDMI_HORZA_HFP_MASK         VC4_MASK(28, 16)
0062 #define VC5_HDMI_HORZA_VPOS         BIT(15)
0063 #define VC5_HDMI_HORZA_HPOS         BIT(14)
0064 #define VC5_HDMI_HORZA_HAP_SHIFT        0
0065 #define VC5_HDMI_HORZA_HAP_MASK         VC4_MASK(13, 0)
0066 
0067 #define VC5_HDMI_HORZB_HBP_SHIFT        16
0068 #define VC5_HDMI_HORZB_HBP_MASK         VC4_MASK(26, 16)
0069 #define VC5_HDMI_HORZB_HSP_SHIFT        0
0070 #define VC5_HDMI_HORZB_HSP_MASK         VC4_MASK(10, 0)
0071 
0072 #define VC5_HDMI_VERTA_VSP_SHIFT        24
0073 #define VC5_HDMI_VERTA_VSP_MASK         VC4_MASK(28, 24)
0074 #define VC5_HDMI_VERTA_VFP_SHIFT        16
0075 #define VC5_HDMI_VERTA_VFP_MASK         VC4_MASK(22, 16)
0076 #define VC5_HDMI_VERTA_VAL_SHIFT        0
0077 #define VC5_HDMI_VERTA_VAL_MASK         VC4_MASK(12, 0)
0078 
0079 #define VC5_HDMI_VERTB_VSPO_SHIFT       16
0080 #define VC5_HDMI_VERTB_VSPO_MASK        VC4_MASK(29, 16)
0081 
0082 #define VC4_HDMI_MISC_CONTROL_PIXEL_REP_SHIFT   0
0083 #define VC4_HDMI_MISC_CONTROL_PIXEL_REP_MASK    VC4_MASK(3, 0)
0084 #define VC5_HDMI_MISC_CONTROL_PIXEL_REP_SHIFT   0
0085 #define VC5_HDMI_MISC_CONTROL_PIXEL_REP_MASK    VC4_MASK(3, 0)
0086 
0087 #define VC5_HDMI_SCRAMBLER_CTL_ENABLE       BIT(0)
0088 
0089 #define VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_SHIFT  8
0090 #define VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK   VC4_MASK(10, 8)
0091 
0092 #define VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_SHIFT      0
0093 #define VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK       VC4_MASK(3, 0)
0094 
0095 #define VC5_HDMI_GCP_CONFIG_GCP_ENABLE      BIT(31)
0096 
0097 #define VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_SHIFT  8
0098 #define VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_MASK   VC4_MASK(15, 8)
0099 
0100 # define VC4_HD_M_SW_RST            BIT(2)
0101 # define VC4_HD_M_ENABLE            BIT(0)
0102 
0103 #define HSM_MIN_CLOCK_FREQ  120000000
0104 #define CEC_CLOCK_FREQ 40000
0105 
0106 #define HDMI_14_MAX_TMDS_CLK   (340 * 1000 * 1000)
0107 
0108 static const char * const output_format_str[] = {
0109     [VC4_HDMI_OUTPUT_RGB]       = "RGB",
0110     [VC4_HDMI_OUTPUT_YUV420]    = "YUV 4:2:0",
0111     [VC4_HDMI_OUTPUT_YUV422]    = "YUV 4:2:2",
0112     [VC4_HDMI_OUTPUT_YUV444]    = "YUV 4:4:4",
0113 };
0114 
0115 static const char *vc4_hdmi_output_fmt_str(enum vc4_hdmi_output_format fmt)
0116 {
0117     if (fmt >= ARRAY_SIZE(output_format_str))
0118         return "invalid";
0119 
0120     return output_format_str[fmt];
0121 }
0122 
0123 static unsigned long long
0124 vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
0125                     unsigned int bpc, enum vc4_hdmi_output_format fmt);
0126 
0127 static bool vc4_hdmi_mode_needs_scrambling(const struct drm_display_mode *mode,
0128                        unsigned int bpc,
0129                        enum vc4_hdmi_output_format fmt)
0130 {
0131     unsigned long long clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt);
0132 
0133     return clock > HDMI_14_MAX_TMDS_CLK;
0134 }
0135 
0136 static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi,
0137                        const struct drm_display_mode *mode)
0138 {
0139     struct drm_display_info *display = &vc4_hdmi->connector.display_info;
0140 
0141     return !display->is_hdmi ||
0142         drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_FULL;
0143 }
0144 
0145 static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)
0146 {
0147     struct drm_info_node *node = (struct drm_info_node *)m->private;
0148     struct vc4_hdmi *vc4_hdmi = node->info_ent->data;
0149     struct drm_printer p = drm_seq_file_printer(m);
0150 
0151     drm_print_regset32(&p, &vc4_hdmi->hdmi_regset);
0152     drm_print_regset32(&p, &vc4_hdmi->hd_regset);
0153     drm_print_regset32(&p, &vc4_hdmi->cec_regset);
0154     drm_print_regset32(&p, &vc4_hdmi->csc_regset);
0155     drm_print_regset32(&p, &vc4_hdmi->dvp_regset);
0156     drm_print_regset32(&p, &vc4_hdmi->phy_regset);
0157     drm_print_regset32(&p, &vc4_hdmi->ram_regset);
0158     drm_print_regset32(&p, &vc4_hdmi->rm_regset);
0159 
0160     return 0;
0161 }
0162 
0163 static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi)
0164 {
0165     unsigned long flags;
0166 
0167     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0168 
0169     HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_SW_RST);
0170     udelay(1);
0171     HDMI_WRITE(HDMI_M_CTL, 0);
0172 
0173     HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_ENABLE);
0174 
0175     HDMI_WRITE(HDMI_SW_RESET_CONTROL,
0176            VC4_HDMI_SW_RESET_HDMI |
0177            VC4_HDMI_SW_RESET_FORMAT_DETECT);
0178 
0179     HDMI_WRITE(HDMI_SW_RESET_CONTROL, 0);
0180 
0181     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0182 }
0183 
0184 static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi)
0185 {
0186     unsigned long flags;
0187 
0188     reset_control_reset(vc4_hdmi->reset);
0189 
0190     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0191 
0192     HDMI_WRITE(HDMI_DVP_CTL, 0);
0193 
0194     HDMI_WRITE(HDMI_CLOCK_STOP,
0195            HDMI_READ(HDMI_CLOCK_STOP) | VC4_DVP_HT_CLOCK_STOP_PIXEL);
0196 
0197     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0198 }
0199 
0200 #ifdef CONFIG_DRM_VC4_HDMI_CEC
0201 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi)
0202 {
0203     unsigned long cec_rate = clk_get_rate(vc4_hdmi->cec_clock);
0204     unsigned long flags;
0205     u16 clk_cnt;
0206     u32 value;
0207 
0208     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0209 
0210     value = HDMI_READ(HDMI_CEC_CNTRL_1);
0211     value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
0212 
0213     /*
0214      * Set the clock divider: the hsm_clock rate and this divider
0215      * setting will give a 40 kHz CEC clock.
0216      */
0217     clk_cnt = cec_rate / CEC_CLOCK_FREQ;
0218     value |= clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT;
0219     HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
0220 
0221     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0222 }
0223 #else
0224 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {}
0225 #endif
0226 
0227 static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder);
0228 
0229 static enum drm_connector_status
0230 vc4_hdmi_connector_detect(struct drm_connector *connector, bool force)
0231 {
0232     struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
0233     bool connected = false;
0234 
0235     mutex_lock(&vc4_hdmi->mutex);
0236 
0237     WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev));
0238 
0239     if (vc4_hdmi->hpd_gpio) {
0240         if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio))
0241             connected = true;
0242     } else {
0243         if (vc4_hdmi->variant->hp_detect &&
0244             vc4_hdmi->variant->hp_detect(vc4_hdmi))
0245             connected = true;
0246     }
0247 
0248     if (connected) {
0249         if (connector->status != connector_status_connected) {
0250             struct edid *edid = drm_get_edid(connector, vc4_hdmi->ddc);
0251 
0252             if (edid) {
0253                 cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
0254                 kfree(edid);
0255             }
0256         }
0257 
0258         vc4_hdmi_enable_scrambling(&vc4_hdmi->encoder.base);
0259         pm_runtime_put(&vc4_hdmi->pdev->dev);
0260         mutex_unlock(&vc4_hdmi->mutex);
0261         return connector_status_connected;
0262     }
0263 
0264     cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
0265     pm_runtime_put(&vc4_hdmi->pdev->dev);
0266     mutex_unlock(&vc4_hdmi->mutex);
0267     return connector_status_disconnected;
0268 }
0269 
0270 static void vc4_hdmi_connector_destroy(struct drm_connector *connector)
0271 {
0272     drm_connector_unregister(connector);
0273     drm_connector_cleanup(connector);
0274 }
0275 
0276 static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
0277 {
0278     struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
0279     int ret = 0;
0280     struct edid *edid;
0281 
0282     mutex_lock(&vc4_hdmi->mutex);
0283 
0284     edid = drm_get_edid(connector, vc4_hdmi->ddc);
0285     cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
0286     if (!edid) {
0287         ret = -ENODEV;
0288         goto out;
0289     }
0290 
0291     drm_connector_update_edid_property(connector, edid);
0292     ret = drm_add_edid_modes(connector, edid);
0293     kfree(edid);
0294 
0295     if (vc4_hdmi->disable_4kp60) {
0296         struct drm_device *drm = connector->dev;
0297         struct drm_display_mode *mode;
0298 
0299         list_for_each_entry(mode, &connector->probed_modes, head) {
0300             if (vc4_hdmi_mode_needs_scrambling(mode, 8, VC4_HDMI_OUTPUT_RGB)) {
0301                 drm_warn_once(drm, "The core clock cannot reach frequencies high enough to support 4k @ 60Hz.");
0302                 drm_warn_once(drm, "Please change your config.txt file to add hdmi_enable_4kp60.");
0303             }
0304         }
0305     }
0306 
0307 out:
0308     mutex_unlock(&vc4_hdmi->mutex);
0309 
0310     return ret;
0311 }
0312 
0313 static int vc4_hdmi_connector_atomic_check(struct drm_connector *connector,
0314                        struct drm_atomic_state *state)
0315 {
0316     struct drm_connector_state *old_state =
0317         drm_atomic_get_old_connector_state(state, connector);
0318     struct drm_connector_state *new_state =
0319         drm_atomic_get_new_connector_state(state, connector);
0320     struct drm_crtc *crtc = new_state->crtc;
0321 
0322     if (!crtc)
0323         return 0;
0324 
0325     if (old_state->colorspace != new_state->colorspace ||
0326         !drm_connector_atomic_hdr_metadata_equal(old_state, new_state)) {
0327         struct drm_crtc_state *crtc_state;
0328 
0329         crtc_state = drm_atomic_get_crtc_state(state, crtc);
0330         if (IS_ERR(crtc_state))
0331             return PTR_ERR(crtc_state);
0332 
0333         crtc_state->mode_changed = true;
0334     }
0335 
0336     return 0;
0337 }
0338 
0339 static void vc4_hdmi_connector_reset(struct drm_connector *connector)
0340 {
0341     struct vc4_hdmi_connector_state *old_state =
0342         conn_state_to_vc4_hdmi_conn_state(connector->state);
0343     struct vc4_hdmi_connector_state *new_state =
0344         kzalloc(sizeof(*new_state), GFP_KERNEL);
0345 
0346     if (connector->state)
0347         __drm_atomic_helper_connector_destroy_state(connector->state);
0348 
0349     kfree(old_state);
0350     __drm_atomic_helper_connector_reset(connector, &new_state->base);
0351 
0352     if (!new_state)
0353         return;
0354 
0355     new_state->base.max_bpc = 8;
0356     new_state->base.max_requested_bpc = 8;
0357     new_state->output_format = VC4_HDMI_OUTPUT_RGB;
0358     drm_atomic_helper_connector_tv_reset(connector);
0359 }
0360 
0361 static struct drm_connector_state *
0362 vc4_hdmi_connector_duplicate_state(struct drm_connector *connector)
0363 {
0364     struct drm_connector_state *conn_state = connector->state;
0365     struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
0366     struct vc4_hdmi_connector_state *new_state;
0367 
0368     new_state = kzalloc(sizeof(*new_state), GFP_KERNEL);
0369     if (!new_state)
0370         return NULL;
0371 
0372     new_state->tmds_char_rate = vc4_state->tmds_char_rate;
0373     new_state->output_bpc = vc4_state->output_bpc;
0374     new_state->output_format = vc4_state->output_format;
0375     __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
0376 
0377     return &new_state->base;
0378 }
0379 
0380 static const struct drm_connector_funcs vc4_hdmi_connector_funcs = {
0381     .detect = vc4_hdmi_connector_detect,
0382     .fill_modes = drm_helper_probe_single_connector_modes,
0383     .destroy = vc4_hdmi_connector_destroy,
0384     .reset = vc4_hdmi_connector_reset,
0385     .atomic_duplicate_state = vc4_hdmi_connector_duplicate_state,
0386     .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
0387 };
0388 
0389 static const struct drm_connector_helper_funcs vc4_hdmi_connector_helper_funcs = {
0390     .get_modes = vc4_hdmi_connector_get_modes,
0391     .atomic_check = vc4_hdmi_connector_atomic_check,
0392 };
0393 
0394 static int vc4_hdmi_connector_init(struct drm_device *dev,
0395                    struct vc4_hdmi *vc4_hdmi)
0396 {
0397     struct drm_connector *connector = &vc4_hdmi->connector;
0398     struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
0399     int ret;
0400 
0401     drm_connector_init_with_ddc(dev, connector,
0402                     &vc4_hdmi_connector_funcs,
0403                     DRM_MODE_CONNECTOR_HDMIA,
0404                     vc4_hdmi->ddc);
0405     drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
0406 
0407     /*
0408      * Some of the properties below require access to state, like bpc.
0409      * Allocate some default initial connector state with our reset helper.
0410      */
0411     if (connector->funcs->reset)
0412         connector->funcs->reset(connector);
0413 
0414     /* Create and attach TV margin props to this connector. */
0415     ret = drm_mode_create_tv_margin_properties(dev);
0416     if (ret)
0417         return ret;
0418 
0419     ret = drm_mode_create_hdmi_colorspace_property(connector);
0420     if (ret)
0421         return ret;
0422 
0423     drm_connector_attach_colorspace_property(connector);
0424     drm_connector_attach_tv_margin_properties(connector);
0425     drm_connector_attach_max_bpc_property(connector, 8, 12);
0426 
0427     connector->polled = (DRM_CONNECTOR_POLL_CONNECT |
0428                  DRM_CONNECTOR_POLL_DISCONNECT);
0429 
0430     connector->interlace_allowed = 1;
0431     connector->doublescan_allowed = 0;
0432     connector->stereo_allowed = 1;
0433 
0434     if (vc4_hdmi->variant->supports_hdr)
0435         drm_connector_attach_hdr_output_metadata_property(connector);
0436 
0437     drm_connector_attach_encoder(connector, encoder);
0438 
0439     return 0;
0440 }
0441 
0442 static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
0443                 enum hdmi_infoframe_type type,
0444                 bool poll)
0445 {
0446     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0447     u32 packet_id = type - 0x80;
0448     unsigned long flags;
0449 
0450     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0451     HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
0452            HDMI_READ(HDMI_RAM_PACKET_CONFIG) & ~BIT(packet_id));
0453     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0454 
0455     if (!poll)
0456         return 0;
0457 
0458     return wait_for(!(HDMI_READ(HDMI_RAM_PACKET_STATUS) &
0459               BIT(packet_id)), 100);
0460 }
0461 
0462 static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder,
0463                      union hdmi_infoframe *frame)
0464 {
0465     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0466     u32 packet_id = frame->any.type - 0x80;
0467     const struct vc4_hdmi_register *ram_packet_start =
0468         &vc4_hdmi->variant->registers[HDMI_RAM_PACKET_START];
0469     u32 packet_reg = ram_packet_start->offset + VC4_HDMI_PACKET_STRIDE * packet_id;
0470     u32 packet_reg_next = ram_packet_start->offset +
0471         VC4_HDMI_PACKET_STRIDE * (packet_id + 1);
0472     void __iomem *base = __vc4_hdmi_get_field_base(vc4_hdmi,
0473                                ram_packet_start->reg);
0474     uint8_t buffer[VC4_HDMI_PACKET_STRIDE] = {};
0475     unsigned long flags;
0476     ssize_t len, i;
0477     int ret;
0478 
0479     WARN_ONCE(!(HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
0480             VC4_HDMI_RAM_PACKET_ENABLE),
0481           "Packet RAM has to be on to store the packet.");
0482 
0483     len = hdmi_infoframe_pack(frame, buffer, sizeof(buffer));
0484     if (len < 0)
0485         return;
0486 
0487     ret = vc4_hdmi_stop_packet(encoder, frame->any.type, true);
0488     if (ret) {
0489         DRM_ERROR("Failed to wait for infoframe to go idle: %d\n", ret);
0490         return;
0491     }
0492 
0493     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0494 
0495     for (i = 0; i < len; i += 7) {
0496         writel(buffer[i + 0] << 0 |
0497                buffer[i + 1] << 8 |
0498                buffer[i + 2] << 16,
0499                base + packet_reg);
0500         packet_reg += 4;
0501 
0502         writel(buffer[i + 3] << 0 |
0503                buffer[i + 4] << 8 |
0504                buffer[i + 5] << 16 |
0505                buffer[i + 6] << 24,
0506                base + packet_reg);
0507         packet_reg += 4;
0508     }
0509 
0510     /*
0511      * clear remainder of packet ram as it's included in the
0512      * infoframe and triggers a checksum error on hdmi analyser
0513      */
0514     for (; packet_reg < packet_reg_next; packet_reg += 4)
0515         writel(0, base + packet_reg);
0516 
0517     HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
0518            HDMI_READ(HDMI_RAM_PACKET_CONFIG) | BIT(packet_id));
0519 
0520     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0521 
0522     ret = wait_for((HDMI_READ(HDMI_RAM_PACKET_STATUS) &
0523             BIT(packet_id)), 100);
0524     if (ret)
0525         DRM_ERROR("Failed to wait for infoframe to start: %d\n", ret);
0526 }
0527 
0528 static void vc4_hdmi_avi_infoframe_colorspace(struct hdmi_avi_infoframe *frame,
0529                           enum vc4_hdmi_output_format fmt)
0530 {
0531     switch (fmt) {
0532     case VC4_HDMI_OUTPUT_RGB:
0533         frame->colorspace = HDMI_COLORSPACE_RGB;
0534         break;
0535 
0536     case VC4_HDMI_OUTPUT_YUV420:
0537         frame->colorspace = HDMI_COLORSPACE_YUV420;
0538         break;
0539 
0540     case VC4_HDMI_OUTPUT_YUV422:
0541         frame->colorspace = HDMI_COLORSPACE_YUV422;
0542         break;
0543 
0544     case VC4_HDMI_OUTPUT_YUV444:
0545         frame->colorspace = HDMI_COLORSPACE_YUV444;
0546         break;
0547 
0548     default:
0549         break;
0550     }
0551 }
0552 
0553 static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
0554 {
0555     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0556     struct drm_connector *connector = &vc4_hdmi->connector;
0557     struct drm_connector_state *cstate = connector->state;
0558     struct vc4_hdmi_connector_state *vc4_state =
0559         conn_state_to_vc4_hdmi_conn_state(cstate);
0560     const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
0561     union hdmi_infoframe frame;
0562     int ret;
0563 
0564     lockdep_assert_held(&vc4_hdmi->mutex);
0565 
0566     ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
0567                                connector, mode);
0568     if (ret < 0) {
0569         DRM_ERROR("couldn't fill AVI infoframe\n");
0570         return;
0571     }
0572 
0573     drm_hdmi_avi_infoframe_quant_range(&frame.avi,
0574                        connector, mode,
0575                        vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ?
0576                        HDMI_QUANTIZATION_RANGE_FULL :
0577                        HDMI_QUANTIZATION_RANGE_LIMITED);
0578     drm_hdmi_avi_infoframe_colorimetry(&frame.avi, cstate);
0579     vc4_hdmi_avi_infoframe_colorspace(&frame.avi, vc4_state->output_format);
0580     drm_hdmi_avi_infoframe_bars(&frame.avi, cstate);
0581 
0582     vc4_hdmi_write_infoframe(encoder, &frame);
0583 }
0584 
0585 static void vc4_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
0586 {
0587     union hdmi_infoframe frame;
0588     int ret;
0589 
0590     ret = hdmi_spd_infoframe_init(&frame.spd, "Broadcom", "Videocore");
0591     if (ret < 0) {
0592         DRM_ERROR("couldn't fill SPD infoframe\n");
0593         return;
0594     }
0595 
0596     frame.spd.sdi = HDMI_SPD_SDI_PC;
0597 
0598     vc4_hdmi_write_infoframe(encoder, &frame);
0599 }
0600 
0601 static void vc4_hdmi_set_audio_infoframe(struct drm_encoder *encoder)
0602 {
0603     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0604     struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe;
0605     union hdmi_infoframe frame;
0606 
0607     memcpy(&frame.audio, audio, sizeof(*audio));
0608 
0609     if (vc4_hdmi->packet_ram_enabled)
0610         vc4_hdmi_write_infoframe(encoder, &frame);
0611 }
0612 
0613 static void vc4_hdmi_set_hdr_infoframe(struct drm_encoder *encoder)
0614 {
0615     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0616     struct drm_connector *connector = &vc4_hdmi->connector;
0617     struct drm_connector_state *conn_state = connector->state;
0618     union hdmi_infoframe frame;
0619 
0620     lockdep_assert_held(&vc4_hdmi->mutex);
0621 
0622     if (!vc4_hdmi->variant->supports_hdr)
0623         return;
0624 
0625     if (!conn_state->hdr_output_metadata)
0626         return;
0627 
0628     if (drm_hdmi_infoframe_set_hdr_metadata(&frame.drm, conn_state))
0629         return;
0630 
0631     vc4_hdmi_write_infoframe(encoder, &frame);
0632 }
0633 
0634 static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder)
0635 {
0636     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0637 
0638     lockdep_assert_held(&vc4_hdmi->mutex);
0639 
0640     vc4_hdmi_set_avi_infoframe(encoder);
0641     vc4_hdmi_set_spd_infoframe(encoder);
0642     /*
0643      * If audio was streaming, then we need to reenabled the audio
0644      * infoframe here during encoder_enable.
0645      */
0646     if (vc4_hdmi->audio.streaming)
0647         vc4_hdmi_set_audio_infoframe(encoder);
0648 
0649     vc4_hdmi_set_hdr_infoframe(encoder);
0650 }
0651 
0652 static bool vc4_hdmi_supports_scrambling(struct drm_encoder *encoder,
0653                      struct drm_display_mode *mode)
0654 {
0655     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0656     struct drm_display_info *display = &vc4_hdmi->connector.display_info;
0657 
0658     lockdep_assert_held(&vc4_hdmi->mutex);
0659 
0660     if (!display->is_hdmi)
0661         return false;
0662 
0663     if (!display->hdmi.scdc.supported ||
0664         !display->hdmi.scdc.scrambling.supported)
0665         return false;
0666 
0667     return true;
0668 }
0669 
0670 #define SCRAMBLING_POLLING_DELAY_MS 1000
0671 
0672 static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
0673 {
0674     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0675     struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
0676     unsigned long flags;
0677 
0678     lockdep_assert_held(&vc4_hdmi->mutex);
0679 
0680     if (!vc4_hdmi_supports_scrambling(encoder, mode))
0681         return;
0682 
0683     if (!vc4_hdmi_mode_needs_scrambling(mode,
0684                         vc4_hdmi->output_bpc,
0685                         vc4_hdmi->output_format))
0686         return;
0687 
0688     drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
0689     drm_scdc_set_scrambling(vc4_hdmi->ddc, true);
0690 
0691     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0692     HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) |
0693            VC5_HDMI_SCRAMBLER_CTL_ENABLE);
0694     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0695 
0696     vc4_hdmi->scdc_enabled = true;
0697 
0698     queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
0699                msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
0700 }
0701 
0702 static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
0703 {
0704     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0705     unsigned long flags;
0706 
0707     lockdep_assert_held(&vc4_hdmi->mutex);
0708 
0709     if (!vc4_hdmi->scdc_enabled)
0710         return;
0711 
0712     vc4_hdmi->scdc_enabled = false;
0713 
0714     if (delayed_work_pending(&vc4_hdmi->scrambling_work))
0715         cancel_delayed_work_sync(&vc4_hdmi->scrambling_work);
0716 
0717     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0718     HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) &
0719            ~VC5_HDMI_SCRAMBLER_CTL_ENABLE);
0720     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0721 
0722     drm_scdc_set_scrambling(vc4_hdmi->ddc, false);
0723     drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, false);
0724 }
0725 
0726 static void vc4_hdmi_scrambling_wq(struct work_struct *work)
0727 {
0728     struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work),
0729                          struct vc4_hdmi,
0730                          scrambling_work);
0731 
0732     if (drm_scdc_get_scrambling_status(vc4_hdmi->ddc))
0733         return;
0734 
0735     drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
0736     drm_scdc_set_scrambling(vc4_hdmi->ddc, true);
0737 
0738     queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
0739                msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
0740 }
0741 
0742 static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder,
0743                            struct drm_atomic_state *state)
0744 {
0745     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0746     unsigned long flags;
0747 
0748     mutex_lock(&vc4_hdmi->mutex);
0749 
0750     vc4_hdmi->packet_ram_enabled = false;
0751 
0752     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0753 
0754     HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
0755 
0756     HDMI_WRITE(HDMI_VID_CTL, HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_CLRRGB);
0757 
0758     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0759 
0760     mdelay(1);
0761 
0762     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0763     HDMI_WRITE(HDMI_VID_CTL,
0764            HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_ENABLE);
0765     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0766 
0767     vc4_hdmi_disable_scrambling(encoder);
0768 
0769     mutex_unlock(&vc4_hdmi->mutex);
0770 }
0771 
0772 static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder,
0773                          struct drm_atomic_state *state)
0774 {
0775     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
0776     unsigned long flags;
0777     int ret;
0778 
0779     mutex_lock(&vc4_hdmi->mutex);
0780 
0781     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0782     HDMI_WRITE(HDMI_VID_CTL,
0783            HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX);
0784     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0785 
0786     if (vc4_hdmi->variant->phy_disable)
0787         vc4_hdmi->variant->phy_disable(vc4_hdmi);
0788 
0789     clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock);
0790     clk_disable_unprepare(vc4_hdmi->pixel_clock);
0791 
0792     ret = pm_runtime_put(&vc4_hdmi->pdev->dev);
0793     if (ret < 0)
0794         DRM_ERROR("Failed to release power domain: %d\n", ret);
0795 
0796     mutex_unlock(&vc4_hdmi->mutex);
0797 }
0798 
0799 static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
0800                    struct drm_connector_state *state,
0801                    const struct drm_display_mode *mode)
0802 {
0803     unsigned long flags;
0804     u32 csc_ctl;
0805 
0806     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0807 
0808     csc_ctl = VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR,
0809                 VC4_HD_CSC_CTL_ORDER);
0810 
0811     if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
0812         /* CEA VICs other than #1 requre limited range RGB
0813          * output unless overridden by an AVI infoframe.
0814          * Apply a colorspace conversion to squash 0-255 down
0815          * to 16-235.  The matrix here is:
0816          *
0817          * [ 0      0      0.8594 16]
0818          * [ 0      0.8594 0      16]
0819          * [ 0.8594 0      0      16]
0820          * [ 0      0      0       1]
0821          */
0822         csc_ctl |= VC4_HD_CSC_CTL_ENABLE;
0823         csc_ctl |= VC4_HD_CSC_CTL_RGB2YCC;
0824         csc_ctl |= VC4_SET_FIELD(VC4_HD_CSC_CTL_MODE_CUSTOM,
0825                      VC4_HD_CSC_CTL_MODE);
0826 
0827         HDMI_WRITE(HDMI_CSC_12_11, (0x000 << 16) | 0x000);
0828         HDMI_WRITE(HDMI_CSC_14_13, (0x100 << 16) | 0x6e0);
0829         HDMI_WRITE(HDMI_CSC_22_21, (0x6e0 << 16) | 0x000);
0830         HDMI_WRITE(HDMI_CSC_24_23, (0x100 << 16) | 0x000);
0831         HDMI_WRITE(HDMI_CSC_32_31, (0x000 << 16) | 0x6e0);
0832         HDMI_WRITE(HDMI_CSC_34_33, (0x100 << 16) | 0x000);
0833     }
0834 
0835     /* The RGB order applies even when CSC is disabled. */
0836     HDMI_WRITE(HDMI_CSC_CTL, csc_ctl);
0837 
0838     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0839 }
0840 
0841 /*
0842  * If we need to output Full Range RGB, then use the unity matrix
0843  *
0844  * [ 1      0      0      0]
0845  * [ 0      1      0      0]
0846  * [ 0      0      1      0]
0847  *
0848  * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
0849  */
0850 static const u16 vc5_hdmi_csc_full_rgb_unity[3][4] = {
0851     { 0x2000, 0x0000, 0x0000, 0x0000 },
0852     { 0x0000, 0x2000, 0x0000, 0x0000 },
0853     { 0x0000, 0x0000, 0x2000, 0x0000 },
0854 };
0855 
0856 /*
0857  * CEA VICs other than #1 require limited range RGB output unless
0858  * overridden by an AVI infoframe. Apply a colorspace conversion to
0859  * squash 0-255 down to 16-235. The matrix here is:
0860  *
0861  * [ 0.8594 0      0      16]
0862  * [ 0      0.8594 0      16]
0863  * [ 0      0      0.8594 16]
0864  *
0865  * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
0866  */
0867 static const u16 vc5_hdmi_csc_full_rgb_to_limited_rgb[3][4] = {
0868     { 0x1b80, 0x0000, 0x0000, 0x0400 },
0869     { 0x0000, 0x1b80, 0x0000, 0x0400 },
0870     { 0x0000, 0x0000, 0x1b80, 0x0400 },
0871 };
0872 
0873 /*
0874  * Conversion between Full Range RGB and Full Range YUV422 using the
0875  * BT.709 Colorspace
0876  *
0877  *
0878  * [  0.181906  0.611804  0.061758  16  ]
0879  * [ -0.100268 -0.337232  0.437500  128 ]
0880  * [  0.437500 -0.397386 -0.040114  128 ]
0881  *
0882  * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
0883  */
0884 static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709[3][4] = {
0885     { 0x05d2, 0x1394, 0x01fa, 0x0400 },
0886     { 0xfccc, 0xf536, 0x0e00, 0x2000 },
0887     { 0x0e00, 0xf34a, 0xfeb8, 0x2000 },
0888 };
0889 
0890 /*
0891  * Conversion between Full Range RGB and Full Range YUV444 using the
0892  * BT.709 Colorspace
0893  *
0894  * [ -0.100268 -0.337232  0.437500  128 ]
0895  * [  0.437500 -0.397386 -0.040114  128 ]
0896  * [  0.181906  0.611804  0.061758  16  ]
0897  *
0898  * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
0899  */
0900 static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709[3][4] = {
0901     { 0xfccc, 0xf536, 0x0e00, 0x2000 },
0902     { 0x0e00, 0xf34a, 0xfeb8, 0x2000 },
0903     { 0x05d2, 0x1394, 0x01fa, 0x0400 },
0904 };
0905 
0906 static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi,
0907                     const u16 coeffs[3][4])
0908 {
0909     lockdep_assert_held(&vc4_hdmi->hw_lock);
0910 
0911     HDMI_WRITE(HDMI_CSC_12_11, (coeffs[0][1] << 16) | coeffs[0][0]);
0912     HDMI_WRITE(HDMI_CSC_14_13, (coeffs[0][3] << 16) | coeffs[0][2]);
0913     HDMI_WRITE(HDMI_CSC_22_21, (coeffs[1][1] << 16) | coeffs[1][0]);
0914     HDMI_WRITE(HDMI_CSC_24_23, (coeffs[1][3] << 16) | coeffs[1][2]);
0915     HDMI_WRITE(HDMI_CSC_32_31, (coeffs[2][1] << 16) | coeffs[2][0]);
0916     HDMI_WRITE(HDMI_CSC_34_33, (coeffs[2][3] << 16) | coeffs[2][2]);
0917 }
0918 
0919 static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
0920                    struct drm_connector_state *state,
0921                    const struct drm_display_mode *mode)
0922 {
0923     struct vc4_hdmi_connector_state *vc4_state =
0924         conn_state_to_vc4_hdmi_conn_state(state);
0925     unsigned long flags;
0926     u32 if_cfg = 0;
0927     u32 if_xbar = 0x543210;
0928     u32 csc_chan_ctl = 0;
0929     u32 csc_ctl = VC5_MT_CP_CSC_CTL_ENABLE | VC4_SET_FIELD(VC4_HD_CSC_CTL_MODE_CUSTOM,
0930                                    VC5_MT_CP_CSC_CTL_MODE);
0931 
0932     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
0933 
0934     switch (vc4_state->output_format) {
0935     case VC4_HDMI_OUTPUT_YUV444:
0936         vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709);
0937         break;
0938 
0939     case VC4_HDMI_OUTPUT_YUV422:
0940         csc_ctl |= VC4_SET_FIELD(VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422_STANDARD,
0941                      VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422) |
0942             VC5_MT_CP_CSC_CTL_USE_444_TO_422 |
0943             VC5_MT_CP_CSC_CTL_USE_RNG_SUPPRESSION;
0944 
0945         csc_chan_ctl |= VC4_SET_FIELD(VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP_LEGACY_STYLE,
0946                           VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP);
0947 
0948         if_cfg |= VC4_SET_FIELD(VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY,
0949                     VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422);
0950 
0951         vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709);
0952         break;
0953 
0954     case VC4_HDMI_OUTPUT_RGB:
0955         if_xbar = 0x354021;
0956 
0957         if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode))
0958             vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb);
0959         else
0960             vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity);
0961         break;
0962 
0963     default:
0964         break;
0965     }
0966 
0967     HDMI_WRITE(HDMI_VEC_INTERFACE_CFG, if_cfg);
0968     HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, if_xbar);
0969     HDMI_WRITE(HDMI_CSC_CHANNEL_CTL, csc_chan_ctl);
0970     HDMI_WRITE(HDMI_CSC_CTL, csc_ctl);
0971 
0972     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
0973 }
0974 
0975 static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
0976                  struct drm_connector_state *state,
0977                  struct drm_display_mode *mode)
0978 {
0979     bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
0980     bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
0981     bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
0982     u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1;
0983     u32 verta = (VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
0984                    VC4_HDMI_VERTA_VSP) |
0985              VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay,
0986                    VC4_HDMI_VERTA_VFP) |
0987              VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL));
0988     u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
0989              VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
0990                    interlaced,
0991                    VC4_HDMI_VERTB_VBP));
0992     u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
0993               VC4_SET_FIELD(mode->crtc_vtotal -
0994                     mode->crtc_vsync_end,
0995                     VC4_HDMI_VERTB_VBP));
0996     unsigned long flags;
0997     u32 reg;
0998 
0999     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1000 
1001     HDMI_WRITE(HDMI_HORZA,
1002            (vsync_pos ? VC4_HDMI_HORZA_VPOS : 0) |
1003            (hsync_pos ? VC4_HDMI_HORZA_HPOS : 0) |
1004            VC4_SET_FIELD(mode->hdisplay * pixel_rep,
1005                  VC4_HDMI_HORZA_HAP));
1006 
1007     HDMI_WRITE(HDMI_HORZB,
1008            VC4_SET_FIELD((mode->htotal -
1009                   mode->hsync_end) * pixel_rep,
1010                  VC4_HDMI_HORZB_HBP) |
1011            VC4_SET_FIELD((mode->hsync_end -
1012                   mode->hsync_start) * pixel_rep,
1013                  VC4_HDMI_HORZB_HSP) |
1014            VC4_SET_FIELD((mode->hsync_start -
1015                   mode->hdisplay) * pixel_rep,
1016                  VC4_HDMI_HORZB_HFP));
1017 
1018     HDMI_WRITE(HDMI_VERTA0, verta);
1019     HDMI_WRITE(HDMI_VERTA1, verta);
1020 
1021     HDMI_WRITE(HDMI_VERTB0, vertb_even);
1022     HDMI_WRITE(HDMI_VERTB1, vertb);
1023 
1024     reg = HDMI_READ(HDMI_MISC_CONTROL);
1025     reg &= ~VC4_HDMI_MISC_CONTROL_PIXEL_REP_MASK;
1026     reg |= VC4_SET_FIELD(pixel_rep - 1, VC4_HDMI_MISC_CONTROL_PIXEL_REP);
1027     HDMI_WRITE(HDMI_MISC_CONTROL, reg);
1028 
1029     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1030 }
1031 
1032 static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
1033                  struct drm_connector_state *state,
1034                  struct drm_display_mode *mode)
1035 {
1036     const struct vc4_hdmi_connector_state *vc4_state =
1037         conn_state_to_vc4_hdmi_conn_state(state);
1038     bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
1039     bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
1040     bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
1041     u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1;
1042     u32 verta = (VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
1043                    VC5_HDMI_VERTA_VSP) |
1044              VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay,
1045                    VC5_HDMI_VERTA_VFP) |
1046              VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL));
1047     u32 vertb = (VC4_SET_FIELD(mode->htotal >> (2 - pixel_rep),
1048                    VC5_HDMI_VERTB_VSPO) |
1049              VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
1050                    VC4_HDMI_VERTB_VBP));
1051     u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
1052               VC4_SET_FIELD(mode->crtc_vtotal -
1053                     mode->crtc_vsync_end - interlaced,
1054                     VC4_HDMI_VERTB_VBP));
1055     unsigned long flags;
1056     unsigned char gcp;
1057     bool gcp_en;
1058     u32 reg;
1059 
1060     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1061 
1062     HDMI_WRITE(HDMI_HORZA,
1063            (vsync_pos ? VC5_HDMI_HORZA_VPOS : 0) |
1064            (hsync_pos ? VC5_HDMI_HORZA_HPOS : 0) |
1065            VC4_SET_FIELD(mode->hdisplay * pixel_rep,
1066                  VC5_HDMI_HORZA_HAP) |
1067            VC4_SET_FIELD((mode->hsync_start -
1068                   mode->hdisplay) * pixel_rep,
1069                  VC5_HDMI_HORZA_HFP));
1070 
1071     HDMI_WRITE(HDMI_HORZB,
1072            VC4_SET_FIELD((mode->htotal -
1073                   mode->hsync_end) * pixel_rep,
1074                  VC5_HDMI_HORZB_HBP) |
1075            VC4_SET_FIELD((mode->hsync_end -
1076                   mode->hsync_start) * pixel_rep,
1077                  VC5_HDMI_HORZB_HSP));
1078 
1079     HDMI_WRITE(HDMI_VERTA0, verta);
1080     HDMI_WRITE(HDMI_VERTA1, verta);
1081 
1082     HDMI_WRITE(HDMI_VERTB0, vertb_even);
1083     HDMI_WRITE(HDMI_VERTB1, vertb);
1084 
1085     switch (vc4_state->output_bpc) {
1086     case 12:
1087         gcp = 6;
1088         gcp_en = true;
1089         break;
1090     case 10:
1091         gcp = 5;
1092         gcp_en = true;
1093         break;
1094     case 8:
1095     default:
1096         gcp = 4;
1097         gcp_en = false;
1098         break;
1099     }
1100 
1101     /*
1102      * YCC422 is always 36-bit and not considered deep colour so
1103      * doesn't signal in GCP.
1104      */
1105     if (vc4_state->output_format == VC4_HDMI_OUTPUT_YUV422) {
1106         gcp = 4;
1107         gcp_en = false;
1108     }
1109 
1110     reg = HDMI_READ(HDMI_DEEP_COLOR_CONFIG_1);
1111     reg &= ~(VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK |
1112          VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK);
1113     reg |= VC4_SET_FIELD(2, VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE) |
1114            VC4_SET_FIELD(gcp, VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH);
1115     HDMI_WRITE(HDMI_DEEP_COLOR_CONFIG_1, reg);
1116 
1117     reg = HDMI_READ(HDMI_GCP_WORD_1);
1118     reg &= ~VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_MASK;
1119     reg |= VC4_SET_FIELD(gcp, VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1);
1120     HDMI_WRITE(HDMI_GCP_WORD_1, reg);
1121 
1122     reg = HDMI_READ(HDMI_GCP_CONFIG);
1123     reg &= ~VC5_HDMI_GCP_CONFIG_GCP_ENABLE;
1124     reg |= gcp_en ? VC5_HDMI_GCP_CONFIG_GCP_ENABLE : 0;
1125     HDMI_WRITE(HDMI_GCP_CONFIG, reg);
1126 
1127     reg = HDMI_READ(HDMI_MISC_CONTROL);
1128     reg &= ~VC5_HDMI_MISC_CONTROL_PIXEL_REP_MASK;
1129     reg |= VC4_SET_FIELD(pixel_rep - 1, VC5_HDMI_MISC_CONTROL_PIXEL_REP);
1130     HDMI_WRITE(HDMI_MISC_CONTROL, reg);
1131 
1132     HDMI_WRITE(HDMI_CLOCK_STOP, 0);
1133 
1134     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1135 }
1136 
1137 static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi)
1138 {
1139     unsigned long flags;
1140     u32 drift;
1141     int ret;
1142 
1143     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1144 
1145     drift = HDMI_READ(HDMI_FIFO_CTL);
1146     drift &= VC4_HDMI_FIFO_VALID_WRITE_MASK;
1147 
1148     HDMI_WRITE(HDMI_FIFO_CTL,
1149            drift & ~VC4_HDMI_FIFO_CTL_RECENTER);
1150     HDMI_WRITE(HDMI_FIFO_CTL,
1151            drift | VC4_HDMI_FIFO_CTL_RECENTER);
1152 
1153     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1154 
1155     usleep_range(1000, 1100);
1156 
1157     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1158 
1159     HDMI_WRITE(HDMI_FIFO_CTL,
1160            drift & ~VC4_HDMI_FIFO_CTL_RECENTER);
1161     HDMI_WRITE(HDMI_FIFO_CTL,
1162            drift | VC4_HDMI_FIFO_CTL_RECENTER);
1163 
1164     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1165 
1166     ret = wait_for(HDMI_READ(HDMI_FIFO_CTL) &
1167                VC4_HDMI_FIFO_CTL_RECENTER_DONE, 1);
1168     WARN_ONCE(ret, "Timeout waiting for "
1169           "VC4_HDMI_FIFO_CTL_RECENTER_DONE");
1170 }
1171 
1172 static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder,
1173                         struct drm_atomic_state *state)
1174 {
1175     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1176     struct drm_connector *connector = &vc4_hdmi->connector;
1177     struct drm_connector_state *conn_state =
1178         drm_atomic_get_new_connector_state(state, connector);
1179     struct vc4_hdmi_connector_state *vc4_conn_state =
1180         conn_state_to_vc4_hdmi_conn_state(conn_state);
1181     struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
1182     unsigned long tmds_char_rate = vc4_conn_state->tmds_char_rate;
1183     unsigned long bvb_rate, hsm_rate;
1184     unsigned long flags;
1185     int ret;
1186 
1187     mutex_lock(&vc4_hdmi->mutex);
1188 
1189     /*
1190      * As stated in RPi's vc4 firmware "HDMI state machine (HSM) clock must
1191      * be faster than pixel clock, infinitesimally faster, tested in
1192      * simulation. Otherwise, exact value is unimportant for HDMI
1193      * operation." This conflicts with bcm2835's vc4 documentation, which
1194      * states HSM's clock has to be at least 108% of the pixel clock.
1195      *
1196      * Real life tests reveal that vc4's firmware statement holds up, and
1197      * users are able to use pixel clocks closer to HSM's, namely for
1198      * 1920x1200@60Hz. So it was decided to have leave a 1% margin between
1199      * both clocks. Which, for RPi0-3 implies a maximum pixel clock of
1200      * 162MHz.
1201      *
1202      * Additionally, the AXI clock needs to be at least 25% of
1203      * pixel clock, but HSM ends up being the limiting factor.
1204      */
1205     hsm_rate = max_t(unsigned long, 120000000, (tmds_char_rate / 100) * 101);
1206     ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate);
1207     if (ret) {
1208         DRM_ERROR("Failed to set HSM clock rate: %d\n", ret);
1209         goto out;
1210     }
1211 
1212     ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev);
1213     if (ret < 0) {
1214         DRM_ERROR("Failed to retain power domain: %d\n", ret);
1215         goto out;
1216     }
1217 
1218     ret = clk_set_rate(vc4_hdmi->pixel_clock, tmds_char_rate);
1219     if (ret) {
1220         DRM_ERROR("Failed to set pixel clock rate: %d\n", ret);
1221         goto err_put_runtime_pm;
1222     }
1223 
1224     ret = clk_prepare_enable(vc4_hdmi->pixel_clock);
1225     if (ret) {
1226         DRM_ERROR("Failed to turn on pixel clock: %d\n", ret);
1227         goto err_put_runtime_pm;
1228     }
1229 
1230 
1231     vc4_hdmi_cec_update_clk_div(vc4_hdmi);
1232 
1233     if (tmds_char_rate > 297000000)
1234         bvb_rate = 300000000;
1235     else if (tmds_char_rate > 148500000)
1236         bvb_rate = 150000000;
1237     else
1238         bvb_rate = 75000000;
1239 
1240     ret = clk_set_min_rate(vc4_hdmi->pixel_bvb_clock, bvb_rate);
1241     if (ret) {
1242         DRM_ERROR("Failed to set pixel bvb clock rate: %d\n", ret);
1243         goto err_disable_pixel_clock;
1244     }
1245 
1246     ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
1247     if (ret) {
1248         DRM_ERROR("Failed to turn on pixel bvb clock: %d\n", ret);
1249         goto err_disable_pixel_clock;
1250     }
1251 
1252     if (vc4_hdmi->variant->phy_init)
1253         vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state);
1254 
1255     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1256 
1257     HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
1258            HDMI_READ(HDMI_SCHEDULER_CONTROL) |
1259            VC4_HDMI_SCHEDULER_CONTROL_MANUAL_FORMAT |
1260            VC4_HDMI_SCHEDULER_CONTROL_IGNORE_VSYNC_PREDICTS);
1261 
1262     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1263 
1264     if (vc4_hdmi->variant->set_timings)
1265         vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode);
1266 
1267     mutex_unlock(&vc4_hdmi->mutex);
1268 
1269     return;
1270 
1271 err_disable_pixel_clock:
1272     clk_disable_unprepare(vc4_hdmi->pixel_clock);
1273 err_put_runtime_pm:
1274     pm_runtime_put(&vc4_hdmi->pdev->dev);
1275 out:
1276     mutex_unlock(&vc4_hdmi->mutex);
1277     return;
1278 }
1279 
1280 static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
1281                          struct drm_atomic_state *state)
1282 {
1283     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1284     struct drm_connector *connector = &vc4_hdmi->connector;
1285     struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
1286     struct drm_connector_state *conn_state =
1287         drm_atomic_get_new_connector_state(state, connector);
1288     unsigned long flags;
1289 
1290     mutex_lock(&vc4_hdmi->mutex);
1291 
1292     if (vc4_hdmi->variant->csc_setup)
1293         vc4_hdmi->variant->csc_setup(vc4_hdmi, conn_state, mode);
1294 
1295     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1296     HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N);
1297     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1298 
1299     mutex_unlock(&vc4_hdmi->mutex);
1300 }
1301 
1302 static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
1303                           struct drm_atomic_state *state)
1304 {
1305     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1306     struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
1307     struct drm_display_info *display = &vc4_hdmi->connector.display_info;
1308     bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
1309     bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
1310     unsigned long flags;
1311     int ret;
1312 
1313     mutex_lock(&vc4_hdmi->mutex);
1314 
1315     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1316 
1317     HDMI_WRITE(HDMI_VID_CTL,
1318            VC4_HD_VID_CTL_ENABLE |
1319            VC4_HD_VID_CTL_CLRRGB |
1320            VC4_HD_VID_CTL_UNDERFLOW_ENABLE |
1321            VC4_HD_VID_CTL_FRAME_COUNTER_RESET |
1322            (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW) |
1323            (hsync_pos ? 0 : VC4_HD_VID_CTL_HSYNC_LOW));
1324 
1325     HDMI_WRITE(HDMI_VID_CTL,
1326            HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_BLANKPIX);
1327 
1328     if (display->is_hdmi) {
1329         HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
1330                HDMI_READ(HDMI_SCHEDULER_CONTROL) |
1331                VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
1332 
1333         spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1334 
1335         ret = wait_for(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
1336                    VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE, 1000);
1337         WARN_ONCE(ret, "Timeout waiting for "
1338               "VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
1339     } else {
1340         HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
1341                HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
1342                ~(VC4_HDMI_RAM_PACKET_ENABLE));
1343         HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
1344                HDMI_READ(HDMI_SCHEDULER_CONTROL) &
1345                ~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
1346 
1347         spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1348 
1349         ret = wait_for(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
1350                  VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE), 1000);
1351         WARN_ONCE(ret, "Timeout waiting for "
1352               "!VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
1353     }
1354 
1355     if (display->is_hdmi) {
1356         spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1357 
1358         WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
1359               VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE));
1360 
1361         HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
1362                VC4_HDMI_RAM_PACKET_ENABLE);
1363 
1364         spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1365         vc4_hdmi->packet_ram_enabled = true;
1366 
1367         vc4_hdmi_set_infoframes(encoder);
1368     }
1369 
1370     vc4_hdmi_recenter_fifo(vc4_hdmi);
1371     vc4_hdmi_enable_scrambling(encoder);
1372 
1373     mutex_unlock(&vc4_hdmi->mutex);
1374 }
1375 
1376 static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
1377                          struct drm_crtc_state *crtc_state,
1378                          struct drm_connector_state *conn_state)
1379 {
1380     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1381     struct vc4_hdmi_connector_state *vc4_state =
1382         conn_state_to_vc4_hdmi_conn_state(conn_state);
1383 
1384     mutex_lock(&vc4_hdmi->mutex);
1385     drm_mode_copy(&vc4_hdmi->saved_adjusted_mode,
1386               &crtc_state->adjusted_mode);
1387     vc4_hdmi->output_bpc = vc4_state->output_bpc;
1388     vc4_hdmi->output_format = vc4_state->output_format;
1389     mutex_unlock(&vc4_hdmi->mutex);
1390 }
1391 
1392 static bool
1393 vc4_hdmi_sink_supports_format_bpc(const struct vc4_hdmi *vc4_hdmi,
1394                   const struct drm_display_info *info,
1395                   const struct drm_display_mode *mode,
1396                   unsigned int format, unsigned int bpc)
1397 {
1398     struct drm_device *dev = vc4_hdmi->connector.dev;
1399     u8 vic = drm_match_cea_mode(mode);
1400 
1401     if (vic == 1 && bpc != 8) {
1402         drm_dbg(dev, "VIC1 requires a bpc of 8, got %u\n", bpc);
1403         return false;
1404     }
1405 
1406     if (!info->is_hdmi &&
1407         (format != VC4_HDMI_OUTPUT_RGB || bpc != 8)) {
1408         drm_dbg(dev, "DVI Monitors require an RGB output at 8 bpc\n");
1409         return false;
1410     }
1411 
1412     switch (format) {
1413     case VC4_HDMI_OUTPUT_RGB:
1414         drm_dbg(dev, "RGB Format, checking the constraints.\n");
1415 
1416         if (!(info->color_formats & DRM_COLOR_FORMAT_RGB444))
1417             return false;
1418 
1419         if (bpc == 10 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30)) {
1420             drm_dbg(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
1421             return false;
1422         }
1423 
1424         if (bpc == 12 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36)) {
1425             drm_dbg(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
1426             return false;
1427         }
1428 
1429         drm_dbg(dev, "RGB format supported in that configuration.\n");
1430 
1431         return true;
1432 
1433     case VC4_HDMI_OUTPUT_YUV422:
1434         drm_dbg(dev, "YUV422 format, checking the constraints.\n");
1435 
1436         if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {
1437             drm_dbg(dev, "Sink doesn't support YUV422.\n");
1438             return false;
1439         }
1440 
1441         if (bpc != 12) {
1442             drm_dbg(dev, "YUV422 only supports 12 bpc.\n");
1443             return false;
1444         }
1445 
1446         drm_dbg(dev, "YUV422 format supported in that configuration.\n");
1447 
1448         return true;
1449 
1450     case VC4_HDMI_OUTPUT_YUV444:
1451         drm_dbg(dev, "YUV444 format, checking the constraints.\n");
1452 
1453         if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR444)) {
1454             drm_dbg(dev, "Sink doesn't support YUV444.\n");
1455             return false;
1456         }
1457 
1458         if (bpc == 10 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_30)) {
1459             drm_dbg(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
1460             return false;
1461         }
1462 
1463         if (bpc == 12 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_36)) {
1464             drm_dbg(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
1465             return false;
1466         }
1467 
1468         drm_dbg(dev, "YUV444 format supported in that configuration.\n");
1469 
1470         return true;
1471     }
1472 
1473     return false;
1474 }
1475 
1476 static enum drm_mode_status
1477 vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
1478                  unsigned long long clock)
1479 {
1480     const struct drm_connector *connector = &vc4_hdmi->connector;
1481     const struct drm_display_info *info = &connector->display_info;
1482 
1483     if (clock > vc4_hdmi->variant->max_pixel_clock)
1484         return MODE_CLOCK_HIGH;
1485 
1486     if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK)
1487         return MODE_CLOCK_HIGH;
1488 
1489     if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000))
1490         return MODE_CLOCK_HIGH;
1491 
1492     return MODE_OK;
1493 }
1494 
1495 static unsigned long long
1496 vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
1497                     unsigned int bpc,
1498                     enum vc4_hdmi_output_format fmt)
1499 {
1500     unsigned long long clock = mode->clock * 1000ULL;
1501 
1502     if (mode->flags & DRM_MODE_FLAG_DBLCLK)
1503         clock = clock * 2;
1504 
1505     if (fmt == VC4_HDMI_OUTPUT_YUV422)
1506         bpc = 8;
1507 
1508     clock = clock * bpc;
1509     do_div(clock, 8);
1510 
1511     return clock;
1512 }
1513 
1514 static int
1515 vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi,
1516                    struct vc4_hdmi_connector_state *vc4_state,
1517                    const struct drm_display_mode *mode,
1518                    unsigned int bpc, unsigned int fmt)
1519 {
1520     unsigned long long clock;
1521 
1522     clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt);
1523     if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK)
1524         return -EINVAL;
1525 
1526     vc4_state->tmds_char_rate = clock;
1527 
1528     return 0;
1529 }
1530 
1531 static int
1532 vc4_hdmi_encoder_compute_format(const struct vc4_hdmi *vc4_hdmi,
1533                 struct vc4_hdmi_connector_state *vc4_state,
1534                 const struct drm_display_mode *mode,
1535                 unsigned int bpc)
1536 {
1537     struct drm_device *dev = vc4_hdmi->connector.dev;
1538     const struct drm_connector *connector = &vc4_hdmi->connector;
1539     const struct drm_display_info *info = &connector->display_info;
1540     unsigned int format;
1541 
1542     drm_dbg(dev, "Trying with an RGB output\n");
1543 
1544     format = VC4_HDMI_OUTPUT_RGB;
1545     if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) {
1546         int ret;
1547 
1548         ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state,
1549                              mode, bpc, format);
1550         if (!ret) {
1551             vc4_state->output_format = format;
1552             return 0;
1553         }
1554     }
1555 
1556     drm_dbg(dev, "Failed, Trying with an YUV422 output\n");
1557 
1558     format = VC4_HDMI_OUTPUT_YUV422;
1559     if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) {
1560         int ret;
1561 
1562         ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state,
1563                              mode, bpc, format);
1564         if (!ret) {
1565             vc4_state->output_format = format;
1566             return 0;
1567         }
1568     }
1569 
1570     drm_dbg(dev, "Failed. No Format Supported for that bpc count.\n");
1571 
1572     return -EINVAL;
1573 }
1574 
1575 static int
1576 vc4_hdmi_encoder_compute_config(const struct vc4_hdmi *vc4_hdmi,
1577                 struct vc4_hdmi_connector_state *vc4_state,
1578                 const struct drm_display_mode *mode)
1579 {
1580     struct drm_device *dev = vc4_hdmi->connector.dev;
1581     struct drm_connector_state *conn_state = &vc4_state->base;
1582     unsigned int max_bpc = clamp_t(unsigned int, conn_state->max_bpc, 8, 12);
1583     unsigned int bpc;
1584     int ret;
1585 
1586     for (bpc = max_bpc; bpc >= 8; bpc -= 2) {
1587         drm_dbg(dev, "Trying with a %d bpc output\n", bpc);
1588 
1589         ret = vc4_hdmi_encoder_compute_format(vc4_hdmi, vc4_state,
1590                               mode, bpc);
1591         if (ret)
1592             continue;
1593 
1594         vc4_state->output_bpc = bpc;
1595 
1596         drm_dbg(dev,
1597             "Mode %ux%u @ %uHz: Found configuration: bpc: %u, fmt: %s, clock: %llu\n",
1598             mode->hdisplay, mode->vdisplay, drm_mode_vrefresh(mode),
1599             vc4_state->output_bpc,
1600             vc4_hdmi_output_fmt_str(vc4_state->output_format),
1601             vc4_state->tmds_char_rate);
1602 
1603         break;
1604     }
1605 
1606     return ret;
1607 }
1608 
1609 #define WIFI_2_4GHz_CH1_MIN_FREQ    2400000000ULL
1610 #define WIFI_2_4GHz_CH1_MAX_FREQ    2422000000ULL
1611 
1612 static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
1613                      struct drm_crtc_state *crtc_state,
1614                      struct drm_connector_state *conn_state)
1615 {
1616     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1617     struct drm_connector *connector = &vc4_hdmi->connector;
1618     struct drm_connector_state *old_conn_state =
1619         drm_atomic_get_old_connector_state(conn_state->state, connector);
1620     struct vc4_hdmi_connector_state *old_vc4_state =
1621         conn_state_to_vc4_hdmi_conn_state(old_conn_state);
1622     struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
1623     struct drm_display_mode *mode = &crtc_state->adjusted_mode;
1624     unsigned long long tmds_char_rate = mode->clock * 1000;
1625     unsigned long long tmds_bit_rate;
1626     int ret;
1627 
1628     if (vc4_hdmi->variant->unsupported_odd_h_timings) {
1629         if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
1630             /* Only try to fixup DBLCLK modes to get 480i and 576i
1631              * working.
1632              * A generic solution for all modes with odd horizontal
1633              * timing values seems impossible based on trying to
1634              * solve it for 1366x768 monitors.
1635              */
1636             if ((mode->hsync_start - mode->hdisplay) & 1)
1637                 mode->hsync_start--;
1638             if ((mode->hsync_end - mode->hsync_start) & 1)
1639                 mode->hsync_end--;
1640         }
1641 
1642         /* Now check whether we still have odd values remaining */
1643         if ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
1644             (mode->hsync_end % 2) || (mode->htotal % 2))
1645             return -EINVAL;
1646     }
1647 
1648     /*
1649      * The 1440p@60 pixel rate is in the same range than the first
1650      * WiFi channel (between 2.4GHz and 2.422GHz with 22MHz
1651      * bandwidth). Slightly lower the frequency to bring it out of
1652      * the WiFi range.
1653      */
1654     tmds_bit_rate = tmds_char_rate * 10;
1655     if (vc4_hdmi->disable_wifi_frequencies &&
1656         (tmds_bit_rate >= WIFI_2_4GHz_CH1_MIN_FREQ &&
1657          tmds_bit_rate <= WIFI_2_4GHz_CH1_MAX_FREQ)) {
1658         mode->clock = 238560;
1659         tmds_char_rate = mode->clock * 1000;
1660     }
1661 
1662     ret = vc4_hdmi_encoder_compute_config(vc4_hdmi, vc4_state, mode);
1663     if (ret)
1664         return ret;
1665 
1666     /* vc4_hdmi_encoder_compute_config may have changed output_bpc and/or output_format */
1667     if (vc4_state->output_bpc != old_vc4_state->output_bpc ||
1668         vc4_state->output_format != old_vc4_state->output_format)
1669         crtc_state->mode_changed = true;
1670 
1671     return 0;
1672 }
1673 
1674 static enum drm_mode_status
1675 vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
1676                 const struct drm_display_mode *mode)
1677 {
1678     struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1679 
1680     if (vc4_hdmi->variant->unsupported_odd_h_timings &&
1681         !(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
1682         ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
1683          (mode->hsync_end % 2) || (mode->htotal % 2)))
1684         return MODE_H_ILLEGAL;
1685 
1686     return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode->clock * 1000);
1687 }
1688 
1689 static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
1690     .atomic_check = vc4_hdmi_encoder_atomic_check,
1691     .atomic_mode_set = vc4_hdmi_encoder_atomic_mode_set,
1692     .mode_valid = vc4_hdmi_encoder_mode_valid,
1693 };
1694 
1695 static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
1696 {
1697     int i;
1698     u32 channel_map = 0;
1699 
1700     for (i = 0; i < 8; i++) {
1701         if (channel_mask & BIT(i))
1702             channel_map |= i << (3 * i);
1703     }
1704     return channel_map;
1705 }
1706 
1707 static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
1708 {
1709     int i;
1710     u32 channel_map = 0;
1711 
1712     for (i = 0; i < 8; i++) {
1713         if (channel_mask & BIT(i))
1714             channel_map |= i << (4 * i);
1715     }
1716     return channel_map;
1717 }
1718 
1719 static bool vc5_hdmi_hp_detect(struct vc4_hdmi *vc4_hdmi)
1720 {
1721     unsigned long flags;
1722     u32 hotplug;
1723 
1724     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1725     hotplug = HDMI_READ(HDMI_HOTPLUG);
1726     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1727 
1728     return !!(hotplug & VC4_HDMI_HOTPLUG_CONNECTED);
1729 }
1730 
1731 /* HDMI audio codec callbacks */
1732 static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi,
1733                      unsigned int samplerate)
1734 {
1735     u32 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock);
1736     unsigned long flags;
1737     unsigned long n, m;
1738 
1739     rational_best_approximation(hsm_clock, samplerate,
1740                     VC4_HD_MAI_SMP_N_MASK >>
1741                     VC4_HD_MAI_SMP_N_SHIFT,
1742                     (VC4_HD_MAI_SMP_M_MASK >>
1743                      VC4_HD_MAI_SMP_M_SHIFT) + 1,
1744                     &n, &m);
1745 
1746     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1747     HDMI_WRITE(HDMI_MAI_SMP,
1748            VC4_SET_FIELD(n, VC4_HD_MAI_SMP_N) |
1749            VC4_SET_FIELD(m - 1, VC4_HD_MAI_SMP_M));
1750     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1751 }
1752 
1753 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate)
1754 {
1755     const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
1756     u32 n, cts;
1757     u64 tmp;
1758 
1759     lockdep_assert_held(&vc4_hdmi->mutex);
1760     lockdep_assert_held(&vc4_hdmi->hw_lock);
1761 
1762     n = 128 * samplerate / 1000;
1763     tmp = (u64)(mode->clock * 1000) * n;
1764     do_div(tmp, 128 * samplerate);
1765     cts = tmp;
1766 
1767     HDMI_WRITE(HDMI_CRP_CFG,
1768            VC4_HDMI_CRP_CFG_EXTERNAL_CTS_EN |
1769            VC4_SET_FIELD(n, VC4_HDMI_CRP_CFG_N));
1770 
1771     /*
1772      * We could get slightly more accurate clocks in some cases by
1773      * providing a CTS_1 value.  The two CTS values are alternated
1774      * between based on the period fields
1775      */
1776     HDMI_WRITE(HDMI_CTS_0, cts);
1777     HDMI_WRITE(HDMI_CTS_1, cts);
1778 }
1779 
1780 static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai)
1781 {
1782     struct snd_soc_card *card = snd_soc_dai_get_drvdata(dai);
1783 
1784     return snd_soc_card_get_drvdata(card);
1785 }
1786 
1787 static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi)
1788 {
1789     struct drm_display_info *display = &vc4_hdmi->connector.display_info;
1790 
1791     lockdep_assert_held(&vc4_hdmi->mutex);
1792 
1793     /*
1794      * If the encoder is currently in DVI mode, treat the codec DAI
1795      * as missing.
1796      */
1797     if (!display->is_hdmi)
1798         return false;
1799 
1800     return true;
1801 }
1802 
1803 static int vc4_hdmi_audio_startup(struct device *dev, void *data)
1804 {
1805     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
1806     unsigned long flags;
1807 
1808     mutex_lock(&vc4_hdmi->mutex);
1809 
1810     if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) {
1811         mutex_unlock(&vc4_hdmi->mutex);
1812         return -ENODEV;
1813     }
1814 
1815     vc4_hdmi->audio.streaming = true;
1816 
1817     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1818     HDMI_WRITE(HDMI_MAI_CTL,
1819            VC4_HD_MAI_CTL_RESET |
1820            VC4_HD_MAI_CTL_FLUSH |
1821            VC4_HD_MAI_CTL_DLATE |
1822            VC4_HD_MAI_CTL_ERRORE |
1823            VC4_HD_MAI_CTL_ERRORF);
1824     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1825 
1826     if (vc4_hdmi->variant->phy_rng_enable)
1827         vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
1828 
1829     mutex_unlock(&vc4_hdmi->mutex);
1830 
1831     return 0;
1832 }
1833 
1834 static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi)
1835 {
1836     struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
1837     struct device *dev = &vc4_hdmi->pdev->dev;
1838     unsigned long flags;
1839     int ret;
1840 
1841     lockdep_assert_held(&vc4_hdmi->mutex);
1842 
1843     vc4_hdmi->audio.streaming = false;
1844     ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO, false);
1845     if (ret)
1846         dev_err(dev, "Failed to stop audio infoframe: %d\n", ret);
1847 
1848     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1849 
1850     HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_RESET);
1851     HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_ERRORF);
1852     HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_FLUSH);
1853 
1854     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1855 }
1856 
1857 static void vc4_hdmi_audio_shutdown(struct device *dev, void *data)
1858 {
1859     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
1860     unsigned long flags;
1861 
1862     mutex_lock(&vc4_hdmi->mutex);
1863 
1864     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1865 
1866     HDMI_WRITE(HDMI_MAI_CTL,
1867            VC4_HD_MAI_CTL_DLATE |
1868            VC4_HD_MAI_CTL_ERRORE |
1869            VC4_HD_MAI_CTL_ERRORF);
1870 
1871     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1872 
1873     if (vc4_hdmi->variant->phy_rng_disable)
1874         vc4_hdmi->variant->phy_rng_disable(vc4_hdmi);
1875 
1876     vc4_hdmi->audio.streaming = false;
1877     vc4_hdmi_audio_reset(vc4_hdmi);
1878 
1879     mutex_unlock(&vc4_hdmi->mutex);
1880 }
1881 
1882 static int sample_rate_to_mai_fmt(int samplerate)
1883 {
1884     switch (samplerate) {
1885     case 8000:
1886         return VC4_HDMI_MAI_SAMPLE_RATE_8000;
1887     case 11025:
1888         return VC4_HDMI_MAI_SAMPLE_RATE_11025;
1889     case 12000:
1890         return VC4_HDMI_MAI_SAMPLE_RATE_12000;
1891     case 16000:
1892         return VC4_HDMI_MAI_SAMPLE_RATE_16000;
1893     case 22050:
1894         return VC4_HDMI_MAI_SAMPLE_RATE_22050;
1895     case 24000:
1896         return VC4_HDMI_MAI_SAMPLE_RATE_24000;
1897     case 32000:
1898         return VC4_HDMI_MAI_SAMPLE_RATE_32000;
1899     case 44100:
1900         return VC4_HDMI_MAI_SAMPLE_RATE_44100;
1901     case 48000:
1902         return VC4_HDMI_MAI_SAMPLE_RATE_48000;
1903     case 64000:
1904         return VC4_HDMI_MAI_SAMPLE_RATE_64000;
1905     case 88200:
1906         return VC4_HDMI_MAI_SAMPLE_RATE_88200;
1907     case 96000:
1908         return VC4_HDMI_MAI_SAMPLE_RATE_96000;
1909     case 128000:
1910         return VC4_HDMI_MAI_SAMPLE_RATE_128000;
1911     case 176400:
1912         return VC4_HDMI_MAI_SAMPLE_RATE_176400;
1913     case 192000:
1914         return VC4_HDMI_MAI_SAMPLE_RATE_192000;
1915     default:
1916         return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
1917     }
1918 }
1919 
1920 /* HDMI audio codec callbacks */
1921 static int vc4_hdmi_audio_prepare(struct device *dev, void *data,
1922                   struct hdmi_codec_daifmt *daifmt,
1923                   struct hdmi_codec_params *params)
1924 {
1925     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
1926     struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
1927     unsigned int sample_rate = params->sample_rate;
1928     unsigned int channels = params->channels;
1929     unsigned long flags;
1930     u32 audio_packet_config, channel_mask;
1931     u32 channel_map;
1932     u32 mai_audio_format;
1933     u32 mai_sample_rate;
1934 
1935     dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
1936         sample_rate, params->sample_width, channels);
1937 
1938     mutex_lock(&vc4_hdmi->mutex);
1939 
1940     if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) {
1941         mutex_unlock(&vc4_hdmi->mutex);
1942         return -EINVAL;
1943     }
1944 
1945     vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate);
1946 
1947     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
1948     HDMI_WRITE(HDMI_MAI_CTL,
1949            VC4_SET_FIELD(channels, VC4_HD_MAI_CTL_CHNUM) |
1950            VC4_HD_MAI_CTL_WHOLSMP |
1951            VC4_HD_MAI_CTL_CHALIGN |
1952            VC4_HD_MAI_CTL_ENABLE);
1953 
1954     mai_sample_rate = sample_rate_to_mai_fmt(sample_rate);
1955     if (params->iec.status[0] & IEC958_AES0_NONAUDIO &&
1956         params->channels == 8)
1957         mai_audio_format = VC4_HDMI_MAI_FORMAT_HBR;
1958     else
1959         mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
1960     HDMI_WRITE(HDMI_MAI_FMT,
1961            VC4_SET_FIELD(mai_sample_rate,
1962                  VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
1963            VC4_SET_FIELD(mai_audio_format,
1964                  VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
1965 
1966     /* The B frame identifier should match the value used by alsa-lib (8) */
1967     audio_packet_config =
1968         VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
1969         VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_INACTIVE_CHANNELS |
1970         VC4_SET_FIELD(0x8, VC4_HDMI_AUDIO_PACKET_B_FRAME_IDENTIFIER);
1971 
1972     channel_mask = GENMASK(channels - 1, 0);
1973     audio_packet_config |= VC4_SET_FIELD(channel_mask,
1974                          VC4_HDMI_AUDIO_PACKET_CEA_MASK);
1975 
1976     /* Set the MAI threshold */
1977     HDMI_WRITE(HDMI_MAI_THR,
1978            VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_PANICHIGH) |
1979            VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_PANICLOW) |
1980            VC4_SET_FIELD(0x06, VC4_HD_MAI_THR_DREQHIGH) |
1981            VC4_SET_FIELD(0x08, VC4_HD_MAI_THR_DREQLOW));
1982 
1983     HDMI_WRITE(HDMI_MAI_CONFIG,
1984            VC4_HDMI_MAI_CONFIG_BIT_REVERSE |
1985            VC4_HDMI_MAI_CONFIG_FORMAT_REVERSE |
1986            VC4_SET_FIELD(channel_mask, VC4_HDMI_MAI_CHANNEL_MASK));
1987 
1988     channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask);
1989     HDMI_WRITE(HDMI_MAI_CHANNEL_MAP, channel_map);
1990     HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config);
1991 
1992     vc4_hdmi_set_n_cts(vc4_hdmi, sample_rate);
1993 
1994     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
1995 
1996     memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));
1997     vc4_hdmi_set_audio_infoframe(encoder);
1998 
1999     mutex_unlock(&vc4_hdmi->mutex);
2000 
2001     return 0;
2002 }
2003 
2004 static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = {
2005     .name = "vc4-hdmi-cpu-dai-component",
2006     .legacy_dai_naming = 1,
2007 };
2008 
2009 static int vc4_hdmi_audio_cpu_dai_probe(struct snd_soc_dai *dai)
2010 {
2011     struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
2012 
2013     snd_soc_dai_init_dma_data(dai, &vc4_hdmi->audio.dma_data, NULL);
2014 
2015     return 0;
2016 }
2017 
2018 static struct snd_soc_dai_driver vc4_hdmi_audio_cpu_dai_drv = {
2019     .name = "vc4-hdmi-cpu-dai",
2020     .probe  = vc4_hdmi_audio_cpu_dai_probe,
2021     .playback = {
2022         .stream_name = "Playback",
2023         .channels_min = 1,
2024         .channels_max = 8,
2025         .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
2026              SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
2027              SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
2028              SNDRV_PCM_RATE_192000,
2029         .formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
2030     },
2031 };
2032 
2033 static const struct snd_dmaengine_pcm_config pcm_conf = {
2034     .chan_names[SNDRV_PCM_STREAM_PLAYBACK] = "audio-rx",
2035     .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
2036 };
2037 
2038 static int vc4_hdmi_audio_get_eld(struct device *dev, void *data,
2039                   uint8_t *buf, size_t len)
2040 {
2041     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
2042     struct drm_connector *connector = &vc4_hdmi->connector;
2043 
2044     mutex_lock(&vc4_hdmi->mutex);
2045     memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
2046     mutex_unlock(&vc4_hdmi->mutex);
2047 
2048     return 0;
2049 }
2050 
2051 static const struct hdmi_codec_ops vc4_hdmi_codec_ops = {
2052     .get_eld = vc4_hdmi_audio_get_eld,
2053     .prepare = vc4_hdmi_audio_prepare,
2054     .audio_shutdown = vc4_hdmi_audio_shutdown,
2055     .audio_startup = vc4_hdmi_audio_startup,
2056 };
2057 
2058 static struct hdmi_codec_pdata vc4_hdmi_codec_pdata = {
2059     .ops = &vc4_hdmi_codec_ops,
2060     .max_i2s_channels = 8,
2061     .i2s = 1,
2062 };
2063 
2064 static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
2065 {
2066     const struct vc4_hdmi_register *mai_data =
2067         &vc4_hdmi->variant->registers[HDMI_MAI_DATA];
2068     struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link;
2069     struct snd_soc_card *card = &vc4_hdmi->audio.card;
2070     struct device *dev = &vc4_hdmi->pdev->dev;
2071     struct platform_device *codec_pdev;
2072     const __be32 *addr;
2073     int index, len;
2074     int ret;
2075 
2076     if (!of_find_property(dev->of_node, "dmas", &len) || !len) {
2077         dev_warn(dev,
2078              "'dmas' DT property is missing or empty, no HDMI audio\n");
2079         return 0;
2080     }
2081 
2082     if (mai_data->reg != VC4_HD) {
2083         WARN_ONCE(true, "MAI isn't in the HD block\n");
2084         return -EINVAL;
2085     }
2086 
2087     /*
2088      * Get the physical address of VC4_HD_MAI_DATA. We need to retrieve
2089      * the bus address specified in the DT, because the physical address
2090      * (the one returned by platform_get_resource()) is not appropriate
2091      * for DMA transfers.
2092      * This VC/MMU should probably be exposed to avoid this kind of hacks.
2093      */
2094     index = of_property_match_string(dev->of_node, "reg-names", "hd");
2095     /* Before BCM2711, we don't have a named register range */
2096     if (index < 0)
2097         index = 1;
2098 
2099     addr = of_get_address(dev->of_node, index, NULL, NULL);
2100 
2101     vc4_hdmi->audio.dma_data.addr = be32_to_cpup(addr) + mai_data->offset;
2102     vc4_hdmi->audio.dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2103     vc4_hdmi->audio.dma_data.maxburst = 2;
2104 
2105     ret = devm_snd_dmaengine_pcm_register(dev, &pcm_conf, 0);
2106     if (ret) {
2107         dev_err(dev, "Could not register PCM component: %d\n", ret);
2108         return ret;
2109     }
2110 
2111     ret = devm_snd_soc_register_component(dev, &vc4_hdmi_audio_cpu_dai_comp,
2112                           &vc4_hdmi_audio_cpu_dai_drv, 1);
2113     if (ret) {
2114         dev_err(dev, "Could not register CPU DAI: %d\n", ret);
2115         return ret;
2116     }
2117 
2118     codec_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
2119                            PLATFORM_DEVID_AUTO,
2120                            &vc4_hdmi_codec_pdata,
2121                            sizeof(vc4_hdmi_codec_pdata));
2122     if (IS_ERR(codec_pdev)) {
2123         dev_err(dev, "Couldn't register the HDMI codec: %ld\n", PTR_ERR(codec_pdev));
2124         return PTR_ERR(codec_pdev);
2125     }
2126     vc4_hdmi->audio.codec_pdev = codec_pdev;
2127 
2128     dai_link->cpus      = &vc4_hdmi->audio.cpu;
2129     dai_link->codecs    = &vc4_hdmi->audio.codec;
2130     dai_link->platforms = &vc4_hdmi->audio.platform;
2131 
2132     dai_link->num_cpus  = 1;
2133     dai_link->num_codecs    = 1;
2134     dai_link->num_platforms = 1;
2135 
2136     dai_link->name = "MAI";
2137     dai_link->stream_name = "MAI PCM";
2138     dai_link->codecs->dai_name = "i2s-hifi";
2139     dai_link->cpus->dai_name = dev_name(dev);
2140     dai_link->codecs->name = dev_name(&codec_pdev->dev);
2141     dai_link->platforms->name = dev_name(dev);
2142 
2143     card->dai_link = dai_link;
2144     card->num_links = 1;
2145     card->name = vc4_hdmi->variant->card_name;
2146     card->driver_name = "vc4-hdmi";
2147     card->dev = dev;
2148     card->owner = THIS_MODULE;
2149 
2150     /*
2151      * Be careful, snd_soc_register_card() calls dev_set_drvdata() and
2152      * stores a pointer to the snd card object in dev->driver_data. This
2153      * means we cannot use it for something else. The hdmi back-pointer is
2154      * now stored in card->drvdata and should be retrieved with
2155      * snd_soc_card_get_drvdata() if needed.
2156      */
2157     snd_soc_card_set_drvdata(card, vc4_hdmi);
2158     ret = devm_snd_soc_register_card(dev, card);
2159     if (ret)
2160         dev_err_probe(dev, ret, "Could not register sound card\n");
2161 
2162     return ret;
2163 
2164 }
2165 
2166 static void vc4_hdmi_audio_exit(struct vc4_hdmi *vc4_hdmi)
2167 {
2168     platform_device_unregister(vc4_hdmi->audio.codec_pdev);
2169     vc4_hdmi->audio.codec_pdev = NULL;
2170 }
2171 
2172 static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
2173 {
2174     struct vc4_hdmi *vc4_hdmi = priv;
2175     struct drm_connector *connector = &vc4_hdmi->connector;
2176     struct drm_device *dev = connector->dev;
2177 
2178     if (dev && dev->registered)
2179         drm_connector_helper_hpd_irq_event(connector);
2180 
2181     return IRQ_HANDLED;
2182 }
2183 
2184 static int vc4_hdmi_hotplug_init(struct vc4_hdmi *vc4_hdmi)
2185 {
2186     struct drm_connector *connector = &vc4_hdmi->connector;
2187     struct platform_device *pdev = vc4_hdmi->pdev;
2188     int ret;
2189 
2190     if (vc4_hdmi->variant->external_irq_controller) {
2191         unsigned int hpd_con = platform_get_irq_byname(pdev, "hpd-connected");
2192         unsigned int hpd_rm = platform_get_irq_byname(pdev, "hpd-removed");
2193 
2194         ret = request_threaded_irq(hpd_con,
2195                        NULL,
2196                        vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
2197                        "vc4 hdmi hpd connected", vc4_hdmi);
2198         if (ret)
2199             return ret;
2200 
2201         ret = request_threaded_irq(hpd_rm,
2202                        NULL,
2203                        vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
2204                        "vc4 hdmi hpd disconnected", vc4_hdmi);
2205         if (ret) {
2206             free_irq(hpd_con, vc4_hdmi);
2207             return ret;
2208         }
2209 
2210         connector->polled = DRM_CONNECTOR_POLL_HPD;
2211     }
2212 
2213     return 0;
2214 }
2215 
2216 static void vc4_hdmi_hotplug_exit(struct vc4_hdmi *vc4_hdmi)
2217 {
2218     struct platform_device *pdev = vc4_hdmi->pdev;
2219 
2220     if (vc4_hdmi->variant->external_irq_controller) {
2221         free_irq(platform_get_irq_byname(pdev, "hpd-connected"), vc4_hdmi);
2222         free_irq(platform_get_irq_byname(pdev, "hpd-removed"), vc4_hdmi);
2223     }
2224 }
2225 
2226 #ifdef CONFIG_DRM_VC4_HDMI_CEC
2227 static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv)
2228 {
2229     struct vc4_hdmi *vc4_hdmi = priv;
2230 
2231     if (vc4_hdmi->cec_rx_msg.len)
2232         cec_received_msg(vc4_hdmi->cec_adap,
2233                  &vc4_hdmi->cec_rx_msg);
2234 
2235     return IRQ_HANDLED;
2236 }
2237 
2238 static irqreturn_t vc4_cec_irq_handler_tx_thread(int irq, void *priv)
2239 {
2240     struct vc4_hdmi *vc4_hdmi = priv;
2241 
2242     if (vc4_hdmi->cec_tx_ok) {
2243         cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK,
2244                   0, 0, 0, 0);
2245     } else {
2246         /*
2247          * This CEC implementation makes 1 retry, so if we
2248          * get a NACK, then that means it made 2 attempts.
2249          */
2250         cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK,
2251                   0, 2, 0, 0);
2252     }
2253     return IRQ_HANDLED;
2254 }
2255 
2256 static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
2257 {
2258     struct vc4_hdmi *vc4_hdmi = priv;
2259     irqreturn_t ret;
2260 
2261     if (vc4_hdmi->cec_irq_was_rx)
2262         ret = vc4_cec_irq_handler_rx_thread(irq, priv);
2263     else
2264         ret = vc4_cec_irq_handler_tx_thread(irq, priv);
2265 
2266     return ret;
2267 }
2268 
2269 static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1)
2270 {
2271     struct drm_device *dev = vc4_hdmi->connector.dev;
2272     struct cec_msg *msg = &vc4_hdmi->cec_rx_msg;
2273     unsigned int i;
2274 
2275     lockdep_assert_held(&vc4_hdmi->hw_lock);
2276 
2277     msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >>
2278                     VC4_HDMI_CEC_REC_WRD_CNT_SHIFT);
2279 
2280     if (msg->len > 16) {
2281         drm_err(dev, "Attempting to read too much data (%d)\n", msg->len);
2282         return;
2283     }
2284 
2285     for (i = 0; i < msg->len; i += 4) {
2286         u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + (i >> 2));
2287 
2288         msg->msg[i] = val & 0xff;
2289         msg->msg[i + 1] = (val >> 8) & 0xff;
2290         msg->msg[i + 2] = (val >> 16) & 0xff;
2291         msg->msg[i + 3] = (val >> 24) & 0xff;
2292     }
2293 }
2294 
2295 static irqreturn_t vc4_cec_irq_handler_tx_bare_locked(struct vc4_hdmi *vc4_hdmi)
2296 {
2297     u32 cntrl1;
2298 
2299     lockdep_assert_held(&vc4_hdmi->hw_lock);
2300 
2301     cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
2302     vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
2303     cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
2304     HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
2305 
2306     return IRQ_WAKE_THREAD;
2307 }
2308 
2309 static irqreturn_t vc4_cec_irq_handler_tx_bare(int irq, void *priv)
2310 {
2311     struct vc4_hdmi *vc4_hdmi = priv;
2312     irqreturn_t ret;
2313 
2314     spin_lock(&vc4_hdmi->hw_lock);
2315     ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi);
2316     spin_unlock(&vc4_hdmi->hw_lock);
2317 
2318     return ret;
2319 }
2320 
2321 static irqreturn_t vc4_cec_irq_handler_rx_bare_locked(struct vc4_hdmi *vc4_hdmi)
2322 {
2323     u32 cntrl1;
2324 
2325     lockdep_assert_held(&vc4_hdmi->hw_lock);
2326 
2327     vc4_hdmi->cec_rx_msg.len = 0;
2328     cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
2329     vc4_cec_read_msg(vc4_hdmi, cntrl1);
2330     cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
2331     HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
2332     cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
2333 
2334     HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
2335 
2336     return IRQ_WAKE_THREAD;
2337 }
2338 
2339 static irqreturn_t vc4_cec_irq_handler_rx_bare(int irq, void *priv)
2340 {
2341     struct vc4_hdmi *vc4_hdmi = priv;
2342     irqreturn_t ret;
2343 
2344     spin_lock(&vc4_hdmi->hw_lock);
2345     ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi);
2346     spin_unlock(&vc4_hdmi->hw_lock);
2347 
2348     return ret;
2349 }
2350 
2351 static irqreturn_t vc4_cec_irq_handler(int irq, void *priv)
2352 {
2353     struct vc4_hdmi *vc4_hdmi = priv;
2354     u32 stat = HDMI_READ(HDMI_CEC_CPU_STATUS);
2355     irqreturn_t ret;
2356     u32 cntrl5;
2357 
2358     if (!(stat & VC4_HDMI_CPU_CEC))
2359         return IRQ_NONE;
2360 
2361     spin_lock(&vc4_hdmi->hw_lock);
2362     cntrl5 = HDMI_READ(HDMI_CEC_CNTRL_5);
2363     vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT;
2364     if (vc4_hdmi->cec_irq_was_rx)
2365         ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi);
2366     else
2367         ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi);
2368 
2369     HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
2370     spin_unlock(&vc4_hdmi->hw_lock);
2371 
2372     return ret;
2373 }
2374 
2375 static int vc4_hdmi_cec_enable(struct cec_adapter *adap)
2376 {
2377     struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
2378     /* clock period in microseconds */
2379     const u32 usecs = 1000000 / CEC_CLOCK_FREQ;
2380     unsigned long flags;
2381     u32 val;
2382     int ret;
2383 
2384     /*
2385      * NOTE: This function should really take vc4_hdmi->mutex, but doing so
2386      * results in a reentrancy since cec_s_phys_addr_from_edid() called in
2387      * .detect or .get_modes might call .adap_enable, which leads to this
2388      * function being called with that mutex held.
2389      *
2390      * Concurrency is not an issue for the moment since we don't share any
2391      * state with KMS, so we can ignore the lock for now, but we need to
2392      * keep it in mind if we were to change that assumption.
2393      */
2394 
2395     ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev);
2396     if (ret)
2397         return ret;
2398 
2399     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2400 
2401     val = HDMI_READ(HDMI_CEC_CNTRL_5);
2402     val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET |
2403          VC4_HDMI_CEC_CNT_TO_4700_US_MASK |
2404          VC4_HDMI_CEC_CNT_TO_4500_US_MASK);
2405     val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) |
2406            ((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT);
2407 
2408     HDMI_WRITE(HDMI_CEC_CNTRL_5, val |
2409            VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
2410     HDMI_WRITE(HDMI_CEC_CNTRL_5, val);
2411     HDMI_WRITE(HDMI_CEC_CNTRL_2,
2412            ((1500 / usecs) << VC4_HDMI_CEC_CNT_TO_1500_US_SHIFT) |
2413            ((1300 / usecs) << VC4_HDMI_CEC_CNT_TO_1300_US_SHIFT) |
2414            ((800 / usecs) << VC4_HDMI_CEC_CNT_TO_800_US_SHIFT) |
2415            ((600 / usecs) << VC4_HDMI_CEC_CNT_TO_600_US_SHIFT) |
2416            ((400 / usecs) << VC4_HDMI_CEC_CNT_TO_400_US_SHIFT));
2417     HDMI_WRITE(HDMI_CEC_CNTRL_3,
2418            ((2750 / usecs) << VC4_HDMI_CEC_CNT_TO_2750_US_SHIFT) |
2419            ((2400 / usecs) << VC4_HDMI_CEC_CNT_TO_2400_US_SHIFT) |
2420            ((2050 / usecs) << VC4_HDMI_CEC_CNT_TO_2050_US_SHIFT) |
2421            ((1700 / usecs) << VC4_HDMI_CEC_CNT_TO_1700_US_SHIFT));
2422     HDMI_WRITE(HDMI_CEC_CNTRL_4,
2423            ((4300 / usecs) << VC4_HDMI_CEC_CNT_TO_4300_US_SHIFT) |
2424            ((3900 / usecs) << VC4_HDMI_CEC_CNT_TO_3900_US_SHIFT) |
2425            ((3600 / usecs) << VC4_HDMI_CEC_CNT_TO_3600_US_SHIFT) |
2426            ((3500 / usecs) << VC4_HDMI_CEC_CNT_TO_3500_US_SHIFT));
2427 
2428     if (!vc4_hdmi->variant->external_irq_controller)
2429         HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC);
2430 
2431     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2432 
2433     return 0;
2434 }
2435 
2436 static int vc4_hdmi_cec_disable(struct cec_adapter *adap)
2437 {
2438     struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
2439     unsigned long flags;
2440 
2441     /*
2442      * NOTE: This function should really take vc4_hdmi->mutex, but doing so
2443      * results in a reentrancy since cec_s_phys_addr_from_edid() called in
2444      * .detect or .get_modes might call .adap_enable, which leads to this
2445      * function being called with that mutex held.
2446      *
2447      * Concurrency is not an issue for the moment since we don't share any
2448      * state with KMS, so we can ignore the lock for now, but we need to
2449      * keep it in mind if we were to change that assumption.
2450      */
2451 
2452     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2453 
2454     if (!vc4_hdmi->variant->external_irq_controller)
2455         HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC);
2456 
2457     HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) |
2458            VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
2459 
2460     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2461 
2462     pm_runtime_put(&vc4_hdmi->pdev->dev);
2463 
2464     return 0;
2465 }
2466 
2467 static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)
2468 {
2469     if (enable)
2470         return vc4_hdmi_cec_enable(adap);
2471     else
2472         return vc4_hdmi_cec_disable(adap);
2473 }
2474 
2475 static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
2476 {
2477     struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
2478     unsigned long flags;
2479 
2480     /*
2481      * NOTE: This function should really take vc4_hdmi->mutex, but doing so
2482      * results in a reentrancy since cec_s_phys_addr_from_edid() called in
2483      * .detect or .get_modes might call .adap_enable, which leads to this
2484      * function being called with that mutex held.
2485      *
2486      * Concurrency is not an issue for the moment since we don't share any
2487      * state with KMS, so we can ignore the lock for now, but we need to
2488      * keep it in mind if we were to change that assumption.
2489      */
2490 
2491     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2492     HDMI_WRITE(HDMI_CEC_CNTRL_1,
2493            (HDMI_READ(HDMI_CEC_CNTRL_1) & ~VC4_HDMI_CEC_ADDR_MASK) |
2494            (log_addr & 0xf) << VC4_HDMI_CEC_ADDR_SHIFT);
2495     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2496 
2497     return 0;
2498 }
2499 
2500 static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
2501                       u32 signal_free_time, struct cec_msg *msg)
2502 {
2503     struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
2504     struct drm_device *dev = vc4_hdmi->connector.dev;
2505     unsigned long flags;
2506     u32 val;
2507     unsigned int i;
2508 
2509     /*
2510      * NOTE: This function should really take vc4_hdmi->mutex, but doing so
2511      * results in a reentrancy since cec_s_phys_addr_from_edid() called in
2512      * .detect or .get_modes might call .adap_enable, which leads to this
2513      * function being called with that mutex held.
2514      *
2515      * Concurrency is not an issue for the moment since we don't share any
2516      * state with KMS, so we can ignore the lock for now, but we need to
2517      * keep it in mind if we were to change that assumption.
2518      */
2519 
2520     if (msg->len > 16) {
2521         drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len);
2522         return -ENOMEM;
2523     }
2524 
2525     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2526 
2527     for (i = 0; i < msg->len; i += 4)
2528         HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2),
2529                (msg->msg[i]) |
2530                (msg->msg[i + 1] << 8) |
2531                (msg->msg[i + 2] << 16) |
2532                (msg->msg[i + 3] << 24));
2533 
2534     val = HDMI_READ(HDMI_CEC_CNTRL_1);
2535     val &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
2536     HDMI_WRITE(HDMI_CEC_CNTRL_1, val);
2537     val &= ~VC4_HDMI_CEC_MESSAGE_LENGTH_MASK;
2538     val |= (msg->len - 1) << VC4_HDMI_CEC_MESSAGE_LENGTH_SHIFT;
2539     val |= VC4_HDMI_CEC_START_XMIT_BEGIN;
2540 
2541     HDMI_WRITE(HDMI_CEC_CNTRL_1, val);
2542 
2543     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2544 
2545     return 0;
2546 }
2547 
2548 static const struct cec_adap_ops vc4_hdmi_cec_adap_ops = {
2549     .adap_enable = vc4_hdmi_cec_adap_enable,
2550     .adap_log_addr = vc4_hdmi_cec_adap_log_addr,
2551     .adap_transmit = vc4_hdmi_cec_adap_transmit,
2552 };
2553 
2554 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
2555 {
2556     struct cec_connector_info conn_info;
2557     struct platform_device *pdev = vc4_hdmi->pdev;
2558     struct device *dev = &pdev->dev;
2559     int ret;
2560 
2561     if (!of_find_property(dev->of_node, "interrupts", NULL)) {
2562         dev_warn(dev, "'interrupts' DT property is missing, no CEC\n");
2563         return 0;
2564     }
2565 
2566     vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
2567                           vc4_hdmi, "vc4",
2568                           CEC_CAP_DEFAULTS |
2569                           CEC_CAP_CONNECTOR_INFO, 1);
2570     ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap);
2571     if (ret < 0)
2572         return ret;
2573 
2574     cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
2575     cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
2576 
2577     if (vc4_hdmi->variant->external_irq_controller) {
2578         ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-rx"),
2579                        vc4_cec_irq_handler_rx_bare,
2580                        vc4_cec_irq_handler_rx_thread, 0,
2581                        "vc4 hdmi cec rx", vc4_hdmi);
2582         if (ret)
2583             goto err_delete_cec_adap;
2584 
2585         ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-tx"),
2586                        vc4_cec_irq_handler_tx_bare,
2587                        vc4_cec_irq_handler_tx_thread, 0,
2588                        "vc4 hdmi cec tx", vc4_hdmi);
2589         if (ret)
2590             goto err_remove_cec_rx_handler;
2591     } else {
2592         ret = request_threaded_irq(platform_get_irq(pdev, 0),
2593                        vc4_cec_irq_handler,
2594                        vc4_cec_irq_handler_thread, 0,
2595                        "vc4 hdmi cec", vc4_hdmi);
2596         if (ret)
2597             goto err_delete_cec_adap;
2598     }
2599 
2600     ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev);
2601     if (ret < 0)
2602         goto err_remove_handlers;
2603 
2604     return 0;
2605 
2606 err_remove_handlers:
2607     if (vc4_hdmi->variant->external_irq_controller)
2608         free_irq(platform_get_irq_byname(pdev, "cec-tx"), vc4_hdmi);
2609     else
2610         free_irq(platform_get_irq(pdev, 0), vc4_hdmi);
2611 
2612 err_remove_cec_rx_handler:
2613     if (vc4_hdmi->variant->external_irq_controller)
2614         free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi);
2615 
2616 err_delete_cec_adap:
2617     cec_delete_adapter(vc4_hdmi->cec_adap);
2618 
2619     return ret;
2620 }
2621 
2622 static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi)
2623 {
2624     struct platform_device *pdev = vc4_hdmi->pdev;
2625 
2626     if (vc4_hdmi->variant->external_irq_controller) {
2627         free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi);
2628         free_irq(platform_get_irq_byname(pdev, "cec-tx"), vc4_hdmi);
2629     } else {
2630         free_irq(platform_get_irq(pdev, 0), vc4_hdmi);
2631     }
2632 
2633     cec_unregister_adapter(vc4_hdmi->cec_adap);
2634 }
2635 #else
2636 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
2637 {
2638     return 0;
2639 }
2640 
2641 static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {};
2642 #endif
2643 
2644 static int vc4_hdmi_build_regset(struct vc4_hdmi *vc4_hdmi,
2645                  struct debugfs_regset32 *regset,
2646                  enum vc4_hdmi_regs reg)
2647 {
2648     const struct vc4_hdmi_variant *variant = vc4_hdmi->variant;
2649     struct debugfs_reg32 *regs, *new_regs;
2650     unsigned int count = 0;
2651     unsigned int i;
2652 
2653     regs = kcalloc(variant->num_registers, sizeof(*regs),
2654                GFP_KERNEL);
2655     if (!regs)
2656         return -ENOMEM;
2657 
2658     for (i = 0; i < variant->num_registers; i++) {
2659         const struct vc4_hdmi_register *field = &variant->registers[i];
2660 
2661         if (field->reg != reg)
2662             continue;
2663 
2664         regs[count].name = field->name;
2665         regs[count].offset = field->offset;
2666         count++;
2667     }
2668 
2669     new_regs = krealloc(regs, count * sizeof(*regs), GFP_KERNEL);
2670     if (!new_regs)
2671         return -ENOMEM;
2672 
2673     regset->base = __vc4_hdmi_get_field_base(vc4_hdmi, reg);
2674     regset->regs = new_regs;
2675     regset->nregs = count;
2676 
2677     return 0;
2678 }
2679 
2680 static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
2681 {
2682     struct platform_device *pdev = vc4_hdmi->pdev;
2683     struct device *dev = &pdev->dev;
2684     int ret;
2685 
2686     vc4_hdmi->hdmicore_regs = vc4_ioremap_regs(pdev, 0);
2687     if (IS_ERR(vc4_hdmi->hdmicore_regs))
2688         return PTR_ERR(vc4_hdmi->hdmicore_regs);
2689 
2690     vc4_hdmi->hd_regs = vc4_ioremap_regs(pdev, 1);
2691     if (IS_ERR(vc4_hdmi->hd_regs))
2692         return PTR_ERR(vc4_hdmi->hd_regs);
2693 
2694     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD);
2695     if (ret)
2696         return ret;
2697 
2698     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI);
2699     if (ret)
2700         return ret;
2701 
2702     vc4_hdmi->pixel_clock = devm_clk_get(dev, "pixel");
2703     if (IS_ERR(vc4_hdmi->pixel_clock)) {
2704         ret = PTR_ERR(vc4_hdmi->pixel_clock);
2705         if (ret != -EPROBE_DEFER)
2706             DRM_ERROR("Failed to get pixel clock\n");
2707         return ret;
2708     }
2709 
2710     vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi");
2711     if (IS_ERR(vc4_hdmi->hsm_clock)) {
2712         DRM_ERROR("Failed to get HDMI state machine clock\n");
2713         return PTR_ERR(vc4_hdmi->hsm_clock);
2714     }
2715     vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock;
2716     vc4_hdmi->cec_clock = vc4_hdmi->hsm_clock;
2717 
2718     return 0;
2719 }
2720 
2721 static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
2722 {
2723     struct platform_device *pdev = vc4_hdmi->pdev;
2724     struct device *dev = &pdev->dev;
2725     struct resource *res;
2726     int ret;
2727 
2728     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi");
2729     if (!res)
2730         return -ENODEV;
2731 
2732     vc4_hdmi->hdmicore_regs = devm_ioremap(dev, res->start,
2733                            resource_size(res));
2734     if (!vc4_hdmi->hdmicore_regs)
2735         return -ENOMEM;
2736 
2737     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hd");
2738     if (!res)
2739         return -ENODEV;
2740 
2741     vc4_hdmi->hd_regs = devm_ioremap(dev, res->start, resource_size(res));
2742     if (!vc4_hdmi->hd_regs)
2743         return -ENOMEM;
2744 
2745     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cec");
2746     if (!res)
2747         return -ENODEV;
2748 
2749     vc4_hdmi->cec_regs = devm_ioremap(dev, res->start, resource_size(res));
2750     if (!vc4_hdmi->cec_regs)
2751         return -ENOMEM;
2752 
2753     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csc");
2754     if (!res)
2755         return -ENODEV;
2756 
2757     vc4_hdmi->csc_regs = devm_ioremap(dev, res->start, resource_size(res));
2758     if (!vc4_hdmi->csc_regs)
2759         return -ENOMEM;
2760 
2761     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dvp");
2762     if (!res)
2763         return -ENODEV;
2764 
2765     vc4_hdmi->dvp_regs = devm_ioremap(dev, res->start, resource_size(res));
2766     if (!vc4_hdmi->dvp_regs)
2767         return -ENOMEM;
2768 
2769     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
2770     if (!res)
2771         return -ENODEV;
2772 
2773     vc4_hdmi->phy_regs = devm_ioremap(dev, res->start, resource_size(res));
2774     if (!vc4_hdmi->phy_regs)
2775         return -ENOMEM;
2776 
2777     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "packet");
2778     if (!res)
2779         return -ENODEV;
2780 
2781     vc4_hdmi->ram_regs = devm_ioremap(dev, res->start, resource_size(res));
2782     if (!vc4_hdmi->ram_regs)
2783         return -ENOMEM;
2784 
2785     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rm");
2786     if (!res)
2787         return -ENODEV;
2788 
2789     vc4_hdmi->rm_regs = devm_ioremap(dev, res->start, resource_size(res));
2790     if (!vc4_hdmi->rm_regs)
2791         return -ENOMEM;
2792 
2793     vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi");
2794     if (IS_ERR(vc4_hdmi->hsm_clock)) {
2795         DRM_ERROR("Failed to get HDMI state machine clock\n");
2796         return PTR_ERR(vc4_hdmi->hsm_clock);
2797     }
2798 
2799     vc4_hdmi->pixel_bvb_clock = devm_clk_get(dev, "bvb");
2800     if (IS_ERR(vc4_hdmi->pixel_bvb_clock)) {
2801         DRM_ERROR("Failed to get pixel bvb clock\n");
2802         return PTR_ERR(vc4_hdmi->pixel_bvb_clock);
2803     }
2804 
2805     vc4_hdmi->audio_clock = devm_clk_get(dev, "audio");
2806     if (IS_ERR(vc4_hdmi->audio_clock)) {
2807         DRM_ERROR("Failed to get audio clock\n");
2808         return PTR_ERR(vc4_hdmi->audio_clock);
2809     }
2810 
2811     vc4_hdmi->cec_clock = devm_clk_get(dev, "cec");
2812     if (IS_ERR(vc4_hdmi->cec_clock)) {
2813         DRM_ERROR("Failed to get CEC clock\n");
2814         return PTR_ERR(vc4_hdmi->cec_clock);
2815     }
2816 
2817     vc4_hdmi->reset = devm_reset_control_get(dev, NULL);
2818     if (IS_ERR(vc4_hdmi->reset)) {
2819         DRM_ERROR("Failed to get HDMI reset line\n");
2820         return PTR_ERR(vc4_hdmi->reset);
2821     }
2822 
2823     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI);
2824     if (ret)
2825         return ret;
2826 
2827     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD);
2828     if (ret)
2829         return ret;
2830 
2831     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->cec_regset, VC5_CEC);
2832     if (ret)
2833         return ret;
2834 
2835     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->csc_regset, VC5_CSC);
2836     if (ret)
2837         return ret;
2838 
2839     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->dvp_regset, VC5_DVP);
2840     if (ret)
2841         return ret;
2842 
2843     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->phy_regset, VC5_PHY);
2844     if (ret)
2845         return ret;
2846 
2847     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->ram_regset, VC5_RAM);
2848     if (ret)
2849         return ret;
2850 
2851     ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->rm_regset, VC5_RM);
2852     if (ret)
2853         return ret;
2854 
2855     return 0;
2856 }
2857 
2858 static int vc4_hdmi_runtime_suspend(struct device *dev)
2859 {
2860     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
2861 
2862     clk_disable_unprepare(vc4_hdmi->hsm_clock);
2863 
2864     return 0;
2865 }
2866 
2867 static int vc4_hdmi_runtime_resume(struct device *dev)
2868 {
2869     struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
2870     unsigned long __maybe_unused flags;
2871     u32 __maybe_unused value;
2872     int ret;
2873 
2874     ret = clk_prepare_enable(vc4_hdmi->hsm_clock);
2875     if (ret)
2876         return ret;
2877 
2878     if (vc4_hdmi->variant->reset)
2879         vc4_hdmi->variant->reset(vc4_hdmi);
2880 
2881 #ifdef CONFIG_DRM_VC4_HDMI_CEC
2882     spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2883     value = HDMI_READ(HDMI_CEC_CNTRL_1);
2884     /* Set the logical address to Unregistered */
2885     value |= VC4_HDMI_CEC_ADDR_MASK;
2886     HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
2887     spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2888 
2889     vc4_hdmi_cec_update_clk_div(vc4_hdmi);
2890 
2891     if (!vc4_hdmi->variant->external_irq_controller) {
2892         spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
2893         HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
2894         spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
2895     }
2896 #endif
2897 
2898     return 0;
2899 }
2900 
2901 static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
2902 {
2903     const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev);
2904     struct platform_device *pdev = to_platform_device(dev);
2905     struct drm_device *drm = dev_get_drvdata(master);
2906     struct vc4_hdmi *vc4_hdmi;
2907     struct drm_encoder *encoder;
2908     struct device_node *ddc_node;
2909     int ret;
2910 
2911     vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL);
2912     if (!vc4_hdmi)
2913         return -ENOMEM;
2914     mutex_init(&vc4_hdmi->mutex);
2915     spin_lock_init(&vc4_hdmi->hw_lock);
2916     INIT_DELAYED_WORK(&vc4_hdmi->scrambling_work, vc4_hdmi_scrambling_wq);
2917 
2918     dev_set_drvdata(dev, vc4_hdmi);
2919     encoder = &vc4_hdmi->encoder.base;
2920     vc4_hdmi->encoder.type = variant->encoder_type;
2921     vc4_hdmi->encoder.pre_crtc_configure = vc4_hdmi_encoder_pre_crtc_configure;
2922     vc4_hdmi->encoder.pre_crtc_enable = vc4_hdmi_encoder_pre_crtc_enable;
2923     vc4_hdmi->encoder.post_crtc_enable = vc4_hdmi_encoder_post_crtc_enable;
2924     vc4_hdmi->encoder.post_crtc_disable = vc4_hdmi_encoder_post_crtc_disable;
2925     vc4_hdmi->encoder.post_crtc_powerdown = vc4_hdmi_encoder_post_crtc_powerdown;
2926     vc4_hdmi->pdev = pdev;
2927     vc4_hdmi->variant = variant;
2928 
2929     /*
2930      * Since we don't know the state of the controller and its
2931      * display (if any), let's assume it's always enabled.
2932      * vc4_hdmi_disable_scrambling() will thus run at boot, make
2933      * sure it's disabled, and avoid any inconsistency.
2934      */
2935     if (variant->max_pixel_clock > HDMI_14_MAX_TMDS_CLK)
2936         vc4_hdmi->scdc_enabled = true;
2937 
2938     ret = variant->init_resources(vc4_hdmi);
2939     if (ret)
2940         return ret;
2941 
2942     ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
2943     if (!ddc_node) {
2944         DRM_ERROR("Failed to find ddc node in device tree\n");
2945         return -ENODEV;
2946     }
2947 
2948     vc4_hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node);
2949     of_node_put(ddc_node);
2950     if (!vc4_hdmi->ddc) {
2951         DRM_DEBUG("Failed to get ddc i2c adapter by node\n");
2952         return -EPROBE_DEFER;
2953     }
2954 
2955     /* Only use the GPIO HPD pin if present in the DT, otherwise
2956      * we'll use the HDMI core's register.
2957      */
2958     vc4_hdmi->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
2959     if (IS_ERR(vc4_hdmi->hpd_gpio)) {
2960         ret = PTR_ERR(vc4_hdmi->hpd_gpio);
2961         goto err_put_ddc;
2962     }
2963 
2964     vc4_hdmi->disable_wifi_frequencies =
2965         of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence");
2966 
2967     if (variant->max_pixel_clock == 600000000) {
2968         struct vc4_dev *vc4 = to_vc4_dev(drm);
2969         long max_rate = clk_round_rate(vc4->hvs->core_clk, 550000000);
2970 
2971         if (max_rate < 550000000)
2972             vc4_hdmi->disable_4kp60 = true;
2973     }
2974 
2975     pm_runtime_enable(dev);
2976 
2977     /*
2978      *  We need to have the device powered up at this point to call
2979      *  our reset hook and for the CEC init.
2980      */
2981     ret = pm_runtime_resume_and_get(dev);
2982     if (ret)
2983         goto err_disable_runtime_pm;
2984 
2985     if ((of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi0") ||
2986          of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi1")) &&
2987         HDMI_READ(HDMI_VID_CTL) & VC4_HD_VID_CTL_ENABLE) {
2988         clk_prepare_enable(vc4_hdmi->pixel_clock);
2989         clk_prepare_enable(vc4_hdmi->hsm_clock);
2990         clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
2991     }
2992 
2993     drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
2994     drm_encoder_helper_add(encoder, &vc4_hdmi_encoder_helper_funcs);
2995 
2996     ret = vc4_hdmi_connector_init(drm, vc4_hdmi);
2997     if (ret)
2998         goto err_destroy_encoder;
2999 
3000     ret = vc4_hdmi_hotplug_init(vc4_hdmi);
3001     if (ret)
3002         goto err_destroy_conn;
3003 
3004     ret = vc4_hdmi_cec_init(vc4_hdmi);
3005     if (ret)
3006         goto err_free_hotplug;
3007 
3008     ret = vc4_hdmi_audio_init(vc4_hdmi);
3009     if (ret)
3010         goto err_free_cec;
3011 
3012     vc4_debugfs_add_file(drm, variant->debugfs_name,
3013                  vc4_hdmi_debugfs_regs,
3014                  vc4_hdmi);
3015 
3016     pm_runtime_put_sync(dev);
3017 
3018     return 0;
3019 
3020 err_free_cec:
3021     vc4_hdmi_cec_exit(vc4_hdmi);
3022 err_free_hotplug:
3023     vc4_hdmi_hotplug_exit(vc4_hdmi);
3024 err_destroy_conn:
3025     vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
3026 err_destroy_encoder:
3027     drm_encoder_cleanup(encoder);
3028     pm_runtime_put_sync(dev);
3029 err_disable_runtime_pm:
3030     pm_runtime_disable(dev);
3031 err_put_ddc:
3032     put_device(&vc4_hdmi->ddc->dev);
3033 
3034     return ret;
3035 }
3036 
3037 static void vc4_hdmi_unbind(struct device *dev, struct device *master,
3038                 void *data)
3039 {
3040     struct vc4_hdmi *vc4_hdmi;
3041 
3042     /*
3043      * ASoC makes it a bit hard to retrieve a pointer to the
3044      * vc4_hdmi structure. Registering the card will overwrite our
3045      * device drvdata with a pointer to the snd_soc_card structure,
3046      * which can then be used to retrieve whatever drvdata we want
3047      * to associate.
3048      *
3049      * However, that doesn't fly in the case where we wouldn't
3050      * register an ASoC card (because of an old DT that is missing
3051      * the dmas properties for example), then the card isn't
3052      * registered and the device drvdata wouldn't be set.
3053      *
3054      * We can deal with both cases by making sure a snd_soc_card
3055      * pointer and a vc4_hdmi structure are pointing to the same
3056      * memory address, so we can treat them indistinctly without any
3057      * issue.
3058      */
3059     BUILD_BUG_ON(offsetof(struct vc4_hdmi_audio, card) != 0);
3060     BUILD_BUG_ON(offsetof(struct vc4_hdmi, audio) != 0);
3061     vc4_hdmi = dev_get_drvdata(dev);
3062 
3063     kfree(vc4_hdmi->hdmi_regset.regs);
3064     kfree(vc4_hdmi->hd_regset.regs);
3065 
3066     vc4_hdmi_audio_exit(vc4_hdmi);
3067     vc4_hdmi_cec_exit(vc4_hdmi);
3068     vc4_hdmi_hotplug_exit(vc4_hdmi);
3069     vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
3070     drm_encoder_cleanup(&vc4_hdmi->encoder.base);
3071 
3072     pm_runtime_disable(dev);
3073 
3074     put_device(&vc4_hdmi->ddc->dev);
3075 }
3076 
3077 static const struct component_ops vc4_hdmi_ops = {
3078     .bind   = vc4_hdmi_bind,
3079     .unbind = vc4_hdmi_unbind,
3080 };
3081 
3082 static int vc4_hdmi_dev_probe(struct platform_device *pdev)
3083 {
3084     return component_add(&pdev->dev, &vc4_hdmi_ops);
3085 }
3086 
3087 static int vc4_hdmi_dev_remove(struct platform_device *pdev)
3088 {
3089     component_del(&pdev->dev, &vc4_hdmi_ops);
3090     return 0;
3091 }
3092 
3093 static const struct vc4_hdmi_variant bcm2835_variant = {
3094     .encoder_type       = VC4_ENCODER_TYPE_HDMI0,
3095     .debugfs_name       = "hdmi_regs",
3096     .card_name      = "vc4-hdmi",
3097     .max_pixel_clock    = 162000000,
3098     .registers      = vc4_hdmi_fields,
3099     .num_registers      = ARRAY_SIZE(vc4_hdmi_fields),
3100 
3101     .init_resources     = vc4_hdmi_init_resources,
3102     .csc_setup      = vc4_hdmi_csc_setup,
3103     .reset          = vc4_hdmi_reset,
3104     .set_timings        = vc4_hdmi_set_timings,
3105     .phy_init       = vc4_hdmi_phy_init,
3106     .phy_disable        = vc4_hdmi_phy_disable,
3107     .phy_rng_enable     = vc4_hdmi_phy_rng_enable,
3108     .phy_rng_disable    = vc4_hdmi_phy_rng_disable,
3109     .channel_map        = vc4_hdmi_channel_map,
3110     .supports_hdr       = false,
3111 };
3112 
3113 static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = {
3114     .encoder_type       = VC4_ENCODER_TYPE_HDMI0,
3115     .debugfs_name       = "hdmi0_regs",
3116     .card_name      = "vc4-hdmi-0",
3117     .max_pixel_clock    = 600000000,
3118     .registers      = vc5_hdmi_hdmi0_fields,
3119     .num_registers      = ARRAY_SIZE(vc5_hdmi_hdmi0_fields),
3120     .phy_lane_mapping   = {
3121         PHY_LANE_0,
3122         PHY_LANE_1,
3123         PHY_LANE_2,
3124         PHY_LANE_CK,
3125     },
3126     .unsupported_odd_h_timings  = true,
3127     .external_irq_controller    = true,
3128 
3129     .init_resources     = vc5_hdmi_init_resources,
3130     .csc_setup      = vc5_hdmi_csc_setup,
3131     .reset          = vc5_hdmi_reset,
3132     .set_timings        = vc5_hdmi_set_timings,
3133     .phy_init       = vc5_hdmi_phy_init,
3134     .phy_disable        = vc5_hdmi_phy_disable,
3135     .phy_rng_enable     = vc5_hdmi_phy_rng_enable,
3136     .phy_rng_disable    = vc5_hdmi_phy_rng_disable,
3137     .channel_map        = vc5_hdmi_channel_map,
3138     .supports_hdr       = true,
3139     .hp_detect      = vc5_hdmi_hp_detect,
3140 };
3141 
3142 static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
3143     .encoder_type       = VC4_ENCODER_TYPE_HDMI1,
3144     .debugfs_name       = "hdmi1_regs",
3145     .card_name      = "vc4-hdmi-1",
3146     .max_pixel_clock    = HDMI_14_MAX_TMDS_CLK,
3147     .registers      = vc5_hdmi_hdmi1_fields,
3148     .num_registers      = ARRAY_SIZE(vc5_hdmi_hdmi1_fields),
3149     .phy_lane_mapping   = {
3150         PHY_LANE_1,
3151         PHY_LANE_0,
3152         PHY_LANE_CK,
3153         PHY_LANE_2,
3154     },
3155     .unsupported_odd_h_timings  = true,
3156     .external_irq_controller    = true,
3157 
3158     .init_resources     = vc5_hdmi_init_resources,
3159     .csc_setup      = vc5_hdmi_csc_setup,
3160     .reset          = vc5_hdmi_reset,
3161     .set_timings        = vc5_hdmi_set_timings,
3162     .phy_init       = vc5_hdmi_phy_init,
3163     .phy_disable        = vc5_hdmi_phy_disable,
3164     .phy_rng_enable     = vc5_hdmi_phy_rng_enable,
3165     .phy_rng_disable    = vc5_hdmi_phy_rng_disable,
3166     .channel_map        = vc5_hdmi_channel_map,
3167     .supports_hdr       = true,
3168     .hp_detect      = vc5_hdmi_hp_detect,
3169 };
3170 
3171 static const struct of_device_id vc4_hdmi_dt_match[] = {
3172     { .compatible = "brcm,bcm2835-hdmi", .data = &bcm2835_variant },
3173     { .compatible = "brcm,bcm2711-hdmi0", .data = &bcm2711_hdmi0_variant },
3174     { .compatible = "brcm,bcm2711-hdmi1", .data = &bcm2711_hdmi1_variant },
3175     {}
3176 };
3177 
3178 static const struct dev_pm_ops vc4_hdmi_pm_ops = {
3179     SET_RUNTIME_PM_OPS(vc4_hdmi_runtime_suspend,
3180                vc4_hdmi_runtime_resume,
3181                NULL)
3182 };
3183 
3184 struct platform_driver vc4_hdmi_driver = {
3185     .probe = vc4_hdmi_dev_probe,
3186     .remove = vc4_hdmi_dev_remove,
3187     .driver = {
3188         .name = "vc4_hdmi",
3189         .of_match_table = vc4_hdmi_dt_match,
3190         .pm = &vc4_hdmi_pm_ops,
3191     },
3192 };