Lines Matching full:dp

27 #include "cdn-dp-core.h"
28 #include "cdn-dp-reg.h"
63 { .compatible = "rockchip,rk3399-cdn-dp",
70 static int cdn_dp_grf_write(struct cdn_dp_device *dp, in cdn_dp_grf_write() argument
75 ret = clk_prepare_enable(dp->grf_clk); in cdn_dp_grf_write()
77 DRM_DEV_ERROR(dp->dev, "Failed to prepare_enable grf clock\n"); in cdn_dp_grf_write()
81 ret = regmap_write(dp->grf, reg, val); in cdn_dp_grf_write()
83 DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret); in cdn_dp_grf_write()
84 clk_disable_unprepare(dp->grf_clk); in cdn_dp_grf_write()
88 clk_disable_unprepare(dp->grf_clk); in cdn_dp_grf_write()
93 static int cdn_dp_clk_enable(struct cdn_dp_device *dp) in cdn_dp_clk_enable() argument
98 ret = clk_prepare_enable(dp->pclk); in cdn_dp_clk_enable()
100 DRM_DEV_ERROR(dp->dev, "cannot enable dp pclk %d\n", ret); in cdn_dp_clk_enable()
104 ret = clk_prepare_enable(dp->core_clk); in cdn_dp_clk_enable()
106 DRM_DEV_ERROR(dp->dev, "cannot enable core_clk %d\n", ret); in cdn_dp_clk_enable()
110 ret = pm_runtime_get_sync(dp->dev); in cdn_dp_clk_enable()
112 DRM_DEV_ERROR(dp->dev, "cannot get pm runtime %d\n", ret); in cdn_dp_clk_enable()
116 reset_control_assert(dp->core_rst); in cdn_dp_clk_enable()
117 reset_control_assert(dp->dptx_rst); in cdn_dp_clk_enable()
118 reset_control_assert(dp->apb_rst); in cdn_dp_clk_enable()
119 reset_control_deassert(dp->core_rst); in cdn_dp_clk_enable()
120 reset_control_deassert(dp->dptx_rst); in cdn_dp_clk_enable()
121 reset_control_deassert(dp->apb_rst); in cdn_dp_clk_enable()
123 rate = clk_get_rate(dp->core_clk); in cdn_dp_clk_enable()
125 DRM_DEV_ERROR(dp->dev, "get clk rate failed\n"); in cdn_dp_clk_enable()
130 cdn_dp_set_fw_clk(dp, rate); in cdn_dp_clk_enable()
131 cdn_dp_clock_reset(dp); in cdn_dp_clk_enable()
136 pm_runtime_put(dp->dev); in cdn_dp_clk_enable()
138 clk_disable_unprepare(dp->core_clk); in cdn_dp_clk_enable()
140 clk_disable_unprepare(dp->pclk); in cdn_dp_clk_enable()
145 static void cdn_dp_clk_disable(struct cdn_dp_device *dp) in cdn_dp_clk_disable() argument
147 pm_runtime_put_sync(dp->dev); in cdn_dp_clk_disable()
148 clk_disable_unprepare(dp->pclk); in cdn_dp_clk_disable()
149 clk_disable_unprepare(dp->core_clk); in cdn_dp_clk_disable()
174 static int cdn_dp_get_sink_count(struct cdn_dp_device *dp, u8 *sink_count) in cdn_dp_get_sink_count() argument
180 ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); in cdn_dp_get_sink_count()
188 static struct cdn_dp_port *cdn_dp_connected_port(struct cdn_dp_device *dp) in cdn_dp_connected_port() argument
193 for (i = 0; i < dp->ports; i++) { in cdn_dp_connected_port()
194 port = dp->port[i]; in cdn_dp_connected_port()
202 static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp) in cdn_dp_check_sink_connection() argument
208 if (dp->active_port < 0 || dp->active_port >= dp->ports) { in cdn_dp_check_sink_connection()
209 DRM_DEV_ERROR(dp->dev, "active_port is wrong!\n"); in cdn_dp_check_sink_connection()
213 port = dp->port[dp->active_port]; in cdn_dp_check_sink_connection()
225 if (!cdn_dp_get_sink_count(dp, &sink_count)) in cdn_dp_check_sink_connection()
231 DRM_DEV_ERROR(dp->dev, "Get sink capability timed out\n"); in cdn_dp_check_sink_connection()
238 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_detect() local
241 mutex_lock(&dp->lock); in cdn_dp_bridge_detect()
242 if (dp->connected) in cdn_dp_bridge_detect()
244 mutex_unlock(&dp->lock); in cdn_dp_bridge_detect()
252 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_edid_read() local
255 mutex_lock(&dp->lock); in cdn_dp_bridge_edid_read()
256 drm_edid = drm_edid_read_custom(connector, cdn_dp_get_edid_block, dp); in cdn_dp_bridge_edid_read()
257 mutex_unlock(&dp->lock); in cdn_dp_bridge_edid_read()
267 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_mode_valid() local
271 /* If DP is disconnected, every mode is invalid */ in cdn_dp_bridge_mode_valid()
272 if (!dp->connected) in cdn_dp_bridge_mode_valid()
289 source_max = dp->lanes; in cdn_dp_bridge_mode_valid()
290 sink_max = drm_dp_max_lane_count(dp->dpcd); in cdn_dp_bridge_mode_valid()
294 sink_max = drm_dp_max_link_rate(dp->dpcd); in cdn_dp_bridge_mode_valid()
303 DRM_DEV_DEBUG_KMS(dp->dev, in cdn_dp_bridge_mode_valid()
312 static int cdn_dp_firmware_init(struct cdn_dp_device *dp) in cdn_dp_firmware_init() argument
316 const struct firmware *fw = dp->fw; in cdn_dp_firmware_init()
321 DRM_DEV_ERROR(dp->dev, "firmware is invalid\n"); in cdn_dp_firmware_init()
328 ret = cdn_dp_load_firmware(dp, iram_data, hdr->iram_size, in cdn_dp_firmware_init()
333 ret = cdn_dp_set_firmware_active(dp, true); in cdn_dp_firmware_init()
335 DRM_DEV_ERROR(dp->dev, "active ucpu failed: %d\n", ret); in cdn_dp_firmware_init()
339 return cdn_dp_event_config(dp); in cdn_dp_firmware_init()
342 static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp) in cdn_dp_get_sink_capability() argument
346 if (!cdn_dp_check_sink_connection(dp)) in cdn_dp_get_sink_capability()
349 ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, in cdn_dp_get_sink_capability()
352 DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); in cdn_dp_get_sink_capability()
359 static int cdn_dp_enable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port) in cdn_dp_enable_phy() argument
367 DRM_DEV_ERROR(dp->dev, "phy power on failed: %d\n", in cdn_dp_enable_phy()
374 ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, in cdn_dp_enable_phy()
377 DRM_DEV_ERROR(dp->dev, "Failed to write HPD_SEL %d\n", ret); in cdn_dp_enable_phy()
381 ret = cdn_dp_get_hpd_status(dp); in cdn_dp_enable_phy()
384 DRM_DEV_ERROR(dp->dev, "hpd does not exist\n"); in cdn_dp_enable_phy()
391 DRM_DEV_ERROR(dp->dev, "get property failed\n"); in cdn_dp_enable_phy()
396 ret = cdn_dp_set_host_cap(dp, port->lanes, property.intval); in cdn_dp_enable_phy()
398 DRM_DEV_ERROR(dp->dev, "set host capabilities failed: %d\n", in cdn_dp_enable_phy()
403 dp->active_port = port->id; in cdn_dp_enable_phy()
408 DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret); in cdn_dp_enable_phy()
413 cdn_dp_grf_write(dp, GRF_SOC_CON26, in cdn_dp_enable_phy()
418 static int cdn_dp_disable_phy(struct cdn_dp_device *dp, in cdn_dp_disable_phy() argument
426 DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret); in cdn_dp_disable_phy()
433 dp->active_port = -1; in cdn_dp_disable_phy()
437 static int cdn_dp_disable(struct cdn_dp_device *dp) in cdn_dp_disable() argument
441 if (!dp->active) in cdn_dp_disable()
444 for (i = 0; i < dp->ports; i++) in cdn_dp_disable()
445 cdn_dp_disable_phy(dp, dp->port[i]); in cdn_dp_disable()
447 ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, in cdn_dp_disable()
450 DRM_DEV_ERROR(dp->dev, "Failed to clear hpd sel %d\n", in cdn_dp_disable()
455 cdn_dp_set_firmware_active(dp, false); in cdn_dp_disable()
456 cdn_dp_clk_disable(dp); in cdn_dp_disable()
457 dp->active = false; in cdn_dp_disable()
458 dp->max_lanes = 0; in cdn_dp_disable()
459 dp->max_rate = 0; in cdn_dp_disable()
464 static int cdn_dp_enable(struct cdn_dp_device *dp) in cdn_dp_enable() argument
469 port = cdn_dp_connected_port(dp); in cdn_dp_enable()
471 DRM_DEV_ERROR(dp->dev, in cdn_dp_enable()
476 if (dp->active) in cdn_dp_enable()
479 ret = cdn_dp_clk_enable(dp); in cdn_dp_enable()
483 ret = cdn_dp_firmware_init(dp); in cdn_dp_enable()
485 DRM_DEV_ERROR(dp->dev, "firmware init failed: %d", ret); in cdn_dp_enable()
490 for (i = port->id; i < dp->ports; i++) { in cdn_dp_enable()
491 port = dp->port[i]; in cdn_dp_enable()
494 ret = cdn_dp_enable_phy(dp, port); in cdn_dp_enable()
498 ret = cdn_dp_get_sink_capability(dp); in cdn_dp_enable()
500 cdn_dp_disable_phy(dp, port); in cdn_dp_enable()
502 dp->active = true; in cdn_dp_enable()
503 dp->lanes = port->lanes; in cdn_dp_enable()
510 cdn_dp_clk_disable(dp); in cdn_dp_enable()
518 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_mode_set() local
519 struct video_info *video = &dp->video_info; in cdn_dp_bridge_mode_set()
525 drm_mode_copy(&dp->mode, adjusted); in cdn_dp_bridge_mode_set()
528 static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) in cdn_dp_check_link_status() argument
531 struct cdn_dp_port *port = cdn_dp_connected_port(dp); in cdn_dp_check_link_status()
532 u8 sink_lanes = drm_dp_max_lane_count(dp->dpcd); in cdn_dp_check_link_status()
534 if (!port || !dp->max_rate || !dp->max_lanes) in cdn_dp_check_link_status()
537 if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, in cdn_dp_check_link_status()
547 static void cdn_dp_display_info_update(struct cdn_dp_device *dp, in cdn_dp_display_info_update() argument
550 struct video_info *video = &dp->video_info; in cdn_dp_display_info_update()
567 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_atomic_enable() local
575 cdn_dp_display_info_update(dp, &connector->display_info); in cdn_dp_bridge_atomic_enable()
577 ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, &dp->encoder.encoder); in cdn_dp_bridge_atomic_enable()
579 DRM_DEV_ERROR(dp->dev, "Could not get vop id, %d", ret); in cdn_dp_bridge_atomic_enable()
583 DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n", in cdn_dp_bridge_atomic_enable()
590 ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val); in cdn_dp_bridge_atomic_enable()
594 mutex_lock(&dp->lock); in cdn_dp_bridge_atomic_enable()
596 ret = cdn_dp_enable(dp); in cdn_dp_bridge_atomic_enable()
598 DRM_DEV_ERROR(dp->dev, "Failed to enable bridge %d\n", in cdn_dp_bridge_atomic_enable()
602 if (!cdn_dp_check_link_status(dp)) { in cdn_dp_bridge_atomic_enable()
603 ret = cdn_dp_train_link(dp); in cdn_dp_bridge_atomic_enable()
605 DRM_DEV_ERROR(dp->dev, "Failed link train %d\n", ret); in cdn_dp_bridge_atomic_enable()
610 ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE); in cdn_dp_bridge_atomic_enable()
612 DRM_DEV_ERROR(dp->dev, "Failed to idle video %d\n", ret); in cdn_dp_bridge_atomic_enable()
616 ret = cdn_dp_config_video(dp); in cdn_dp_bridge_atomic_enable()
618 DRM_DEV_ERROR(dp->dev, "Failed to config video %d\n", ret); in cdn_dp_bridge_atomic_enable()
622 ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_VALID); in cdn_dp_bridge_atomic_enable()
624 DRM_DEV_ERROR(dp->dev, "Failed to valid video %d\n", ret); in cdn_dp_bridge_atomic_enable()
629 mutex_unlock(&dp->lock); in cdn_dp_bridge_atomic_enable()
634 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_bridge_atomic_disable() local
637 mutex_lock(&dp->lock); in cdn_dp_bridge_atomic_disable()
639 if (dp->active) { in cdn_dp_bridge_atomic_disable()
640 ret = cdn_dp_disable(dp); in cdn_dp_bridge_atomic_disable()
642 DRM_DEV_ERROR(dp->dev, "Failed to disable bridge %d\n", in cdn_dp_bridge_atomic_disable()
646 mutex_unlock(&dp->lock); in cdn_dp_bridge_atomic_disable()
650 * the DP: in cdn_dp_bridge_atomic_disable()
652 * device from a port, the DP will be disabled here, at this case, in cdn_dp_bridge_atomic_disable()
653 * run the event_work to re-open DP for the other port. in cdn_dp_bridge_atomic_disable()
654 * 2. If re-training or re-config failed, the DP will be disabled here. in cdn_dp_bridge_atomic_disable()
657 if (!dp->connected && cdn_dp_connected_port(dp)) in cdn_dp_bridge_atomic_disable()
658 schedule_work(&dp->event_work); in cdn_dp_bridge_atomic_disable()
677 static int cdn_dp_parse_dt(struct cdn_dp_device *dp) in cdn_dp_parse_dt() argument
679 struct device *dev = dp->dev; in cdn_dp_parse_dt()
683 dp->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); in cdn_dp_parse_dt()
684 if (IS_ERR(dp->grf)) { in cdn_dp_parse_dt()
685 DRM_DEV_ERROR(dev, "cdn-dp needs rockchip,grf property\n"); in cdn_dp_parse_dt()
686 return PTR_ERR(dp->grf); in cdn_dp_parse_dt()
689 dp->regs = devm_platform_ioremap_resource(pdev, 0); in cdn_dp_parse_dt()
690 if (IS_ERR(dp->regs)) { in cdn_dp_parse_dt()
692 return PTR_ERR(dp->regs); in cdn_dp_parse_dt()
695 dp->core_clk = devm_clk_get(dev, "core-clk"); in cdn_dp_parse_dt()
696 if (IS_ERR(dp->core_clk)) { in cdn_dp_parse_dt()
698 return PTR_ERR(dp->core_clk); in cdn_dp_parse_dt()
701 dp->pclk = devm_clk_get(dev, "pclk"); in cdn_dp_parse_dt()
702 if (IS_ERR(dp->pclk)) { in cdn_dp_parse_dt()
704 return PTR_ERR(dp->pclk); in cdn_dp_parse_dt()
707 dp->spdif_clk = devm_clk_get(dev, "spdif"); in cdn_dp_parse_dt()
708 if (IS_ERR(dp->spdif_clk)) { in cdn_dp_parse_dt()
710 return PTR_ERR(dp->spdif_clk); in cdn_dp_parse_dt()
713 dp->grf_clk = devm_clk_get(dev, "grf"); in cdn_dp_parse_dt()
714 if (IS_ERR(dp->grf_clk)) { in cdn_dp_parse_dt()
716 return PTR_ERR(dp->grf_clk); in cdn_dp_parse_dt()
719 dp->spdif_rst = devm_reset_control_get(dev, "spdif"); in cdn_dp_parse_dt()
720 if (IS_ERR(dp->spdif_rst)) { in cdn_dp_parse_dt()
722 return PTR_ERR(dp->spdif_rst); in cdn_dp_parse_dt()
725 dp->dptx_rst = devm_reset_control_get(dev, "dptx"); in cdn_dp_parse_dt()
726 if (IS_ERR(dp->dptx_rst)) { in cdn_dp_parse_dt()
728 return PTR_ERR(dp->dptx_rst); in cdn_dp_parse_dt()
731 dp->core_rst = devm_reset_control_get(dev, "core"); in cdn_dp_parse_dt()
732 if (IS_ERR(dp->core_rst)) { in cdn_dp_parse_dt()
734 return PTR_ERR(dp->core_rst); in cdn_dp_parse_dt()
737 dp->apb_rst = devm_reset_control_get(dev, "apb"); in cdn_dp_parse_dt()
738 if (IS_ERR(dp->apb_rst)) { in cdn_dp_parse_dt()
740 return PTR_ERR(dp->apb_rst); in cdn_dp_parse_dt()
751 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_audio_prepare() local
759 mutex_lock(&dp->lock); in cdn_dp_audio_prepare()
760 if (!dp->active) { in cdn_dp_audio_prepare()
778 ret = cdn_dp_audio_config(dp, &audio); in cdn_dp_audio_prepare()
780 dp->audio_info = audio; in cdn_dp_audio_prepare()
783 mutex_unlock(&dp->lock); in cdn_dp_audio_prepare()
790 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_audio_shutdown() local
793 mutex_lock(&dp->lock); in cdn_dp_audio_shutdown()
794 if (!dp->active) in cdn_dp_audio_shutdown()
797 ret = cdn_dp_audio_stop(dp, &dp->audio_info); in cdn_dp_audio_shutdown()
799 dp->audio_info.format = AFMT_UNUSED; in cdn_dp_audio_shutdown()
801 mutex_unlock(&dp->lock); in cdn_dp_audio_shutdown()
808 struct cdn_dp_device *dp = bridge_to_dp(bridge); in cdn_dp_audio_mute_stream() local
811 mutex_lock(&dp->lock); in cdn_dp_audio_mute_stream()
812 if (!dp->active) { in cdn_dp_audio_mute_stream()
817 ret = cdn_dp_audio_mute(dp, enable); in cdn_dp_audio_mute_stream()
820 mutex_unlock(&dp->lock); in cdn_dp_audio_mute_stream()
840 static int cdn_dp_request_firmware(struct cdn_dp_device *dp) in cdn_dp_request_firmware() argument
846 WARN_ON(!mutex_is_locked(&dp->lock)); in cdn_dp_request_firmware()
848 if (dp->fw_loaded) in cdn_dp_request_firmware()
852 mutex_unlock(&dp->lock); in cdn_dp_request_firmware()
855 ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dp->dev); in cdn_dp_request_firmware()
861 DRM_DEV_ERROR(dp->dev, in cdn_dp_request_firmware()
866 dp->fw_loaded = true; in cdn_dp_request_firmware()
871 DRM_DEV_ERROR(dp->dev, "Timed out trying to load firmware\n"); in cdn_dp_request_firmware()
874 mutex_lock(&dp->lock); in cdn_dp_request_firmware()
880 struct cdn_dp_device *dp = container_of(work, struct cdn_dp_device, in cdn_dp_pd_event_work() local
884 mutex_lock(&dp->lock); in cdn_dp_pd_event_work()
886 if (dp->suspended) in cdn_dp_pd_event_work()
889 ret = cdn_dp_request_firmware(dp); in cdn_dp_pd_event_work()
893 dp->connected = true; in cdn_dp_pd_event_work()
896 if (!cdn_dp_connected_port(dp)) { in cdn_dp_pd_event_work()
897 DRM_DEV_INFO(dp->dev, "Not connected; disabling cdn\n"); in cdn_dp_pd_event_work()
898 dp->connected = false; in cdn_dp_pd_event_work()
901 } else if (!dp->active) { in cdn_dp_pd_event_work()
902 DRM_DEV_INFO(dp->dev, "Connected, not enabled; enabling cdn\n"); in cdn_dp_pd_event_work()
903 ret = cdn_dp_enable(dp); in cdn_dp_pd_event_work()
905 DRM_DEV_ERROR(dp->dev, "Enabling dp failed: %d\n", ret); in cdn_dp_pd_event_work()
906 dp->connected = false; in cdn_dp_pd_event_work()
910 } else if (!cdn_dp_check_sink_connection(dp)) { in cdn_dp_pd_event_work()
911 DRM_DEV_INFO(dp->dev, "Connected without sink; assert hpd\n"); in cdn_dp_pd_event_work()
912 dp->connected = false; in cdn_dp_pd_event_work()
915 } else if (!cdn_dp_check_link_status(dp)) { in cdn_dp_pd_event_work()
916 unsigned int rate = dp->max_rate; in cdn_dp_pd_event_work()
917 unsigned int lanes = dp->max_lanes; in cdn_dp_pd_event_work()
918 struct drm_display_mode *mode = &dp->mode; in cdn_dp_pd_event_work()
920 DRM_DEV_INFO(dp->dev, "Connected with sink; re-train link\n"); in cdn_dp_pd_event_work()
921 ret = cdn_dp_train_link(dp); in cdn_dp_pd_event_work()
923 dp->connected = false; in cdn_dp_pd_event_work()
924 DRM_DEV_ERROR(dp->dev, "Training link failed: %d\n", ret); in cdn_dp_pd_event_work()
930 (rate != dp->max_rate || lanes != dp->max_lanes)) { in cdn_dp_pd_event_work()
931 ret = cdn_dp_config_video(dp); in cdn_dp_pd_event_work()
933 dp->connected = false; in cdn_dp_pd_event_work()
934 DRM_DEV_ERROR(dp->dev, "Failed to configure video: %d\n", ret); in cdn_dp_pd_event_work()
940 mutex_unlock(&dp->lock); in cdn_dp_pd_event_work()
941 drm_bridge_hpd_notify(&dp->bridge, in cdn_dp_pd_event_work()
942 dp->connected ? connector_status_connected in cdn_dp_pd_event_work()
951 struct cdn_dp_device *dp = port->dp; in cdn_dp_pd_event() local
958 schedule_work(&dp->event_work); in cdn_dp_pd_event()
965 struct cdn_dp_device *dp = dev_get_drvdata(dev); in cdn_dp_bind() local
972 ret = cdn_dp_parse_dt(dp); in cdn_dp_bind()
976 dp->drm_dev = drm_dev; in cdn_dp_bind()
977 dp->connected = false; in cdn_dp_bind()
978 dp->active = false; in cdn_dp_bind()
979 dp->active_port = -1; in cdn_dp_bind()
980 dp->fw_loaded = false; in cdn_dp_bind()
982 INIT_WORK(&dp->event_work, cdn_dp_pd_event_work); in cdn_dp_bind()
984 encoder = &dp->encoder.encoder; in cdn_dp_bind()
999 dp->bridge.ops = in cdn_dp_bind()
1004 dp->bridge.of_node = dp->dev->of_node; in cdn_dp_bind()
1005 dp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; in cdn_dp_bind()
1006 dp->bridge.hdmi_audio_dev = dp->dev; in cdn_dp_bind()
1007 dp->bridge.hdmi_audio_max_i2s_playback_channels = 8; in cdn_dp_bind()
1008 dp->bridge.hdmi_audio_spdif_playback = 1; in cdn_dp_bind()
1009 dp->bridge.hdmi_audio_dai_port = -1; in cdn_dp_bind()
1011 ret = devm_drm_bridge_add(dev, &dp->bridge); in cdn_dp_bind()
1015 ret = drm_bridge_attach(encoder, &dp->bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); in cdn_dp_bind()
1022 dev_err(dp->dev, "failed to init bridge connector: %d\n", ret); in cdn_dp_bind()
1028 for (i = 0; i < dp->ports; i++) { in cdn_dp_bind()
1029 port = dp->port[i]; in cdn_dp_bind()
1032 ret = devm_extcon_register_notifier(dp->dev, port->extcon, in cdn_dp_bind()
1044 schedule_work(&dp->event_work); in cdn_dp_bind()
1051 struct cdn_dp_device *dp = dev_get_drvdata(dev); in cdn_dp_unbind() local
1052 struct drm_encoder *encoder = &dp->encoder.encoder; in cdn_dp_unbind()
1054 cancel_work_sync(&dp->event_work); in cdn_dp_unbind()
1058 if (dp->fw_loaded) in cdn_dp_unbind()
1059 release_firmware(dp->fw); in cdn_dp_unbind()
1069 struct cdn_dp_device *dp = dev_get_drvdata(dev); in cdn_dp_suspend() local
1072 mutex_lock(&dp->lock); in cdn_dp_suspend()
1073 if (dp->active) in cdn_dp_suspend()
1074 ret = cdn_dp_disable(dp); in cdn_dp_suspend()
1075 dp->suspended = true; in cdn_dp_suspend()
1076 mutex_unlock(&dp->lock); in cdn_dp_suspend()
1083 struct cdn_dp_device *dp = dev_get_drvdata(dev); in cdn_dp_resume() local
1085 mutex_lock(&dp->lock); in cdn_dp_resume()
1086 dp->suspended = false; in cdn_dp_resume()
1087 if (dp->fw_loaded) in cdn_dp_resume()
1088 schedule_work(&dp->event_work); in cdn_dp_resume()
1089 mutex_unlock(&dp->lock); in cdn_dp_resume()
1100 struct cdn_dp_device *dp; in cdn_dp_probe() local
1106 dp = devm_drm_bridge_alloc(dev, struct cdn_dp_device, bridge, in cdn_dp_probe()
1108 if (IS_ERR(dp)) in cdn_dp_probe()
1109 return PTR_ERR(dp); in cdn_dp_probe()
1110 dp->dev = dev; in cdn_dp_probe()
1132 port->dp = dp; in cdn_dp_probe()
1134 dp->port[dp->ports++] = port; in cdn_dp_probe()
1137 if (!dp->ports) { in cdn_dp_probe()
1142 mutex_init(&dp->lock); in cdn_dp_probe()
1143 dev_set_drvdata(dev, dp); in cdn_dp_probe()
1154 struct cdn_dp_device *dp = platform_get_drvdata(pdev); in cdn_dp_remove() local
1156 platform_device_unregister(dp->audio_pdev); in cdn_dp_remove()
1157 cdn_dp_suspend(dp->dev); in cdn_dp_remove()
1163 struct cdn_dp_device *dp = platform_get_drvdata(pdev); in cdn_dp_shutdown() local
1165 cdn_dp_suspend(dp->dev); in cdn_dp_shutdown()
1178 .name = "cdn-dp",