hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c
....@@ -151,8 +151,8 @@
151151 u8 value;
152152
153153 *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)
156156 return ret;
157157
158158 *sink_count = DP_GET_SINK_COUNT(value);
....@@ -351,9 +351,9 @@
351351 if (!cdn_dp_check_sink_connection(dp))
352352 return -ENODEV;
353353
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) {
357357 DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret);
358358 return ret;
359359 }
....@@ -551,8 +551,8 @@
551551 if (!port || !dp->max_rate || !dp->max_lanes)
552552 return false;
553553
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) {
556556 DRM_ERROR("Failed to get link status\n");
557557 return false;
558558 }
....@@ -598,11 +598,13 @@
598598 goto out;
599599 }
600600 }
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
+ }
606608 }
607609
608610 ret = cdn_dp_config_video(dp);
....@@ -611,11 +613,15 @@
611613 goto out;
612614 }
613615
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
+ }
618623 }
624
+
619625 out:
620626 mutex_unlock(&dp->lock);
621627 }
....@@ -962,6 +968,40 @@
962968 drm_kms_helper_hotplug_event(dp->drm_dev);
963969 }
964970
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
+
9651005 static int cdn_dp_bind(struct device *dev, struct device *master, void *data)
9661006 {
9671007 struct cdn_dp_device *dp = dev_get_drvdata(dev);
....@@ -979,6 +1019,13 @@
9791019 dp->active = false;
9801020 dp->active_port = -1;
9811021 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;
9821029
9831030 INIT_DELAYED_WORK(&dp->event_work, cdn_dp_pd_event_work);
9841031