2 * Copyright (C) 2015 Broadcom
3 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
4 * Copyright (C) 2013 Red Hat
5 * Author: Rob Clark <robdclark@gmail.com>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program. If not, see <http://www.gnu.org/licenses/>.
21 * DOC: VC4 Falcon HDMI module
23 * The HDMI core has a state machine and a PHY. Most of the unit
24 * operates off of the HSM clock from CPRMAN. It also internally uses
25 * the PLLH_PIX clock for the PHY.
28 #include "drm_atomic_helper.h"
29 #include "drm_crtc_helper.h"
31 #include "linux/clk.h"
32 #include "linux/component.h"
33 #include "linux/i2c.h"
34 #include "linux/of_gpio.h"
35 #include "linux/of_platform.h"
39 /* General HDMI hardware state. */
41 struct platform_device
*pdev
;
43 struct drm_encoder
*encoder
;
44 struct drm_connector
*connector
;
46 struct i2c_adapter
*ddc
;
47 void __iomem
*hdmicore_regs
;
48 void __iomem
*hd_regs
;
51 struct clk
*pixel_clock
;
52 struct clk
*hsm_clock
;
55 #define HDMI_READ(offset) readl(vc4->hdmi->hdmicore_regs + offset)
56 #define HDMI_WRITE(offset, val) writel(val, vc4->hdmi->hdmicore_regs + offset)
57 #define HD_READ(offset) readl(vc4->hdmi->hd_regs + offset)
58 #define HD_WRITE(offset, val) writel(val, vc4->hdmi->hd_regs + offset)
60 /* VC4 HDMI encoder KMS struct */
61 struct vc4_hdmi_encoder
{
62 struct vc4_encoder base
;
66 static inline struct vc4_hdmi_encoder
*
67 to_vc4_hdmi_encoder(struct drm_encoder
*encoder
)
69 return container_of(encoder
, struct vc4_hdmi_encoder
, base
.base
);
72 /* VC4 HDMI connector KMS struct */
73 struct vc4_hdmi_connector
{
74 struct drm_connector base
;
76 /* Since the connector is attached to just the one encoder,
77 * this is the reference to it so we can do the best_encoder()
80 struct drm_encoder
*encoder
;
83 static inline struct vc4_hdmi_connector
*
84 to_vc4_hdmi_connector(struct drm_connector
*connector
)
86 return container_of(connector
, struct vc4_hdmi_connector
, base
);
89 #define HDMI_REG(reg) { reg, #reg }
94 HDMI_REG(VC4_HDMI_CORE_REV
),
95 HDMI_REG(VC4_HDMI_SW_RESET_CONTROL
),
96 HDMI_REG(VC4_HDMI_HOTPLUG_INT
),
97 HDMI_REG(VC4_HDMI_HOTPLUG
),
98 HDMI_REG(VC4_HDMI_HORZA
),
99 HDMI_REG(VC4_HDMI_HORZB
),
100 HDMI_REG(VC4_HDMI_FIFO_CTL
),
101 HDMI_REG(VC4_HDMI_SCHEDULER_CONTROL
),
102 HDMI_REG(VC4_HDMI_VERTA0
),
103 HDMI_REG(VC4_HDMI_VERTA1
),
104 HDMI_REG(VC4_HDMI_VERTB0
),
105 HDMI_REG(VC4_HDMI_VERTB1
),
106 HDMI_REG(VC4_HDMI_TX_PHY_RESET_CTL
),
109 static const struct {
113 HDMI_REG(VC4_HD_M_CTL
),
114 HDMI_REG(VC4_HD_MAI_CTL
),
115 HDMI_REG(VC4_HD_VID_CTL
),
116 HDMI_REG(VC4_HD_CSC_CTL
),
117 HDMI_REG(VC4_HD_FRAME_COUNT
),
120 #ifdef CONFIG_DEBUG_FS
121 int vc4_hdmi_debugfs_regs(struct seq_file
*m
, void *unused
)
123 struct drm_info_node
*node
= (struct drm_info_node
*)m
->private;
124 struct drm_device
*dev
= node
->minor
->dev
;
125 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
128 for (i
= 0; i
< ARRAY_SIZE(hdmi_regs
); i
++) {
129 seq_printf(m
, "%s (0x%04x): 0x%08x\n",
130 hdmi_regs
[i
].name
, hdmi_regs
[i
].reg
,
131 HDMI_READ(hdmi_regs
[i
].reg
));
134 for (i
= 0; i
< ARRAY_SIZE(hd_regs
); i
++) {
135 seq_printf(m
, "%s (0x%04x): 0x%08x\n",
136 hd_regs
[i
].name
, hd_regs
[i
].reg
,
137 HD_READ(hd_regs
[i
].reg
));
142 #endif /* CONFIG_DEBUG_FS */
144 static void vc4_hdmi_dump_regs(struct drm_device
*dev
)
146 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
149 for (i
= 0; i
< ARRAY_SIZE(hdmi_regs
); i
++) {
150 DRM_INFO("0x%04x (%s): 0x%08x\n",
151 hdmi_regs
[i
].reg
, hdmi_regs
[i
].name
,
152 HDMI_READ(hdmi_regs
[i
].reg
));
154 for (i
= 0; i
< ARRAY_SIZE(hd_regs
); i
++) {
155 DRM_INFO("0x%04x (%s): 0x%08x\n",
156 hd_regs
[i
].reg
, hd_regs
[i
].name
,
157 HD_READ(hd_regs
[i
].reg
));
161 static enum drm_connector_status
162 vc4_hdmi_connector_detect(struct drm_connector
*connector
, bool force
)
164 struct drm_device
*dev
= connector
->dev
;
165 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
167 if (vc4
->hdmi
->hpd_gpio
) {
168 if (gpio_get_value(vc4
->hdmi
->hpd_gpio
))
169 return connector_status_connected
;
171 return connector_status_disconnected
;
174 if (HDMI_READ(VC4_HDMI_HOTPLUG
) & VC4_HDMI_HOTPLUG_CONNECTED
)
175 return connector_status_connected
;
177 return connector_status_disconnected
;
180 static void vc4_hdmi_connector_destroy(struct drm_connector
*connector
)
182 drm_connector_unregister(connector
);
183 drm_connector_cleanup(connector
);
186 static int vc4_hdmi_connector_get_modes(struct drm_connector
*connector
)
188 struct vc4_hdmi_connector
*vc4_connector
=
189 to_vc4_hdmi_connector(connector
);
190 struct drm_encoder
*encoder
= vc4_connector
->encoder
;
191 struct vc4_hdmi_encoder
*vc4_encoder
= to_vc4_hdmi_encoder(encoder
);
192 struct drm_device
*dev
= connector
->dev
;
193 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
197 edid
= drm_get_edid(connector
, vc4
->hdmi
->ddc
);
201 vc4_encoder
->hdmi_monitor
= drm_detect_hdmi_monitor(edid
);
202 drm_mode_connector_update_edid_property(connector
, edid
);
203 ret
= drm_add_edid_modes(connector
, edid
);
208 static struct drm_encoder
*
209 vc4_hdmi_connector_best_encoder(struct drm_connector
*connector
)
211 struct vc4_hdmi_connector
*hdmi_connector
=
212 to_vc4_hdmi_connector(connector
);
213 return hdmi_connector
->encoder
;
216 static const struct drm_connector_funcs vc4_hdmi_connector_funcs
= {
217 .dpms
= drm_atomic_helper_connector_dpms
,
218 .detect
= vc4_hdmi_connector_detect
,
219 .fill_modes
= drm_helper_probe_single_connector_modes
,
220 .destroy
= vc4_hdmi_connector_destroy
,
221 .reset
= drm_atomic_helper_connector_reset
,
222 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
223 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
226 static const struct drm_connector_helper_funcs vc4_hdmi_connector_helper_funcs
= {
227 .get_modes
= vc4_hdmi_connector_get_modes
,
228 .best_encoder
= vc4_hdmi_connector_best_encoder
,
231 static struct drm_connector
*vc4_hdmi_connector_init(struct drm_device
*dev
,
232 struct drm_encoder
*encoder
)
234 struct drm_connector
*connector
= NULL
;
235 struct vc4_hdmi_connector
*hdmi_connector
;
238 hdmi_connector
= devm_kzalloc(dev
->dev
, sizeof(*hdmi_connector
),
240 if (!hdmi_connector
) {
244 connector
= &hdmi_connector
->base
;
246 hdmi_connector
->encoder
= encoder
;
248 drm_connector_init(dev
, connector
, &vc4_hdmi_connector_funcs
,
249 DRM_MODE_CONNECTOR_HDMIA
);
250 drm_connector_helper_add(connector
, &vc4_hdmi_connector_helper_funcs
);
252 connector
->polled
= (DRM_CONNECTOR_POLL_CONNECT
|
253 DRM_CONNECTOR_POLL_DISCONNECT
);
255 connector
->interlace_allowed
= 0;
256 connector
->doublescan_allowed
= 0;
258 drm_mode_connector_attach_encoder(connector
, encoder
);
264 vc4_hdmi_connector_destroy(connector
);
269 static void vc4_hdmi_encoder_destroy(struct drm_encoder
*encoder
)
271 drm_encoder_cleanup(encoder
);
274 static const struct drm_encoder_funcs vc4_hdmi_encoder_funcs
= {
275 .destroy
= vc4_hdmi_encoder_destroy
,
278 static void vc4_hdmi_encoder_mode_set(struct drm_encoder
*encoder
,
279 struct drm_display_mode
*unadjusted_mode
,
280 struct drm_display_mode
*mode
)
282 struct drm_device
*dev
= encoder
->dev
;
283 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
284 bool debug_dump_regs
= false;
285 bool hsync_pos
= mode
->flags
& DRM_MODE_FLAG_PHSYNC
;
286 bool vsync_pos
= mode
->flags
& DRM_MODE_FLAG_PVSYNC
;
287 u32 vactive
= (mode
->vdisplay
>>
288 ((mode
->flags
& DRM_MODE_FLAG_INTERLACE
) ? 1 : 0));
289 u32 verta
= (VC4_SET_FIELD(mode
->vsync_end
- mode
->vsync_start
,
290 VC4_HDMI_VERTA_VSP
) |
291 VC4_SET_FIELD(mode
->vsync_start
- mode
->vdisplay
,
292 VC4_HDMI_VERTA_VFP
) |
293 VC4_SET_FIELD(vactive
, VC4_HDMI_VERTA_VAL
));
294 u32 vertb
= (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO
) |
295 VC4_SET_FIELD(mode
->vtotal
- mode
->vsync_end
,
296 VC4_HDMI_VERTB_VBP
));
298 if (debug_dump_regs
) {
299 DRM_INFO("HDMI regs before:\n");
300 vc4_hdmi_dump_regs(dev
);
303 HD_WRITE(VC4_HD_VID_CTL
, 0);
305 clk_set_rate(vc4
->hdmi
->pixel_clock
, mode
->clock
* 1000);
307 HDMI_WRITE(VC4_HDMI_SCHEDULER_CONTROL
,
308 HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) |
309 VC4_HDMI_SCHEDULER_CONTROL_MANUAL_FORMAT
|
310 VC4_HDMI_SCHEDULER_CONTROL_IGNORE_VSYNC_PREDICTS
);
312 HDMI_WRITE(VC4_HDMI_HORZA
,
313 (vsync_pos
? VC4_HDMI_HORZA_VPOS
: 0) |
314 (hsync_pos
? VC4_HDMI_HORZA_HPOS
: 0) |
315 VC4_SET_FIELD(mode
->hdisplay
, VC4_HDMI_HORZA_HAP
));
317 HDMI_WRITE(VC4_HDMI_HORZB
,
318 VC4_SET_FIELD(mode
->htotal
- mode
->hsync_end
,
319 VC4_HDMI_HORZB_HBP
) |
320 VC4_SET_FIELD(mode
->hsync_end
- mode
->hsync_start
,
321 VC4_HDMI_HORZB_HSP
) |
322 VC4_SET_FIELD(mode
->hsync_start
- mode
->hdisplay
,
323 VC4_HDMI_HORZB_HFP
));
325 HDMI_WRITE(VC4_HDMI_VERTA0
, verta
);
326 HDMI_WRITE(VC4_HDMI_VERTA1
, verta
);
328 HDMI_WRITE(VC4_HDMI_VERTB0
, vertb
);
329 HDMI_WRITE(VC4_HDMI_VERTB1
, vertb
);
331 HD_WRITE(VC4_HD_VID_CTL
,
332 (vsync_pos
? 0 : VC4_HD_VID_CTL_VSYNC_LOW
) |
333 (hsync_pos
? 0 : VC4_HD_VID_CTL_HSYNC_LOW
));
335 /* The RGB order applies even when CSC is disabled. */
336 HD_WRITE(VC4_HD_CSC_CTL
, VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR
,
337 VC4_HD_CSC_CTL_ORDER
));
339 HDMI_WRITE(VC4_HDMI_FIFO_CTL
, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N
);
341 if (debug_dump_regs
) {
342 DRM_INFO("HDMI regs after:\n");
343 vc4_hdmi_dump_regs(dev
);
347 static void vc4_hdmi_encoder_disable(struct drm_encoder
*encoder
)
349 struct drm_device
*dev
= encoder
->dev
;
350 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
352 HDMI_WRITE(VC4_HDMI_TX_PHY_RESET_CTL
, 0xf << 16);
353 HD_WRITE(VC4_HD_VID_CTL
,
354 HD_READ(VC4_HD_VID_CTL
) & ~VC4_HD_VID_CTL_ENABLE
);
357 static void vc4_hdmi_encoder_enable(struct drm_encoder
*encoder
)
359 struct vc4_hdmi_encoder
*vc4_encoder
= to_vc4_hdmi_encoder(encoder
);
360 struct drm_device
*dev
= encoder
->dev
;
361 struct vc4_dev
*vc4
= to_vc4_dev(dev
);
364 HDMI_WRITE(VC4_HDMI_TX_PHY_RESET_CTL
, 0);
366 HD_WRITE(VC4_HD_VID_CTL
,
367 HD_READ(VC4_HD_VID_CTL
) |
368 VC4_HD_VID_CTL_ENABLE
|
369 VC4_HD_VID_CTL_UNDERFLOW_ENABLE
|
370 VC4_HD_VID_CTL_FRAME_COUNTER_RESET
);
372 if (vc4_encoder
->hdmi_monitor
) {
373 HDMI_WRITE(VC4_HDMI_SCHEDULER_CONTROL
,
374 HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) |
375 VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI
);
377 ret
= wait_for(HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) &
378 VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE
, 1);
379 WARN_ONCE(ret
, "Timeout waiting for "
380 "VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
382 HDMI_WRITE(VC4_HDMI_RAM_PACKET_CONFIG
,
383 HDMI_READ(VC4_HDMI_RAM_PACKET_CONFIG
) &
384 ~(VC4_HDMI_RAM_PACKET_ENABLE
));
385 HDMI_WRITE(VC4_HDMI_SCHEDULER_CONTROL
,
386 HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) &
387 ~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI
);
389 ret
= wait_for(!(HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) &
390 VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE
), 1);
391 WARN_ONCE(ret
, "Timeout waiting for "
392 "!VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE\n");
395 if (vc4_encoder
->hdmi_monitor
) {
398 WARN_ON(!(HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) &
399 VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE
));
400 HDMI_WRITE(VC4_HDMI_SCHEDULER_CONTROL
,
401 HDMI_READ(VC4_HDMI_SCHEDULER_CONTROL
) |
402 VC4_HDMI_SCHEDULER_CONTROL_VERT_ALWAYS_KEEPOUT
);
404 /* XXX: Set HDMI_RAM_PACKET_CONFIG (1 << 16) and set
408 drift
= HDMI_READ(VC4_HDMI_FIFO_CTL
);
409 drift
&= VC4_HDMI_FIFO_VALID_WRITE_MASK
;
411 HDMI_WRITE(VC4_HDMI_FIFO_CTL
,
412 drift
& ~VC4_HDMI_FIFO_CTL_RECENTER
);
413 HDMI_WRITE(VC4_HDMI_FIFO_CTL
,
414 drift
| VC4_HDMI_FIFO_CTL_RECENTER
);
416 HDMI_WRITE(VC4_HDMI_FIFO_CTL
,
417 drift
& ~VC4_HDMI_FIFO_CTL_RECENTER
);
418 HDMI_WRITE(VC4_HDMI_FIFO_CTL
,
419 drift
| VC4_HDMI_FIFO_CTL_RECENTER
);
421 ret
= wait_for(HDMI_READ(VC4_HDMI_FIFO_CTL
) &
422 VC4_HDMI_FIFO_CTL_RECENTER_DONE
, 1);
423 WARN_ONCE(ret
, "Timeout waiting for "
424 "VC4_HDMI_FIFO_CTL_RECENTER_DONE");
428 static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs
= {
429 .mode_set
= vc4_hdmi_encoder_mode_set
,
430 .disable
= vc4_hdmi_encoder_disable
,
431 .enable
= vc4_hdmi_encoder_enable
,
434 static int vc4_hdmi_bind(struct device
*dev
, struct device
*master
, void *data
)
436 struct platform_device
*pdev
= to_platform_device(dev
);
437 struct drm_device
*drm
= dev_get_drvdata(master
);
438 struct vc4_dev
*vc4
= drm
->dev_private
;
439 struct vc4_hdmi
*hdmi
;
440 struct vc4_hdmi_encoder
*vc4_hdmi_encoder
;
441 struct device_node
*ddc_node
;
445 hdmi
= devm_kzalloc(dev
, sizeof(*hdmi
), GFP_KERNEL
);
449 vc4_hdmi_encoder
= devm_kzalloc(dev
, sizeof(*vc4_hdmi_encoder
),
451 if (!vc4_hdmi_encoder
)
453 vc4_hdmi_encoder
->base
.type
= VC4_ENCODER_TYPE_HDMI
;
454 hdmi
->encoder
= &vc4_hdmi_encoder
->base
.base
;
457 hdmi
->hdmicore_regs
= vc4_ioremap_regs(pdev
, 0);
458 if (IS_ERR(hdmi
->hdmicore_regs
))
459 return PTR_ERR(hdmi
->hdmicore_regs
);
461 hdmi
->hd_regs
= vc4_ioremap_regs(pdev
, 1);
462 if (IS_ERR(hdmi
->hd_regs
))
463 return PTR_ERR(hdmi
->hd_regs
);
465 ddc_node
= of_parse_phandle(dev
->of_node
, "ddc", 0);
467 DRM_ERROR("Failed to find ddc node in device tree\n");
471 hdmi
->pixel_clock
= devm_clk_get(dev
, "pixel");
472 if (IS_ERR(hdmi
->pixel_clock
)) {
473 DRM_ERROR("Failed to get pixel clock\n");
474 return PTR_ERR(hdmi
->pixel_clock
);
476 hdmi
->hsm_clock
= devm_clk_get(dev
, "hdmi");
477 if (IS_ERR(hdmi
->hsm_clock
)) {
478 DRM_ERROR("Failed to get HDMI state machine clock\n");
479 return PTR_ERR(hdmi
->hsm_clock
);
482 hdmi
->ddc
= of_find_i2c_adapter_by_node(ddc_node
);
484 DRM_DEBUG("Failed to get ddc i2c adapter by node\n");
485 return -EPROBE_DEFER
;
488 /* Enable the clocks at startup. We can't quite recover from
489 * turning off the pixel clock during disable/enables yet, so
490 * it's always running.
492 ret
= clk_prepare_enable(hdmi
->pixel_clock
);
494 DRM_ERROR("Failed to turn on pixel clock: %d\n", ret
);
498 ret
= clk_prepare_enable(hdmi
->hsm_clock
);
500 DRM_ERROR("Failed to turn on HDMI state machine clock: %d\n",
502 goto err_unprepare_pix
;
505 /* Only use the GPIO HPD pin if present in the DT, otherwise
506 * we'll use the HDMI core's register.
508 if (of_find_property(dev
->of_node
, "hpd-gpios", &value
)) {
509 hdmi
->hpd_gpio
= of_get_named_gpio(dev
->of_node
, "hpd-gpios", 0);
510 if (hdmi
->hpd_gpio
< 0) {
511 ret
= hdmi
->hpd_gpio
;
512 goto err_unprepare_hsm
;
518 /* HDMI core must be enabled. */
519 WARN_ON_ONCE((HD_READ(VC4_HD_M_CTL
) & VC4_HD_M_ENABLE
) == 0);
521 drm_encoder_init(drm
, hdmi
->encoder
, &vc4_hdmi_encoder_funcs
,
522 DRM_MODE_ENCODER_TMDS
);
523 drm_encoder_helper_add(hdmi
->encoder
, &vc4_hdmi_encoder_helper_funcs
);
525 hdmi
->connector
= vc4_hdmi_connector_init(drm
, hdmi
->encoder
);
526 if (IS_ERR(hdmi
->connector
)) {
527 ret
= PTR_ERR(hdmi
->connector
);
528 goto err_destroy_encoder
;
534 vc4_hdmi_encoder_destroy(hdmi
->encoder
);
536 clk_disable_unprepare(hdmi
->hsm_clock
);
538 clk_disable_unprepare(hdmi
->pixel_clock
);
540 put_device(&vc4
->hdmi
->ddc
->dev
);
545 static void vc4_hdmi_unbind(struct device
*dev
, struct device
*master
,
548 struct drm_device
*drm
= dev_get_drvdata(master
);
549 struct vc4_dev
*vc4
= drm
->dev_private
;
550 struct vc4_hdmi
*hdmi
= vc4
->hdmi
;
552 vc4_hdmi_connector_destroy(hdmi
->connector
);
553 vc4_hdmi_encoder_destroy(hdmi
->encoder
);
555 clk_disable_unprepare(hdmi
->pixel_clock
);
556 clk_disable_unprepare(hdmi
->hsm_clock
);
557 put_device(&hdmi
->ddc
->dev
);
562 static const struct component_ops vc4_hdmi_ops
= {
563 .bind
= vc4_hdmi_bind
,
564 .unbind
= vc4_hdmi_unbind
,
567 static int vc4_hdmi_dev_probe(struct platform_device
*pdev
)
569 return component_add(&pdev
->dev
, &vc4_hdmi_ops
);
572 static int vc4_hdmi_dev_remove(struct platform_device
*pdev
)
574 component_del(&pdev
->dev
, &vc4_hdmi_ops
);
578 static const struct of_device_id vc4_hdmi_dt_match
[] = {
579 { .compatible
= "brcm,bcm2835-hdmi" },
583 struct platform_driver vc4_hdmi_driver
= {
584 .probe
= vc4_hdmi_dev_probe
,
585 .remove
= vc4_hdmi_dev_remove
,
588 .of_match_table
= vc4_hdmi_dt_match
,