Lines Matching full:dp
495 static int dw_dp_hdcp_init_keys(struct dw_dp *dp) in dw_dp_hdcp_init_keys() argument
503 regmap_read(dp->regmap, DPTX_HDCPREG_RMLSTS, &val); in dw_dp_hdcp_init_keys()
505 dev_info(dp->dev, "dpk keys already write\n"); in dw_dp_hdcp_init_keys()
511 dev_info(dp->dev, "HDCP: read size %d\n", size); in dw_dp_hdcp_init_keys()
515 base = sip_hdcp_request_share_memory(dp->id ? DP_TX1 : DP_TX0); in dw_dp_hdcp_init_keys()
521 res = sip_hdcp_config(HDCP_FUNC_KEY_LOAD, dp->id ? DP_TX1 : DP_TX0, 0); in dw_dp_hdcp_init_keys()
523 dev_err(dp->dev, "load hdcp key failed\n"); in dw_dp_hdcp_init_keys()
530 static int dw_dp_hdcp_rng_init(struct dw_dp *dp) in dw_dp_hdcp_rng_init() argument
534 regmap_write(dp->regmap, DPTX_HDCPREG_ANCONF, OANBYPASS); in dw_dp_hdcp_rng_init()
536 regmap_write(dp->regmap, DPTX_HDCPREG_AN0, random_val); in dw_dp_hdcp_rng_init()
538 regmap_write(dp->regmap, DPTX_HDCPREG_AN1, random_val); in dw_dp_hdcp_rng_init()
543 static int dw_dp_hw_hdcp_init(struct dw_dp *dp) in dw_dp_hw_hdcp_init() argument
545 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, HDCP_MODULE_RESET, in dw_dp_hw_hdcp_init()
548 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, HDCP_MODULE_RESET, in dw_dp_hw_hdcp_init()
551 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE, in dw_dp_hw_hdcp_init()
557 static bool dw_dp_hdcp2_capable(struct dw_dp *dp) in dw_dp_hdcp2_capable() argument
562 ret = drm_dp_dpcd_read(&dp->aux, DP_HDCP_2_2_REG_RX_CAPS_OFFSET, in dw_dp_hdcp2_capable()
565 dev_err(dp->dev, "get hdcp2 capable failed:%d\n", ret); in dw_dp_hdcp2_capable()
576 static int _dw_dp_hdcp2_disable(struct dw_dp *dp) in _dw_dp_hdcp2_disable() argument
578 struct dw_dp_hdcp *hdcp = &dp->hdcp; in _dw_dp_hdcp2_disable()
580 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP, 0); in _dw_dp_hdcp2_disable()
581 clk_disable_unprepare(dp->hdcp_clk); in _dw_dp_hdcp2_disable()
585 dp->hdcp.hdcp2_encrypted = false; in _dw_dp_hdcp2_disable()
590 static int dw_dp_hdcp2_auth_check(struct dw_dp *dp) in dw_dp_hdcp2_auth_check() argument
595 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val, in dw_dp_hdcp2_auth_check()
598 dev_err(dp->dev, "wait HDCP2 controller booted timeout\n"); in dw_dp_hdcp2_auth_check()
602 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val, in dw_dp_hdcp2_auth_check()
607 dev_err(dp->dev, "sink not support HDCP2\n"); in dw_dp_hdcp2_auth_check()
611 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPOBS, val, in dw_dp_hdcp2_auth_check()
615 dev_err(dp->dev, "wait hdcp22 controller auth timeout\n"); in dw_dp_hdcp2_auth_check()
619 dp->hdcp.hdcp2_encrypted = true; in dw_dp_hdcp2_auth_check()
621 dev_info(dp->dev, "HDCP2 authentication succeed\n"); in dw_dp_hdcp2_auth_check()
626 static int _dw_dp_hdcp2_enable(struct dw_dp *dp) in _dw_dp_hdcp2_enable() argument
628 struct dw_dp_hdcp *hdcp = &dp->hdcp; in _dw_dp_hdcp2_enable()
632 clk_prepare_enable(dp->hdcp_clk); in _dw_dp_hdcp2_enable()
634 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP, ENABLE_HDCP); in _dw_dp_hdcp2_enable()
636 return dw_dp_hdcp2_auth_check(dp); in _dw_dp_hdcp2_enable()
639 static bool dw_dp_hdcp_capable(struct dw_dp *dp) in dw_dp_hdcp_capable() argument
644 ret = drm_dp_dpcd_readb(&dp->aux, DP_AUX_HDCP_BCAPS, &bcaps); in dw_dp_hdcp_capable()
646 dev_err(dp->dev, "get hdcp capable failed:%d\n", ret); in dw_dp_hdcp_capable()
653 static int _dw_dp_hdcp_disable(struct dw_dp *dp) in _dw_dp_hdcp_disable() argument
655 struct dw_dp_hdcp *hdcp = &dp->hdcp; in _dw_dp_hdcp_disable()
657 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP | ENABLE_HDCP_13, 0); in _dw_dp_hdcp_disable()
661 dp->hdcp.hdcp_encrypted = false; in _dw_dp_hdcp_disable()
666 static int dw_dp_hdcp_auth_check(struct dw_dp *dp) in dw_dp_hdcp_auth_check() argument
671 ret = regmap_read_poll_timeout(dp->regmap, DPTX_HDCPAPIINTSTAT, val, in dw_dp_hdcp_auth_check()
675 dev_err(dp->dev, " HDCP authentication process failed\n"); in dw_dp_hdcp_auth_check()
676 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP_FAILED); in dw_dp_hdcp_auth_check()
680 dev_err(dp->dev, "Aux received nack response continuously for 7 times\n"); in dw_dp_hdcp_auth_check()
681 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPNACK7TIMES); in dw_dp_hdcp_auth_check()
685 dev_err(dp->dev, "Aux did not receive a response and timedout\n"); in dw_dp_hdcp_auth_check()
686 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPTIMEOUT); in dw_dp_hdcp_auth_check()
690 dev_err(dp->dev, "Aux received defer response continuously for 7 times\n"); in dw_dp_hdcp_auth_check()
691 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, AUXRESPDEFER7TIMES); in dw_dp_hdcp_auth_check()
694 dev_err(dp->dev, "HDCP authentication timeout\n"); in dw_dp_hdcp_auth_check()
696 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP_ENGAGED); in dw_dp_hdcp_auth_check()
697 dp->hdcp.hdcp_encrypted = true; in dw_dp_hdcp_auth_check()
698 dev_info(dp->dev, "HDCP authentication succeed\n"); in dw_dp_hdcp_auth_check()
704 static int _dw_dp_hdcp_enable(struct dw_dp *dp) in _dw_dp_hdcp_enable() argument
708 struct dw_dp_hdcp *hdcp = &dp->hdcp; in _dw_dp_hdcp_enable()
712 dw_dp_hdcp_rng_init(dp); in _dw_dp_hdcp_enable()
714 ret = dw_dp_hdcp_init_keys(dp); in _dw_dp_hdcp_enable()
718 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPCD_REV, &rev); in _dw_dp_hdcp_enable()
723 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, DPCD12PLUS, DPCD12PLUS); in _dw_dp_hdcp_enable()
725 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, ENABLE_HDCP | ENABLE_HDCP_13, in _dw_dp_hdcp_enable()
728 return dw_dp_hdcp_auth_check(dp); in _dw_dp_hdcp_enable()
733 static int dw_dp_hdcp_enable(struct dw_dp *dp, u8 content_type) in dw_dp_hdcp_enable() argument
737 dp->hdcp.check_link_interval = DRM_HDCP_CHECK_PERIOD_MS; in dw_dp_hdcp_enable()
738 mutex_lock(&dp->hdcp.mutex); in dw_dp_hdcp_enable()
739 sip_hdcp_config(HDCP_FUNC_ENCRYPT_MODE, dp->id ? DP_TX1 : DP_TX0, 0x0); in dw_dp_hdcp_enable()
740 dw_dp_hw_hdcp_init(dp); in dw_dp_hdcp_enable()
741 if (dw_dp_hdcp2_capable(dp)) { in dw_dp_hdcp_enable()
742 ret = _dw_dp_hdcp2_enable(dp); in dw_dp_hdcp_enable()
744 dp->hdcp.check_link_interval = DRM_HDCP2_CHECK_PERIOD_MS; in dw_dp_hdcp_enable()
746 _dw_dp_hdcp2_disable(dp); in dw_dp_hdcp_enable()
749 if (ret && dw_dp_hdcp_capable(dp) && content_type != DRM_MODE_HDCP_CONTENT_TYPE1) { in dw_dp_hdcp_enable()
750 ret = _dw_dp_hdcp_enable(dp); in dw_dp_hdcp_enable()
752 dp->hdcp.check_link_interval = DRM_HDCP_CHECK_PERIOD_MS; in dw_dp_hdcp_enable()
754 _dw_dp_hdcp_disable(dp); in dw_dp_hdcp_enable()
760 dp->hdcp.hdcp_content_type = content_type; in dw_dp_hdcp_enable()
761 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_ENABLED; in dw_dp_hdcp_enable()
762 schedule_work(&dp->hdcp.prop_work); in dw_dp_hdcp_enable()
763 schedule_delayed_work(&dp->hdcp.check_work, dp->hdcp.check_link_interval); in dw_dp_hdcp_enable()
766 mutex_unlock(&dp->hdcp.mutex); in dw_dp_hdcp_enable()
770 static int dw_dp_hdcp_disable(struct dw_dp *dp) in dw_dp_hdcp_disable() argument
774 mutex_lock(&dp->hdcp.mutex); in dw_dp_hdcp_disable()
775 if (dp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { in dw_dp_hdcp_disable()
776 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED; in dw_dp_hdcp_disable()
777 sip_hdcp_config(HDCP_FUNC_ENCRYPT_MODE, dp->id ? DP_TX1 : DP_TX0, 0x1); in dw_dp_hdcp_disable()
778 ret = _dw_dp_hdcp_disable(dp); in dw_dp_hdcp_disable()
780 mutex_unlock(&dp->hdcp.mutex); in dw_dp_hdcp_disable()
781 cancel_delayed_work_sync(&dp->hdcp.check_work); in dw_dp_hdcp_disable()
786 static int _dw_dp_hdcp_check_link(struct dw_dp *dp) in _dw_dp_hdcp_check_link() argument
791 ret = drm_dp_dpcd_readb(&dp->aux, DP_AUX_HDCP_BSTATUS, &bstatus); in _dw_dp_hdcp_check_link()
801 static int dw_dp_hdcp_check_link(struct dw_dp *dp) in dw_dp_hdcp_check_link() argument
805 mutex_lock(&dp->hdcp.mutex); in dw_dp_hdcp_check_link()
807 if (dp->hdcp.value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) in dw_dp_hdcp_check_link()
810 ret = _dw_dp_hdcp_check_link(dp); in dw_dp_hdcp_check_link()
814 dev_info(dp->dev, "HDCP link failed, retrying authentication\n"); in dw_dp_hdcp_check_link()
816 if (dp->hdcp.status == HDCP_TX_2) { in dw_dp_hdcp_check_link()
817 ret = _dw_dp_hdcp2_disable(dp); in dw_dp_hdcp_check_link()
819 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; in dw_dp_hdcp_check_link()
820 schedule_work(&dp->hdcp.prop_work); in dw_dp_hdcp_check_link()
824 ret = _dw_dp_hdcp2_enable(dp); in dw_dp_hdcp_check_link()
826 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; in dw_dp_hdcp_check_link()
827 schedule_work(&dp->hdcp.prop_work); in dw_dp_hdcp_check_link()
829 } else if (dp->hdcp.status == HDCP_TX_1) { in dw_dp_hdcp_check_link()
830 ret = _dw_dp_hdcp_disable(dp); in dw_dp_hdcp_check_link()
832 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; in dw_dp_hdcp_check_link()
833 schedule_work(&dp->hdcp.prop_work); in dw_dp_hdcp_check_link()
837 ret = _dw_dp_hdcp_enable(dp); in dw_dp_hdcp_check_link()
839 dp->hdcp.value = DRM_MODE_CONTENT_PROTECTION_DESIRED; in dw_dp_hdcp_check_link()
840 schedule_work(&dp->hdcp.prop_work); in dw_dp_hdcp_check_link()
845 mutex_unlock(&dp->hdcp.mutex); in dw_dp_hdcp_check_link()
854 struct dw_dp *dp = in dw_dp_hdcp_check_work() local
857 if (!dw_dp_hdcp_check_link(dp)) in dw_dp_hdcp_check_work()
866 struct dw_dp *dp = in dp_dp_hdcp_prop_work() local
868 struct drm_device *dev = dp->connector.dev; in dp_dp_hdcp_prop_work()
871 mutex_lock(&dp->hdcp.mutex); in dp_dp_hdcp_prop_work()
872 if (dp->hdcp.value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) in dp_dp_hdcp_prop_work()
873 drm_hdcp_update_content_protection(&dp->connector, dp->hdcp.value); in dp_dp_hdcp_prop_work()
874 mutex_unlock(&dp->hdcp.mutex); in dp_dp_hdcp_prop_work()
878 static void dw_dp_hdcp_init(struct dw_dp *dp) in dw_dp_hdcp_init() argument
880 INIT_DELAYED_WORK(&dp->hdcp.check_work, dw_dp_hdcp_check_work); in dw_dp_hdcp_init()
881 INIT_WORK(&dp->hdcp.prop_work, dp_dp_hdcp_prop_work); in dw_dp_hdcp_init()
882 mutex_init(&dp->hdcp.mutex); in dw_dp_hdcp_init()
885 static void dw_dp_handle_hdcp_event(struct dw_dp *dp) in dw_dp_handle_hdcp_event() argument
889 mutex_lock(&dp->irq_lock); in dw_dp_handle_hdcp_event()
891 regmap_read(dp->regmap, DPTX_HDCPAPIINTSTAT, &value); in dw_dp_handle_hdcp_event()
894 dev_info(dp->dev, "A change in HDCP22 GPIO Output status\n"); in dw_dp_handle_hdcp_event()
895 regmap_write(dp->regmap, DPTX_HDCPAPIINTCLR, HDCP22_GPIOINT); in dw_dp_handle_hdcp_event()
898 mutex_unlock(&dp->irq_lock); in dw_dp_handle_hdcp_event()
948 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_match_by_id() local
951 return dp->id == *id; in dw_dp_match_by_id()
966 static void dw_dp_phy_set_pattern(struct dw_dp *dp, u32 pattern) in dw_dp_phy_set_pattern() argument
968 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, TPS_SEL, in dw_dp_phy_set_pattern()
972 static void dw_dp_phy_xmit_enable(struct dw_dp *dp, u32 lanes) in dw_dp_phy_xmit_enable() argument
988 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, XMIT_ENABLE, in dw_dp_phy_xmit_enable()
992 static bool dw_dp_bandwidth_ok(struct dw_dp *dp, in dw_dp_bandwidth_ok() argument
1006 static bool dw_dp_detect(struct dw_dp *dp) in dw_dp_detect() argument
1010 if (dp->hpd_gpio) in dw_dp_detect()
1011 return gpiod_get_value_cansleep(dp->hpd_gpio); in dw_dp_detect()
1013 regmap_read(dp->regmap, DPTX_HPD_STATUS, &value); in dw_dp_detect()
1021 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_connector_detect() local
1023 if (dp->right && drm_bridge_detect(&dp->right->bridge) != connector_status_connected) in dw_dp_connector_detect()
1026 return drm_bridge_detect(&dp->bridge); in dw_dp_connector_detect()
1037 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_connector_force() local
1040 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, true); in dw_dp_connector_force()
1041 dw_dp_audio_handle_plugged_change(&dp->audio, true); in dw_dp_connector_force()
1043 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, false); in dw_dp_connector_force()
1044 dw_dp_audio_handle_plugged_change(&dp->audio, false); in dw_dp_connector_force()
1100 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_atomic_connector_get_property() local
1104 if (property == dp->color_depth_property) { in dw_dp_atomic_connector_get_property()
1107 } else if (property == dp->color_format_property) { in dw_dp_atomic_connector_get_property()
1110 } else if (property == dp->color_depth_capacity) { in dw_dp_atomic_connector_get_property()
1130 } else if (property == dp->color_format_capacity) { in dw_dp_atomic_connector_get_property()
1133 } else if (property == dp->hdcp_state_property) { in dw_dp_atomic_connector_get_property()
1134 if (dp->hdcp.hdcp2_encrypted) in dw_dp_atomic_connector_get_property()
1136 else if (dp->hdcp.hdcp_encrypted) in dw_dp_atomic_connector_get_property()
1143 dev_err(dp->dev, "Unknown property [PROP:%d:%s]\n", in dw_dp_atomic_connector_get_property()
1154 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_atomic_connector_set_property() local
1157 if (property == dp->color_depth_property) { in dw_dp_atomic_connector_set_property()
1160 } else if (property == dp->color_format_property) { in dw_dp_atomic_connector_set_property()
1163 } else if (property == dp->color_depth_capacity) { in dw_dp_atomic_connector_set_property()
1165 } else if (property == dp->color_format_capacity) { in dw_dp_atomic_connector_set_property()
1167 } else if (property == dp->hdcp_state_property) { in dw_dp_atomic_connector_set_property()
1171 dev_err(dp->dev, "Unknown property [PROP:%d:%s]\n", in dw_dp_atomic_connector_set_property()
1191 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_update_hdr_property() local
1198 ret = drm_property_replace_global_blob(dev, &dp->hdr_panel_blob_ptr, size, metadata, in dw_dp_update_hdr_property()
1199 &connector->base, dp->hdr_panel_metadata_property); in dw_dp_update_hdr_property()
1206 struct dw_dp *dp = connector_to_dp(connector); in dw_dp_connector_get_modes() local
1211 if (dp->right && dp->right->next_bridge) { in dw_dp_connector_get_modes()
1212 struct drm_bridge *bridge = dp->right->next_bridge; in dw_dp_connector_get_modes()
1220 if (dp->next_bridge) in dw_dp_connector_get_modes()
1221 num_modes = drm_bridge_get_modes(dp->next_bridge, connector); in dw_dp_connector_get_modes()
1223 if (dp->panel) in dw_dp_connector_get_modes()
1224 num_modes = drm_panel_get_modes(dp->panel, connector); in dw_dp_connector_get_modes()
1227 edid = drm_bridge_get_edid(&dp->bridge, connector); in dw_dp_connector_get_modes()
1242 if (num_modes > 0 && dp->split_mode) { in dw_dp_connector_get_modes()
1316 struct dw_dp *dp = connector_to_dp(conn); in dw_dp_connector_atomic_check() local
1335 dev_err(dp->dev, "set invalid bpc:%d\n", dp_new_state->bpc); in dw_dp_connector_atomic_check()
1341 dev_err(dp->dev, "set invalid color format:%d\n", dp_new_state->color_format); in dw_dp_connector_atomic_check()
1348 dev_info(dp->dev, "still auto set color mode\n"); in dw_dp_connector_atomic_check()
1383 static int dw_dp_link_power_up(struct dw_dp *dp) in dw_dp_link_power_up() argument
1385 struct dw_dp_link *link = &dp->link; in dw_dp_link_power_up()
1392 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value); in dw_dp_link_power_up()
1399 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value); in dw_dp_link_power_up()
1408 static int dw_dp_link_power_down(struct dw_dp *dp) in dw_dp_link_power_down() argument
1410 struct dw_dp_link *link = &dp->link; in dw_dp_link_power_down()
1417 ret = drm_dp_dpcd_readb(&dp->aux, DP_SET_POWER, &value); in dw_dp_link_power_down()
1424 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, value); in dw_dp_link_power_down()
1439 static int dw_dp_link_probe(struct dw_dp *dp) in dw_dp_link_probe() argument
1441 struct dw_dp_link *link = &dp->link; in dw_dp_link_probe()
1447 ret = drm_dp_read_dpcd_caps(&dp->aux, link->dpcd); in dw_dp_link_probe()
1451 drm_dp_read_desc(&dp->aux, &link->desc, drm_dp_is_branch(link->dpcd)); in dw_dp_link_probe()
1454 ret = drm_dp_read_sink_count(&dp->aux); in dw_dp_link_probe()
1465 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST, in dw_dp_link_probe()
1474 link->rate = min_t(u32, min(dp->max_link_rate, dp->phy->attrs.max_link_rate * 100), in dw_dp_link_probe()
1476 link->lanes = min_t(u8, phy_get_bus_width(dp->phy), in dw_dp_link_probe()
1489 static int dw_dp_phy_update_vs_emph(struct dw_dp *dp, unsigned int rate, unsigned int lanes, in dw_dp_phy_update_vs_emph() argument
1501 phy_cfg.dp.voltage[i] = vs[i]; in dw_dp_phy_update_vs_emph()
1502 phy_cfg.dp.pre[i] = pe[i]; in dw_dp_phy_update_vs_emph()
1505 phy_cfg.dp.lanes = lanes; in dw_dp_phy_update_vs_emph()
1506 phy_cfg.dp.link_rate = rate / 100; in dw_dp_phy_update_vs_emph()
1507 phy_cfg.dp.set_lanes = false; in dw_dp_phy_update_vs_emph()
1508 phy_cfg.dp.set_rate = false; in dw_dp_phy_update_vs_emph()
1509 phy_cfg.dp.set_voltages = true; in dw_dp_phy_update_vs_emph()
1511 ret = phy_configure(dp->phy, &phy_cfg); in dw_dp_phy_update_vs_emph()
1524 ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf, lanes); in dw_dp_phy_update_vs_emph()
1531 static int dw_dp_link_train_update_vs_emph(struct dw_dp *dp) in dw_dp_link_train_update_vs_emph() argument
1533 struct dw_dp_link *link = &dp->link; in dw_dp_link_train_update_vs_emph()
1536 return dw_dp_phy_update_vs_emph(dp, dp->link.rate, dp->link.lanes, request); in dw_dp_link_train_update_vs_emph()
1539 static int dw_dp_phy_configure(struct dw_dp *dp, unsigned int rate, in dw_dp_phy_configure() argument
1546 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_POWERDOWN, in dw_dp_phy_configure()
1549 phy_cfg.dp.lanes = lanes; in dw_dp_phy_configure()
1550 phy_cfg.dp.link_rate = rate / 100; in dw_dp_phy_configure()
1551 phy_cfg.dp.ssc = ssc; in dw_dp_phy_configure()
1552 phy_cfg.dp.set_lanes = true; in dw_dp_phy_configure()
1553 phy_cfg.dp.set_rate = true; in dw_dp_phy_configure()
1554 phy_cfg.dp.set_voltages = false; in dw_dp_phy_configure()
1555 ret = phy_configure(dp->phy, &phy_cfg); in dw_dp_phy_configure()
1559 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_LANES, in dw_dp_phy_configure()
1563 regmap_update_bits(dp->regmap, DPTX_PHYIF_CTRL, PHY_POWERDOWN, in dw_dp_phy_configure()
1566 dw_dp_phy_xmit_enable(dp, lanes); in dw_dp_phy_configure()
1571 static int dw_dp_link_configure(struct dw_dp *dp) in dw_dp_link_configure() argument
1573 struct dw_dp_link *link = &dp->link; in dw_dp_link_configure()
1577 ret = dw_dp_phy_configure(dp, link->rate, link->lanes, link->caps.ssc); in dw_dp_link_configure()
1585 regmap_update_bits(dp->regmap, DPTX_CCTL, ENHANCE_FRAMING_EN, in dw_dp_link_configure()
1588 regmap_update_bits(dp->regmap, DPTX_CCTL, ENHANCE_FRAMING_EN, in dw_dp_link_configure()
1592 ret = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, sizeof(buf)); in dw_dp_link_configure()
1599 ret = drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, buf, in dw_dp_link_configure()
1636 static int dw_dp_link_train_set_pattern(struct dw_dp *dp, u32 pattern) in dw_dp_link_train_set_pattern() argument
1644 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_link_train_set_pattern()
1647 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_link_train_set_pattern()
1653 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_NONE); in dw_dp_link_train_set_pattern()
1656 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_1); in dw_dp_link_train_set_pattern()
1659 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_2); in dw_dp_link_train_set_pattern()
1662 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_3); in dw_dp_link_train_set_pattern()
1665 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_4); in dw_dp_link_train_set_pattern()
1671 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, in dw_dp_link_train_set_pattern()
1746 static int dw_dp_link_clock_recovery(struct dw_dp *dp) in dw_dp_link_clock_recovery() argument
1748 struct dw_dp_link *link = &dp->link; in dw_dp_link_clock_recovery()
1753 ret = dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_1); in dw_dp_link_clock_recovery()
1758 ret = dw_dp_link_train_update_vs_emph(dp); in dw_dp_link_clock_recovery()
1764 ret = drm_dp_dpcd_read_link_status(&dp->aux, status); in dw_dp_link_clock_recovery()
1766 dev_err(dp->dev, "failed to read link status: %d\n", ret); in dw_dp_link_clock_recovery()
1792 static int dw_dp_link_channel_equalization(struct dw_dp *dp) in dw_dp_link_channel_equalization() argument
1794 struct dw_dp_link *link = &dp->link; in dw_dp_link_channel_equalization()
1805 ret = dw_dp_link_train_set_pattern(dp, pattern); in dw_dp_link_channel_equalization()
1810 ret = dw_dp_link_train_update_vs_emph(dp); in dw_dp_link_channel_equalization()
1816 ret = drm_dp_dpcd_read_link_status(&dp->aux, status); in dw_dp_link_channel_equalization()
1821 dev_err(dp->dev, "clock recovery lost while equalizing channel\n"); in dw_dp_link_channel_equalization()
1838 static int dw_dp_link_downgrade(struct dw_dp *dp) in dw_dp_link_downgrade() argument
1840 struct dw_dp_link *link = &dp->link; in dw_dp_link_downgrade()
1841 struct dw_dp_video *video = &dp->video; in dw_dp_link_downgrade()
1857 if (!dw_dp_bandwidth_ok(dp, &video->mode, video->bpp, link->lanes, in dw_dp_link_downgrade()
1864 static int dw_dp_link_train_full(struct dw_dp *dp) in dw_dp_link_train_full() argument
1866 struct dw_dp_link *link = &dp->link; in dw_dp_link_train_full()
1872 dev_info(dp->dev, "full-training link: %u lane%s at %u MHz\n", in dw_dp_link_train_full()
1875 ret = dw_dp_link_configure(dp); in dw_dp_link_train_full()
1877 dev_err(dp->dev, "failed to configure DP link: %d\n", ret); in dw_dp_link_train_full()
1881 ret = dw_dp_link_clock_recovery(dp); in dw_dp_link_train_full()
1883 dev_err(dp->dev, "clock recovery failed: %d\n", ret); in dw_dp_link_train_full()
1888 dev_err(dp->dev, "clock recovery failed, downgrading link\n"); in dw_dp_link_train_full()
1890 ret = dw_dp_link_downgrade(dp); in dw_dp_link_train_full()
1897 dev_info(dp->dev, "clock recovery succeeded\n"); in dw_dp_link_train_full()
1899 ret = dw_dp_link_channel_equalization(dp); in dw_dp_link_train_full()
1901 dev_err(dp->dev, "channel equalization failed: %d\n", ret); in dw_dp_link_train_full()
1906 dev_err(dp->dev, "channel equalization failed, downgrading link\n"); in dw_dp_link_train_full()
1908 ret = dw_dp_link_downgrade(dp); in dw_dp_link_train_full()
1915 dev_info(dp->dev, "channel equalization succeeded\n"); in dw_dp_link_train_full()
1918 dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_DISABLE); in dw_dp_link_train_full()
1922 static int dw_dp_link_train_fast(struct dw_dp *dp) in dw_dp_link_train_fast() argument
1924 struct dw_dp_link *link = &dp->link; in dw_dp_link_train_fast()
1930 dev_info(dp->dev, "fast-training link: %u lane%s at %u MHz\n", in dw_dp_link_train_fast()
1933 ret = dw_dp_link_configure(dp); in dw_dp_link_train_fast()
1935 dev_err(dp->dev, "failed to configure DP link: %d\n", ret); in dw_dp_link_train_fast()
1939 ret = dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_1); in dw_dp_link_train_fast()
1951 ret = dw_dp_link_train_set_pattern(dp, pattern); in dw_dp_link_train_fast()
1957 ret = drm_dp_dpcd_read_link_status(&dp->aux, status); in dw_dp_link_train_fast()
1959 dev_err(dp->dev, "failed to read link status: %d\n", ret); in dw_dp_link_train_fast()
1964 dev_err(dp->dev, "clock recovery failed\n"); in dw_dp_link_train_fast()
1970 dev_err(dp->dev, "channel equalization failed\n"); in dw_dp_link_train_fast()
1976 dw_dp_link_train_set_pattern(dp, DP_TRAINING_PATTERN_DISABLE); in dw_dp_link_train_fast()
1980 static int dw_dp_link_train(struct dw_dp *dp) in dw_dp_link_train() argument
1982 struct dw_dp_link *link = &dp->link; in dw_dp_link_train()
1987 ret = dw_dp_link_train_fast(dp); in dw_dp_link_train()
1989 dev_err(dp->dev, in dw_dp_link_train()
1996 ret = dw_dp_link_train_full(dp); in dw_dp_link_train()
1998 dev_err(dp->dev, "full link training failed: %d\n", ret); in dw_dp_link_train()
2005 static int dw_dp_send_sdp(struct dw_dp *dp, struct dw_dp_sdp *sdp) in dw_dp_send_sdp() argument
2011 nr = find_first_zero_bit(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); in dw_dp_send_sdp()
2013 set_bit(nr, dp->sdp_reg_bank); in dw_dp_send_sdp()
2020 regmap_write(dp->regmap, reg, get_unaligned_le32(&sdp->header)); in dw_dp_send_sdp()
2024 regmap_write(dp->regmap, reg + i * 4, in dw_dp_send_sdp()
2028 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL, in dw_dp_send_sdp()
2033 regmap_update_bits(dp->regmap, DPTX_SDP_HORIZONTAL_CTRL, in dw_dp_send_sdp()
2077 static int dw_dp_send_vsc_sdp(struct dw_dp *dp) in dw_dp_send_vsc_sdp() argument
2079 struct dw_dp_video *video = &dp->video; in dw_dp_send_vsc_sdp()
2103 if (dw_dp_is_hdr_eotf(dp->eotf_type)) in dw_dp_send_vsc_sdp()
2109 if (dw_dp_is_hdr_eotf(dp->eotf_type)) in dw_dp_send_vsc_sdp()
2121 return dw_dp_send_sdp(dp, &sdp); in dw_dp_send_vsc_sdp()
2124 static ssize_t dw_dp_hdr_metadata_infoframe_sdp_pack(struct dw_dp *dp, in dw_dp_hdr_metadata_infoframe_sdp_pack() argument
2136 dev_err(dp->dev, "buffer size is smaller than hdr metadata infoframe\n"); in dw_dp_hdr_metadata_infoframe_sdp_pack()
2141 dev_err(dp->dev, "wrong static hdr metadata size\n"); in dw_dp_hdr_metadata_infoframe_sdp_pack()
2160 static int dw_dp_send_hdr_metadata_infoframe_sdp(struct dw_dp *dp) in dw_dp_send_hdr_metadata_infoframe_sdp() argument
2167 conn_state = dp->connector.state; in dw_dp_send_hdr_metadata_infoframe_sdp()
2171 dev_err(dp->dev, "couldn't set HDR metadata in infoframe\n"); in dw_dp_send_hdr_metadata_infoframe_sdp()
2175 dw_dp_hdr_metadata_infoframe_sdp_pack(dp, &drm_infoframe, &sdp); in dw_dp_send_hdr_metadata_infoframe_sdp()
2177 return dw_dp_send_sdp(dp, &sdp); in dw_dp_send_hdr_metadata_infoframe_sdp()
2180 static int dw_dp_video_set_pixel_mode(struct dw_dp *dp, u8 pixel_mode) in dw_dp_video_set_pixel_mode() argument
2191 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, PIXEL_MODE_SELECT, in dw_dp_video_set_pixel_mode()
2197 static bool dw_dp_video_need_vsc_sdp(struct dw_dp *dp) in dw_dp_video_need_vsc_sdp() argument
2199 struct dw_dp_link *link = &dp->link; in dw_dp_video_need_vsc_sdp()
2200 struct dw_dp_video *video = &dp->video; in dw_dp_video_need_vsc_sdp()
2208 if (dw_dp_is_hdr_eotf(dp->eotf_type)) in dw_dp_video_need_vsc_sdp()
2214 static int dw_dp_video_set_msa(struct dw_dp *dp, u8 color_format, u8 bpc, in dw_dp_video_set_msa() argument
2219 if (dw_dp_video_need_vsc_sdp(dp)) in dw_dp_video_set_msa()
2258 regmap_write(dp->regmap, DPTX_VIDEO_MSA1, in dw_dp_video_set_msa()
2260 regmap_write(dp->regmap, DPTX_VIDEO_MSA2, FIELD_PREP(MISC0, misc)); in dw_dp_video_set_msa()
2261 regmap_write(dp->regmap, DPTX_VIDEO_MSA3, FIELD_PREP(MISC1, misc >> 8)); in dw_dp_video_set_msa()
2266 static void dw_dp_video_disable(struct dw_dp *dp) in dw_dp_video_disable() argument
2268 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_STREAM_ENABLE, in dw_dp_video_disable()
2272 static int dw_dp_video_enable(struct dw_dp *dp) in dw_dp_video_enable() argument
2274 struct dw_dp_video *video = &dp->video; in dw_dp_video_enable()
2275 struct dw_dp_link *link = &dp->link; in dw_dp_video_enable()
2291 ret = dw_dp_video_set_pixel_mode(dp, pixel_mode); in dw_dp_video_enable()
2295 ret = dw_dp_video_set_msa(dp, color_format, bpc, vstart, hstart); in dw_dp_video_enable()
2299 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_MAPPING, in dw_dp_video_enable()
2308 regmap_write(dp->regmap, DPTX_VINPUT_POLARITY_CTRL, value); in dw_dp_video_enable()
2325 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG1, value); in dw_dp_video_enable()
2330 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG2, in dw_dp_video_enable()
2336 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG3, in dw_dp_video_enable()
2343 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG4, in dw_dp_video_enable()
2420 regmap_write(dp->regmap, DPTX_VIDEO_CONFIG5, in dw_dp_video_enable()
2428 regmap_write(dp->regmap, DPTX_VIDEO_HBLANK_INTERVAL, in dw_dp_video_enable()
2433 regmap_update_bits(dp->regmap, DPTX_VSAMPLE_CTRL, VIDEO_STREAM_ENABLE, in dw_dp_video_enable()
2436 if (dw_dp_video_need_vsc_sdp(dp)) in dw_dp_video_enable()
2437 dw_dp_send_vsc_sdp(dp); in dw_dp_video_enable()
2439 if (dw_dp_is_hdr_eotf(dp->eotf_type)) in dw_dp_video_enable()
2440 dw_dp_send_hdr_metadata_infoframe_sdp(dp); in dw_dp_video_enable()
2447 struct dw_dp *dp = arg; in dw_dp_hpd_irq_handler() local
2448 bool hpd = dw_dp_detect(dp); in dw_dp_hpd_irq_handler()
2450 mutex_lock(&dp->irq_lock); in dw_dp_hpd_irq_handler()
2452 dp->hotplug.long_hpd = true; in dw_dp_hpd_irq_handler()
2454 if (dp->hotplug.status && !hpd) { in dw_dp_hpd_irq_handler()
2457 hpd = dw_dp_detect(dp); in dw_dp_hpd_irq_handler()
2459 dp->hotplug.long_hpd = false; in dw_dp_hpd_irq_handler()
2462 dp->hotplug.status = hpd; in dw_dp_hpd_irq_handler()
2464 mutex_unlock(&dp->irq_lock); in dw_dp_hpd_irq_handler()
2466 schedule_work(&dp->hpd_work); in dw_dp_hpd_irq_handler()
2471 static void dw_dp_hpd_init(struct dw_dp *dp) in dw_dp_hpd_init() argument
2473 dp->hotplug.status = dw_dp_detect(dp); in dw_dp_hpd_init()
2475 if (dp->hpd_gpio || dp->force_hpd) { in dw_dp_hpd_init()
2476 regmap_update_bits(dp->regmap, DPTX_CCTL, FORCE_HPD, in dw_dp_hpd_init()
2482 regmap_update_bits(dp->regmap, DPTX_HPD_INTERRUPT_ENABLE, in dw_dp_hpd_init()
2489 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE, in dw_dp_hpd_init()
2493 static void dw_dp_aux_init(struct dw_dp *dp) in dw_dp_aux_init() argument
2495 regmap_update_bits(dp->regmap, DPTX_GENERAL_INTERRUPT_ENABLE, in dw_dp_aux_init()
2500 static void dw_dp_init(struct dw_dp *dp) in dw_dp_init() argument
2502 regmap_update_bits(dp->regmap, DPTX_CCTL, DEFAULT_FAST_LINK_TRAIN_EN, in dw_dp_init()
2505 dw_dp_hpd_init(dp); in dw_dp_init()
2506 dw_dp_aux_init(dp); in dw_dp_init()
2516 struct dw_dp *dp = encoder_to_dp(encoder); in dw_dp_encoder_disable() local
2523 if (dp->split_mode) in dw_dp_encoder_disable()
2526 s->output_if &= ~(dp->id ? VOP_OUTPUT_IF_DP1 : VOP_OUTPUT_IF_DP0); in dw_dp_encoder_disable()
2529 static void dw_dp_mode_fixup(struct dw_dp *dp, struct drm_display_mode *adjusted_mode) in dw_dp_mode_fixup() argument
2534 if (dp->split_mode) { in dw_dp_mode_fixup()
2541 dev_warn(dp->dev, "hsync is too narrow, fixup to min hsync:%d\n", min_hsync); in dw_dp_mode_fixup()
2545 dev_warn(dp->dev, "hbp is too narrow, fixup to min hbp:%d\n", min_hbp); in dw_dp_mode_fixup()
2565 struct dw_dp *dp = encoder_to_dp(encoder); in dw_dp_encoder_atomic_check() local
2566 struct dw_dp_video *video = &dp->video; in dw_dp_encoder_atomic_check()
2570 dp->eotf_type = dw_dp_get_eotf(conn_state); in dw_dp_encoder_atomic_check()
2585 if (dp->split_mode) { in dw_dp_encoder_atomic_check()
2587 s->output_flags |= dp->id ? ROCKCHIP_OUTPUT_DATA_SWAP : 0; in dw_dp_encoder_atomic_check()
2590 s->output_if |= dp->id ? VOP_OUTPUT_IF_DP1 : VOP_OUTPUT_IF_DP0; in dw_dp_encoder_atomic_check()
2597 s->eotf = dp->eotf_type; in dw_dp_encoder_atomic_check()
2603 dw_dp_mode_fixup(dp, &crtc_state->adjusted_mode); in dw_dp_encoder_atomic_check()
2635 static int dw_dp_aux_write_data(struct dw_dp *dp, const u8 *buffer, size_t size) in dw_dp_aux_write_data() argument
2646 regmap_write(dp->regmap, DPTX_AUX_DATA0 + i * 4, value); in dw_dp_aux_write_data()
2652 static int dw_dp_aux_read_data(struct dw_dp *dp, u8 *buffer, size_t size) in dw_dp_aux_read_data() argument
2660 regmap_read(dp->regmap, DPTX_AUX_DATA0 + i * 4, &value); in dw_dp_aux_read_data()
2672 struct dw_dp *dp = container_of(aux, struct dw_dp, aux); in dw_dp_aux_transfer() local
2684 ret = dw_dp_aux_write_data(dp, msg->buffer, msg->size); in dw_dp_aux_transfer()
2701 regmap_write(dp->regmap, DPTX_AUX_CMD, value); in dw_dp_aux_transfer()
2703 status = wait_for_completion_timeout(&dp->complete, timeout); in dw_dp_aux_transfer()
2705 dev_dbg(dp->dev, "timeout waiting for AUX reply\n"); in dw_dp_aux_transfer()
2709 regmap_read(dp->regmap, DPTX_AUX_STATUS, &value); in dw_dp_aux_transfer()
2722 ret = dw_dp_aux_read_data(dp, msg->buffer, count); in dw_dp_aux_transfer()
2736 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_mode_valid() local
2737 struct dw_dp_link *link = &dp->link; in dw_dp_bridge_mode_valid()
2743 if (dp->split_mode) in dw_dp_bridge_mode_valid()
2761 if (!dw_dp_bandwidth_ok(dp, &m, min_bpp, link->lanes, link->rate)) in dw_dp_bridge_mode_valid()
2767 static void _dw_dp_loader_protect(struct dw_dp *dp, bool on) in _dw_dp_loader_protect() argument
2769 struct dw_dp_link *link = &dp->link; in _dw_dp_loader_protect()
2770 struct drm_connector *conn = &dp->connector; in _dw_dp_loader_protect()
2779 regmap_read(dp->regmap, DPTX_PHYIF_CTRL, &value); in _dw_dp_loader_protect()
2811 phy_power_on(dp->phy); in _dw_dp_loader_protect()
2813 phy_power_off(dp->phy); in _dw_dp_loader_protect()
2819 struct dw_dp *dp = encoder_to_dp(encoder); in dw_dp_loader_protect() local
2821 _dw_dp_loader_protect(dp, on); in dw_dp_loader_protect()
2822 if (dp->right) in dw_dp_loader_protect()
2823 _dw_dp_loader_protect(dp->right, on); in dw_dp_loader_protect()
2828 static int dw_dp_connector_init(struct dw_dp *dp) in dw_dp_connector_init() argument
2830 struct drm_connector *connector = &dp->connector; in dw_dp_connector_init()
2831 struct drm_bridge *bridge = &dp->bridge; in dw_dp_connector_init()
2837 if (dp->next_bridge && dp->next_bridge->ops & DRM_BRIDGE_OP_DETECT) in dw_dp_connector_init()
2846 DRM_DEV_ERROR(dp->dev, "Failed to initialize connector\n"); in dw_dp_connector_init()
2859 DRM_DEV_ERROR(dp->dev, "create color depth prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2862 dp->color_depth_property = prop; in dw_dp_connector_init()
2869 DRM_DEV_ERROR(dp->dev, "create color format prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2872 dp->color_format_property = prop; in dw_dp_connector_init()
2878 DRM_DEV_ERROR(dp->dev, "create color depth caps prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2881 dp->color_depth_capacity = prop; in dw_dp_connector_init()
2887 DRM_DEV_ERROR(dp->dev, "create color format caps prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2890 dp->color_format_capacity = prop; in dw_dp_connector_init()
2893 ret = drm_connector_attach_content_protection_property(&dp->connector, true); in dw_dp_connector_init()
2895 dev_err(dp->dev, "failed to attach content protection: %d\n", ret); in dw_dp_connector_init()
2902 dev_err(dp->dev, "create hdcp encrypted prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2905 dp->hdcp_state_property = prop; in dw_dp_connector_init()
2911 DRM_DEV_ERROR(dp->dev, "create hdr metedata prop for dp%d failed\n", dp->id); in dw_dp_connector_init()
2914 dp->hdr_panel_metadata_property = prop; in dw_dp_connector_init()
2926 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_attach() local
2932 DRM_DEV_ERROR(dp->dev, "Parent encoder object not found"); in dw_dp_bridge_attach()
2936 ret = drm_of_find_panel_or_bridge(bridge->of_node, 1, -1, &dp->panel, in dw_dp_bridge_attach()
2937 &dp->next_bridge); in dw_dp_bridge_attach()
2941 if (dp->next_bridge) { in dw_dp_bridge_attach()
2942 struct drm_bridge *next_bridge = dp->next_bridge; in dw_dp_bridge_attach()
2948 DRM_DEV_ERROR(dp->dev, "failed to attach next bridge: %d\n", ret); in dw_dp_bridge_attach()
2959 ret = dw_dp_connector_init(dp); in dw_dp_bridge_attach()
2961 DRM_DEV_ERROR(dp->dev, "failed to create connector\n"); in dw_dp_bridge_attach()
2965 connector = &dp->connector; in dw_dp_bridge_attach()
2976 dp->sub_dev.connector = connector; in dw_dp_bridge_attach()
2977 dp->sub_dev.of_node = dp->dev->of_node; in dw_dp_bridge_attach()
2978 dp->sub_dev.loader_protect = dw_dp_loader_protect; in dw_dp_bridge_attach()
2979 rockchip_drm_register_sub_dev(&dp->sub_dev); in dw_dp_bridge_attach()
2986 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_detach() local
2988 drm_connector_cleanup(&dp->connector); in dw_dp_bridge_detach()
2994 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_pre_enable() local
2995 struct dw_dp_video *video = &dp->video; in dw_dp_bridge_atomic_pre_enable()
3001 if (dp->split_mode) in dw_dp_bridge_atomic_pre_enable()
3004 if (dp->panel) in dw_dp_bridge_atomic_pre_enable()
3005 drm_panel_prepare(dp->panel); in dw_dp_bridge_atomic_pre_enable()
3012 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_post_disable() local
3014 if (dp->panel) in dw_dp_bridge_atomic_post_disable()
3015 drm_panel_unprepare(dp->panel); in dw_dp_bridge_atomic_post_disable()
3018 static bool dw_dp_needs_link_retrain(struct dw_dp *dp) in dw_dp_needs_link_retrain() argument
3020 struct dw_dp_link *link = &dp->link; in dw_dp_needs_link_retrain()
3026 if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) < 0) in dw_dp_needs_link_retrain()
3030 return !drm_dp_channel_eq_ok(link_status, dp->link.lanes); in dw_dp_needs_link_retrain()
3033 static void dw_dp_link_disable(struct dw_dp *dp) in dw_dp_link_disable() argument
3035 struct dw_dp_link *link = &dp->link; in dw_dp_link_disable()
3037 if (dw_dp_detect(dp)) in dw_dp_link_disable()
3038 dw_dp_link_power_down(dp); in dw_dp_link_disable()
3040 dw_dp_phy_xmit_enable(dp, 0); in dw_dp_link_disable()
3042 phy_power_off(dp->phy); in dw_dp_link_disable()
3048 static int dw_dp_link_enable(struct dw_dp *dp) in dw_dp_link_enable() argument
3052 ret = phy_power_on(dp->phy); in dw_dp_link_enable()
3056 ret = dw_dp_link_power_up(dp); in dw_dp_link_enable()
3060 ret = dw_dp_link_train(dp); in dw_dp_link_enable()
3062 dev_err(dp->dev, "link training failed: %d\n", ret); in dw_dp_link_enable()
3072 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_enable() local
3080 dev_err(dp->dev, "failed to get connector\n"); in dw_dp_bridge_atomic_enable()
3086 dev_err(dp->dev, "failed to get connector state\n"); in dw_dp_bridge_atomic_enable()
3090 set_bit(0, dp->sdp_reg_bank); in dw_dp_bridge_atomic_enable()
3092 ret = dw_dp_link_enable(dp); in dw_dp_bridge_atomic_enable()
3094 dev_err(dp->dev, "failed to enable link: %d\n", ret); in dw_dp_bridge_atomic_enable()
3099 dw_dp_hdcp_enable(dp, conn_state->hdcp_content_type); in dw_dp_bridge_atomic_enable()
3101 ret = dw_dp_video_enable(dp); in dw_dp_bridge_atomic_enable()
3103 dev_err(dp->dev, "failed to enable video: %d\n", ret); in dw_dp_bridge_atomic_enable()
3107 if (dp->panel) in dw_dp_bridge_atomic_enable()
3108 drm_panel_enable(dp->panel); in dw_dp_bridge_atomic_enable()
3110 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, true); in dw_dp_bridge_atomic_enable()
3111 dw_dp_audio_handle_plugged_change(&dp->audio, true); in dw_dp_bridge_atomic_enable()
3114 static void dw_dp_reset(struct dw_dp *dp) in dw_dp_reset() argument
3118 disable_irq(dp->irq); in dw_dp_reset()
3119 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, CONTROLLER_RESET, in dw_dp_reset()
3122 regmap_update_bits(dp->regmap, DPTX_SOFT_RESET_CTRL, CONTROLLER_RESET, in dw_dp_reset()
3125 dw_dp_init(dp); in dw_dp_reset()
3126 if (!dp->hpd_gpio) { in dw_dp_reset()
3127 regmap_read_poll_timeout(dp->regmap, DPTX_HPD_STATUS, val, in dw_dp_reset()
3129 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_PLUG); in dw_dp_reset()
3131 enable_irq(dp->irq); in dw_dp_reset()
3137 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_disable() local
3139 if (dp->panel) in dw_dp_bridge_atomic_disable()
3140 drm_panel_disable(dp->panel); in dw_dp_bridge_atomic_disable()
3142 dw_dp_hdcp_disable(dp); in dw_dp_bridge_atomic_disable()
3143 dw_dp_video_disable(dp); in dw_dp_bridge_atomic_disable()
3144 dw_dp_link_disable(dp); in dw_dp_bridge_atomic_disable()
3145 bitmap_zero(dp->sdp_reg_bank, SDP_REG_BANK_SIZE); in dw_dp_bridge_atomic_disable()
3146 dw_dp_reset(dp); in dw_dp_bridge_atomic_disable()
3148 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, false); in dw_dp_bridge_atomic_disable()
3149 dw_dp_audio_handle_plugged_change(&dp->audio, false); in dw_dp_bridge_atomic_disable()
3152 static bool dw_dp_detect_dpcd(struct dw_dp *dp) in dw_dp_detect_dpcd() argument
3157 ret = phy_power_on(dp->phy); in dw_dp_detect_dpcd()
3161 ret = drm_dp_dpcd_readb(&dp->aux, DP_DPCD_REV, &value); in dw_dp_detect_dpcd()
3163 dev_err(dp->dev, "aux failed to read dpcd: %d\n", ret); in dw_dp_detect_dpcd()
3167 ret = dw_dp_link_probe(dp); in dw_dp_detect_dpcd()
3169 dev_err(dp->dev, "failed to probe DP link: %d\n", ret); in dw_dp_detect_dpcd()
3173 phy_power_off(dp->phy); in dw_dp_detect_dpcd()
3178 phy_power_off(dp->phy); in dw_dp_detect_dpcd()
3185 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_detect() local
3188 if (dp->panel) in dw_dp_bridge_detect()
3189 drm_panel_prepare(dp->panel); in dw_dp_bridge_detect()
3191 if (!dw_dp_detect(dp)) { in dw_dp_bridge_detect()
3196 if (!dw_dp_detect_dpcd(dp)) { in dw_dp_bridge_detect()
3201 if (dp->next_bridge) { in dw_dp_bridge_detect()
3202 struct drm_bridge *next_bridge = dp->next_bridge; in dw_dp_bridge_detect()
3215 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_get_edid() local
3219 ret = phy_power_on(dp->phy); in dw_dp_bridge_get_edid()
3223 edid = drm_get_edid(connector, &dp->aux.ddc); in dw_dp_bridge_get_edid()
3225 phy_power_off(dp->phy); in dw_dp_bridge_get_edid()
3236 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_get_output_bus_fmts() local
3238 struct dw_dp_link *link = &dp->link; in dw_dp_bridge_atomic_get_output_bus_fmts()
3244 if (dp->split_mode) in dw_dp_bridge_atomic_get_output_bus_fmts()
3247 if (dp->panel) { in dw_dp_bridge_atomic_get_output_bus_fmts()
3286 if (!dw_dp_bandwidth_ok(dp, &mode, fmt->bpp, link->lanes, link->rate)) in dw_dp_bridge_atomic_get_output_bus_fmts()
3295 if (dw_dp_is_hdr_eotf(dp->eotf_type) && fmt->bpc < 10) in dw_dp_bridge_atomic_get_output_bus_fmts()
3311 struct dw_dp *dp = bridge_to_dp(bridge); in dw_dp_bridge_atomic_check() local
3312 struct dw_dp_video *video = &dp->video; in dw_dp_bridge_atomic_check()
3316 dev_dbg(dp->dev, "input format 0x%04x, output format 0x%04x\n", in dw_dp_bridge_atomic_check()
3347 static int dw_dp_link_retrain(struct dw_dp *dp) in dw_dp_link_retrain() argument
3349 struct drm_device *dev = dp->bridge.dev; in dw_dp_link_retrain()
3353 if (!dw_dp_needs_link_retrain(dp)) in dw_dp_link_retrain()
3356 dev_dbg(dp->dev, "Retraining link\n"); in dw_dp_link_retrain()
3367 ret = dw_dp_link_train(dp); in dw_dp_link_retrain()
3374 static u8 dw_dp_autotest_phy_pattern(struct dw_dp *dp) in dw_dp_autotest_phy_pattern() argument
3376 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest; in dw_dp_autotest_phy_pattern()
3378 if (drm_dp_get_phy_test_pattern(&dp->aux, data)) { in dw_dp_autotest_phy_pattern()
3379 dev_err(dp->dev, "DP Phy Test pattern AUX read failure\n"); in dw_dp_autotest_phy_pattern()
3384 dp->compliance.test_active = true; in dw_dp_autotest_phy_pattern()
3389 static void dw_dp_handle_test_request(struct dw_dp *dp) in dw_dp_handle_test_request() argument
3395 status = drm_dp_dpcd_readb(&dp->aux, DP_TEST_REQUEST, &request); in dw_dp_handle_test_request()
3397 dev_err(dp->dev, "Could not read test request from sink\n"); in dw_dp_handle_test_request()
3403 dev_dbg(dp->dev, "PHY_PATTERN test requested\n"); in dw_dp_handle_test_request()
3404 response = dw_dp_autotest_phy_pattern(dp); in dw_dp_handle_test_request()
3407 dev_warn(dp->dev, "Invalid test request '%02x'\n", request); in dw_dp_handle_test_request()
3412 dp->compliance.test_type = request; in dw_dp_handle_test_request()
3415 status = drm_dp_dpcd_writeb(&dp->aux, DP_TEST_RESPONSE, response); in dw_dp_handle_test_request()
3417 dev_warn(dp->dev, "Could not write test response to sink\n"); in dw_dp_handle_test_request()
3420 static void dw_dp_hdcp_handle_cp_irq(struct dw_dp *dp) in dw_dp_hdcp_handle_cp_irq() argument
3422 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, CP_IRQ, CP_IRQ); in dw_dp_hdcp_handle_cp_irq()
3424 regmap_update_bits(dp->regmap, DPTX_HDCPCFG, CP_IRQ, 0); in dw_dp_hdcp_handle_cp_irq()
3427 static void dw_dp_check_service_irq(struct dw_dp *dp) in dw_dp_check_service_irq() argument
3429 struct dw_dp_link *link = &dp->link; in dw_dp_check_service_irq()
3435 if (drm_dp_dpcd_readb(&dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val) in dw_dp_check_service_irq()
3438 drm_dp_dpcd_writeb(&dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val); in dw_dp_check_service_irq()
3441 dw_dp_handle_test_request(dp); in dw_dp_check_service_irq()
3444 dw_dp_hdcp_handle_cp_irq(dp); in dw_dp_check_service_irq()
3447 dev_info(dp->dev, "Sink specific irq unhandled\n"); in dw_dp_check_service_irq()
3450 static void dw_dp_phy_pattern_update(struct dw_dp *dp) in dw_dp_phy_pattern_update() argument
3452 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest; in dw_dp_phy_pattern_update()
3456 dev_dbg(dp->dev, "Disable Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3457 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3459 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_NONE); in dw_dp_phy_pattern_update()
3462 dev_dbg(dp->dev, "Set D10.2 Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3463 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3465 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_1); in dw_dp_phy_pattern_update()
3468 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3470 dev_dbg(dp->dev, "Set Error Count Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3471 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_SERM); in dw_dp_phy_pattern_update()
3474 dev_dbg(dp->dev, "Set PRBS7 Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3475 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3477 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_PBRS7); in dw_dp_phy_pattern_update()
3480 dev_dbg(dp->dev, "Set 80Bit Custom Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3481 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3483 regmap_write(dp->regmap, DPTX_CUSTOMPAT0, 0x3e0f83e0); in dw_dp_phy_pattern_update()
3484 regmap_write(dp->regmap, DPTX_CUSTOMPAT1, 0x3e0f83e0); in dw_dp_phy_pattern_update()
3485 regmap_write(dp->regmap, DPTX_CUSTOMPAT2, 0x000f83e0); in dw_dp_phy_pattern_update()
3486 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_CUSTOM_80BIT); in dw_dp_phy_pattern_update()
3489 dev_dbg(dp->dev, "Set HBR2 compliance Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3490 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3492 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_CP2520_1); in dw_dp_phy_pattern_update()
3495 dev_dbg(dp->dev, "Set TPS4 Phy Test Pattern\n"); in dw_dp_phy_pattern_update()
3496 regmap_update_bits(dp->regmap, DPTX_CCTL, SCRAMBLE_DIS, in dw_dp_phy_pattern_update()
3498 dw_dp_phy_set_pattern(dp, DPTX_PHY_PATTERN_TPS_4); in dw_dp_phy_pattern_update()
3505 static void dw_dp_process_phy_request(struct dw_dp *dp) in dw_dp_process_phy_request() argument
3507 struct drm_dp_phy_test_params *data = &dp->compliance.test_data.phytest; in dw_dp_process_phy_request()
3511 ret = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, DP_LINK_STATUS_SIZE); in dw_dp_process_phy_request()
3513 dev_err(dp->dev, "failed to get link status\n"); in dw_dp_process_phy_request()
3517 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &spread); in dw_dp_process_phy_request()
3519 dev_err(dp->dev, "failed to get spread\n"); in dw_dp_process_phy_request()
3523 dw_dp_phy_configure(dp, data->link_rate, data->num_lanes, in dw_dp_process_phy_request()
3525 dw_dp_link_get_adjustments(&dp->link, link_status); in dw_dp_process_phy_request()
3526 dw_dp_phy_update_vs_emph(dp, data->link_rate, data->num_lanes, &dp->link.train.adjust); in dw_dp_process_phy_request()
3527 dw_dp_phy_pattern_update(dp); in dw_dp_process_phy_request()
3528 drm_dp_set_phy_test_pattern(&dp->aux, data, link_status[DP_DPCD_REV]); in dw_dp_process_phy_request()
3530 dev_dbg(dp->dev, "phy test rate:%d, lane count:%d, ssc:%d, vs:%d, pe: %d\n", in dw_dp_process_phy_request()
3531 data->link_rate, data->num_lanes, spread, dp->link.train.adjust.voltage_swing[0], in dw_dp_process_phy_request()
3532 dp->link.train.adjust.pre_emphasis[0]); in dw_dp_process_phy_request()
3535 static void dw_dp_phy_test(struct dw_dp *dp) in dw_dp_phy_test() argument
3537 struct drm_device *dev = dp->bridge.dev; in dw_dp_phy_test()
3551 dw_dp_process_phy_request(dp); in dw_dp_phy_test()
3556 static bool dw_dp_hpd_short_pulse(struct dw_dp *dp) in dw_dp_hpd_short_pulse() argument
3558 memset(&dp->compliance, 0, sizeof(dp->compliance)); in dw_dp_hpd_short_pulse()
3560 dw_dp_check_service_irq(dp); in dw_dp_hpd_short_pulse()
3562 if (dw_dp_needs_link_retrain(dp)) in dw_dp_hpd_short_pulse()
3565 switch (dp->compliance.test_type) { in dw_dp_hpd_short_pulse()
3569 dev_warn(dp->dev, "test_type%lu is not support\n", dp->compliance.test_type); in dw_dp_hpd_short_pulse()
3578 struct dw_dp *dp = container_of(work, struct dw_dp, hpd_work); in dw_dp_hpd_work() local
3582 mutex_lock(&dp->irq_lock); in dw_dp_hpd_work()
3583 long_hpd = dp->hotplug.long_hpd; in dw_dp_hpd_work()
3584 mutex_unlock(&dp->irq_lock); in dw_dp_hpd_work()
3586 dev_dbg(dp->dev, "got hpd irq - %s\n", long_hpd ? "long" : "short"); in dw_dp_hpd_work()
3589 if (dw_dp_hpd_short_pulse(dp)) in dw_dp_hpd_work()
3592 if (dp->compliance.test_active && in dw_dp_hpd_work()
3593 dp->compliance.test_type == DP_TEST_LINK_PHY_TEST_PATTERN) { in dw_dp_hpd_work()
3594 dw_dp_phy_test(dp); in dw_dp_hpd_work()
3599 ret = dw_dp_link_retrain(dp); in dw_dp_hpd_work()
3601 dev_warn(dp->dev, "Retrain link failed\n"); in dw_dp_hpd_work()
3603 drm_helper_hpd_irq_event(dp->bridge.dev); in dw_dp_hpd_work()
3607 static void dw_dp_handle_hpd_event(struct dw_dp *dp) in dw_dp_handle_hpd_event() argument
3611 mutex_lock(&dp->irq_lock); in dw_dp_handle_hpd_event()
3613 regmap_read(dp->regmap, DPTX_HPD_STATUS, &value); in dw_dp_handle_hpd_event()
3616 dev_dbg(dp->dev, "IRQ from the HPD\n"); in dw_dp_handle_hpd_event()
3617 dp->hotplug.long_hpd = false; in dw_dp_handle_hpd_event()
3618 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_IRQ); in dw_dp_handle_hpd_event()
3622 dev_dbg(dp->dev, "Hot plug detected\n"); in dw_dp_handle_hpd_event()
3623 dp->hotplug.long_hpd = true; in dw_dp_handle_hpd_event()
3624 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_PLUG); in dw_dp_handle_hpd_event()
3628 dev_dbg(dp->dev, "Unplug detected\n"); in dw_dp_handle_hpd_event()
3629 dp->hotplug.long_hpd = true; in dw_dp_handle_hpd_event()
3630 regmap_write(dp->regmap, DPTX_HPD_STATUS, HPD_HOT_UNPLUG); in dw_dp_handle_hpd_event()
3633 mutex_unlock(&dp->irq_lock); in dw_dp_handle_hpd_event()
3635 schedule_work(&dp->hpd_work); in dw_dp_handle_hpd_event()
3640 struct dw_dp *dp = data; in dw_dp_irq_handler() local
3643 regmap_read(dp->regmap, DPTX_GENERAL_INTERRUPT, &value); in dw_dp_irq_handler()
3648 dw_dp_handle_hpd_event(dp); in dw_dp_irq_handler()
3651 regmap_write(dp->regmap, DPTX_GENERAL_INTERRUPT, in dw_dp_irq_handler()
3653 complete(&dp->complete); in dw_dp_irq_handler()
3657 dw_dp_handle_hdcp_event(dp); in dw_dp_irq_handler()
3666 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_audio_hw_params() local
3667 struct dw_dp_audio *audio = &dp->audio; in dw_dp_audio_hw_params()
3686 dev_err(dp->dev, "invalid channels %d\n", params->cea.channels); in dw_dp_audio_hw_params()
3700 dev_err(dp->dev, "invalid daifmt %d\n", daifmt->fmt); in dw_dp_audio_hw_params()
3704 clk_prepare_enable(dp->spdif_clk); in dw_dp_audio_hw_params()
3705 clk_prepare_enable(dp->i2s_clk); in dw_dp_audio_hw_params()
3707 regmap_update_bits(dp->regmap, DPTX_AUD_CONFIG1, in dw_dp_audio_hw_params()
3718 clk_disable_unprepare(dp->spdif_clk); in dw_dp_audio_hw_params()
3720 clk_disable_unprepare(dp->i2s_clk); in dw_dp_audio_hw_params()
3725 static int dw_dp_audio_infoframe_send(struct dw_dp *dp) in dw_dp_audio_infoframe_send() argument
3727 struct dw_dp_audio *audio = &dp->audio; in dw_dp_audio_infoframe_send()
3752 regmap_write(dp->regmap, DPTX_SDP_REGISTER_BANK, in dw_dp_audio_infoframe_send()
3762 regmap_write(dp->regmap, DPTX_SDP_REGISTER_BANK + 4 * i, value); in dw_dp_audio_infoframe_send()
3765 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL, in dw_dp_audio_infoframe_send()
3773 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_audio_startup() local
3775 regmap_update_bits(dp->regmap, DPTX_SDP_VERTICAL_CTRL, in dw_dp_audio_startup()
3779 regmap_update_bits(dp->regmap, DPTX_SDP_HORIZONTAL_CTRL, in dw_dp_audio_startup()
3783 return dw_dp_audio_infoframe_send(dp); in dw_dp_audio_startup()
3788 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_audio_shutdown() local
3789 struct dw_dp_audio *audio = &dp->audio; in dw_dp_audio_shutdown()
3791 regmap_update_bits(dp->regmap, DPTX_AUD_CONFIG1, AUDIO_DATA_IN_EN, in dw_dp_audio_shutdown()
3795 clk_disable_unprepare(dp->spdif_clk); in dw_dp_audio_shutdown()
3797 clk_disable_unprepare(dp->i2s_clk); in dw_dp_audio_shutdown()
3806 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_audio_hook_plugged_cb() local
3807 struct dw_dp_audio *audio = &dp->audio; in dw_dp_audio_hook_plugged_cb()
3811 dw_dp_audio_handle_plugged_change(audio, dw_dp_detect(dp)); in dw_dp_audio_hook_plugged_cb()
3818 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_audio_get_eld() local
3819 struct drm_connector *connector = &dp->connector; in dw_dp_audio_get_eld()
3834 static int dw_dp_register_audio_driver(struct dw_dp *dp) in dw_dp_register_audio_driver() argument
3836 struct dw_dp_audio *audio = &dp->audio; in dw_dp_register_audio_driver()
3845 audio->pdev = platform_device_register_data(dp->dev, in dw_dp_register_audio_driver()
3856 struct dw_dp *dp = data; in dw_dp_unregister_audio_driver() local
3857 struct dw_dp_audio *audio = &dp->audio; in dw_dp_unregister_audio_driver()
3867 struct dw_dp *dp = data; in dw_dp_aux_unregister() local
3869 drm_dp_aux_unregister(&dp->aux); in dw_dp_aux_unregister()
3874 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_bind() local
3876 struct drm_encoder *encoder = &dp->encoder; in dw_dp_bind()
3877 struct drm_bridge *bridge = &dp->bridge; in dw_dp_bind()
3880 if (!dp->left) { in dw_dp_bind()
3894 if (dp->right) { in dw_dp_bind()
3895 struct dw_dp *secondary = dp->right; in dw_dp_bind()
3906 pm_runtime_enable(dp->dev); in dw_dp_bind()
3907 pm_runtime_get_sync(dp->dev); in dw_dp_bind()
3909 enable_irq(dp->irq); in dw_dp_bind()
3910 if (dp->hpd_gpio) in dw_dp_bind()
3911 enable_irq(dp->hpd_irq); in dw_dp_bind()
3918 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_unbind() local
3920 if (dp->hpd_gpio) in dw_dp_unbind()
3921 disable_irq(dp->hpd_irq); in dw_dp_unbind()
3922 disable_irq(dp->irq); in dw_dp_unbind()
3924 pm_runtime_put(dp->dev); in dw_dp_unbind()
3925 pm_runtime_disable(dp->dev); in dw_dp_unbind()
3927 drm_encoder_cleanup(&dp->encoder); in dw_dp_unbind()
3963 static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp) in dw_dp_parse_link_frequencies() argument
3965 struct device_node *node = dp->dev->of_node; in dw_dp_parse_link_frequencies()
3992 dev_err(dp->dev, "invalid link frequency value: %llu\n", frequency); in dw_dp_parse_link_frequencies()
3999 static int dw_dp_parse_dt(struct dw_dp *dp) in dw_dp_parse_dt() argument
4001 dp->force_hpd = device_property_read_bool(dp->dev, "force-hpd"); in dw_dp_parse_dt()
4003 dp->max_link_rate = dw_dp_parse_link_frequencies(dp); in dw_dp_parse_dt()
4004 if (!dp->max_link_rate) in dw_dp_parse_dt()
4005 dp->max_link_rate = 810000; in dw_dp_parse_dt()
4013 struct dw_dp *dp; in dw_dp_probe() local
4017 dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); in dw_dp_probe()
4018 if (!dp) in dw_dp_probe()
4021 id = of_alias_get_id(dev->of_node, "dp"); in dw_dp_probe()
4025 dp->id = id; in dw_dp_probe()
4026 dp->dev = dev; in dw_dp_probe()
4027 dp->video.pixel_mode = DPTX_MP_QUAD_PIXEL; in dw_dp_probe()
4029 ret = dw_dp_parse_dt(dp); in dw_dp_probe()
4033 mutex_init(&dp->irq_lock); in dw_dp_probe()
4034 INIT_WORK(&dp->hpd_work, dw_dp_hpd_work); in dw_dp_probe()
4035 init_completion(&dp->complete); in dw_dp_probe()
4041 dp->regmap = devm_regmap_init_mmio(dev, base, &dw_dp_regmap_config); in dw_dp_probe()
4042 if (IS_ERR(dp->regmap)) in dw_dp_probe()
4043 return dev_err_probe(dev, PTR_ERR(dp->regmap), in dw_dp_probe()
4046 dp->phy = devm_of_phy_get(dev, dev->of_node, NULL); in dw_dp_probe()
4047 if (IS_ERR(dp->phy)) in dw_dp_probe()
4048 return dev_err_probe(dev, PTR_ERR(dp->phy), in dw_dp_probe()
4051 dp->apb_clk = devm_clk_get(dev, "apb"); in dw_dp_probe()
4052 if (IS_ERR(dp->apb_clk)) in dw_dp_probe()
4053 return dev_err_probe(dev, PTR_ERR(dp->apb_clk), in dw_dp_probe()
4056 dp->aux_clk = devm_clk_get(dev, "aux"); in dw_dp_probe()
4057 if (IS_ERR(dp->aux_clk)) in dw_dp_probe()
4058 return dev_err_probe(dev, PTR_ERR(dp->aux_clk), in dw_dp_probe()
4061 dp->i2s_clk = devm_clk_get(dev, "i2s"); in dw_dp_probe()
4062 if (IS_ERR(dp->i2s_clk)) in dw_dp_probe()
4063 return dev_err_probe(dev, PTR_ERR(dp->i2s_clk), in dw_dp_probe()
4066 dp->spdif_clk = devm_clk_get(dev, "spdif"); in dw_dp_probe()
4067 if (IS_ERR(dp->spdif_clk)) in dw_dp_probe()
4068 return dev_err_probe(dev, PTR_ERR(dp->spdif_clk), in dw_dp_probe()
4071 dp->hclk = devm_clk_get_optional(dev, "hclk"); in dw_dp_probe()
4072 if (IS_ERR(dp->hclk)) in dw_dp_probe()
4073 return dev_err_probe(dev, PTR_ERR(dp->hclk), in dw_dp_probe()
4076 dp->hdcp_clk = devm_clk_get(dev, "hdcp"); in dw_dp_probe()
4077 if (IS_ERR(dp->hdcp_clk)) in dw_dp_probe()
4078 return dev_err_probe(dev, PTR_ERR(dp->hdcp_clk), in dw_dp_probe()
4081 dp->rstc = devm_reset_control_get(dev, NULL); in dw_dp_probe()
4082 if (IS_ERR(dp->rstc)) in dw_dp_probe()
4083 return dev_err_probe(dev, PTR_ERR(dp->rstc), in dw_dp_probe()
4086 dp->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in dw_dp_probe()
4087 if (IS_ERR(dp->hpd_gpio)) in dw_dp_probe()
4088 return dev_err_probe(dev, PTR_ERR(dp->hpd_gpio), in dw_dp_probe()
4090 if (dp->hpd_gpio) { in dw_dp_probe()
4091 dp->hpd_irq = gpiod_to_irq(dp->hpd_gpio); in dw_dp_probe()
4092 if (dp->hpd_irq < 0) in dw_dp_probe()
4093 return dev_err_probe(dev, dp->hpd_irq, in dw_dp_probe()
4096 irq_set_status_flags(dp->hpd_irq, IRQ_NOAUTOEN); in dw_dp_probe()
4097 ret = devm_request_threaded_irq(dev, dp->hpd_irq, NULL, in dw_dp_probe()
4101 IRQF_ONESHOT, "dw-dp-hpd", dp); in dw_dp_probe()
4108 dp->irq = platform_get_irq(pdev, 0); in dw_dp_probe()
4109 if (dp->irq < 0) in dw_dp_probe()
4110 return dp->irq; in dw_dp_probe()
4112 irq_set_status_flags(dp->irq, IRQ_NOAUTOEN); in dw_dp_probe()
4113 ret = devm_request_threaded_irq(dev, dp->irq, NULL, dw_dp_irq_handler, in dw_dp_probe()
4114 IRQF_ONESHOT, dev_name(dev), dp); in dw_dp_probe()
4120 dp->extcon = devm_extcon_dev_allocate(dev, dw_dp_cable); in dw_dp_probe()
4121 if (IS_ERR(dp->extcon)) in dw_dp_probe()
4122 return dev_err_probe(dev, PTR_ERR(dp->extcon), in dw_dp_probe()
4125 ret = devm_extcon_dev_register(dev, dp->extcon); in dw_dp_probe()
4130 ret = dw_dp_register_audio_driver(dp); in dw_dp_probe()
4134 ret = devm_add_action_or_reset(dev, dw_dp_unregister_audio_driver, dp); in dw_dp_probe()
4138 dp->aux.dev = dev; in dw_dp_probe()
4139 dp->aux.name = dev_name(dev); in dw_dp_probe()
4140 dp->aux.transfer = dw_dp_aux_transfer; in dw_dp_probe()
4141 ret = drm_dp_aux_register(&dp->aux); in dw_dp_probe()
4145 ret = devm_add_action_or_reset(dev, dw_dp_aux_unregister, dp); in dw_dp_probe()
4149 dp->bridge.of_node = dev->of_node; in dw_dp_probe()
4150 dp->bridge.funcs = &dw_dp_bridge_funcs; in dw_dp_probe()
4151 dp->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | in dw_dp_probe()
4153 dp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; in dw_dp_probe()
4155 platform_set_drvdata(pdev, dp); in dw_dp_probe()
4158 struct dw_dp *secondary = dw_dp_find_by_id(dev->driver, !dp->id); in dw_dp_probe()
4163 dp->right = secondary; in dw_dp_probe()
4164 dp->split_mode = true; in dw_dp_probe()
4165 secondary->left = dp; in dw_dp_probe()
4169 dw_dp_hdcp_init(dp); in dw_dp_probe()
4176 struct dw_dp *dp = platform_get_drvdata(pdev); in dw_dp_remove() local
4178 component_del(dp->dev, &dw_dp_component_ops); in dw_dp_remove()
4179 cancel_work_sync(&dp->hpd_work); in dw_dp_remove()
4186 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_runtime_suspend() local
4188 clk_disable_unprepare(dp->aux_clk); in dw_dp_runtime_suspend()
4189 clk_disable_unprepare(dp->apb_clk); in dw_dp_runtime_suspend()
4190 clk_disable_unprepare(dp->hclk); in dw_dp_runtime_suspend()
4197 struct dw_dp *dp = dev_get_drvdata(dev); in dw_dp_runtime_resume() local
4199 clk_prepare_enable(dp->hclk); in dw_dp_runtime_resume()
4200 clk_prepare_enable(dp->apb_clk); in dw_dp_runtime_resume()
4201 clk_prepare_enable(dp->aux_clk); in dw_dp_runtime_resume()
4203 dw_dp_init(dp); in dw_dp_runtime_resume()
4215 { .compatible = "rockchip,rk3588-dp", },
4224 .name = "dw-dp",