.. | .. |
---|
151 | 151 | u8 value; |
---|
152 | 152 | |
---|
153 | 153 | *sink_count = 0; |
---|
154 | | - ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1); |
---|
155 | | - if (ret) |
---|
| 154 | + ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, &value, 1); |
---|
| 155 | + if (ret < 0) |
---|
156 | 156 | return ret; |
---|
157 | 157 | |
---|
158 | 158 | *sink_count = DP_GET_SINK_COUNT(value); |
---|
.. | .. |
---|
351 | 351 | if (!cdn_dp_check_sink_connection(dp)) |
---|
352 | 352 | return -ENODEV; |
---|
353 | 353 | |
---|
354 | | - ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, |
---|
355 | | - DP_RECEIVER_CAP_SIZE); |
---|
356 | | - if (ret) { |
---|
| 354 | + ret = drm_dp_dpcd_read(&dp->aux, DP_DPCD_REV, dp->dpcd, |
---|
| 355 | + sizeof(dp->dpcd)); |
---|
| 356 | + if (ret < 0) { |
---|
357 | 357 | DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret); |
---|
358 | 358 | return ret; |
---|
359 | 359 | } |
---|
.. | .. |
---|
551 | 551 | if (!port || !dp->max_rate || !dp->max_lanes) |
---|
552 | 552 | return false; |
---|
553 | 553 | |
---|
554 | | - if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, |
---|
555 | | - DP_LINK_STATUS_SIZE)) { |
---|
| 554 | + if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) != |
---|
| 555 | + DP_LINK_STATUS_SIZE) { |
---|
556 | 556 | DRM_ERROR("Failed to get link status\n"); |
---|
557 | 557 | return false; |
---|
558 | 558 | } |
---|
.. | .. |
---|
598 | 598 | goto out; |
---|
599 | 599 | } |
---|
600 | 600 | } |
---|
601 | | - |
---|
602 | | - ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE); |
---|
603 | | - if (ret) { |
---|
604 | | - DRM_DEV_ERROR(dp->dev, "Failed to idle video %d\n", ret); |
---|
605 | | - goto out; |
---|
| 601 | + if (dp->use_fw_training) { |
---|
| 602 | + ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE); |
---|
| 603 | + if (ret) { |
---|
| 604 | + DRM_DEV_ERROR(dp->dev, |
---|
| 605 | + "Failed to idle video %d\n", ret); |
---|
| 606 | + goto out; |
---|
| 607 | + } |
---|
606 | 608 | } |
---|
607 | 609 | |
---|
608 | 610 | ret = cdn_dp_config_video(dp); |
---|
.. | .. |
---|
611 | 613 | goto out; |
---|
612 | 614 | } |
---|
613 | 615 | |
---|
614 | | - ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_VALID); |
---|
615 | | - if (ret) { |
---|
616 | | - DRM_DEV_ERROR(dp->dev, "Failed to valid video %d\n", ret); |
---|
617 | | - goto out; |
---|
| 616 | + if (dp->use_fw_training) { |
---|
| 617 | + ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_VALID); |
---|
| 618 | + if (ret) { |
---|
| 619 | + DRM_DEV_ERROR(dp->dev, |
---|
| 620 | + "Failed to valid video %d\n", ret); |
---|
| 621 | + goto out; |
---|
| 622 | + } |
---|
618 | 623 | } |
---|
| 624 | + |
---|
619 | 625 | out: |
---|
620 | 626 | mutex_unlock(&dp->lock); |
---|
621 | 627 | } |
---|
.. | .. |
---|
962 | 968 | drm_kms_helper_hotplug_event(dp->drm_dev); |
---|
963 | 969 | } |
---|
964 | 970 | |
---|
| 971 | +static ssize_t cdn_dp_aux_transfer(struct drm_dp_aux *aux, |
---|
| 972 | + struct drm_dp_aux_msg *msg) |
---|
| 973 | +{ |
---|
| 974 | + struct cdn_dp_device *dp = container_of(aux, struct cdn_dp_device, aux); |
---|
| 975 | + int ret; |
---|
| 976 | + u8 status; |
---|
| 977 | + |
---|
| 978 | + switch (msg->request & ~DP_AUX_I2C_MOT) { |
---|
| 979 | + case DP_AUX_NATIVE_WRITE: |
---|
| 980 | + case DP_AUX_I2C_WRITE: |
---|
| 981 | + case DP_AUX_I2C_WRITE_STATUS_UPDATE: |
---|
| 982 | + ret = cdn_dp_dpcd_write(dp, msg->address, msg->buffer, |
---|
| 983 | + msg->size); |
---|
| 984 | + break; |
---|
| 985 | + case DP_AUX_NATIVE_READ: |
---|
| 986 | + case DP_AUX_I2C_READ: |
---|
| 987 | + ret = cdn_dp_dpcd_read(dp, msg->address, msg->buffer, |
---|
| 988 | + msg->size); |
---|
| 989 | + break; |
---|
| 990 | + default: |
---|
| 991 | + return -EINVAL; |
---|
| 992 | + } |
---|
| 993 | + |
---|
| 994 | + status = cdn_dp_get_aux_status(dp); |
---|
| 995 | + if (status == AUX_STATUS_ACK) |
---|
| 996 | + msg->reply = DP_AUX_NATIVE_REPLY_ACK; |
---|
| 997 | + else if (status == AUX_STATUS_NACK) |
---|
| 998 | + msg->reply = DP_AUX_NATIVE_REPLY_NACK; |
---|
| 999 | + else if (status == AUX_STATUS_DEFER) |
---|
| 1000 | + msg->reply = DP_AUX_NATIVE_REPLY_DEFER; |
---|
| 1001 | + |
---|
| 1002 | + return ret; |
---|
| 1003 | +} |
---|
| 1004 | + |
---|
965 | 1005 | static int cdn_dp_bind(struct device *dev, struct device *master, void *data) |
---|
966 | 1006 | { |
---|
967 | 1007 | struct cdn_dp_device *dp = dev_get_drvdata(dev); |
---|
.. | .. |
---|
979 | 1019 | dp->active = false; |
---|
980 | 1020 | dp->active_port = -1; |
---|
981 | 1021 | dp->fw_loaded = false; |
---|
| 1022 | + dp->aux.name = "DP-AUX"; |
---|
| 1023 | + dp->aux.transfer = cdn_dp_aux_transfer; |
---|
| 1024 | + dp->aux.dev = dev; |
---|
| 1025 | + |
---|
| 1026 | + ret = drm_dp_aux_register(&dp->aux); |
---|
| 1027 | + if (ret) |
---|
| 1028 | + return ret; |
---|
982 | 1029 | |
---|
983 | 1030 | INIT_DELAYED_WORK(&dp->event_work, cdn_dp_pd_event_work); |
---|
984 | 1031 | |
---|