1 // SPDX-License-Identifier: GPL-2.0-only
3 * HDMI interface DSS driver for TI's OMAP4 family of SoCs.
5 * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com/
7 * Mythri pk <mythripk@ti.com>
10 #define DSS_SUBSYS_NAME "HDMI"
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/err.h>
16 #include <linux/interrupt.h>
17 #include <linux/mutex.h>
18 #include <linux/delay.h>
19 #include <linux/string.h>
20 #include <linux/platform_device.h>
21 #include <linux/pm_runtime.h>
22 #include <linux/clk.h>
23 #include <linux/regulator/consumer.h>
24 #include <linux/component.h>
26 #include <linux/of_graph.h>
27 #include <sound/omap-hdmi-audio.h>
28 #include <media/cec.h>
30 #include <drm/drm_atomic.h>
31 #include <drm/drm_atomic_state_helper.h>
34 #include "hdmi4_core.h"
35 #include "hdmi4_cec.h"
39 static int hdmi_runtime_get(struct omap_hdmi
*hdmi
)
43 DSSDBG("hdmi_runtime_get\n");
45 r
= pm_runtime_get_sync(&hdmi
->pdev
->dev
);
47 pm_runtime_put_noidle(&hdmi
->pdev
->dev
);
53 static void hdmi_runtime_put(struct omap_hdmi
*hdmi
)
57 DSSDBG("hdmi_runtime_put\n");
59 r
= pm_runtime_put_sync(&hdmi
->pdev
->dev
);
60 WARN_ON(r
< 0 && r
!= -ENOSYS
);
63 static irqreturn_t
hdmi_irq_handler(int irq
, void *data
)
65 struct omap_hdmi
*hdmi
= data
;
66 struct hdmi_wp_data
*wp
= &hdmi
->wp
;
69 irqstatus
= hdmi_wp_get_irqstatus(wp
);
70 hdmi_wp_set_irqstatus(wp
, irqstatus
);
72 if ((irqstatus
& HDMI_IRQ_LINK_CONNECT
) &&
73 irqstatus
& HDMI_IRQ_LINK_DISCONNECT
) {
75 * If we get both connect and disconnect interrupts at the same
76 * time, turn off the PHY, clear interrupts, and restart, which
77 * raises connect interrupt if a cable is connected, or nothing
78 * if cable is not connected.
80 hdmi_wp_set_phy_pwr(wp
, HDMI_PHYPWRCMD_OFF
);
82 hdmi_wp_set_irqstatus(wp
, HDMI_IRQ_LINK_CONNECT
|
83 HDMI_IRQ_LINK_DISCONNECT
);
85 hdmi_wp_set_phy_pwr(wp
, HDMI_PHYPWRCMD_LDOON
);
86 } else if (irqstatus
& HDMI_IRQ_LINK_CONNECT
) {
87 hdmi_wp_set_phy_pwr(wp
, HDMI_PHYPWRCMD_TXON
);
88 } else if (irqstatus
& HDMI_IRQ_LINK_DISCONNECT
) {
89 hdmi_wp_set_phy_pwr(wp
, HDMI_PHYPWRCMD_LDOON
);
91 if (irqstatus
& HDMI_IRQ_CORE
) {
92 u32 intr4
= hdmi_read_reg(hdmi
->core
.base
, HDMI_CORE_SYS_INTR4
);
94 hdmi_write_reg(hdmi
->core
.base
, HDMI_CORE_SYS_INTR4
, intr4
);
96 hdmi4_cec_irq(&hdmi
->core
);
102 static int hdmi_power_on_core(struct omap_hdmi
*hdmi
)
106 if (hdmi
->core
.core_pwr_cnt
++)
109 r
= regulator_enable(hdmi
->vdda_reg
);
113 r
= hdmi_runtime_get(hdmi
);
115 goto err_runtime_get
;
117 hdmi4_core_powerdown_disable(&hdmi
->core
);
119 /* Make selection of HDMI in DSS */
120 dss_select_hdmi_venc_clk_source(hdmi
->dss
, DSS_HDMI_M_PCLK
);
122 hdmi
->core_enabled
= true;
127 regulator_disable(hdmi
->vdda_reg
);
129 hdmi
->core
.core_pwr_cnt
--;
134 static void hdmi_power_off_core(struct omap_hdmi
*hdmi
)
136 if (--hdmi
->core
.core_pwr_cnt
)
139 hdmi
->core_enabled
= false;
141 hdmi_runtime_put(hdmi
);
142 regulator_disable(hdmi
->vdda_reg
);
145 static int hdmi_power_on_full(struct omap_hdmi
*hdmi
)
148 const struct videomode
*vm
;
149 struct hdmi_wp_data
*wp
= &hdmi
->wp
;
150 struct dss_pll_clock_info hdmi_cinfo
= { 0 };
153 r
= hdmi_power_on_core(hdmi
);
157 /* disable and clear irqs */
158 hdmi_wp_clear_irqenable(wp
, ~HDMI_IRQ_CORE
);
159 hdmi_wp_set_irqstatus(wp
, ~HDMI_IRQ_CORE
);
163 DSSDBG("hdmi_power_on hactive= %d vactive = %d\n", vm
->hactive
,
167 if (vm
->flags
& DISPLAY_FLAGS_DOUBLECLK
)
170 /* DSS_HDMI_TCLK is bitclk / 10 */
173 dss_pll_calc_b(&hdmi
->pll
.pll
, clk_get_rate(hdmi
->pll
.pll
.clkin
),
176 r
= dss_pll_enable(&hdmi
->pll
.pll
);
178 DSSERR("Failed to enable PLL\n");
182 r
= dss_pll_set_config(&hdmi
->pll
.pll
, &hdmi_cinfo
);
184 DSSERR("Failed to configure PLL\n");
188 r
= hdmi_phy_configure(&hdmi
->phy
, hdmi_cinfo
.clkdco
,
189 hdmi_cinfo
.clkout
[0]);
191 DSSDBG("Failed to configure PHY\n");
195 r
= hdmi_wp_set_phy_pwr(wp
, HDMI_PHYPWRCMD_LDOON
);
199 hdmi4_configure(&hdmi
->core
, &hdmi
->wp
, &hdmi
->cfg
);
201 r
= dss_mgr_enable(&hdmi
->output
);
205 r
= hdmi_wp_video_start(&hdmi
->wp
);
209 hdmi_wp_set_irqenable(wp
,
210 HDMI_IRQ_LINK_CONNECT
| HDMI_IRQ_LINK_DISCONNECT
);
215 dss_mgr_disable(&hdmi
->output
);
217 hdmi_wp_set_phy_pwr(&hdmi
->wp
, HDMI_PHYPWRCMD_OFF
);
221 dss_pll_disable(&hdmi
->pll
.pll
);
223 hdmi_power_off_core(hdmi
);
227 static void hdmi_power_off_full(struct omap_hdmi
*hdmi
)
229 hdmi_wp_clear_irqenable(&hdmi
->wp
, ~HDMI_IRQ_CORE
);
231 hdmi_wp_video_stop(&hdmi
->wp
);
233 dss_mgr_disable(&hdmi
->output
);
235 hdmi_wp_set_phy_pwr(&hdmi
->wp
, HDMI_PHYPWRCMD_OFF
);
237 dss_pll_disable(&hdmi
->pll
.pll
);
239 hdmi_power_off_core(hdmi
);
242 static int hdmi_dump_regs(struct seq_file
*s
, void *p
)
244 struct omap_hdmi
*hdmi
= s
->private;
246 mutex_lock(&hdmi
->lock
);
248 if (hdmi_runtime_get(hdmi
)) {
249 mutex_unlock(&hdmi
->lock
);
253 hdmi_wp_dump(&hdmi
->wp
, s
);
254 hdmi_pll_dump(&hdmi
->pll
, s
);
255 hdmi_phy_dump(&hdmi
->phy
, s
);
256 hdmi4_core_dump(&hdmi
->core
, s
);
258 hdmi_runtime_put(hdmi
);
259 mutex_unlock(&hdmi
->lock
);
263 static void hdmi_start_audio_stream(struct omap_hdmi
*hd
)
265 hdmi_wp_audio_enable(&hd
->wp
, true);
266 hdmi4_audio_start(&hd
->core
, &hd
->wp
);
269 static void hdmi_stop_audio_stream(struct omap_hdmi
*hd
)
271 hdmi4_audio_stop(&hd
->core
, &hd
->wp
);
272 hdmi_wp_audio_enable(&hd
->wp
, false);
275 int hdmi4_core_enable(struct hdmi_core_data
*core
)
277 struct omap_hdmi
*hdmi
= container_of(core
, struct omap_hdmi
, core
);
280 DSSDBG("ENTER omapdss_hdmi4_core_enable\n");
282 mutex_lock(&hdmi
->lock
);
284 r
= hdmi_power_on_core(hdmi
);
286 DSSERR("failed to power on device\n");
290 mutex_unlock(&hdmi
->lock
);
294 mutex_unlock(&hdmi
->lock
);
298 void hdmi4_core_disable(struct hdmi_core_data
*core
)
300 struct omap_hdmi
*hdmi
= container_of(core
, struct omap_hdmi
, core
);
302 DSSDBG("Enter omapdss_hdmi4_core_disable\n");
304 mutex_lock(&hdmi
->lock
);
306 hdmi_power_off_core(hdmi
);
308 mutex_unlock(&hdmi
->lock
);
311 /* -----------------------------------------------------------------------------
312 * DRM Bridge Operations
315 static int hdmi4_bridge_attach(struct drm_bridge
*bridge
,
316 enum drm_bridge_attach_flags flags
)
318 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
320 if (!(flags
& DRM_BRIDGE_ATTACH_NO_CONNECTOR
))
323 return drm_bridge_attach(bridge
->encoder
, hdmi
->output
.next_bridge
,
327 static void hdmi4_bridge_mode_set(struct drm_bridge
*bridge
,
328 const struct drm_display_mode
*mode
,
329 const struct drm_display_mode
*adjusted_mode
)
331 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
333 mutex_lock(&hdmi
->lock
);
335 drm_display_mode_to_videomode(adjusted_mode
, &hdmi
->cfg
.vm
);
337 dispc_set_tv_pclk(hdmi
->dss
->dispc
, adjusted_mode
->clock
* 1000);
339 mutex_unlock(&hdmi
->lock
);
342 static void hdmi4_bridge_enable(struct drm_bridge
*bridge
,
343 struct drm_bridge_state
*bridge_state
)
345 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
346 struct drm_atomic_state
*state
= bridge_state
->base
.state
;
347 struct drm_connector_state
*conn_state
;
348 struct drm_connector
*connector
;
349 struct drm_crtc_state
*crtc_state
;
354 * None of these should fail, as the bridge can't be enabled without a
355 * valid CRTC to connector path with fully populated new states.
357 connector
= drm_atomic_get_new_connector_for_encoder(state
,
359 if (WARN_ON(!connector
))
361 conn_state
= drm_atomic_get_new_connector_state(state
, connector
);
362 if (WARN_ON(!conn_state
))
364 crtc_state
= drm_atomic_get_new_crtc_state(state
, conn_state
->crtc
);
365 if (WARN_ON(!crtc_state
))
368 hdmi
->cfg
.hdmi_dvi_mode
= connector
->display_info
.is_hdmi
369 ? HDMI_HDMI
: HDMI_DVI
;
371 if (connector
->display_info
.is_hdmi
) {
372 const struct drm_display_mode
*mode
;
373 struct hdmi_avi_infoframe avi
;
375 mode
= &crtc_state
->adjusted_mode
;
376 ret
= drm_hdmi_avi_infoframe_from_display_mode(&avi
, connector
,
379 hdmi
->cfg
.infoframe
= avi
;
382 mutex_lock(&hdmi
->lock
);
384 ret
= hdmi_power_on_full(hdmi
);
386 DSSERR("failed to power on device\n");
390 if (hdmi
->audio_configured
) {
391 ret
= hdmi4_audio_config(&hdmi
->core
, &hdmi
->wp
,
393 hdmi
->cfg
.vm
.pixelclock
);
395 DSSERR("Error restoring audio configuration: %d", ret
);
396 hdmi
->audio_abort_cb(&hdmi
->pdev
->dev
);
397 hdmi
->audio_configured
= false;
401 spin_lock_irqsave(&hdmi
->audio_playing_lock
, flags
);
402 if (hdmi
->audio_configured
&& hdmi
->audio_playing
)
403 hdmi_start_audio_stream(hdmi
);
404 hdmi
->display_enabled
= true;
405 spin_unlock_irqrestore(&hdmi
->audio_playing_lock
, flags
);
408 mutex_unlock(&hdmi
->lock
);
411 static void hdmi4_bridge_disable(struct drm_bridge
*bridge
,
412 struct drm_bridge_state
*bridge_state
)
414 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
417 mutex_lock(&hdmi
->lock
);
419 spin_lock_irqsave(&hdmi
->audio_playing_lock
, flags
);
420 hdmi_stop_audio_stream(hdmi
);
421 hdmi
->display_enabled
= false;
422 spin_unlock_irqrestore(&hdmi
->audio_playing_lock
, flags
);
424 hdmi_power_off_full(hdmi
);
426 mutex_unlock(&hdmi
->lock
);
429 static void hdmi4_bridge_hpd_notify(struct drm_bridge
*bridge
,
430 enum drm_connector_status status
)
432 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
434 if (status
== connector_status_disconnected
)
435 hdmi4_cec_set_phys_addr(&hdmi
->core
, CEC_PHYS_ADDR_INVALID
);
438 static struct edid
*hdmi4_bridge_get_edid(struct drm_bridge
*bridge
,
439 struct drm_connector
*connector
)
441 struct omap_hdmi
*hdmi
= drm_bridge_to_hdmi(bridge
);
442 struct edid
*edid
= NULL
;
443 unsigned int cec_addr
;
447 need_enable
= hdmi
->core_enabled
== false;
450 r
= hdmi4_core_enable(&hdmi
->core
);
455 mutex_lock(&hdmi
->lock
);
456 r
= hdmi_runtime_get(hdmi
);
459 r
= hdmi4_core_ddc_init(&hdmi
->core
);
463 edid
= drm_do_get_edid(connector
, hdmi4_core_ddc_read
, &hdmi
->core
);
466 hdmi_runtime_put(hdmi
);
467 mutex_unlock(&hdmi
->lock
);
469 if (edid
&& edid
->extensions
) {
470 unsigned int len
= (edid
->extensions
+ 1) * EDID_LENGTH
;
472 cec_addr
= cec_get_edid_phys_addr((u8
*)edid
, len
, NULL
);
474 cec_addr
= CEC_PHYS_ADDR_INVALID
;
477 hdmi4_cec_set_phys_addr(&hdmi
->core
, cec_addr
);
480 hdmi4_core_disable(&hdmi
->core
);
485 static const struct drm_bridge_funcs hdmi4_bridge_funcs
= {
486 .attach
= hdmi4_bridge_attach
,
487 .mode_set
= hdmi4_bridge_mode_set
,
488 .atomic_duplicate_state
= drm_atomic_helper_bridge_duplicate_state
,
489 .atomic_destroy_state
= drm_atomic_helper_bridge_destroy_state
,
490 .atomic_reset
= drm_atomic_helper_bridge_reset
,
491 .atomic_enable
= hdmi4_bridge_enable
,
492 .atomic_disable
= hdmi4_bridge_disable
,
493 .hpd_notify
= hdmi4_bridge_hpd_notify
,
494 .get_edid
= hdmi4_bridge_get_edid
,
497 static void hdmi4_bridge_init(struct omap_hdmi
*hdmi
)
499 hdmi
->bridge
.funcs
= &hdmi4_bridge_funcs
;
500 hdmi
->bridge
.of_node
= hdmi
->pdev
->dev
.of_node
;
501 hdmi
->bridge
.ops
= DRM_BRIDGE_OP_EDID
;
502 hdmi
->bridge
.type
= DRM_MODE_CONNECTOR_HDMIA
;
504 drm_bridge_add(&hdmi
->bridge
);
507 static void hdmi4_bridge_cleanup(struct omap_hdmi
*hdmi
)
509 drm_bridge_remove(&hdmi
->bridge
);
512 /* -----------------------------------------------------------------------------
516 static int hdmi_audio_startup(struct device
*dev
,
517 void (*abort_cb
)(struct device
*dev
))
519 struct omap_hdmi
*hd
= dev_get_drvdata(dev
);
521 mutex_lock(&hd
->lock
);
523 WARN_ON(hd
->audio_abort_cb
!= NULL
);
525 hd
->audio_abort_cb
= abort_cb
;
527 mutex_unlock(&hd
->lock
);
532 static int hdmi_audio_shutdown(struct device
*dev
)
534 struct omap_hdmi
*hd
= dev_get_drvdata(dev
);
536 mutex_lock(&hd
->lock
);
537 hd
->audio_abort_cb
= NULL
;
538 hd
->audio_configured
= false;
539 hd
->audio_playing
= false;
540 mutex_unlock(&hd
->lock
);
545 static int hdmi_audio_start(struct device
*dev
)
547 struct omap_hdmi
*hd
= dev_get_drvdata(dev
);
550 spin_lock_irqsave(&hd
->audio_playing_lock
, flags
);
552 if (hd
->display_enabled
) {
553 if (!hdmi_mode_has_audio(&hd
->cfg
))
554 DSSERR("%s: Video mode does not support audio\n",
556 hdmi_start_audio_stream(hd
);
558 hd
->audio_playing
= true;
560 spin_unlock_irqrestore(&hd
->audio_playing_lock
, flags
);
564 static void hdmi_audio_stop(struct device
*dev
)
566 struct omap_hdmi
*hd
= dev_get_drvdata(dev
);
569 WARN_ON(!hdmi_mode_has_audio(&hd
->cfg
));
571 spin_lock_irqsave(&hd
->audio_playing_lock
, flags
);
573 if (hd
->display_enabled
)
574 hdmi_stop_audio_stream(hd
);
575 hd
->audio_playing
= false;
577 spin_unlock_irqrestore(&hd
->audio_playing_lock
, flags
);
580 static int hdmi_audio_config(struct device
*dev
,
581 struct omap_dss_audio
*dss_audio
)
583 struct omap_hdmi
*hd
= dev_get_drvdata(dev
);
586 mutex_lock(&hd
->lock
);
588 if (hd
->display_enabled
) {
589 ret
= hdmi4_audio_config(&hd
->core
, &hd
->wp
, dss_audio
,
590 hd
->cfg
.vm
.pixelclock
);
595 hd
->audio_configured
= true;
596 hd
->audio_config
= *dss_audio
;
598 mutex_unlock(&hd
->lock
);
603 static const struct omap_hdmi_audio_ops hdmi_audio_ops
= {
604 .audio_startup
= hdmi_audio_startup
,
605 .audio_shutdown
= hdmi_audio_shutdown
,
606 .audio_start
= hdmi_audio_start
,
607 .audio_stop
= hdmi_audio_stop
,
608 .audio_config
= hdmi_audio_config
,
611 static int hdmi_audio_register(struct omap_hdmi
*hdmi
)
613 struct omap_hdmi_audio_pdata pdata
= {
614 .dev
= &hdmi
->pdev
->dev
,
616 .audio_dma_addr
= hdmi_wp_get_audio_dma_addr(&hdmi
->wp
),
617 .ops
= &hdmi_audio_ops
,
620 hdmi
->audio_pdev
= platform_device_register_data(
621 &hdmi
->pdev
->dev
, "omap-hdmi-audio", PLATFORM_DEVID_AUTO
,
622 &pdata
, sizeof(pdata
));
624 if (IS_ERR(hdmi
->audio_pdev
))
625 return PTR_ERR(hdmi
->audio_pdev
);
630 /* -----------------------------------------------------------------------------
631 * Component Bind & Unbind
634 static int hdmi4_bind(struct device
*dev
, struct device
*master
, void *data
)
636 struct dss_device
*dss
= dss_get_device(master
);
637 struct omap_hdmi
*hdmi
= dev_get_drvdata(dev
);
642 r
= hdmi_runtime_get(hdmi
);
646 r
= hdmi_pll_init(dss
, hdmi
->pdev
, &hdmi
->pll
, &hdmi
->wp
);
648 goto err_runtime_put
;
650 r
= hdmi4_cec_init(hdmi
->pdev
, &hdmi
->core
, &hdmi
->wp
);
654 r
= hdmi_audio_register(hdmi
);
656 DSSERR("Registering HDMI audio failed\n");
660 hdmi
->debugfs
= dss_debugfs_create_file(dss
, "hdmi", hdmi_dump_regs
,
663 hdmi_runtime_put(hdmi
);
668 hdmi4_cec_uninit(&hdmi
->core
);
670 hdmi_pll_uninit(&hdmi
->pll
);
672 hdmi_runtime_put(hdmi
);
676 static void hdmi4_unbind(struct device
*dev
, struct device
*master
, void *data
)
678 struct omap_hdmi
*hdmi
= dev_get_drvdata(dev
);
680 dss_debugfs_remove_file(hdmi
->debugfs
);
682 if (hdmi
->audio_pdev
)
683 platform_device_unregister(hdmi
->audio_pdev
);
685 hdmi4_cec_uninit(&hdmi
->core
);
686 hdmi_pll_uninit(&hdmi
->pll
);
689 static const struct component_ops hdmi4_component_ops
= {
691 .unbind
= hdmi4_unbind
,
694 /* -----------------------------------------------------------------------------
695 * Probe & Remove, Suspend & Resume
698 static int hdmi4_init_output(struct omap_hdmi
*hdmi
)
700 struct omap_dss_device
*out
= &hdmi
->output
;
703 hdmi4_bridge_init(hdmi
);
705 out
->dev
= &hdmi
->pdev
->dev
;
706 out
->id
= OMAP_DSS_OUTPUT_HDMI
;
707 out
->type
= OMAP_DISPLAY_TYPE_HDMI
;
708 out
->name
= "hdmi.0";
709 out
->dispc_channel
= OMAP_DSS_CHANNEL_DIGIT
;
710 out
->owner
= THIS_MODULE
;
713 r
= omapdss_device_init_output(out
, &hdmi
->bridge
);
715 hdmi4_bridge_cleanup(hdmi
);
719 omapdss_device_register(out
);
724 static void hdmi4_uninit_output(struct omap_hdmi
*hdmi
)
726 struct omap_dss_device
*out
= &hdmi
->output
;
728 omapdss_device_unregister(out
);
729 omapdss_device_cleanup_output(out
);
731 hdmi4_bridge_cleanup(hdmi
);
734 static int hdmi4_probe_of(struct omap_hdmi
*hdmi
)
736 struct platform_device
*pdev
= hdmi
->pdev
;
737 struct device_node
*node
= pdev
->dev
.of_node
;
738 struct device_node
*ep
;
741 ep
= of_graph_get_endpoint_by_regs(node
, 0, 0);
745 r
= hdmi_parse_lanes_of(pdev
, ep
, &hdmi
->phy
);
750 static int hdmi4_probe(struct platform_device
*pdev
)
752 struct omap_hdmi
*hdmi
;
756 hdmi
= kzalloc(sizeof(*hdmi
), GFP_KERNEL
);
762 dev_set_drvdata(&pdev
->dev
, hdmi
);
764 mutex_init(&hdmi
->lock
);
765 spin_lock_init(&hdmi
->audio_playing_lock
);
767 r
= hdmi4_probe_of(hdmi
);
771 r
= hdmi_wp_init(pdev
, &hdmi
->wp
, 4);
775 r
= hdmi_phy_init(pdev
, &hdmi
->phy
, 4);
779 r
= hdmi4_core_init(pdev
, &hdmi
->core
);
783 irq
= platform_get_irq(pdev
, 0);
785 DSSERR("platform_get_irq failed\n");
790 r
= devm_request_threaded_irq(&pdev
->dev
, irq
,
791 NULL
, hdmi_irq_handler
,
792 IRQF_ONESHOT
, "OMAP HDMI", hdmi
);
794 DSSERR("HDMI IRQ request failed\n");
798 hdmi
->vdda_reg
= devm_regulator_get(&pdev
->dev
, "vdda");
799 if (IS_ERR(hdmi
->vdda_reg
)) {
800 r
= PTR_ERR(hdmi
->vdda_reg
);
801 if (r
!= -EPROBE_DEFER
)
802 DSSERR("can't get VDDA regulator\n");
806 pm_runtime_enable(&pdev
->dev
);
808 r
= hdmi4_init_output(hdmi
);
812 r
= component_add(&pdev
->dev
, &hdmi4_component_ops
);
814 goto err_uninit_output
;
819 hdmi4_uninit_output(hdmi
);
821 pm_runtime_disable(&pdev
->dev
);
827 static int hdmi4_remove(struct platform_device
*pdev
)
829 struct omap_hdmi
*hdmi
= platform_get_drvdata(pdev
);
831 component_del(&pdev
->dev
, &hdmi4_component_ops
);
833 hdmi4_uninit_output(hdmi
);
835 pm_runtime_disable(&pdev
->dev
);
841 static const struct of_device_id hdmi_of_match
[] = {
842 { .compatible
= "ti,omap4-hdmi", },
846 struct platform_driver omapdss_hdmi4hw_driver
= {
847 .probe
= hdmi4_probe
,
848 .remove
= hdmi4_remove
,
850 .name
= "omapdss_hdmi",
851 .of_match_table
= hdmi_of_match
,
852 .suppress_bind_attrs
= true,