cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vc4_hdmi.c (89805B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2015 Broadcom
      4 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
      5 * Copyright (C) 2013 Red Hat
      6 * Author: Rob Clark <robdclark@gmail.com>
      7 */
      8
      9/**
     10 * DOC: VC4 Falcon HDMI module
     11 *
     12 * The HDMI core has a state machine and a PHY.  On BCM2835, most of
     13 * the unit operates off of the HSM clock from CPRMAN.  It also
     14 * internally uses the PLLH_PIX clock for the PHY.
     15 *
     16 * HDMI infoframes are kept within a small packet ram, where each
     17 * packet can be individually enabled for including in a frame.
     18 *
     19 * HDMI audio is implemented entirely within the HDMI IP block.  A
     20 * register in the HDMI encoder takes SPDIF frames from the DMA engine
     21 * and transfers them over an internal MAI (multi-channel audio
     22 * interconnect) bus to the encoder side for insertion into the video
     23 * blank regions.
     24 *
     25 * The driver's HDMI encoder does not yet support power management.
     26 * The HDMI encoder's power domain and the HSM/pixel clocks are kept
     27 * continuously running, and only the HDMI logic and packet ram are
     28 * powered off/on at disable/enable time.
     29 *
     30 * The driver does not yet support CEC control, though the HDMI
     31 * encoder block has CEC support.
     32 */
     33
     34#include <drm/display/drm_hdmi_helper.h>
     35#include <drm/display/drm_scdc_helper.h>
     36#include <drm/drm_atomic_helper.h>
     37#include <drm/drm_probe_helper.h>
     38#include <drm/drm_simple_kms_helper.h>
     39#include <linux/clk.h>
     40#include <linux/component.h>
     41#include <linux/gpio/consumer.h>
     42#include <linux/i2c.h>
     43#include <linux/of_address.h>
     44#include <linux/of_gpio.h>
     45#include <linux/of_platform.h>
     46#include <linux/pm_runtime.h>
     47#include <linux/rational.h>
     48#include <linux/reset.h>
     49#include <sound/dmaengine_pcm.h>
     50#include <sound/hdmi-codec.h>
     51#include <sound/pcm_drm_eld.h>
     52#include <sound/pcm_params.h>
     53#include <sound/soc.h>
     54#include "media/cec.h"
     55#include "vc4_drv.h"
     56#include "vc4_hdmi.h"
     57#include "vc4_hdmi_regs.h"
     58#include "vc4_regs.h"
     59
     60#define VC5_HDMI_HORZA_HFP_SHIFT		16
     61#define VC5_HDMI_HORZA_HFP_MASK			VC4_MASK(28, 16)
     62#define VC5_HDMI_HORZA_VPOS			BIT(15)
     63#define VC5_HDMI_HORZA_HPOS			BIT(14)
     64#define VC5_HDMI_HORZA_HAP_SHIFT		0
     65#define VC5_HDMI_HORZA_HAP_MASK			VC4_MASK(13, 0)
     66
     67#define VC5_HDMI_HORZB_HBP_SHIFT		16
     68#define VC5_HDMI_HORZB_HBP_MASK			VC4_MASK(26, 16)
     69#define VC5_HDMI_HORZB_HSP_SHIFT		0
     70#define VC5_HDMI_HORZB_HSP_MASK			VC4_MASK(10, 0)
     71
     72#define VC5_HDMI_VERTA_VSP_SHIFT		24
     73#define VC5_HDMI_VERTA_VSP_MASK			VC4_MASK(28, 24)
     74#define VC5_HDMI_VERTA_VFP_SHIFT		16
     75#define VC5_HDMI_VERTA_VFP_MASK			VC4_MASK(22, 16)
     76#define VC5_HDMI_VERTA_VAL_SHIFT		0
     77#define VC5_HDMI_VERTA_VAL_MASK			VC4_MASK(12, 0)
     78
     79#define VC5_HDMI_VERTB_VSPO_SHIFT		16
     80#define VC5_HDMI_VERTB_VSPO_MASK		VC4_MASK(29, 16)
     81
     82#define VC5_HDMI_SCRAMBLER_CTL_ENABLE		BIT(0)
     83
     84#define VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_SHIFT	8
     85#define VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK	VC4_MASK(10, 8)
     86
     87#define VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_SHIFT		0
     88#define VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK		VC4_MASK(3, 0)
     89
     90#define VC5_HDMI_GCP_CONFIG_GCP_ENABLE		BIT(31)
     91
     92#define VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_SHIFT	8
     93#define VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_MASK	VC4_MASK(15, 8)
     94
     95# define VC4_HD_M_SW_RST			BIT(2)
     96# define VC4_HD_M_ENABLE			BIT(0)
     97
     98#define HSM_MIN_CLOCK_FREQ	120000000
     99#define CEC_CLOCK_FREQ 40000
    100
    101#define HDMI_14_MAX_TMDS_CLK   (340 * 1000 * 1000)
    102
    103static const char * const output_format_str[] = {
    104	[VC4_HDMI_OUTPUT_RGB]		= "RGB",
    105	[VC4_HDMI_OUTPUT_YUV420]	= "YUV 4:2:0",
    106	[VC4_HDMI_OUTPUT_YUV422]	= "YUV 4:2:2",
    107	[VC4_HDMI_OUTPUT_YUV444]	= "YUV 4:4:4",
    108};
    109
    110static const char *vc4_hdmi_output_fmt_str(enum vc4_hdmi_output_format fmt)
    111{
    112	if (fmt >= ARRAY_SIZE(output_format_str))
    113		return "invalid";
    114
    115	return output_format_str[fmt];
    116}
    117
    118static unsigned long long
    119vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
    120				    unsigned int bpc, enum vc4_hdmi_output_format fmt);
    121
    122static bool vc4_hdmi_mode_needs_scrambling(const struct drm_display_mode *mode,
    123					   unsigned int bpc,
    124					   enum vc4_hdmi_output_format fmt)
    125{
    126	unsigned long long clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt);
    127
    128	return clock > HDMI_14_MAX_TMDS_CLK;
    129}
    130
    131static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi,
    132				       const struct drm_display_mode *mode)
    133{
    134	struct drm_display_info *display = &vc4_hdmi->connector.display_info;
    135
    136	return !display->is_hdmi ||
    137		drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_FULL;
    138}
    139
    140static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)
    141{
    142	struct drm_info_node *node = (struct drm_info_node *)m->private;
    143	struct vc4_hdmi *vc4_hdmi = node->info_ent->data;
    144	struct drm_printer p = drm_seq_file_printer(m);
    145
    146	drm_print_regset32(&p, &vc4_hdmi->hdmi_regset);
    147	drm_print_regset32(&p, &vc4_hdmi->hd_regset);
    148
    149	return 0;
    150}
    151
    152static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi)
    153{
    154	unsigned long flags;
    155
    156	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    157
    158	HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_SW_RST);
    159	udelay(1);
    160	HDMI_WRITE(HDMI_M_CTL, 0);
    161
    162	HDMI_WRITE(HDMI_M_CTL, VC4_HD_M_ENABLE);
    163
    164	HDMI_WRITE(HDMI_SW_RESET_CONTROL,
    165		   VC4_HDMI_SW_RESET_HDMI |
    166		   VC4_HDMI_SW_RESET_FORMAT_DETECT);
    167
    168	HDMI_WRITE(HDMI_SW_RESET_CONTROL, 0);
    169
    170	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    171}
    172
    173static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi)
    174{
    175	unsigned long flags;
    176
    177	reset_control_reset(vc4_hdmi->reset);
    178
    179	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    180
    181	HDMI_WRITE(HDMI_DVP_CTL, 0);
    182
    183	HDMI_WRITE(HDMI_CLOCK_STOP,
    184		   HDMI_READ(HDMI_CLOCK_STOP) | VC4_DVP_HT_CLOCK_STOP_PIXEL);
    185
    186	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    187}
    188
    189#ifdef CONFIG_DRM_VC4_HDMI_CEC
    190static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi)
    191{
    192	unsigned long cec_rate = clk_get_rate(vc4_hdmi->cec_clock);
    193	unsigned long flags;
    194	u16 clk_cnt;
    195	u32 value;
    196
    197	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    198
    199	value = HDMI_READ(HDMI_CEC_CNTRL_1);
    200	value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK;
    201
    202	/*
    203	 * Set the clock divider: the hsm_clock rate and this divider
    204	 * setting will give a 40 kHz CEC clock.
    205	 */
    206	clk_cnt = cec_rate / CEC_CLOCK_FREQ;
    207	value |= clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT;
    208	HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
    209
    210	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    211}
    212#else
    213static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {}
    214#endif
    215
    216static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder);
    217
    218static enum drm_connector_status
    219vc4_hdmi_connector_detect(struct drm_connector *connector, bool force)
    220{
    221	struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
    222	bool connected = false;
    223
    224	mutex_lock(&vc4_hdmi->mutex);
    225
    226	WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev));
    227
    228	if (vc4_hdmi->hpd_gpio) {
    229		if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio))
    230			connected = true;
    231	} else {
    232		if (vc4_hdmi->variant->hp_detect &&
    233		    vc4_hdmi->variant->hp_detect(vc4_hdmi))
    234			connected = true;
    235	}
    236
    237	if (connected) {
    238		if (connector->status != connector_status_connected) {
    239			struct edid *edid = drm_get_edid(connector, vc4_hdmi->ddc);
    240
    241			if (edid) {
    242				cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
    243				kfree(edid);
    244			}
    245		}
    246
    247		vc4_hdmi_enable_scrambling(&vc4_hdmi->encoder.base);
    248		pm_runtime_put(&vc4_hdmi->pdev->dev);
    249		mutex_unlock(&vc4_hdmi->mutex);
    250		return connector_status_connected;
    251	}
    252
    253	cec_phys_addr_invalidate(vc4_hdmi->cec_adap);
    254	pm_runtime_put(&vc4_hdmi->pdev->dev);
    255	mutex_unlock(&vc4_hdmi->mutex);
    256	return connector_status_disconnected;
    257}
    258
    259static void vc4_hdmi_connector_destroy(struct drm_connector *connector)
    260{
    261	drm_connector_unregister(connector);
    262	drm_connector_cleanup(connector);
    263}
    264
    265static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
    266{
    267	struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
    268	int ret = 0;
    269	struct edid *edid;
    270
    271	mutex_lock(&vc4_hdmi->mutex);
    272
    273	edid = drm_get_edid(connector, vc4_hdmi->ddc);
    274	cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
    275	if (!edid) {
    276		ret = -ENODEV;
    277		goto out;
    278	}
    279
    280	drm_connector_update_edid_property(connector, edid);
    281	ret = drm_add_edid_modes(connector, edid);
    282	kfree(edid);
    283
    284	if (vc4_hdmi->disable_4kp60) {
    285		struct drm_device *drm = connector->dev;
    286		struct drm_display_mode *mode;
    287
    288		list_for_each_entry(mode, &connector->probed_modes, head) {
    289			if (vc4_hdmi_mode_needs_scrambling(mode, 8, VC4_HDMI_OUTPUT_RGB)) {
    290				drm_warn_once(drm, "The core clock cannot reach frequencies high enough to support 4k @ 60Hz.");
    291				drm_warn_once(drm, "Please change your config.txt file to add hdmi_enable_4kp60.");
    292			}
    293		}
    294	}
    295
    296out:
    297	mutex_unlock(&vc4_hdmi->mutex);
    298
    299	return ret;
    300}
    301
    302static int vc4_hdmi_connector_atomic_check(struct drm_connector *connector,
    303					   struct drm_atomic_state *state)
    304{
    305	struct drm_connector_state *old_state =
    306		drm_atomic_get_old_connector_state(state, connector);
    307	struct drm_connector_state *new_state =
    308		drm_atomic_get_new_connector_state(state, connector);
    309	struct drm_crtc *crtc = new_state->crtc;
    310
    311	if (!crtc)
    312		return 0;
    313
    314	if (old_state->colorspace != new_state->colorspace ||
    315	    !drm_connector_atomic_hdr_metadata_equal(old_state, new_state)) {
    316		struct drm_crtc_state *crtc_state;
    317
    318		crtc_state = drm_atomic_get_crtc_state(state, crtc);
    319		if (IS_ERR(crtc_state))
    320			return PTR_ERR(crtc_state);
    321
    322		crtc_state->mode_changed = true;
    323	}
    324
    325	return 0;
    326}
    327
    328static void vc4_hdmi_connector_reset(struct drm_connector *connector)
    329{
    330	struct vc4_hdmi_connector_state *old_state =
    331		conn_state_to_vc4_hdmi_conn_state(connector->state);
    332	struct vc4_hdmi_connector_state *new_state =
    333		kzalloc(sizeof(*new_state), GFP_KERNEL);
    334
    335	if (connector->state)
    336		__drm_atomic_helper_connector_destroy_state(connector->state);
    337
    338	kfree(old_state);
    339	__drm_atomic_helper_connector_reset(connector, &new_state->base);
    340
    341	if (!new_state)
    342		return;
    343
    344	new_state->base.max_bpc = 8;
    345	new_state->base.max_requested_bpc = 8;
    346	new_state->output_format = VC4_HDMI_OUTPUT_RGB;
    347	drm_atomic_helper_connector_tv_reset(connector);
    348}
    349
    350static struct drm_connector_state *
    351vc4_hdmi_connector_duplicate_state(struct drm_connector *connector)
    352{
    353	struct drm_connector_state *conn_state = connector->state;
    354	struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
    355	struct vc4_hdmi_connector_state *new_state;
    356
    357	new_state = kzalloc(sizeof(*new_state), GFP_KERNEL);
    358	if (!new_state)
    359		return NULL;
    360
    361	new_state->tmds_char_rate = vc4_state->tmds_char_rate;
    362	new_state->output_bpc = vc4_state->output_bpc;
    363	new_state->output_format = vc4_state->output_format;
    364	__drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
    365
    366	return &new_state->base;
    367}
    368
    369static const struct drm_connector_funcs vc4_hdmi_connector_funcs = {
    370	.detect = vc4_hdmi_connector_detect,
    371	.fill_modes = drm_helper_probe_single_connector_modes,
    372	.destroy = vc4_hdmi_connector_destroy,
    373	.reset = vc4_hdmi_connector_reset,
    374	.atomic_duplicate_state = vc4_hdmi_connector_duplicate_state,
    375	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
    376};
    377
    378static const struct drm_connector_helper_funcs vc4_hdmi_connector_helper_funcs = {
    379	.get_modes = vc4_hdmi_connector_get_modes,
    380	.atomic_check = vc4_hdmi_connector_atomic_check,
    381};
    382
    383static int vc4_hdmi_connector_init(struct drm_device *dev,
    384				   struct vc4_hdmi *vc4_hdmi)
    385{
    386	struct drm_connector *connector = &vc4_hdmi->connector;
    387	struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
    388	int ret;
    389
    390	drm_connector_init_with_ddc(dev, connector,
    391				    &vc4_hdmi_connector_funcs,
    392				    DRM_MODE_CONNECTOR_HDMIA,
    393				    vc4_hdmi->ddc);
    394	drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
    395
    396	/*
    397	 * Some of the properties below require access to state, like bpc.
    398	 * Allocate some default initial connector state with our reset helper.
    399	 */
    400	if (connector->funcs->reset)
    401		connector->funcs->reset(connector);
    402
    403	/* Create and attach TV margin props to this connector. */
    404	ret = drm_mode_create_tv_margin_properties(dev);
    405	if (ret)
    406		return ret;
    407
    408	ret = drm_mode_create_hdmi_colorspace_property(connector);
    409	if (ret)
    410		return ret;
    411
    412	drm_connector_attach_colorspace_property(connector);
    413	drm_connector_attach_tv_margin_properties(connector);
    414	drm_connector_attach_max_bpc_property(connector, 8, 12);
    415
    416	connector->polled = (DRM_CONNECTOR_POLL_CONNECT |
    417			     DRM_CONNECTOR_POLL_DISCONNECT);
    418
    419	connector->interlace_allowed = 1;
    420	connector->doublescan_allowed = 0;
    421
    422	if (vc4_hdmi->variant->supports_hdr)
    423		drm_connector_attach_hdr_output_metadata_property(connector);
    424
    425	drm_connector_attach_encoder(connector, encoder);
    426
    427	return 0;
    428}
    429
    430static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
    431				enum hdmi_infoframe_type type,
    432				bool poll)
    433{
    434	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    435	u32 packet_id = type - 0x80;
    436	unsigned long flags;
    437
    438	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    439	HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
    440		   HDMI_READ(HDMI_RAM_PACKET_CONFIG) & ~BIT(packet_id));
    441	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    442
    443	if (!poll)
    444		return 0;
    445
    446	return wait_for(!(HDMI_READ(HDMI_RAM_PACKET_STATUS) &
    447			  BIT(packet_id)), 100);
    448}
    449
    450static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder,
    451				     union hdmi_infoframe *frame)
    452{
    453	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    454	u32 packet_id = frame->any.type - 0x80;
    455	const struct vc4_hdmi_register *ram_packet_start =
    456		&vc4_hdmi->variant->registers[HDMI_RAM_PACKET_START];
    457	u32 packet_reg = ram_packet_start->offset + VC4_HDMI_PACKET_STRIDE * packet_id;
    458	void __iomem *base = __vc4_hdmi_get_field_base(vc4_hdmi,
    459						       ram_packet_start->reg);
    460	uint8_t buffer[VC4_HDMI_PACKET_STRIDE];
    461	unsigned long flags;
    462	ssize_t len, i;
    463	int ret;
    464
    465	WARN_ONCE(!(HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
    466		    VC4_HDMI_RAM_PACKET_ENABLE),
    467		  "Packet RAM has to be on to store the packet.");
    468
    469	len = hdmi_infoframe_pack(frame, buffer, sizeof(buffer));
    470	if (len < 0)
    471		return;
    472
    473	ret = vc4_hdmi_stop_packet(encoder, frame->any.type, true);
    474	if (ret) {
    475		DRM_ERROR("Failed to wait for infoframe to go idle: %d\n", ret);
    476		return;
    477	}
    478
    479	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    480
    481	for (i = 0; i < len; i += 7) {
    482		writel(buffer[i + 0] << 0 |
    483		       buffer[i + 1] << 8 |
    484		       buffer[i + 2] << 16,
    485		       base + packet_reg);
    486		packet_reg += 4;
    487
    488		writel(buffer[i + 3] << 0 |
    489		       buffer[i + 4] << 8 |
    490		       buffer[i + 5] << 16 |
    491		       buffer[i + 6] << 24,
    492		       base + packet_reg);
    493		packet_reg += 4;
    494	}
    495
    496	HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
    497		   HDMI_READ(HDMI_RAM_PACKET_CONFIG) | BIT(packet_id));
    498
    499	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    500
    501	ret = wait_for((HDMI_READ(HDMI_RAM_PACKET_STATUS) &
    502			BIT(packet_id)), 100);
    503	if (ret)
    504		DRM_ERROR("Failed to wait for infoframe to start: %d\n", ret);
    505}
    506
    507static void vc4_hdmi_avi_infoframe_colorspace(struct hdmi_avi_infoframe *frame,
    508					      enum vc4_hdmi_output_format fmt)
    509{
    510	switch (fmt) {
    511	case VC4_HDMI_OUTPUT_RGB:
    512		frame->colorspace = HDMI_COLORSPACE_RGB;
    513		break;
    514
    515	case VC4_HDMI_OUTPUT_YUV420:
    516		frame->colorspace = HDMI_COLORSPACE_YUV420;
    517		break;
    518
    519	case VC4_HDMI_OUTPUT_YUV422:
    520		frame->colorspace = HDMI_COLORSPACE_YUV422;
    521		break;
    522
    523	case VC4_HDMI_OUTPUT_YUV444:
    524		frame->colorspace = HDMI_COLORSPACE_YUV444;
    525		break;
    526
    527	default:
    528		break;
    529	}
    530}
    531
    532static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
    533{
    534	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    535	struct drm_connector *connector = &vc4_hdmi->connector;
    536	struct drm_connector_state *cstate = connector->state;
    537	struct vc4_hdmi_connector_state *vc4_state =
    538		conn_state_to_vc4_hdmi_conn_state(cstate);
    539	const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
    540	union hdmi_infoframe frame;
    541	int ret;
    542
    543	lockdep_assert_held(&vc4_hdmi->mutex);
    544
    545	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
    546						       connector, mode);
    547	if (ret < 0) {
    548		DRM_ERROR("couldn't fill AVI infoframe\n");
    549		return;
    550	}
    551
    552	drm_hdmi_avi_infoframe_quant_range(&frame.avi,
    553					   connector, mode,
    554					   vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ?
    555					   HDMI_QUANTIZATION_RANGE_FULL :
    556					   HDMI_QUANTIZATION_RANGE_LIMITED);
    557	drm_hdmi_avi_infoframe_colorimetry(&frame.avi, cstate);
    558	vc4_hdmi_avi_infoframe_colorspace(&frame.avi, vc4_state->output_format);
    559	drm_hdmi_avi_infoframe_bars(&frame.avi, cstate);
    560
    561	vc4_hdmi_write_infoframe(encoder, &frame);
    562}
    563
    564static void vc4_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
    565{
    566	union hdmi_infoframe frame;
    567	int ret;
    568
    569	ret = hdmi_spd_infoframe_init(&frame.spd, "Broadcom", "Videocore");
    570	if (ret < 0) {
    571		DRM_ERROR("couldn't fill SPD infoframe\n");
    572		return;
    573	}
    574
    575	frame.spd.sdi = HDMI_SPD_SDI_PC;
    576
    577	vc4_hdmi_write_infoframe(encoder, &frame);
    578}
    579
    580static void vc4_hdmi_set_audio_infoframe(struct drm_encoder *encoder)
    581{
    582	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    583	struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe;
    584	union hdmi_infoframe frame;
    585
    586	memcpy(&frame.audio, audio, sizeof(*audio));
    587	vc4_hdmi_write_infoframe(encoder, &frame);
    588}
    589
    590static void vc4_hdmi_set_hdr_infoframe(struct drm_encoder *encoder)
    591{
    592	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    593	struct drm_connector *connector = &vc4_hdmi->connector;
    594	struct drm_connector_state *conn_state = connector->state;
    595	union hdmi_infoframe frame;
    596
    597	lockdep_assert_held(&vc4_hdmi->mutex);
    598
    599	if (!vc4_hdmi->variant->supports_hdr)
    600		return;
    601
    602	if (!conn_state->hdr_output_metadata)
    603		return;
    604
    605	if (drm_hdmi_infoframe_set_hdr_metadata(&frame.drm, conn_state))
    606		return;
    607
    608	vc4_hdmi_write_infoframe(encoder, &frame);
    609}
    610
    611static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder)
    612{
    613	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    614
    615	lockdep_assert_held(&vc4_hdmi->mutex);
    616
    617	vc4_hdmi_set_avi_infoframe(encoder);
    618	vc4_hdmi_set_spd_infoframe(encoder);
    619	/*
    620	 * If audio was streaming, then we need to reenabled the audio
    621	 * infoframe here during encoder_enable.
    622	 */
    623	if (vc4_hdmi->audio.streaming)
    624		vc4_hdmi_set_audio_infoframe(encoder);
    625
    626	vc4_hdmi_set_hdr_infoframe(encoder);
    627}
    628
    629static bool vc4_hdmi_supports_scrambling(struct drm_encoder *encoder,
    630					 struct drm_display_mode *mode)
    631{
    632	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    633	struct drm_display_info *display = &vc4_hdmi->connector.display_info;
    634
    635	lockdep_assert_held(&vc4_hdmi->mutex);
    636
    637	if (!display->is_hdmi)
    638		return false;
    639
    640	if (!display->hdmi.scdc.supported ||
    641	    !display->hdmi.scdc.scrambling.supported)
    642		return false;
    643
    644	return true;
    645}
    646
    647#define SCRAMBLING_POLLING_DELAY_MS	1000
    648
    649static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
    650{
    651	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    652	struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
    653	unsigned long flags;
    654
    655	lockdep_assert_held(&vc4_hdmi->mutex);
    656
    657	if (!vc4_hdmi_supports_scrambling(encoder, mode))
    658		return;
    659
    660	if (!vc4_hdmi_mode_needs_scrambling(mode,
    661					    vc4_hdmi->output_bpc,
    662					    vc4_hdmi->output_format))
    663		return;
    664
    665	drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
    666	drm_scdc_set_scrambling(vc4_hdmi->ddc, true);
    667
    668	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    669	HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) |
    670		   VC5_HDMI_SCRAMBLER_CTL_ENABLE);
    671	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    672
    673	vc4_hdmi->scdc_enabled = true;
    674
    675	queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
    676			   msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
    677}
    678
    679static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
    680{
    681	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    682	unsigned long flags;
    683
    684	lockdep_assert_held(&vc4_hdmi->mutex);
    685
    686	if (!vc4_hdmi->scdc_enabled)
    687		return;
    688
    689	vc4_hdmi->scdc_enabled = false;
    690
    691	if (delayed_work_pending(&vc4_hdmi->scrambling_work))
    692		cancel_delayed_work_sync(&vc4_hdmi->scrambling_work);
    693
    694	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    695	HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) &
    696		   ~VC5_HDMI_SCRAMBLER_CTL_ENABLE);
    697	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    698
    699	drm_scdc_set_scrambling(vc4_hdmi->ddc, false);
    700	drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, false);
    701}
    702
    703static void vc4_hdmi_scrambling_wq(struct work_struct *work)
    704{
    705	struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work),
    706						 struct vc4_hdmi,
    707						 scrambling_work);
    708
    709	if (drm_scdc_get_scrambling_status(vc4_hdmi->ddc))
    710		return;
    711
    712	drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
    713	drm_scdc_set_scrambling(vc4_hdmi->ddc, true);
    714
    715	queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
    716			   msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
    717}
    718
    719static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder,
    720					       struct drm_atomic_state *state)
    721{
    722	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    723	unsigned long flags;
    724
    725	mutex_lock(&vc4_hdmi->mutex);
    726
    727	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    728
    729	HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
    730
    731	HDMI_WRITE(HDMI_VID_CTL, HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_CLRRGB);
    732
    733	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    734
    735	mdelay(1);
    736
    737	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    738	HDMI_WRITE(HDMI_VID_CTL,
    739		   HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_ENABLE);
    740	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    741
    742	vc4_hdmi_disable_scrambling(encoder);
    743
    744	mutex_unlock(&vc4_hdmi->mutex);
    745}
    746
    747static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder,
    748						 struct drm_atomic_state *state)
    749{
    750	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    751	unsigned long flags;
    752	int ret;
    753
    754	mutex_lock(&vc4_hdmi->mutex);
    755
    756	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    757	HDMI_WRITE(HDMI_VID_CTL,
    758		   HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX);
    759	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    760
    761	if (vc4_hdmi->variant->phy_disable)
    762		vc4_hdmi->variant->phy_disable(vc4_hdmi);
    763
    764	clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock);
    765	clk_disable_unprepare(vc4_hdmi->pixel_clock);
    766
    767	ret = pm_runtime_put(&vc4_hdmi->pdev->dev);
    768	if (ret < 0)
    769		DRM_ERROR("Failed to release power domain: %d\n", ret);
    770
    771	mutex_unlock(&vc4_hdmi->mutex);
    772}
    773
    774static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder)
    775{
    776	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
    777
    778	mutex_lock(&vc4_hdmi->mutex);
    779	vc4_hdmi->output_enabled = false;
    780	mutex_unlock(&vc4_hdmi->mutex);
    781}
    782
    783static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
    784			       struct drm_connector_state *state,
    785			       const struct drm_display_mode *mode)
    786{
    787	unsigned long flags;
    788	u32 csc_ctl;
    789
    790	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    791
    792	csc_ctl = VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR,
    793				VC4_HD_CSC_CTL_ORDER);
    794
    795	if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
    796		/* CEA VICs other than #1 requre limited range RGB
    797		 * output unless overridden by an AVI infoframe.
    798		 * Apply a colorspace conversion to squash 0-255 down
    799		 * to 16-235.  The matrix here is:
    800		 *
    801		 * [ 0      0      0.8594 16]
    802		 * [ 0      0.8594 0      16]
    803		 * [ 0.8594 0      0      16]
    804		 * [ 0      0      0       1]
    805		 */
    806		csc_ctl |= VC4_HD_CSC_CTL_ENABLE;
    807		csc_ctl |= VC4_HD_CSC_CTL_RGB2YCC;
    808		csc_ctl |= VC4_SET_FIELD(VC4_HD_CSC_CTL_MODE_CUSTOM,
    809					 VC4_HD_CSC_CTL_MODE);
    810
    811		HDMI_WRITE(HDMI_CSC_12_11, (0x000 << 16) | 0x000);
    812		HDMI_WRITE(HDMI_CSC_14_13, (0x100 << 16) | 0x6e0);
    813		HDMI_WRITE(HDMI_CSC_22_21, (0x6e0 << 16) | 0x000);
    814		HDMI_WRITE(HDMI_CSC_24_23, (0x100 << 16) | 0x000);
    815		HDMI_WRITE(HDMI_CSC_32_31, (0x000 << 16) | 0x6e0);
    816		HDMI_WRITE(HDMI_CSC_34_33, (0x100 << 16) | 0x000);
    817	}
    818
    819	/* The RGB order applies even when CSC is disabled. */
    820	HDMI_WRITE(HDMI_CSC_CTL, csc_ctl);
    821
    822	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    823}
    824
    825/*
    826 * If we need to output Full Range RGB, then use the unity matrix
    827 *
    828 * [ 1      0      0      0]
    829 * [ 0      1      0      0]
    830 * [ 0      0      1      0]
    831 *
    832 * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
    833 */
    834static const u16 vc5_hdmi_csc_full_rgb_unity[3][4] = {
    835	{ 0x2000, 0x0000, 0x0000, 0x0000 },
    836	{ 0x0000, 0x2000, 0x0000, 0x0000 },
    837	{ 0x0000, 0x0000, 0x2000, 0x0000 },
    838};
    839
    840/*
    841 * CEA VICs other than #1 require limited range RGB output unless
    842 * overridden by an AVI infoframe. Apply a colorspace conversion to
    843 * squash 0-255 down to 16-235. The matrix here is:
    844 *
    845 * [ 0.8594 0      0      16]
    846 * [ 0      0.8594 0      16]
    847 * [ 0      0      0.8594 16]
    848 *
    849 * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
    850 */
    851static const u16 vc5_hdmi_csc_full_rgb_to_limited_rgb[3][4] = {
    852	{ 0x1b80, 0x0000, 0x0000, 0x0400 },
    853	{ 0x0000, 0x1b80, 0x0000, 0x0400 },
    854	{ 0x0000, 0x0000, 0x1b80, 0x0400 },
    855};
    856
    857/*
    858 * Conversion between Full Range RGB and Full Range YUV422 using the
    859 * BT.709 Colorspace
    860 *
    861 *
    862 * [  0.181906  0.611804  0.061758  16  ]
    863 * [ -0.100268 -0.337232  0.437500  128 ]
    864 * [  0.437500 -0.397386 -0.040114  128 ]
    865 *
    866 * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
    867 */
    868static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709[3][4] = {
    869	{ 0x05d2, 0x1394, 0x01fa, 0x0400 },
    870	{ 0xfccc, 0xf536, 0x0e00, 0x2000 },
    871	{ 0x0e00, 0xf34a, 0xfeb8, 0x2000 },
    872};
    873
    874/*
    875 * Conversion between Full Range RGB and Full Range YUV444 using the
    876 * BT.709 Colorspace
    877 *
    878 * [ -0.100268 -0.337232  0.437500  128 ]
    879 * [  0.437500 -0.397386 -0.040114  128 ]
    880 * [  0.181906  0.611804  0.061758  16  ]
    881 *
    882 * Matrix is signed 2p13 fixed point, with signed 9p6 offsets
    883 */
    884static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709[3][4] = {
    885	{ 0xfccc, 0xf536, 0x0e00, 0x2000 },
    886	{ 0x0e00, 0xf34a, 0xfeb8, 0x2000 },
    887	{ 0x05d2, 0x1394, 0x01fa, 0x0400 },
    888};
    889
    890static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi,
    891				    const u16 coeffs[3][4])
    892{
    893	lockdep_assert_held(&vc4_hdmi->hw_lock);
    894
    895	HDMI_WRITE(HDMI_CSC_12_11, (coeffs[0][1] << 16) | coeffs[0][0]);
    896	HDMI_WRITE(HDMI_CSC_14_13, (coeffs[0][3] << 16) | coeffs[0][2]);
    897	HDMI_WRITE(HDMI_CSC_22_21, (coeffs[1][1] << 16) | coeffs[1][0]);
    898	HDMI_WRITE(HDMI_CSC_24_23, (coeffs[1][3] << 16) | coeffs[1][2]);
    899	HDMI_WRITE(HDMI_CSC_32_31, (coeffs[2][1] << 16) | coeffs[2][0]);
    900	HDMI_WRITE(HDMI_CSC_34_33, (coeffs[2][3] << 16) | coeffs[2][2]);
    901}
    902
    903static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi,
    904			       struct drm_connector_state *state,
    905			       const struct drm_display_mode *mode)
    906{
    907	struct vc4_hdmi_connector_state *vc4_state =
    908		conn_state_to_vc4_hdmi_conn_state(state);
    909	unsigned long flags;
    910	u32 if_cfg = 0;
    911	u32 if_xbar = 0x543210;
    912	u32 csc_chan_ctl = 0;
    913	u32 csc_ctl = VC5_MT_CP_CSC_CTL_ENABLE | VC4_SET_FIELD(VC4_HD_CSC_CTL_MODE_CUSTOM,
    914							       VC5_MT_CP_CSC_CTL_MODE);
    915
    916	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    917
    918	switch (vc4_state->output_format) {
    919	case VC4_HDMI_OUTPUT_YUV444:
    920		vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709);
    921		break;
    922
    923	case VC4_HDMI_OUTPUT_YUV422:
    924		csc_ctl |= VC4_SET_FIELD(VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422_STANDARD,
    925					 VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422) |
    926			VC5_MT_CP_CSC_CTL_USE_444_TO_422 |
    927			VC5_MT_CP_CSC_CTL_USE_RNG_SUPPRESSION;
    928
    929		csc_chan_ctl |= VC4_SET_FIELD(VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP_LEGACY_STYLE,
    930					      VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP);
    931
    932		if_cfg |= VC4_SET_FIELD(VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY,
    933					VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422);
    934
    935		vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709);
    936		break;
    937
    938	case VC4_HDMI_OUTPUT_RGB:
    939		if_xbar = 0x354021;
    940
    941		if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode))
    942			vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb);
    943		else
    944			vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity);
    945		break;
    946
    947	default:
    948		break;
    949	}
    950
    951	HDMI_WRITE(HDMI_VEC_INTERFACE_CFG, if_cfg);
    952	HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, if_xbar);
    953	HDMI_WRITE(HDMI_CSC_CHANNEL_CTL, csc_chan_ctl);
    954	HDMI_WRITE(HDMI_CSC_CTL, csc_ctl);
    955
    956	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
    957}
    958
    959static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
    960				 struct drm_connector_state *state,
    961				 struct drm_display_mode *mode)
    962{
    963	bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
    964	bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
    965	bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
    966	u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1;
    967	u32 verta = (VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
    968				   VC4_HDMI_VERTA_VSP) |
    969		     VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay,
    970				   VC4_HDMI_VERTA_VFP) |
    971		     VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL));
    972	u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
    973		     VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
    974				   VC4_HDMI_VERTB_VBP));
    975	u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
    976			  VC4_SET_FIELD(mode->crtc_vtotal -
    977					mode->crtc_vsync_end -
    978					interlaced,
    979					VC4_HDMI_VERTB_VBP));
    980	unsigned long flags;
    981
    982	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
    983
    984	HDMI_WRITE(HDMI_HORZA,
    985		   (vsync_pos ? VC4_HDMI_HORZA_VPOS : 0) |
    986		   (hsync_pos ? VC4_HDMI_HORZA_HPOS : 0) |
    987		   VC4_SET_FIELD(mode->hdisplay * pixel_rep,
    988				 VC4_HDMI_HORZA_HAP));
    989
    990	HDMI_WRITE(HDMI_HORZB,
    991		   VC4_SET_FIELD((mode->htotal -
    992				  mode->hsync_end) * pixel_rep,
    993				 VC4_HDMI_HORZB_HBP) |
    994		   VC4_SET_FIELD((mode->hsync_end -
    995				  mode->hsync_start) * pixel_rep,
    996				 VC4_HDMI_HORZB_HSP) |
    997		   VC4_SET_FIELD((mode->hsync_start -
    998				  mode->hdisplay) * pixel_rep,
    999				 VC4_HDMI_HORZB_HFP));
   1000
   1001	HDMI_WRITE(HDMI_VERTA0, verta);
   1002	HDMI_WRITE(HDMI_VERTA1, verta);
   1003
   1004	HDMI_WRITE(HDMI_VERTB0, vertb_even);
   1005	HDMI_WRITE(HDMI_VERTB1, vertb);
   1006
   1007	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1008}
   1009
   1010static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
   1011				 struct drm_connector_state *state,
   1012				 struct drm_display_mode *mode)
   1013{
   1014	const struct vc4_hdmi_connector_state *vc4_state =
   1015		conn_state_to_vc4_hdmi_conn_state(state);
   1016	bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
   1017	bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
   1018	bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
   1019	u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1;
   1020	u32 verta = (VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
   1021				   VC5_HDMI_VERTA_VSP) |
   1022		     VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay,
   1023				   VC5_HDMI_VERTA_VFP) |
   1024		     VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL));
   1025	u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
   1026		     VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
   1027				   VC4_HDMI_VERTB_VBP));
   1028	u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
   1029			  VC4_SET_FIELD(mode->crtc_vtotal -
   1030					mode->crtc_vsync_end -
   1031					interlaced,
   1032					VC4_HDMI_VERTB_VBP));
   1033	unsigned long flags;
   1034	unsigned char gcp;
   1035	bool gcp_en;
   1036	u32 reg;
   1037
   1038	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1039
   1040	HDMI_WRITE(HDMI_HORZA,
   1041		   (vsync_pos ? VC5_HDMI_HORZA_VPOS : 0) |
   1042		   (hsync_pos ? VC5_HDMI_HORZA_HPOS : 0) |
   1043		   VC4_SET_FIELD(mode->hdisplay * pixel_rep,
   1044				 VC5_HDMI_HORZA_HAP) |
   1045		   VC4_SET_FIELD((mode->hsync_start -
   1046				  mode->hdisplay) * pixel_rep,
   1047				 VC5_HDMI_HORZA_HFP));
   1048
   1049	HDMI_WRITE(HDMI_HORZB,
   1050		   VC4_SET_FIELD((mode->htotal -
   1051				  mode->hsync_end) * pixel_rep,
   1052				 VC5_HDMI_HORZB_HBP) |
   1053		   VC4_SET_FIELD((mode->hsync_end -
   1054				  mode->hsync_start) * pixel_rep,
   1055				 VC5_HDMI_HORZB_HSP));
   1056
   1057	HDMI_WRITE(HDMI_VERTA0, verta);
   1058	HDMI_WRITE(HDMI_VERTA1, verta);
   1059
   1060	HDMI_WRITE(HDMI_VERTB0, vertb_even);
   1061	HDMI_WRITE(HDMI_VERTB1, vertb);
   1062
   1063	switch (vc4_state->output_bpc) {
   1064	case 12:
   1065		gcp = 6;
   1066		gcp_en = true;
   1067		break;
   1068	case 10:
   1069		gcp = 5;
   1070		gcp_en = true;
   1071		break;
   1072	case 8:
   1073	default:
   1074		gcp = 4;
   1075		gcp_en = false;
   1076		break;
   1077	}
   1078
   1079	/*
   1080	 * YCC422 is always 36-bit and not considered deep colour so
   1081	 * doesn't signal in GCP.
   1082	 */
   1083	if (vc4_state->output_format == VC4_HDMI_OUTPUT_YUV422) {
   1084		gcp = 4;
   1085		gcp_en = false;
   1086	}
   1087
   1088	reg = HDMI_READ(HDMI_DEEP_COLOR_CONFIG_1);
   1089	reg &= ~(VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK |
   1090		 VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK);
   1091	reg |= VC4_SET_FIELD(2, VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE) |
   1092	       VC4_SET_FIELD(gcp, VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH);
   1093	HDMI_WRITE(HDMI_DEEP_COLOR_CONFIG_1, reg);
   1094
   1095	reg = HDMI_READ(HDMI_GCP_WORD_1);
   1096	reg &= ~VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1_MASK;
   1097	reg |= VC4_SET_FIELD(gcp, VC5_HDMI_GCP_WORD_1_GCP_SUBPACKET_BYTE_1);
   1098	HDMI_WRITE(HDMI_GCP_WORD_1, reg);
   1099
   1100	reg = HDMI_READ(HDMI_GCP_CONFIG);
   1101	reg &= ~VC5_HDMI_GCP_CONFIG_GCP_ENABLE;
   1102	reg |= gcp_en ? VC5_HDMI_GCP_CONFIG_GCP_ENABLE : 0;
   1103	HDMI_WRITE(HDMI_GCP_CONFIG, reg);
   1104
   1105	HDMI_WRITE(HDMI_CLOCK_STOP, 0);
   1106
   1107	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1108}
   1109
   1110static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi)
   1111{
   1112	unsigned long flags;
   1113	u32 drift;
   1114	int ret;
   1115
   1116	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1117
   1118	drift = HDMI_READ(HDMI_FIFO_CTL);
   1119	drift &= VC4_HDMI_FIFO_VALID_WRITE_MASK;
   1120
   1121	HDMI_WRITE(HDMI_FIFO_CTL,
   1122		   drift & ~VC4_HDMI_FIFO_CTL_RECENTER);
   1123	HDMI_WRITE(HDMI_FIFO_CTL,
   1124		   drift | VC4_HDMI_FIFO_CTL_RECENTER);
   1125
   1126	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1127
   1128	usleep_range(1000, 1100);
   1129
   1130	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1131
   1132	HDMI_WRITE(HDMI_FIFO_CTL,
   1133		   drift & ~VC4_HDMI_FIFO_CTL_RECENTER);
   1134	HDMI_WRITE(HDMI_FIFO_CTL,
   1135		   drift | VC4_HDMI_FIFO_CTL_RECENTER);
   1136
   1137	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1138
   1139	ret = wait_for(HDMI_READ(HDMI_FIFO_CTL) &
   1140		       VC4_HDMI_FIFO_CTL_RECENTER_DONE, 1);
   1141	WARN_ONCE(ret, "Timeout waiting for "
   1142		  "VC4_HDMI_FIFO_CTL_RECENTER_DONE");
   1143}
   1144
   1145static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder,
   1146						struct drm_atomic_state *state)
   1147{
   1148	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1149	struct drm_connector *connector = &vc4_hdmi->connector;
   1150	struct drm_connector_state *conn_state =
   1151		drm_atomic_get_new_connector_state(state, connector);
   1152	struct vc4_hdmi_connector_state *vc4_conn_state =
   1153		conn_state_to_vc4_hdmi_conn_state(conn_state);
   1154	struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
   1155	unsigned long tmds_char_rate = vc4_conn_state->tmds_char_rate;
   1156	unsigned long bvb_rate, hsm_rate;
   1157	unsigned long flags;
   1158	int ret;
   1159
   1160	mutex_lock(&vc4_hdmi->mutex);
   1161
   1162	/*
   1163	 * As stated in RPi's vc4 firmware "HDMI state machine (HSM) clock must
   1164	 * be faster than pixel clock, infinitesimally faster, tested in
   1165	 * simulation. Otherwise, exact value is unimportant for HDMI
   1166	 * operation." This conflicts with bcm2835's vc4 documentation, which
   1167	 * states HSM's clock has to be at least 108% of the pixel clock.
   1168	 *
   1169	 * Real life tests reveal that vc4's firmware statement holds up, and
   1170	 * users are able to use pixel clocks closer to HSM's, namely for
   1171	 * 1920x1200@60Hz. So it was decided to have leave a 1% margin between
   1172	 * both clocks. Which, for RPi0-3 implies a maximum pixel clock of
   1173	 * 162MHz.
   1174	 *
   1175	 * Additionally, the AXI clock needs to be at least 25% of
   1176	 * pixel clock, but HSM ends up being the limiting factor.
   1177	 */
   1178	hsm_rate = max_t(unsigned long, 120000000, (tmds_char_rate / 100) * 101);
   1179	ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate);
   1180	if (ret) {
   1181		DRM_ERROR("Failed to set HSM clock rate: %d\n", ret);
   1182		goto out;
   1183	}
   1184
   1185	ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev);
   1186	if (ret < 0) {
   1187		DRM_ERROR("Failed to retain power domain: %d\n", ret);
   1188		goto out;
   1189	}
   1190
   1191	ret = clk_set_rate(vc4_hdmi->pixel_clock, tmds_char_rate);
   1192	if (ret) {
   1193		DRM_ERROR("Failed to set pixel clock rate: %d\n", ret);
   1194		goto err_put_runtime_pm;
   1195	}
   1196
   1197	ret = clk_prepare_enable(vc4_hdmi->pixel_clock);
   1198	if (ret) {
   1199		DRM_ERROR("Failed to turn on pixel clock: %d\n", ret);
   1200		goto err_put_runtime_pm;
   1201	}
   1202
   1203
   1204	vc4_hdmi_cec_update_clk_div(vc4_hdmi);
   1205
   1206	if (tmds_char_rate > 297000000)
   1207		bvb_rate = 300000000;
   1208	else if (tmds_char_rate > 148500000)
   1209		bvb_rate = 150000000;
   1210	else
   1211		bvb_rate = 75000000;
   1212
   1213	ret = clk_set_min_rate(vc4_hdmi->pixel_bvb_clock, bvb_rate);
   1214	if (ret) {
   1215		DRM_ERROR("Failed to set pixel bvb clock rate: %d\n", ret);
   1216		goto err_disable_pixel_clock;
   1217	}
   1218
   1219	ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
   1220	if (ret) {
   1221		DRM_ERROR("Failed to turn on pixel bvb clock: %d\n", ret);
   1222		goto err_disable_pixel_clock;
   1223	}
   1224
   1225	if (vc4_hdmi->variant->phy_init)
   1226		vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state);
   1227
   1228	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1229
   1230	HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
   1231		   HDMI_READ(HDMI_SCHEDULER_CONTROL) |
   1232		   VC4_HDMI_SCHEDULER_CONTROL_MANUAL_FORMAT |
   1233		   VC4_HDMI_SCHEDULER_CONTROL_IGNORE_VSYNC_PREDICTS);
   1234
   1235	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1236
   1237	if (vc4_hdmi->variant->set_timings)
   1238		vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode);
   1239
   1240	mutex_unlock(&vc4_hdmi->mutex);
   1241
   1242	return;
   1243
   1244err_disable_pixel_clock:
   1245	clk_disable_unprepare(vc4_hdmi->pixel_clock);
   1246err_put_runtime_pm:
   1247	pm_runtime_put(&vc4_hdmi->pdev->dev);
   1248out:
   1249	mutex_unlock(&vc4_hdmi->mutex);
   1250	return;
   1251}
   1252
   1253static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
   1254					     struct drm_atomic_state *state)
   1255{
   1256	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1257	struct drm_connector *connector = &vc4_hdmi->connector;
   1258	struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
   1259	struct drm_connector_state *conn_state =
   1260		drm_atomic_get_new_connector_state(state, connector);
   1261	unsigned long flags;
   1262
   1263	mutex_lock(&vc4_hdmi->mutex);
   1264
   1265	if (vc4_hdmi->variant->csc_setup)
   1266		vc4_hdmi->variant->csc_setup(vc4_hdmi, conn_state, mode);
   1267
   1268	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1269	HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N);
   1270	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1271
   1272	mutex_unlock(&vc4_hdmi->mutex);
   1273}
   1274
   1275static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
   1276					      struct drm_atomic_state *state)
   1277{
   1278	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1279	struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
   1280	struct drm_display_info *display = &vc4_hdmi->connector.display_info;
   1281	bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
   1282	bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
   1283	unsigned long flags;
   1284	int ret;
   1285
   1286	mutex_lock(&vc4_hdmi->mutex);
   1287
   1288	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1289
   1290	HDMI_WRITE(HDMI_VID_CTL,
   1291		   VC4_HD_VID_CTL_ENABLE |
   1292		   VC4_HD_VID_CTL_CLRRGB |
   1293		   VC4_HD_VID_CTL_UNDERFLOW_ENABLE |
   1294		   VC4_HD_VID_CTL_FRAME_COUNTER_RESET |
   1295		   (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW) |
   1296		   (hsync_pos ? 0 : VC4_HD_VID_CTL_HSYNC_LOW));
   1297
   1298	HDMI_WRITE(HDMI_VID_CTL,
   1299		   HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_BLANKPIX);
   1300
   1301	if (display->is_hdmi) {
   1302		HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
   1303			   HDMI_READ(HDMI_SCHEDULER_CONTROL) |
   1304			   VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
   1305
   1306		spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1307
   1308		ret = wait_for(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
   1309			       VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE, 1000);
   1310		WARN_ONCE(ret, "Timeout waiting for "
   1311			  "VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
   1312	} else {
   1313		HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
   1314			   HDMI_READ(HDMI_RAM_PACKET_CONFIG) &
   1315			   ~(VC4_HDMI_RAM_PACKET_ENABLE));
   1316		HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
   1317			   HDMI_READ(HDMI_SCHEDULER_CONTROL) &
   1318			   ~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
   1319
   1320		spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1321
   1322		ret = wait_for(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
   1323				 VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE), 1000);
   1324		WARN_ONCE(ret, "Timeout waiting for "
   1325			  "!VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
   1326	}
   1327
   1328	if (display->is_hdmi) {
   1329		spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1330
   1331		WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
   1332			  VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE));
   1333		HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
   1334			   HDMI_READ(HDMI_SCHEDULER_CONTROL) |
   1335			   VC4_HDMI_SCHEDULER_CONTROL_VERT_ALWAYS_KEEPOUT);
   1336
   1337		HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
   1338			   VC4_HDMI_RAM_PACKET_ENABLE);
   1339
   1340		spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1341
   1342		vc4_hdmi_set_infoframes(encoder);
   1343	}
   1344
   1345	vc4_hdmi_recenter_fifo(vc4_hdmi);
   1346	vc4_hdmi_enable_scrambling(encoder);
   1347
   1348	mutex_unlock(&vc4_hdmi->mutex);
   1349}
   1350
   1351static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
   1352{
   1353	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1354
   1355	mutex_lock(&vc4_hdmi->mutex);
   1356	vc4_hdmi->output_enabled = true;
   1357	mutex_unlock(&vc4_hdmi->mutex);
   1358}
   1359
   1360static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
   1361					     struct drm_crtc_state *crtc_state,
   1362					     struct drm_connector_state *conn_state)
   1363{
   1364	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1365	struct vc4_hdmi_connector_state *vc4_state =
   1366		conn_state_to_vc4_hdmi_conn_state(conn_state);
   1367
   1368	mutex_lock(&vc4_hdmi->mutex);
   1369	drm_mode_copy(&vc4_hdmi->saved_adjusted_mode,
   1370		      &crtc_state->adjusted_mode);
   1371	vc4_hdmi->output_bpc = vc4_state->output_bpc;
   1372	vc4_hdmi->output_format = vc4_state->output_format;
   1373	mutex_unlock(&vc4_hdmi->mutex);
   1374}
   1375
   1376static bool
   1377vc4_hdmi_sink_supports_format_bpc(const struct vc4_hdmi *vc4_hdmi,
   1378				  const struct drm_display_info *info,
   1379				  const struct drm_display_mode *mode,
   1380				  unsigned int format, unsigned int bpc)
   1381{
   1382	struct drm_device *dev = vc4_hdmi->connector.dev;
   1383	u8 vic = drm_match_cea_mode(mode);
   1384
   1385	if (vic == 1 && bpc != 8) {
   1386		drm_dbg(dev, "VIC1 requires a bpc of 8, got %u\n", bpc);
   1387		return false;
   1388	}
   1389
   1390	if (!info->is_hdmi &&
   1391	    (format != VC4_HDMI_OUTPUT_RGB || bpc != 8)) {
   1392		drm_dbg(dev, "DVI Monitors require an RGB output at 8 bpc\n");
   1393		return false;
   1394	}
   1395
   1396	switch (format) {
   1397	case VC4_HDMI_OUTPUT_RGB:
   1398		drm_dbg(dev, "RGB Format, checking the constraints.\n");
   1399
   1400		if (!(info->color_formats & DRM_COLOR_FORMAT_RGB444))
   1401			return false;
   1402
   1403		if (bpc == 10 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30)) {
   1404			drm_dbg(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
   1405			return false;
   1406		}
   1407
   1408		if (bpc == 12 && !(info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36)) {
   1409			drm_dbg(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
   1410			return false;
   1411		}
   1412
   1413		drm_dbg(dev, "RGB format supported in that configuration.\n");
   1414
   1415		return true;
   1416
   1417	case VC4_HDMI_OUTPUT_YUV422:
   1418		drm_dbg(dev, "YUV422 format, checking the constraints.\n");
   1419
   1420		if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {
   1421			drm_dbg(dev, "Sink doesn't support YUV422.\n");
   1422			return false;
   1423		}
   1424
   1425		if (bpc != 12) {
   1426			drm_dbg(dev, "YUV422 only supports 12 bpc.\n");
   1427			return false;
   1428		}
   1429
   1430		drm_dbg(dev, "YUV422 format supported in that configuration.\n");
   1431
   1432		return true;
   1433
   1434	case VC4_HDMI_OUTPUT_YUV444:
   1435		drm_dbg(dev, "YUV444 format, checking the constraints.\n");
   1436
   1437		if (!(info->color_formats & DRM_COLOR_FORMAT_YCBCR444)) {
   1438			drm_dbg(dev, "Sink doesn't support YUV444.\n");
   1439			return false;
   1440		}
   1441
   1442		if (bpc == 10 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_30)) {
   1443			drm_dbg(dev, "10 BPC but sink doesn't support Deep Color 30.\n");
   1444			return false;
   1445		}
   1446
   1447		if (bpc == 12 && !(info->edid_hdmi_ycbcr444_dc_modes & DRM_EDID_HDMI_DC_36)) {
   1448			drm_dbg(dev, "12 BPC but sink doesn't support Deep Color 36.\n");
   1449			return false;
   1450		}
   1451
   1452		drm_dbg(dev, "YUV444 format supported in that configuration.\n");
   1453
   1454		return true;
   1455	}
   1456
   1457	return false;
   1458}
   1459
   1460static enum drm_mode_status
   1461vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
   1462			     unsigned long long clock)
   1463{
   1464	const struct drm_connector *connector = &vc4_hdmi->connector;
   1465	const struct drm_display_info *info = &connector->display_info;
   1466
   1467	if (clock > vc4_hdmi->variant->max_pixel_clock)
   1468		return MODE_CLOCK_HIGH;
   1469
   1470	if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK)
   1471		return MODE_CLOCK_HIGH;
   1472
   1473	if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000))
   1474		return MODE_CLOCK_HIGH;
   1475
   1476	return MODE_OK;
   1477}
   1478
   1479static unsigned long long
   1480vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
   1481				    unsigned int bpc,
   1482				    enum vc4_hdmi_output_format fmt)
   1483{
   1484	unsigned long long clock = mode->clock * 1000ULL;
   1485
   1486	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
   1487		clock = clock * 2;
   1488
   1489	if (fmt == VC4_HDMI_OUTPUT_YUV422)
   1490		bpc = 8;
   1491
   1492	clock = clock * bpc;
   1493	do_div(clock, 8);
   1494
   1495	return clock;
   1496}
   1497
   1498static int
   1499vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi,
   1500			       struct vc4_hdmi_connector_state *vc4_state,
   1501			       const struct drm_display_mode *mode,
   1502			       unsigned int bpc, unsigned int fmt)
   1503{
   1504	unsigned long long clock;
   1505
   1506	clock = vc4_hdmi_encoder_compute_mode_clock(mode, bpc, fmt);
   1507	if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK)
   1508		return -EINVAL;
   1509
   1510	vc4_state->tmds_char_rate = clock;
   1511
   1512	return 0;
   1513}
   1514
   1515static int
   1516vc4_hdmi_encoder_compute_format(const struct vc4_hdmi *vc4_hdmi,
   1517				struct vc4_hdmi_connector_state *vc4_state,
   1518				const struct drm_display_mode *mode,
   1519				unsigned int bpc)
   1520{
   1521	struct drm_device *dev = vc4_hdmi->connector.dev;
   1522	const struct drm_connector *connector = &vc4_hdmi->connector;
   1523	const struct drm_display_info *info = &connector->display_info;
   1524	unsigned int format;
   1525
   1526	drm_dbg(dev, "Trying with an RGB output\n");
   1527
   1528	format = VC4_HDMI_OUTPUT_RGB;
   1529	if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) {
   1530		int ret;
   1531
   1532		ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state,
   1533						     mode, bpc, format);
   1534		if (!ret) {
   1535			vc4_state->output_format = format;
   1536			return 0;
   1537		}
   1538	}
   1539
   1540	drm_dbg(dev, "Failed, Trying with an YUV422 output\n");
   1541
   1542	format = VC4_HDMI_OUTPUT_YUV422;
   1543	if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) {
   1544		int ret;
   1545
   1546		ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state,
   1547						     mode, bpc, format);
   1548		if (!ret) {
   1549			vc4_state->output_format = format;
   1550			return 0;
   1551		}
   1552	}
   1553
   1554	drm_dbg(dev, "Failed. No Format Supported for that bpc count.\n");
   1555
   1556	return -EINVAL;
   1557}
   1558
   1559static int
   1560vc4_hdmi_encoder_compute_config(const struct vc4_hdmi *vc4_hdmi,
   1561				struct vc4_hdmi_connector_state *vc4_state,
   1562				const struct drm_display_mode *mode)
   1563{
   1564	struct drm_device *dev = vc4_hdmi->connector.dev;
   1565	struct drm_connector_state *conn_state = &vc4_state->base;
   1566	unsigned int max_bpc = clamp_t(unsigned int, conn_state->max_bpc, 8, 12);
   1567	unsigned int bpc;
   1568	int ret;
   1569
   1570	for (bpc = max_bpc; bpc >= 8; bpc -= 2) {
   1571		drm_dbg(dev, "Trying with a %d bpc output\n", bpc);
   1572
   1573		ret = vc4_hdmi_encoder_compute_format(vc4_hdmi, vc4_state,
   1574						      mode, bpc);
   1575		if (ret)
   1576			continue;
   1577
   1578		vc4_state->output_bpc = bpc;
   1579
   1580		drm_dbg(dev,
   1581			"Mode %ux%u @ %uHz: Found configuration: bpc: %u, fmt: %s, clock: %llu\n",
   1582			mode->hdisplay, mode->vdisplay, drm_mode_vrefresh(mode),
   1583			vc4_state->output_bpc,
   1584			vc4_hdmi_output_fmt_str(vc4_state->output_format),
   1585			vc4_state->tmds_char_rate);
   1586
   1587		break;
   1588	}
   1589
   1590	return ret;
   1591}
   1592
   1593#define WIFI_2_4GHz_CH1_MIN_FREQ	2400000000ULL
   1594#define WIFI_2_4GHz_CH1_MAX_FREQ	2422000000ULL
   1595
   1596static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
   1597					 struct drm_crtc_state *crtc_state,
   1598					 struct drm_connector_state *conn_state)
   1599{
   1600	struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
   1601	struct drm_display_mode *mode = &crtc_state->adjusted_mode;
   1602	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1603	unsigned long long tmds_char_rate = mode->clock * 1000;
   1604	unsigned long long tmds_bit_rate;
   1605	int ret;
   1606
   1607	if (vc4_hdmi->variant->unsupported_odd_h_timings &&
   1608	    !(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
   1609	    ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
   1610	     (mode->hsync_end % 2) || (mode->htotal % 2)))
   1611		return -EINVAL;
   1612
   1613	/*
   1614	 * The 1440p@60 pixel rate is in the same range than the first
   1615	 * WiFi channel (between 2.4GHz and 2.422GHz with 22MHz
   1616	 * bandwidth). Slightly lower the frequency to bring it out of
   1617	 * the WiFi range.
   1618	 */
   1619	tmds_bit_rate = tmds_char_rate * 10;
   1620	if (vc4_hdmi->disable_wifi_frequencies &&
   1621	    (tmds_bit_rate >= WIFI_2_4GHz_CH1_MIN_FREQ &&
   1622	     tmds_bit_rate <= WIFI_2_4GHz_CH1_MAX_FREQ)) {
   1623		mode->clock = 238560;
   1624		tmds_char_rate = mode->clock * 1000;
   1625	}
   1626
   1627	ret = vc4_hdmi_encoder_compute_config(vc4_hdmi, vc4_state, mode);
   1628	if (ret)
   1629		return ret;
   1630
   1631	return 0;
   1632}
   1633
   1634static enum drm_mode_status
   1635vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
   1636			    const struct drm_display_mode *mode)
   1637{
   1638	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
   1639
   1640	if (vc4_hdmi->variant->unsupported_odd_h_timings &&
   1641	    !(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
   1642	    ((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
   1643	     (mode->hsync_end % 2) || (mode->htotal % 2)))
   1644		return MODE_H_ILLEGAL;
   1645
   1646	return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode->clock * 1000);
   1647}
   1648
   1649static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
   1650	.atomic_check = vc4_hdmi_encoder_atomic_check,
   1651	.atomic_mode_set = vc4_hdmi_encoder_atomic_mode_set,
   1652	.mode_valid = vc4_hdmi_encoder_mode_valid,
   1653	.disable = vc4_hdmi_encoder_disable,
   1654	.enable = vc4_hdmi_encoder_enable,
   1655};
   1656
   1657static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
   1658{
   1659	int i;
   1660	u32 channel_map = 0;
   1661
   1662	for (i = 0; i < 8; i++) {
   1663		if (channel_mask & BIT(i))
   1664			channel_map |= i << (3 * i);
   1665	}
   1666	return channel_map;
   1667}
   1668
   1669static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
   1670{
   1671	int i;
   1672	u32 channel_map = 0;
   1673
   1674	for (i = 0; i < 8; i++) {
   1675		if (channel_mask & BIT(i))
   1676			channel_map |= i << (4 * i);
   1677	}
   1678	return channel_map;
   1679}
   1680
   1681static bool vc5_hdmi_hp_detect(struct vc4_hdmi *vc4_hdmi)
   1682{
   1683	unsigned long flags;
   1684	u32 hotplug;
   1685
   1686	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1687	hotplug = HDMI_READ(HDMI_HOTPLUG);
   1688	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1689
   1690	return !!(hotplug & VC4_HDMI_HOTPLUG_CONNECTED);
   1691}
   1692
   1693/* HDMI audio codec callbacks */
   1694static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi,
   1695					 unsigned int samplerate)
   1696{
   1697	u32 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock);
   1698	unsigned long flags;
   1699	unsigned long n, m;
   1700
   1701	rational_best_approximation(hsm_clock, samplerate,
   1702				    VC4_HD_MAI_SMP_N_MASK >>
   1703				    VC4_HD_MAI_SMP_N_SHIFT,
   1704				    (VC4_HD_MAI_SMP_M_MASK >>
   1705				     VC4_HD_MAI_SMP_M_SHIFT) + 1,
   1706				    &n, &m);
   1707
   1708	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1709	HDMI_WRITE(HDMI_MAI_SMP,
   1710		   VC4_SET_FIELD(n, VC4_HD_MAI_SMP_N) |
   1711		   VC4_SET_FIELD(m - 1, VC4_HD_MAI_SMP_M));
   1712	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1713}
   1714
   1715static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate)
   1716{
   1717	const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
   1718	u32 n, cts;
   1719	u64 tmp;
   1720
   1721	lockdep_assert_held(&vc4_hdmi->mutex);
   1722	lockdep_assert_held(&vc4_hdmi->hw_lock);
   1723
   1724	n = 128 * samplerate / 1000;
   1725	tmp = (u64)(mode->clock * 1000) * n;
   1726	do_div(tmp, 128 * samplerate);
   1727	cts = tmp;
   1728
   1729	HDMI_WRITE(HDMI_CRP_CFG,
   1730		   VC4_HDMI_CRP_CFG_EXTERNAL_CTS_EN |
   1731		   VC4_SET_FIELD(n, VC4_HDMI_CRP_CFG_N));
   1732
   1733	/*
   1734	 * We could get slightly more accurate clocks in some cases by
   1735	 * providing a CTS_1 value.  The two CTS values are alternated
   1736	 * between based on the period fields
   1737	 */
   1738	HDMI_WRITE(HDMI_CTS_0, cts);
   1739	HDMI_WRITE(HDMI_CTS_1, cts);
   1740}
   1741
   1742static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai)
   1743{
   1744	struct snd_soc_card *card = snd_soc_dai_get_drvdata(dai);
   1745
   1746	return snd_soc_card_get_drvdata(card);
   1747}
   1748
   1749static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi)
   1750{
   1751	lockdep_assert_held(&vc4_hdmi->mutex);
   1752
   1753	/*
   1754	 * If the controller is disabled, prevent any ALSA output.
   1755	 */
   1756	if (!vc4_hdmi->output_enabled)
   1757		return false;
   1758
   1759	/*
   1760	 * If the encoder is currently in DVI mode, treat the codec DAI
   1761	 * as missing.
   1762	 */
   1763	if (!(HDMI_READ(HDMI_RAM_PACKET_CONFIG) & VC4_HDMI_RAM_PACKET_ENABLE))
   1764		return false;
   1765
   1766	return true;
   1767}
   1768
   1769static int vc4_hdmi_audio_startup(struct device *dev, void *data)
   1770{
   1771	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   1772	unsigned long flags;
   1773
   1774	mutex_lock(&vc4_hdmi->mutex);
   1775
   1776	if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) {
   1777		mutex_unlock(&vc4_hdmi->mutex);
   1778		return -ENODEV;
   1779	}
   1780
   1781	vc4_hdmi->audio.streaming = true;
   1782
   1783	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1784	HDMI_WRITE(HDMI_MAI_CTL,
   1785		   VC4_HD_MAI_CTL_RESET |
   1786		   VC4_HD_MAI_CTL_FLUSH |
   1787		   VC4_HD_MAI_CTL_DLATE |
   1788		   VC4_HD_MAI_CTL_ERRORE |
   1789		   VC4_HD_MAI_CTL_ERRORF);
   1790	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1791
   1792	if (vc4_hdmi->variant->phy_rng_enable)
   1793		vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
   1794
   1795	mutex_unlock(&vc4_hdmi->mutex);
   1796
   1797	return 0;
   1798}
   1799
   1800static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi)
   1801{
   1802	struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
   1803	struct device *dev = &vc4_hdmi->pdev->dev;
   1804	unsigned long flags;
   1805	int ret;
   1806
   1807	lockdep_assert_held(&vc4_hdmi->mutex);
   1808
   1809	vc4_hdmi->audio.streaming = false;
   1810	ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO, false);
   1811	if (ret)
   1812		dev_err(dev, "Failed to stop audio infoframe: %d\n", ret);
   1813
   1814	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1815
   1816	HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_RESET);
   1817	HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_ERRORF);
   1818	HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_FLUSH);
   1819
   1820	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1821}
   1822
   1823static void vc4_hdmi_audio_shutdown(struct device *dev, void *data)
   1824{
   1825	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   1826	unsigned long flags;
   1827
   1828	mutex_lock(&vc4_hdmi->mutex);
   1829
   1830	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1831
   1832	HDMI_WRITE(HDMI_MAI_CTL,
   1833		   VC4_HD_MAI_CTL_DLATE |
   1834		   VC4_HD_MAI_CTL_ERRORE |
   1835		   VC4_HD_MAI_CTL_ERRORF);
   1836
   1837	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1838
   1839	if (vc4_hdmi->variant->phy_rng_disable)
   1840		vc4_hdmi->variant->phy_rng_disable(vc4_hdmi);
   1841
   1842	vc4_hdmi->audio.streaming = false;
   1843	vc4_hdmi_audio_reset(vc4_hdmi);
   1844
   1845	mutex_unlock(&vc4_hdmi->mutex);
   1846}
   1847
   1848static int sample_rate_to_mai_fmt(int samplerate)
   1849{
   1850	switch (samplerate) {
   1851	case 8000:
   1852		return VC4_HDMI_MAI_SAMPLE_RATE_8000;
   1853	case 11025:
   1854		return VC4_HDMI_MAI_SAMPLE_RATE_11025;
   1855	case 12000:
   1856		return VC4_HDMI_MAI_SAMPLE_RATE_12000;
   1857	case 16000:
   1858		return VC4_HDMI_MAI_SAMPLE_RATE_16000;
   1859	case 22050:
   1860		return VC4_HDMI_MAI_SAMPLE_RATE_22050;
   1861	case 24000:
   1862		return VC4_HDMI_MAI_SAMPLE_RATE_24000;
   1863	case 32000:
   1864		return VC4_HDMI_MAI_SAMPLE_RATE_32000;
   1865	case 44100:
   1866		return VC4_HDMI_MAI_SAMPLE_RATE_44100;
   1867	case 48000:
   1868		return VC4_HDMI_MAI_SAMPLE_RATE_48000;
   1869	case 64000:
   1870		return VC4_HDMI_MAI_SAMPLE_RATE_64000;
   1871	case 88200:
   1872		return VC4_HDMI_MAI_SAMPLE_RATE_88200;
   1873	case 96000:
   1874		return VC4_HDMI_MAI_SAMPLE_RATE_96000;
   1875	case 128000:
   1876		return VC4_HDMI_MAI_SAMPLE_RATE_128000;
   1877	case 176400:
   1878		return VC4_HDMI_MAI_SAMPLE_RATE_176400;
   1879	case 192000:
   1880		return VC4_HDMI_MAI_SAMPLE_RATE_192000;
   1881	default:
   1882		return VC4_HDMI_MAI_SAMPLE_RATE_NOT_INDICATED;
   1883	}
   1884}
   1885
   1886/* HDMI audio codec callbacks */
   1887static int vc4_hdmi_audio_prepare(struct device *dev, void *data,
   1888				  struct hdmi_codec_daifmt *daifmt,
   1889				  struct hdmi_codec_params *params)
   1890{
   1891	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   1892	struct drm_encoder *encoder = &vc4_hdmi->encoder.base;
   1893	unsigned int sample_rate = params->sample_rate;
   1894	unsigned int channels = params->channels;
   1895	unsigned long flags;
   1896	u32 audio_packet_config, channel_mask;
   1897	u32 channel_map;
   1898	u32 mai_audio_format;
   1899	u32 mai_sample_rate;
   1900
   1901	dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
   1902		sample_rate, params->sample_width, channels);
   1903
   1904	mutex_lock(&vc4_hdmi->mutex);
   1905
   1906	if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) {
   1907		mutex_unlock(&vc4_hdmi->mutex);
   1908		return -EINVAL;
   1909	}
   1910
   1911	vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate);
   1912
   1913	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   1914	HDMI_WRITE(HDMI_MAI_CTL,
   1915		   VC4_SET_FIELD(channels, VC4_HD_MAI_CTL_CHNUM) |
   1916		   VC4_HD_MAI_CTL_WHOLSMP |
   1917		   VC4_HD_MAI_CTL_CHALIGN |
   1918		   VC4_HD_MAI_CTL_ENABLE);
   1919
   1920	mai_sample_rate = sample_rate_to_mai_fmt(sample_rate);
   1921	if (params->iec.status[0] & IEC958_AES0_NONAUDIO &&
   1922	    params->channels == 8)
   1923		mai_audio_format = VC4_HDMI_MAI_FORMAT_HBR;
   1924	else
   1925		mai_audio_format = VC4_HDMI_MAI_FORMAT_PCM;
   1926	HDMI_WRITE(HDMI_MAI_FMT,
   1927		   VC4_SET_FIELD(mai_sample_rate,
   1928				 VC4_HDMI_MAI_FORMAT_SAMPLE_RATE) |
   1929		   VC4_SET_FIELD(mai_audio_format,
   1930				 VC4_HDMI_MAI_FORMAT_AUDIO_FORMAT));
   1931
   1932	/* The B frame identifier should match the value used by alsa-lib (8) */
   1933	audio_packet_config =
   1934		VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_SAMPLE_FLAT |
   1935		VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_INACTIVE_CHANNELS |
   1936		VC4_SET_FIELD(0x8, VC4_HDMI_AUDIO_PACKET_B_FRAME_IDENTIFIER);
   1937
   1938	channel_mask = GENMASK(channels - 1, 0);
   1939	audio_packet_config |= VC4_SET_FIELD(channel_mask,
   1940					     VC4_HDMI_AUDIO_PACKET_CEA_MASK);
   1941
   1942	/* Set the MAI threshold */
   1943	HDMI_WRITE(HDMI_MAI_THR,
   1944		   VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) |
   1945		   VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
   1946		   VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQHIGH) |
   1947		   VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_DREQLOW));
   1948
   1949	HDMI_WRITE(HDMI_MAI_CONFIG,
   1950		   VC4_HDMI_MAI_CONFIG_BIT_REVERSE |
   1951		   VC4_HDMI_MAI_CONFIG_FORMAT_REVERSE |
   1952		   VC4_SET_FIELD(channel_mask, VC4_HDMI_MAI_CHANNEL_MASK));
   1953
   1954	channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask);
   1955	HDMI_WRITE(HDMI_MAI_CHANNEL_MAP, channel_map);
   1956	HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config);
   1957
   1958	vc4_hdmi_set_n_cts(vc4_hdmi, sample_rate);
   1959
   1960	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   1961
   1962	memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));
   1963	vc4_hdmi_set_audio_infoframe(encoder);
   1964
   1965	mutex_unlock(&vc4_hdmi->mutex);
   1966
   1967	return 0;
   1968}
   1969
   1970static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = {
   1971	.name = "vc4-hdmi-cpu-dai-component",
   1972};
   1973
   1974static int vc4_hdmi_audio_cpu_dai_probe(struct snd_soc_dai *dai)
   1975{
   1976	struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
   1977
   1978	snd_soc_dai_init_dma_data(dai, &vc4_hdmi->audio.dma_data, NULL);
   1979
   1980	return 0;
   1981}
   1982
   1983static struct snd_soc_dai_driver vc4_hdmi_audio_cpu_dai_drv = {
   1984	.name = "vc4-hdmi-cpu-dai",
   1985	.probe  = vc4_hdmi_audio_cpu_dai_probe,
   1986	.playback = {
   1987		.stream_name = "Playback",
   1988		.channels_min = 1,
   1989		.channels_max = 8,
   1990		.rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
   1991			 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
   1992			 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
   1993			 SNDRV_PCM_RATE_192000,
   1994		.formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
   1995	},
   1996};
   1997
   1998static const struct snd_dmaengine_pcm_config pcm_conf = {
   1999	.chan_names[SNDRV_PCM_STREAM_PLAYBACK] = "audio-rx",
   2000	.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
   2001};
   2002
   2003static int vc4_hdmi_audio_get_eld(struct device *dev, void *data,
   2004				  uint8_t *buf, size_t len)
   2005{
   2006	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   2007	struct drm_connector *connector = &vc4_hdmi->connector;
   2008
   2009	mutex_lock(&vc4_hdmi->mutex);
   2010	memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
   2011	mutex_unlock(&vc4_hdmi->mutex);
   2012
   2013	return 0;
   2014}
   2015
   2016static const struct hdmi_codec_ops vc4_hdmi_codec_ops = {
   2017	.get_eld = vc4_hdmi_audio_get_eld,
   2018	.prepare = vc4_hdmi_audio_prepare,
   2019	.audio_shutdown = vc4_hdmi_audio_shutdown,
   2020	.audio_startup = vc4_hdmi_audio_startup,
   2021};
   2022
   2023static struct hdmi_codec_pdata vc4_hdmi_codec_pdata = {
   2024	.ops = &vc4_hdmi_codec_ops,
   2025	.max_i2s_channels = 8,
   2026	.i2s = 1,
   2027};
   2028
   2029static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
   2030{
   2031	const struct vc4_hdmi_register *mai_data =
   2032		&vc4_hdmi->variant->registers[HDMI_MAI_DATA];
   2033	struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link;
   2034	struct snd_soc_card *card = &vc4_hdmi->audio.card;
   2035	struct device *dev = &vc4_hdmi->pdev->dev;
   2036	struct platform_device *codec_pdev;
   2037	const __be32 *addr;
   2038	int index;
   2039	int ret;
   2040
   2041	if (!of_find_property(dev->of_node, "dmas", NULL)) {
   2042		dev_warn(dev,
   2043			 "'dmas' DT property is missing, no HDMI audio\n");
   2044		return 0;
   2045	}
   2046
   2047	if (mai_data->reg != VC4_HD) {
   2048		WARN_ONCE(true, "MAI isn't in the HD block\n");
   2049		return -EINVAL;
   2050	}
   2051
   2052	/*
   2053	 * Get the physical address of VC4_HD_MAI_DATA. We need to retrieve
   2054	 * the bus address specified in the DT, because the physical address
   2055	 * (the one returned by platform_get_resource()) is not appropriate
   2056	 * for DMA transfers.
   2057	 * This VC/MMU should probably be exposed to avoid this kind of hacks.
   2058	 */
   2059	index = of_property_match_string(dev->of_node, "reg-names", "hd");
   2060	/* Before BCM2711, we don't have a named register range */
   2061	if (index < 0)
   2062		index = 1;
   2063
   2064	addr = of_get_address(dev->of_node, index, NULL, NULL);
   2065
   2066	vc4_hdmi->audio.dma_data.addr = be32_to_cpup(addr) + mai_data->offset;
   2067	vc4_hdmi->audio.dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
   2068	vc4_hdmi->audio.dma_data.maxburst = 2;
   2069
   2070	ret = devm_snd_dmaengine_pcm_register(dev, &pcm_conf, 0);
   2071	if (ret) {
   2072		dev_err(dev, "Could not register PCM component: %d\n", ret);
   2073		return ret;
   2074	}
   2075
   2076	ret = devm_snd_soc_register_component(dev, &vc4_hdmi_audio_cpu_dai_comp,
   2077					      &vc4_hdmi_audio_cpu_dai_drv, 1);
   2078	if (ret) {
   2079		dev_err(dev, "Could not register CPU DAI: %d\n", ret);
   2080		return ret;
   2081	}
   2082
   2083	codec_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
   2084						   PLATFORM_DEVID_AUTO,
   2085						   &vc4_hdmi_codec_pdata,
   2086						   sizeof(vc4_hdmi_codec_pdata));
   2087	if (IS_ERR(codec_pdev)) {
   2088		dev_err(dev, "Couldn't register the HDMI codec: %ld\n", PTR_ERR(codec_pdev));
   2089		return PTR_ERR(codec_pdev);
   2090	}
   2091	vc4_hdmi->audio.codec_pdev = codec_pdev;
   2092
   2093	dai_link->cpus		= &vc4_hdmi->audio.cpu;
   2094	dai_link->codecs	= &vc4_hdmi->audio.codec;
   2095	dai_link->platforms	= &vc4_hdmi->audio.platform;
   2096
   2097	dai_link->num_cpus	= 1;
   2098	dai_link->num_codecs	= 1;
   2099	dai_link->num_platforms	= 1;
   2100
   2101	dai_link->name = "MAI";
   2102	dai_link->stream_name = "MAI PCM";
   2103	dai_link->codecs->dai_name = "i2s-hifi";
   2104	dai_link->cpus->dai_name = dev_name(dev);
   2105	dai_link->codecs->name = dev_name(&codec_pdev->dev);
   2106	dai_link->platforms->name = dev_name(dev);
   2107
   2108	card->dai_link = dai_link;
   2109	card->num_links = 1;
   2110	card->name = vc4_hdmi->variant->card_name;
   2111	card->driver_name = "vc4-hdmi";
   2112	card->dev = dev;
   2113	card->owner = THIS_MODULE;
   2114
   2115	/*
   2116	 * Be careful, snd_soc_register_card() calls dev_set_drvdata() and
   2117	 * stores a pointer to the snd card object in dev->driver_data. This
   2118	 * means we cannot use it for something else. The hdmi back-pointer is
   2119	 * now stored in card->drvdata and should be retrieved with
   2120	 * snd_soc_card_get_drvdata() if needed.
   2121	 */
   2122	snd_soc_card_set_drvdata(card, vc4_hdmi);
   2123	ret = devm_snd_soc_register_card(dev, card);
   2124	if (ret)
   2125		dev_err_probe(dev, ret, "Could not register sound card\n");
   2126
   2127	return ret;
   2128
   2129}
   2130
   2131static void vc4_hdmi_audio_exit(struct vc4_hdmi *vc4_hdmi)
   2132{
   2133	platform_device_unregister(vc4_hdmi->audio.codec_pdev);
   2134	vc4_hdmi->audio.codec_pdev = NULL;
   2135}
   2136
   2137static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
   2138{
   2139	struct vc4_hdmi *vc4_hdmi = priv;
   2140	struct drm_connector *connector = &vc4_hdmi->connector;
   2141	struct drm_device *dev = connector->dev;
   2142
   2143	if (dev && dev->registered)
   2144		drm_connector_helper_hpd_irq_event(connector);
   2145
   2146	return IRQ_HANDLED;
   2147}
   2148
   2149static int vc4_hdmi_hotplug_init(struct vc4_hdmi *vc4_hdmi)
   2150{
   2151	struct drm_connector *connector = &vc4_hdmi->connector;
   2152	struct platform_device *pdev = vc4_hdmi->pdev;
   2153	int ret;
   2154
   2155	if (vc4_hdmi->variant->external_irq_controller) {
   2156		unsigned int hpd_con = platform_get_irq_byname(pdev, "hpd-connected");
   2157		unsigned int hpd_rm = platform_get_irq_byname(pdev, "hpd-removed");
   2158
   2159		ret = request_threaded_irq(hpd_con,
   2160					   NULL,
   2161					   vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
   2162					   "vc4 hdmi hpd connected", vc4_hdmi);
   2163		if (ret)
   2164			return ret;
   2165
   2166		ret = request_threaded_irq(hpd_rm,
   2167					   NULL,
   2168					   vc4_hdmi_hpd_irq_thread, IRQF_ONESHOT,
   2169					   "vc4 hdmi hpd disconnected", vc4_hdmi);
   2170		if (ret) {
   2171			free_irq(hpd_con, vc4_hdmi);
   2172			return ret;
   2173		}
   2174
   2175		connector->polled = DRM_CONNECTOR_POLL_HPD;
   2176	}
   2177
   2178	return 0;
   2179}
   2180
   2181static void vc4_hdmi_hotplug_exit(struct vc4_hdmi *vc4_hdmi)
   2182{
   2183	struct platform_device *pdev = vc4_hdmi->pdev;
   2184
   2185	if (vc4_hdmi->variant->external_irq_controller) {
   2186		free_irq(platform_get_irq_byname(pdev, "hpd-connected"), vc4_hdmi);
   2187		free_irq(platform_get_irq_byname(pdev, "hpd-removed"), vc4_hdmi);
   2188	}
   2189}
   2190
   2191#ifdef CONFIG_DRM_VC4_HDMI_CEC
   2192static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv)
   2193{
   2194	struct vc4_hdmi *vc4_hdmi = priv;
   2195
   2196	if (vc4_hdmi->cec_rx_msg.len)
   2197		cec_received_msg(vc4_hdmi->cec_adap,
   2198				 &vc4_hdmi->cec_rx_msg);
   2199
   2200	return IRQ_HANDLED;
   2201}
   2202
   2203static irqreturn_t vc4_cec_irq_handler_tx_thread(int irq, void *priv)
   2204{
   2205	struct vc4_hdmi *vc4_hdmi = priv;
   2206
   2207	if (vc4_hdmi->cec_tx_ok) {
   2208		cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK,
   2209				  0, 0, 0, 0);
   2210	} else {
   2211		/*
   2212		 * This CEC implementation makes 1 retry, so if we
   2213		 * get a NACK, then that means it made 2 attempts.
   2214		 */
   2215		cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK,
   2216				  0, 2, 0, 0);
   2217	}
   2218	return IRQ_HANDLED;
   2219}
   2220
   2221static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv)
   2222{
   2223	struct vc4_hdmi *vc4_hdmi = priv;
   2224	irqreturn_t ret;
   2225
   2226	if (vc4_hdmi->cec_irq_was_rx)
   2227		ret = vc4_cec_irq_handler_rx_thread(irq, priv);
   2228	else
   2229		ret = vc4_cec_irq_handler_tx_thread(irq, priv);
   2230
   2231	return ret;
   2232}
   2233
   2234static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1)
   2235{
   2236	struct drm_device *dev = vc4_hdmi->connector.dev;
   2237	struct cec_msg *msg = &vc4_hdmi->cec_rx_msg;
   2238	unsigned int i;
   2239
   2240	lockdep_assert_held(&vc4_hdmi->hw_lock);
   2241
   2242	msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >>
   2243					VC4_HDMI_CEC_REC_WRD_CNT_SHIFT);
   2244
   2245	if (msg->len > 16) {
   2246		drm_err(dev, "Attempting to read too much data (%d)\n", msg->len);
   2247		return;
   2248	}
   2249
   2250	for (i = 0; i < msg->len; i += 4) {
   2251		u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + (i >> 2));
   2252
   2253		msg->msg[i] = val & 0xff;
   2254		msg->msg[i + 1] = (val >> 8) & 0xff;
   2255		msg->msg[i + 2] = (val >> 16) & 0xff;
   2256		msg->msg[i + 3] = (val >> 24) & 0xff;
   2257	}
   2258}
   2259
   2260static irqreturn_t vc4_cec_irq_handler_tx_bare_locked(struct vc4_hdmi *vc4_hdmi)
   2261{
   2262	u32 cntrl1;
   2263
   2264	lockdep_assert_held(&vc4_hdmi->hw_lock);
   2265
   2266	cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
   2267	vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
   2268	cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
   2269	HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
   2270
   2271	return IRQ_WAKE_THREAD;
   2272}
   2273
   2274static irqreturn_t vc4_cec_irq_handler_tx_bare(int irq, void *priv)
   2275{
   2276	struct vc4_hdmi *vc4_hdmi = priv;
   2277	irqreturn_t ret;
   2278
   2279	spin_lock(&vc4_hdmi->hw_lock);
   2280	ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi);
   2281	spin_unlock(&vc4_hdmi->hw_lock);
   2282
   2283	return ret;
   2284}
   2285
   2286static irqreturn_t vc4_cec_irq_handler_rx_bare_locked(struct vc4_hdmi *vc4_hdmi)
   2287{
   2288	u32 cntrl1;
   2289
   2290	lockdep_assert_held(&vc4_hdmi->hw_lock);
   2291
   2292	vc4_hdmi->cec_rx_msg.len = 0;
   2293	cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
   2294	vc4_cec_read_msg(vc4_hdmi, cntrl1);
   2295	cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
   2296	HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
   2297	cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF;
   2298
   2299	HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1);
   2300
   2301	return IRQ_WAKE_THREAD;
   2302}
   2303
   2304static irqreturn_t vc4_cec_irq_handler_rx_bare(int irq, void *priv)
   2305{
   2306	struct vc4_hdmi *vc4_hdmi = priv;
   2307	irqreturn_t ret;
   2308
   2309	spin_lock(&vc4_hdmi->hw_lock);
   2310	ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi);
   2311	spin_unlock(&vc4_hdmi->hw_lock);
   2312
   2313	return ret;
   2314}
   2315
   2316static irqreturn_t vc4_cec_irq_handler(int irq, void *priv)
   2317{
   2318	struct vc4_hdmi *vc4_hdmi = priv;
   2319	u32 stat = HDMI_READ(HDMI_CEC_CPU_STATUS);
   2320	irqreturn_t ret;
   2321	u32 cntrl5;
   2322
   2323	if (!(stat & VC4_HDMI_CPU_CEC))
   2324		return IRQ_NONE;
   2325
   2326	spin_lock(&vc4_hdmi->hw_lock);
   2327	cntrl5 = HDMI_READ(HDMI_CEC_CNTRL_5);
   2328	vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT;
   2329	if (vc4_hdmi->cec_irq_was_rx)
   2330		ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi);
   2331	else
   2332		ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi);
   2333
   2334	HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC);
   2335	spin_unlock(&vc4_hdmi->hw_lock);
   2336
   2337	return ret;
   2338}
   2339
   2340static int vc4_hdmi_cec_enable(struct cec_adapter *adap)
   2341{
   2342	struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
   2343	/* clock period in microseconds */
   2344	const u32 usecs = 1000000 / CEC_CLOCK_FREQ;
   2345	unsigned long flags;
   2346	u32 val;
   2347	int ret;
   2348
   2349	/*
   2350	 * NOTE: This function should really take vc4_hdmi->mutex, but doing so
   2351	 * results in a reentrancy since cec_s_phys_addr_from_edid() called in
   2352	 * .detect or .get_modes might call .adap_enable, which leads to this
   2353	 * function being called with that mutex held.
   2354	 *
   2355	 * Concurrency is not an issue for the moment since we don't share any
   2356	 * state with KMS, so we can ignore the lock for now, but we need to
   2357	 * keep it in mind if we were to change that assumption.
   2358	 */
   2359
   2360	ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev);
   2361	if (ret)
   2362		return ret;
   2363
   2364	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2365
   2366	val = HDMI_READ(HDMI_CEC_CNTRL_5);
   2367	val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET |
   2368		 VC4_HDMI_CEC_CNT_TO_4700_US_MASK |
   2369		 VC4_HDMI_CEC_CNT_TO_4500_US_MASK);
   2370	val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) |
   2371	       ((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT);
   2372
   2373	HDMI_WRITE(HDMI_CEC_CNTRL_5, val |
   2374		   VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
   2375	HDMI_WRITE(HDMI_CEC_CNTRL_5, val);
   2376	HDMI_WRITE(HDMI_CEC_CNTRL_2,
   2377		   ((1500 / usecs) << VC4_HDMI_CEC_CNT_TO_1500_US_SHIFT) |
   2378		   ((1300 / usecs) << VC4_HDMI_CEC_CNT_TO_1300_US_SHIFT) |
   2379		   ((800 / usecs) << VC4_HDMI_CEC_CNT_TO_800_US_SHIFT) |
   2380		   ((600 / usecs) << VC4_HDMI_CEC_CNT_TO_600_US_SHIFT) |
   2381		   ((400 / usecs) << VC4_HDMI_CEC_CNT_TO_400_US_SHIFT));
   2382	HDMI_WRITE(HDMI_CEC_CNTRL_3,
   2383		   ((2750 / usecs) << VC4_HDMI_CEC_CNT_TO_2750_US_SHIFT) |
   2384		   ((2400 / usecs) << VC4_HDMI_CEC_CNT_TO_2400_US_SHIFT) |
   2385		   ((2050 / usecs) << VC4_HDMI_CEC_CNT_TO_2050_US_SHIFT) |
   2386		   ((1700 / usecs) << VC4_HDMI_CEC_CNT_TO_1700_US_SHIFT));
   2387	HDMI_WRITE(HDMI_CEC_CNTRL_4,
   2388		   ((4300 / usecs) << VC4_HDMI_CEC_CNT_TO_4300_US_SHIFT) |
   2389		   ((3900 / usecs) << VC4_HDMI_CEC_CNT_TO_3900_US_SHIFT) |
   2390		   ((3600 / usecs) << VC4_HDMI_CEC_CNT_TO_3600_US_SHIFT) |
   2391		   ((3500 / usecs) << VC4_HDMI_CEC_CNT_TO_3500_US_SHIFT));
   2392
   2393	if (!vc4_hdmi->variant->external_irq_controller)
   2394		HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC);
   2395
   2396	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2397
   2398	return 0;
   2399}
   2400
   2401static int vc4_hdmi_cec_disable(struct cec_adapter *adap)
   2402{
   2403	struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
   2404	unsigned long flags;
   2405
   2406	/*
   2407	 * NOTE: This function should really take vc4_hdmi->mutex, but doing so
   2408	 * results in a reentrancy since cec_s_phys_addr_from_edid() called in
   2409	 * .detect or .get_modes might call .adap_enable, which leads to this
   2410	 * function being called with that mutex held.
   2411	 *
   2412	 * Concurrency is not an issue for the moment since we don't share any
   2413	 * state with KMS, so we can ignore the lock for now, but we need to
   2414	 * keep it in mind if we were to change that assumption.
   2415	 */
   2416
   2417	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2418
   2419	if (!vc4_hdmi->variant->external_irq_controller)
   2420		HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC);
   2421
   2422	HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) |
   2423		   VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
   2424
   2425	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2426
   2427	pm_runtime_put(&vc4_hdmi->pdev->dev);
   2428
   2429	return 0;
   2430}
   2431
   2432static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)
   2433{
   2434	if (enable)
   2435		return vc4_hdmi_cec_enable(adap);
   2436	else
   2437		return vc4_hdmi_cec_disable(adap);
   2438}
   2439
   2440static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
   2441{
   2442	struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
   2443	unsigned long flags;
   2444
   2445	/*
   2446	 * NOTE: This function should really take vc4_hdmi->mutex, but doing so
   2447	 * results in a reentrancy since cec_s_phys_addr_from_edid() called in
   2448	 * .detect or .get_modes might call .adap_enable, which leads to this
   2449	 * function being called with that mutex held.
   2450	 *
   2451	 * Concurrency is not an issue for the moment since we don't share any
   2452	 * state with KMS, so we can ignore the lock for now, but we need to
   2453	 * keep it in mind if we were to change that assumption.
   2454	 */
   2455
   2456	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2457	HDMI_WRITE(HDMI_CEC_CNTRL_1,
   2458		   (HDMI_READ(HDMI_CEC_CNTRL_1) & ~VC4_HDMI_CEC_ADDR_MASK) |
   2459		   (log_addr & 0xf) << VC4_HDMI_CEC_ADDR_SHIFT);
   2460	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2461
   2462	return 0;
   2463}
   2464
   2465static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
   2466				      u32 signal_free_time, struct cec_msg *msg)
   2467{
   2468	struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
   2469	struct drm_device *dev = vc4_hdmi->connector.dev;
   2470	unsigned long flags;
   2471	u32 val;
   2472	unsigned int i;
   2473
   2474	/*
   2475	 * NOTE: This function should really take vc4_hdmi->mutex, but doing so
   2476	 * results in a reentrancy since cec_s_phys_addr_from_edid() called in
   2477	 * .detect or .get_modes might call .adap_enable, which leads to this
   2478	 * function being called with that mutex held.
   2479	 *
   2480	 * Concurrency is not an issue for the moment since we don't share any
   2481	 * state with KMS, so we can ignore the lock for now, but we need to
   2482	 * keep it in mind if we were to change that assumption.
   2483	 */
   2484
   2485	if (msg->len > 16) {
   2486		drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len);
   2487		return -ENOMEM;
   2488	}
   2489
   2490	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2491
   2492	for (i = 0; i < msg->len; i += 4)
   2493		HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2),
   2494			   (msg->msg[i]) |
   2495			   (msg->msg[i + 1] << 8) |
   2496			   (msg->msg[i + 2] << 16) |
   2497			   (msg->msg[i + 3] << 24));
   2498
   2499	val = HDMI_READ(HDMI_CEC_CNTRL_1);
   2500	val &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
   2501	HDMI_WRITE(HDMI_CEC_CNTRL_1, val);
   2502	val &= ~VC4_HDMI_CEC_MESSAGE_LENGTH_MASK;
   2503	val |= (msg->len - 1) << VC4_HDMI_CEC_MESSAGE_LENGTH_SHIFT;
   2504	val |= VC4_HDMI_CEC_START_XMIT_BEGIN;
   2505
   2506	HDMI_WRITE(HDMI_CEC_CNTRL_1, val);
   2507
   2508	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2509
   2510	return 0;
   2511}
   2512
   2513static const struct cec_adap_ops vc4_hdmi_cec_adap_ops = {
   2514	.adap_enable = vc4_hdmi_cec_adap_enable,
   2515	.adap_log_addr = vc4_hdmi_cec_adap_log_addr,
   2516	.adap_transmit = vc4_hdmi_cec_adap_transmit,
   2517};
   2518
   2519static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
   2520{
   2521	struct cec_connector_info conn_info;
   2522	struct platform_device *pdev = vc4_hdmi->pdev;
   2523	struct device *dev = &pdev->dev;
   2524	unsigned long flags;
   2525	u32 value;
   2526	int ret;
   2527
   2528	if (!of_find_property(dev->of_node, "interrupts", NULL)) {
   2529		dev_warn(dev, "'interrupts' DT property is missing, no CEC\n");
   2530		return 0;
   2531	}
   2532
   2533	vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops,
   2534						  vc4_hdmi, "vc4",
   2535						  CEC_CAP_DEFAULTS |
   2536						  CEC_CAP_CONNECTOR_INFO, 1);
   2537	ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap);
   2538	if (ret < 0)
   2539		return ret;
   2540
   2541	cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
   2542	cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
   2543
   2544	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2545	value = HDMI_READ(HDMI_CEC_CNTRL_1);
   2546	/* Set the logical address to Unregistered */
   2547	value |= VC4_HDMI_CEC_ADDR_MASK;
   2548	HDMI_WRITE(HDMI_CEC_CNTRL_1, value);
   2549	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2550
   2551	vc4_hdmi_cec_update_clk_div(vc4_hdmi);
   2552
   2553	if (vc4_hdmi->variant->external_irq_controller) {
   2554		ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-rx"),
   2555					   vc4_cec_irq_handler_rx_bare,
   2556					   vc4_cec_irq_handler_rx_thread, 0,
   2557					   "vc4 hdmi cec rx", vc4_hdmi);
   2558		if (ret)
   2559			goto err_delete_cec_adap;
   2560
   2561		ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-tx"),
   2562					   vc4_cec_irq_handler_tx_bare,
   2563					   vc4_cec_irq_handler_tx_thread, 0,
   2564					   "vc4 hdmi cec tx", vc4_hdmi);
   2565		if (ret)
   2566			goto err_remove_cec_rx_handler;
   2567	} else {
   2568		spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
   2569		HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff);
   2570		spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
   2571
   2572		ret = request_threaded_irq(platform_get_irq(pdev, 0),
   2573					   vc4_cec_irq_handler,
   2574					   vc4_cec_irq_handler_thread, 0,
   2575					   "vc4 hdmi cec", vc4_hdmi);
   2576		if (ret)
   2577			goto err_delete_cec_adap;
   2578	}
   2579
   2580	ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev);
   2581	if (ret < 0)
   2582		goto err_remove_handlers;
   2583
   2584	return 0;
   2585
   2586err_remove_handlers:
   2587	if (vc4_hdmi->variant->external_irq_controller)
   2588		free_irq(platform_get_irq_byname(pdev, "cec-tx"), vc4_hdmi);
   2589	else
   2590		free_irq(platform_get_irq(pdev, 0), vc4_hdmi);
   2591
   2592err_remove_cec_rx_handler:
   2593	if (vc4_hdmi->variant->external_irq_controller)
   2594		free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi);
   2595
   2596err_delete_cec_adap:
   2597	cec_delete_adapter(vc4_hdmi->cec_adap);
   2598
   2599	return ret;
   2600}
   2601
   2602static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi)
   2603{
   2604	struct platform_device *pdev = vc4_hdmi->pdev;
   2605
   2606	if (vc4_hdmi->variant->external_irq_controller) {
   2607		free_irq(platform_get_irq_byname(pdev, "cec-rx"), vc4_hdmi);
   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
   2613	cec_unregister_adapter(vc4_hdmi->cec_adap);
   2614}
   2615#else
   2616static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
   2617{
   2618	return 0;
   2619}
   2620
   2621static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {};
   2622
   2623#endif
   2624
   2625static int vc4_hdmi_build_regset(struct vc4_hdmi *vc4_hdmi,
   2626				 struct debugfs_regset32 *regset,
   2627				 enum vc4_hdmi_regs reg)
   2628{
   2629	const struct vc4_hdmi_variant *variant = vc4_hdmi->variant;
   2630	struct debugfs_reg32 *regs, *new_regs;
   2631	unsigned int count = 0;
   2632	unsigned int i;
   2633
   2634	regs = kcalloc(variant->num_registers, sizeof(*regs),
   2635		       GFP_KERNEL);
   2636	if (!regs)
   2637		return -ENOMEM;
   2638
   2639	for (i = 0; i < variant->num_registers; i++) {
   2640		const struct vc4_hdmi_register *field =	&variant->registers[i];
   2641
   2642		if (field->reg != reg)
   2643			continue;
   2644
   2645		regs[count].name = field->name;
   2646		regs[count].offset = field->offset;
   2647		count++;
   2648	}
   2649
   2650	new_regs = krealloc(regs, count * sizeof(*regs), GFP_KERNEL);
   2651	if (!new_regs)
   2652		return -ENOMEM;
   2653
   2654	regset->base = __vc4_hdmi_get_field_base(vc4_hdmi, reg);
   2655	regset->regs = new_regs;
   2656	regset->nregs = count;
   2657
   2658	return 0;
   2659}
   2660
   2661static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
   2662{
   2663	struct platform_device *pdev = vc4_hdmi->pdev;
   2664	struct device *dev = &pdev->dev;
   2665	int ret;
   2666
   2667	vc4_hdmi->hdmicore_regs = vc4_ioremap_regs(pdev, 0);
   2668	if (IS_ERR(vc4_hdmi->hdmicore_regs))
   2669		return PTR_ERR(vc4_hdmi->hdmicore_regs);
   2670
   2671	vc4_hdmi->hd_regs = vc4_ioremap_regs(pdev, 1);
   2672	if (IS_ERR(vc4_hdmi->hd_regs))
   2673		return PTR_ERR(vc4_hdmi->hd_regs);
   2674
   2675	ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD);
   2676	if (ret)
   2677		return ret;
   2678
   2679	ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI);
   2680	if (ret)
   2681		return ret;
   2682
   2683	vc4_hdmi->pixel_clock = devm_clk_get(dev, "pixel");
   2684	if (IS_ERR(vc4_hdmi->pixel_clock)) {
   2685		ret = PTR_ERR(vc4_hdmi->pixel_clock);
   2686		if (ret != -EPROBE_DEFER)
   2687			DRM_ERROR("Failed to get pixel clock\n");
   2688		return ret;
   2689	}
   2690
   2691	vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi");
   2692	if (IS_ERR(vc4_hdmi->hsm_clock)) {
   2693		DRM_ERROR("Failed to get HDMI state machine clock\n");
   2694		return PTR_ERR(vc4_hdmi->hsm_clock);
   2695	}
   2696	vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock;
   2697	vc4_hdmi->cec_clock = vc4_hdmi->hsm_clock;
   2698
   2699	return 0;
   2700}
   2701
   2702static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
   2703{
   2704	struct platform_device *pdev = vc4_hdmi->pdev;
   2705	struct device *dev = &pdev->dev;
   2706	struct resource *res;
   2707
   2708	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi");
   2709	if (!res)
   2710		return -ENODEV;
   2711
   2712	vc4_hdmi->hdmicore_regs = devm_ioremap(dev, res->start,
   2713					       resource_size(res));
   2714	if (!vc4_hdmi->hdmicore_regs)
   2715		return -ENOMEM;
   2716
   2717	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hd");
   2718	if (!res)
   2719		return -ENODEV;
   2720
   2721	vc4_hdmi->hd_regs = devm_ioremap(dev, res->start, resource_size(res));
   2722	if (!vc4_hdmi->hd_regs)
   2723		return -ENOMEM;
   2724
   2725	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cec");
   2726	if (!res)
   2727		return -ENODEV;
   2728
   2729	vc4_hdmi->cec_regs = devm_ioremap(dev, res->start, resource_size(res));
   2730	if (!vc4_hdmi->cec_regs)
   2731		return -ENOMEM;
   2732
   2733	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csc");
   2734	if (!res)
   2735		return -ENODEV;
   2736
   2737	vc4_hdmi->csc_regs = devm_ioremap(dev, res->start, resource_size(res));
   2738	if (!vc4_hdmi->csc_regs)
   2739		return -ENOMEM;
   2740
   2741	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dvp");
   2742	if (!res)
   2743		return -ENODEV;
   2744
   2745	vc4_hdmi->dvp_regs = devm_ioremap(dev, res->start, resource_size(res));
   2746	if (!vc4_hdmi->dvp_regs)
   2747		return -ENOMEM;
   2748
   2749	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
   2750	if (!res)
   2751		return -ENODEV;
   2752
   2753	vc4_hdmi->phy_regs = devm_ioremap(dev, res->start, resource_size(res));
   2754	if (!vc4_hdmi->phy_regs)
   2755		return -ENOMEM;
   2756
   2757	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "packet");
   2758	if (!res)
   2759		return -ENODEV;
   2760
   2761	vc4_hdmi->ram_regs = devm_ioremap(dev, res->start, resource_size(res));
   2762	if (!vc4_hdmi->ram_regs)
   2763		return -ENOMEM;
   2764
   2765	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rm");
   2766	if (!res)
   2767		return -ENODEV;
   2768
   2769	vc4_hdmi->rm_regs = devm_ioremap(dev, res->start, resource_size(res));
   2770	if (!vc4_hdmi->rm_regs)
   2771		return -ENOMEM;
   2772
   2773	vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi");
   2774	if (IS_ERR(vc4_hdmi->hsm_clock)) {
   2775		DRM_ERROR("Failed to get HDMI state machine clock\n");
   2776		return PTR_ERR(vc4_hdmi->hsm_clock);
   2777	}
   2778
   2779	vc4_hdmi->pixel_bvb_clock = devm_clk_get(dev, "bvb");
   2780	if (IS_ERR(vc4_hdmi->pixel_bvb_clock)) {
   2781		DRM_ERROR("Failed to get pixel bvb clock\n");
   2782		return PTR_ERR(vc4_hdmi->pixel_bvb_clock);
   2783	}
   2784
   2785	vc4_hdmi->audio_clock = devm_clk_get(dev, "audio");
   2786	if (IS_ERR(vc4_hdmi->audio_clock)) {
   2787		DRM_ERROR("Failed to get audio clock\n");
   2788		return PTR_ERR(vc4_hdmi->audio_clock);
   2789	}
   2790
   2791	vc4_hdmi->cec_clock = devm_clk_get(dev, "cec");
   2792	if (IS_ERR(vc4_hdmi->cec_clock)) {
   2793		DRM_ERROR("Failed to get CEC clock\n");
   2794		return PTR_ERR(vc4_hdmi->cec_clock);
   2795	}
   2796
   2797	vc4_hdmi->reset = devm_reset_control_get(dev, NULL);
   2798	if (IS_ERR(vc4_hdmi->reset)) {
   2799		DRM_ERROR("Failed to get HDMI reset line\n");
   2800		return PTR_ERR(vc4_hdmi->reset);
   2801	}
   2802
   2803	return 0;
   2804}
   2805
   2806static int __maybe_unused vc4_hdmi_runtime_suspend(struct device *dev)
   2807{
   2808	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   2809
   2810	clk_disable_unprepare(vc4_hdmi->hsm_clock);
   2811
   2812	return 0;
   2813}
   2814
   2815static int vc4_hdmi_runtime_resume(struct device *dev)
   2816{
   2817	struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
   2818	int ret;
   2819
   2820	ret = clk_prepare_enable(vc4_hdmi->hsm_clock);
   2821	if (ret)
   2822		return ret;
   2823
   2824	return 0;
   2825}
   2826
   2827static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data)
   2828{
   2829	const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev);
   2830	struct platform_device *pdev = to_platform_device(dev);
   2831	struct drm_device *drm = dev_get_drvdata(master);
   2832	struct vc4_hdmi *vc4_hdmi;
   2833	struct drm_encoder *encoder;
   2834	struct device_node *ddc_node;
   2835	int ret;
   2836
   2837	vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL);
   2838	if (!vc4_hdmi)
   2839		return -ENOMEM;
   2840	mutex_init(&vc4_hdmi->mutex);
   2841	spin_lock_init(&vc4_hdmi->hw_lock);
   2842	INIT_DELAYED_WORK(&vc4_hdmi->scrambling_work, vc4_hdmi_scrambling_wq);
   2843
   2844	dev_set_drvdata(dev, vc4_hdmi);
   2845	encoder = &vc4_hdmi->encoder.base;
   2846	vc4_hdmi->encoder.type = variant->encoder_type;
   2847	vc4_hdmi->encoder.pre_crtc_configure = vc4_hdmi_encoder_pre_crtc_configure;
   2848	vc4_hdmi->encoder.pre_crtc_enable = vc4_hdmi_encoder_pre_crtc_enable;
   2849	vc4_hdmi->encoder.post_crtc_enable = vc4_hdmi_encoder_post_crtc_enable;
   2850	vc4_hdmi->encoder.post_crtc_disable = vc4_hdmi_encoder_post_crtc_disable;
   2851	vc4_hdmi->encoder.post_crtc_powerdown = vc4_hdmi_encoder_post_crtc_powerdown;
   2852	vc4_hdmi->pdev = pdev;
   2853	vc4_hdmi->variant = variant;
   2854
   2855	/*
   2856	 * Since we don't know the state of the controller and its
   2857	 * display (if any), let's assume it's always enabled.
   2858	 * vc4_hdmi_disable_scrambling() will thus run at boot, make
   2859	 * sure it's disabled, and avoid any inconsistency.
   2860	 */
   2861	if (variant->max_pixel_clock > HDMI_14_MAX_TMDS_CLK)
   2862		vc4_hdmi->scdc_enabled = true;
   2863
   2864	ret = variant->init_resources(vc4_hdmi);
   2865	if (ret)
   2866		return ret;
   2867
   2868	ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
   2869	if (!ddc_node) {
   2870		DRM_ERROR("Failed to find ddc node in device tree\n");
   2871		return -ENODEV;
   2872	}
   2873
   2874	vc4_hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node);
   2875	of_node_put(ddc_node);
   2876	if (!vc4_hdmi->ddc) {
   2877		DRM_DEBUG("Failed to get ddc i2c adapter by node\n");
   2878		return -EPROBE_DEFER;
   2879	}
   2880
   2881	/* Only use the GPIO HPD pin if present in the DT, otherwise
   2882	 * we'll use the HDMI core's register.
   2883	 */
   2884	vc4_hdmi->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
   2885	if (IS_ERR(vc4_hdmi->hpd_gpio)) {
   2886		ret = PTR_ERR(vc4_hdmi->hpd_gpio);
   2887		goto err_put_ddc;
   2888	}
   2889
   2890	vc4_hdmi->disable_wifi_frequencies =
   2891		of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence");
   2892
   2893	if (variant->max_pixel_clock == 600000000) {
   2894		struct vc4_dev *vc4 = to_vc4_dev(drm);
   2895		long max_rate = clk_round_rate(vc4->hvs->core_clk, 550000000);
   2896
   2897		if (max_rate < 550000000)
   2898			vc4_hdmi->disable_4kp60 = true;
   2899	}
   2900
   2901	/*
   2902	 * We need to have the device powered up at this point to call
   2903	 * our reset hook and for the CEC init.
   2904	 */
   2905	ret = vc4_hdmi_runtime_resume(dev);
   2906	if (ret)
   2907		goto err_put_ddc;
   2908
   2909	pm_runtime_get_noresume(dev);
   2910	pm_runtime_set_active(dev);
   2911	pm_runtime_enable(dev);
   2912
   2913	if (vc4_hdmi->variant->reset)
   2914		vc4_hdmi->variant->reset(vc4_hdmi);
   2915
   2916	if ((of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi0") ||
   2917	     of_device_is_compatible(dev->of_node, "brcm,bcm2711-hdmi1")) &&
   2918	    HDMI_READ(HDMI_VID_CTL) & VC4_HD_VID_CTL_ENABLE) {
   2919		clk_prepare_enable(vc4_hdmi->pixel_clock);
   2920		clk_prepare_enable(vc4_hdmi->hsm_clock);
   2921		clk_prepare_enable(vc4_hdmi->pixel_bvb_clock);
   2922	}
   2923
   2924	drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
   2925	drm_encoder_helper_add(encoder, &vc4_hdmi_encoder_helper_funcs);
   2926
   2927	ret = vc4_hdmi_connector_init(drm, vc4_hdmi);
   2928	if (ret)
   2929		goto err_destroy_encoder;
   2930
   2931	ret = vc4_hdmi_hotplug_init(vc4_hdmi);
   2932	if (ret)
   2933		goto err_destroy_conn;
   2934
   2935	ret = vc4_hdmi_cec_init(vc4_hdmi);
   2936	if (ret)
   2937		goto err_free_hotplug;
   2938
   2939	ret = vc4_hdmi_audio_init(vc4_hdmi);
   2940	if (ret)
   2941		goto err_free_cec;
   2942
   2943	vc4_debugfs_add_file(drm, variant->debugfs_name,
   2944			     vc4_hdmi_debugfs_regs,
   2945			     vc4_hdmi);
   2946
   2947	pm_runtime_put_sync(dev);
   2948
   2949	return 0;
   2950
   2951err_free_cec:
   2952	vc4_hdmi_cec_exit(vc4_hdmi);
   2953err_free_hotplug:
   2954	vc4_hdmi_hotplug_exit(vc4_hdmi);
   2955err_destroy_conn:
   2956	vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
   2957err_destroy_encoder:
   2958	drm_encoder_cleanup(encoder);
   2959	pm_runtime_put_sync(dev);
   2960	pm_runtime_disable(dev);
   2961err_put_ddc:
   2962	put_device(&vc4_hdmi->ddc->dev);
   2963
   2964	return ret;
   2965}
   2966
   2967static void vc4_hdmi_unbind(struct device *dev, struct device *master,
   2968			    void *data)
   2969{
   2970	struct vc4_hdmi *vc4_hdmi;
   2971
   2972	/*
   2973	 * ASoC makes it a bit hard to retrieve a pointer to the
   2974	 * vc4_hdmi structure. Registering the card will overwrite our
   2975	 * device drvdata with a pointer to the snd_soc_card structure,
   2976	 * which can then be used to retrieve whatever drvdata we want
   2977	 * to associate.
   2978	 *
   2979	 * However, that doesn't fly in the case where we wouldn't
   2980	 * register an ASoC card (because of an old DT that is missing
   2981	 * the dmas properties for example), then the card isn't
   2982	 * registered and the device drvdata wouldn't be set.
   2983	 *
   2984	 * We can deal with both cases by making sure a snd_soc_card
   2985	 * pointer and a vc4_hdmi structure are pointing to the same
   2986	 * memory address, so we can treat them indistinctly without any
   2987	 * issue.
   2988	 */
   2989	BUILD_BUG_ON(offsetof(struct vc4_hdmi_audio, card) != 0);
   2990	BUILD_BUG_ON(offsetof(struct vc4_hdmi, audio) != 0);
   2991	vc4_hdmi = dev_get_drvdata(dev);
   2992
   2993	kfree(vc4_hdmi->hdmi_regset.regs);
   2994	kfree(vc4_hdmi->hd_regset.regs);
   2995
   2996	vc4_hdmi_audio_exit(vc4_hdmi);
   2997	vc4_hdmi_cec_exit(vc4_hdmi);
   2998	vc4_hdmi_hotplug_exit(vc4_hdmi);
   2999	vc4_hdmi_connector_destroy(&vc4_hdmi->connector);
   3000	drm_encoder_cleanup(&vc4_hdmi->encoder.base);
   3001
   3002	pm_runtime_disable(dev);
   3003
   3004	put_device(&vc4_hdmi->ddc->dev);
   3005}
   3006
   3007static const struct component_ops vc4_hdmi_ops = {
   3008	.bind   = vc4_hdmi_bind,
   3009	.unbind = vc4_hdmi_unbind,
   3010};
   3011
   3012static int vc4_hdmi_dev_probe(struct platform_device *pdev)
   3013{
   3014	return component_add(&pdev->dev, &vc4_hdmi_ops);
   3015}
   3016
   3017static int vc4_hdmi_dev_remove(struct platform_device *pdev)
   3018{
   3019	component_del(&pdev->dev, &vc4_hdmi_ops);
   3020	return 0;
   3021}
   3022
   3023static const struct vc4_hdmi_variant bcm2835_variant = {
   3024	.encoder_type		= VC4_ENCODER_TYPE_HDMI0,
   3025	.debugfs_name		= "hdmi_regs",
   3026	.card_name		= "vc4-hdmi",
   3027	.max_pixel_clock	= 162000000,
   3028	.registers		= vc4_hdmi_fields,
   3029	.num_registers		= ARRAY_SIZE(vc4_hdmi_fields),
   3030
   3031	.init_resources		= vc4_hdmi_init_resources,
   3032	.csc_setup		= vc4_hdmi_csc_setup,
   3033	.reset			= vc4_hdmi_reset,
   3034	.set_timings		= vc4_hdmi_set_timings,
   3035	.phy_init		= vc4_hdmi_phy_init,
   3036	.phy_disable		= vc4_hdmi_phy_disable,
   3037	.phy_rng_enable		= vc4_hdmi_phy_rng_enable,
   3038	.phy_rng_disable	= vc4_hdmi_phy_rng_disable,
   3039	.channel_map		= vc4_hdmi_channel_map,
   3040	.supports_hdr		= false,
   3041};
   3042
   3043static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = {
   3044	.encoder_type		= VC4_ENCODER_TYPE_HDMI0,
   3045	.debugfs_name		= "hdmi0_regs",
   3046	.card_name		= "vc4-hdmi-0",
   3047	.max_pixel_clock	= 600000000,
   3048	.registers		= vc5_hdmi_hdmi0_fields,
   3049	.num_registers		= ARRAY_SIZE(vc5_hdmi_hdmi0_fields),
   3050	.phy_lane_mapping	= {
   3051		PHY_LANE_0,
   3052		PHY_LANE_1,
   3053		PHY_LANE_2,
   3054		PHY_LANE_CK,
   3055	},
   3056	.unsupported_odd_h_timings	= true,
   3057	.external_irq_controller	= true,
   3058
   3059	.init_resources		= vc5_hdmi_init_resources,
   3060	.csc_setup		= vc5_hdmi_csc_setup,
   3061	.reset			= vc5_hdmi_reset,
   3062	.set_timings		= vc5_hdmi_set_timings,
   3063	.phy_init		= vc5_hdmi_phy_init,
   3064	.phy_disable		= vc5_hdmi_phy_disable,
   3065	.phy_rng_enable		= vc5_hdmi_phy_rng_enable,
   3066	.phy_rng_disable	= vc5_hdmi_phy_rng_disable,
   3067	.channel_map		= vc5_hdmi_channel_map,
   3068	.supports_hdr		= true,
   3069	.hp_detect		= vc5_hdmi_hp_detect,
   3070};
   3071
   3072static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
   3073	.encoder_type		= VC4_ENCODER_TYPE_HDMI1,
   3074	.debugfs_name		= "hdmi1_regs",
   3075	.card_name		= "vc4-hdmi-1",
   3076	.max_pixel_clock	= HDMI_14_MAX_TMDS_CLK,
   3077	.registers		= vc5_hdmi_hdmi1_fields,
   3078	.num_registers		= ARRAY_SIZE(vc5_hdmi_hdmi1_fields),
   3079	.phy_lane_mapping	= {
   3080		PHY_LANE_1,
   3081		PHY_LANE_0,
   3082		PHY_LANE_CK,
   3083		PHY_LANE_2,
   3084	},
   3085	.unsupported_odd_h_timings	= true,
   3086	.external_irq_controller	= true,
   3087
   3088	.init_resources		= vc5_hdmi_init_resources,
   3089	.csc_setup		= vc5_hdmi_csc_setup,
   3090	.reset			= vc5_hdmi_reset,
   3091	.set_timings		= vc5_hdmi_set_timings,
   3092	.phy_init		= vc5_hdmi_phy_init,
   3093	.phy_disable		= vc5_hdmi_phy_disable,
   3094	.phy_rng_enable		= vc5_hdmi_phy_rng_enable,
   3095	.phy_rng_disable	= vc5_hdmi_phy_rng_disable,
   3096	.channel_map		= vc5_hdmi_channel_map,
   3097	.supports_hdr		= true,
   3098	.hp_detect		= vc5_hdmi_hp_detect,
   3099};
   3100
   3101static const struct of_device_id vc4_hdmi_dt_match[] = {
   3102	{ .compatible = "brcm,bcm2835-hdmi", .data = &bcm2835_variant },
   3103	{ .compatible = "brcm,bcm2711-hdmi0", .data = &bcm2711_hdmi0_variant },
   3104	{ .compatible = "brcm,bcm2711-hdmi1", .data = &bcm2711_hdmi1_variant },
   3105	{}
   3106};
   3107
   3108static const struct dev_pm_ops vc4_hdmi_pm_ops = {
   3109	SET_RUNTIME_PM_OPS(vc4_hdmi_runtime_suspend,
   3110			   vc4_hdmi_runtime_resume,
   3111			   NULL)
   3112};
   3113
   3114struct platform_driver vc4_hdmi_driver = {
   3115	.probe = vc4_hdmi_dev_probe,
   3116	.remove = vc4_hdmi_dev_remove,
   3117	.driver = {
   3118		.name = "vc4_hdmi",
   3119		.of_match_table = vc4_hdmi_dt_match,
   3120		.pm = &vc4_hdmi_pm_ops,
   3121	},
   3122};