| .. | .. |
|---|
| 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 | } |
|---|
| .. | .. |
|---|
| 539 | 539 | video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); |
|---|
| 540 | 540 | video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); |
|---|
| 541 | 541 | |
|---|
| 542 | | - memcpy(&dp->mode, adjusted, sizeof(*mode)); |
|---|
| 542 | + drm_mode_copy(&dp->mode, adjusted); |
|---|
| 543 | 543 | } |
|---|
| 544 | 544 | |
|---|
| 545 | 545 | static bool cdn_dp_check_link_status(struct cdn_dp_device *dp) |
|---|
| .. | .. |
|---|
| 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 | |
|---|