Hi, Rex:
On Mon, 2022-05-23 at 12:47 +0200, Guillaume Ranquet wrote:
From: Markus Schneider-Pargmann msp@baylibre.com
This patch adds a DisplayPort driver for the Mediatek mt8195 SoC.
It supports the mt8195, the embedded DisplayPort units. It offers DisplayPort 1.4 with up to 4 lanes.
The driver creates a child device for the phy. The child device will never exist without the parent being active. As they are sharing a register range, the parent passes a regmap pointer to the child so that both can work with the same register range. The phy driver sets device data that is read by the parent to get the phy device that can be used to control the phy properties.
This driver is based on an initial version by Jason-JH.Lin jason-jh.lin@mediatek.com.
Signed-off-by: Markus Schneider-Pargmann msp@baylibre.com Signed-off-by: Guillaume Ranquet granquet@baylibre.com
[snip]
+static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
struct drm_dp_aux_msg *msg)
+{
- struct mtk_dp *mtk_dp;
- bool is_read;
- u8 request;
- size_t accessed_bytes = 0;
- int ret = 0;
- mtk_dp = container_of(mtk_aux, struct mtk_dp, aux);
- if (!mtk_dp->train_info.cable_plugged_in ||
mtk_dp->train_info.irq_status & MTK_DP_HPD_DISCONNECT) {
mtk_dp->train_state = MTK_DP_TRAIN_STATE_CHECKCAP;
Changing state here has no any effect, so drop this.
return -EAGAIN;
- }
- switch (msg->request) {
- case DP_AUX_I2C_MOT:
- case DP_AUX_I2C_WRITE:
- case DP_AUX_NATIVE_WRITE:
- case DP_AUX_I2C_WRITE_STATUS_UPDATE:
- case DP_AUX_I2C_WRITE_STATUS_UPDATE | DP_AUX_I2C_MOT:
request = msg->request &
~DP_AUX_I2C_WRITE_STATUS_UPDATE;
is_read = false;
break;
- case DP_AUX_I2C_READ:
- case DP_AUX_NATIVE_READ:
- case DP_AUX_I2C_READ | DP_AUX_I2C_MOT:
request = msg->request;
is_read = true;
break;
- default:
drm_err(mtk_aux->drm_dev, "invalid aux cmd = %d\n",
msg->request);
return -EINVAL;
- }
- if (msg->size == 0) {
ret = mtk_dp_aux_do_transfer(mtk_dp, is_read, request,
msg->address +
accessed_bytes,
msg->buffer +
accessed_bytes, 0);
- } else {
while (accessed_bytes < msg->size) {
size_t to_access =
min_t(size_t, DP_AUX_MAX_PAYLOAD_BYTES,
msg->size - accessed_bytes);
ret = mtk_dp_aux_do_transfer(mtk_dp,
is_read, request,
msg->address +
accessed_bytes,
msg->buffer +
accessed_bytes,
to_access);
if (ret) {
drm_info(mtk_dp->drm_dev,
"Failed to do AUX transfer:
%d\n", ret);
break;
}
accessed_bytes += to_access;
}
- }
- if (ret) {
msg->reply = DP_AUX_NATIVE_REPLY_NACK |
DP_AUX_I2C_REPLY_NACK;
return ret;
- }
- msg->reply = DP_AUX_NATIVE_REPLY_ACK | DP_AUX_I2C_REPLY_ACK;
- return msg->size;
+}