| .. | .. |
|---|
| 175 | 175 | case MEDIA_BUS_FMT_UYVY8_1X16: |
|---|
| 176 | 176 | case MEDIA_BUS_FMT_UYVY10_1X20: |
|---|
| 177 | 177 | case MEDIA_BUS_FMT_UYVY12_1X24: |
|---|
| 178 | + case MEDIA_BUS_FMT_YUYV8_1X16: |
|---|
| 179 | + case MEDIA_BUS_FMT_YUYV10_1X20: |
|---|
| 180 | + case MEDIA_BUS_FMT_YUYV12_1X24: |
|---|
| 178 | 181 | return true; |
|---|
| 179 | 182 | |
|---|
| 180 | 183 | default: |
|---|
| .. | .. |
|---|
| 1047 | 1050 | /* HDMI Initialization Step B.2 */ |
|---|
| 1048 | 1051 | hdmi->phy.ops->set_pll(conn, hdmi->rk_hdmi, state); |
|---|
| 1049 | 1052 | |
|---|
| 1053 | + /* Mark yuv422 10bit */ |
|---|
| 1054 | + if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_YUYV10_1X20) |
|---|
| 1055 | + hdmi_writel(hdmi, BIT(20), VIDEO_INTERFACE_CONFIG0); |
|---|
| 1050 | 1056 | rk3588_set_grf_cfg(hdmi->rk_hdmi); |
|---|
| 1051 | 1057 | link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); |
|---|
| 1052 | 1058 | |
|---|
| .. | .. |
|---|
| 1094 | 1100 | hdmi->phy.enabled = true; |
|---|
| 1095 | 1101 | printf("%s DVI mode\n", __func__); |
|---|
| 1096 | 1102 | } |
|---|
| 1103 | + |
|---|
| 1104 | + /* Mark uboot hdmi is enabled */ |
|---|
| 1105 | + hdmi_writel(hdmi, BIT(21), VIDEO_INTERFACE_CONFIG0); |
|---|
| 1097 | 1106 | |
|---|
| 1098 | 1107 | return 0; |
|---|
| 1099 | 1108 | } |
|---|
| .. | .. |
|---|
| 1239 | 1248 | return 0; |
|---|
| 1240 | 1249 | } |
|---|
| 1241 | 1250 | |
|---|
| 1242 | | -int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state) |
|---|
| 1251 | +static void rockchip_dw_hdmi_qp_mode_valid(struct dw_hdmi_qp *hdmi) |
|---|
| 1243 | 1252 | { |
|---|
| 1244 | | - int ret, i; |
|---|
| 1253 | + struct hdmi_edid_data *edid_data = &hdmi->edid_data; |
|---|
| 1254 | + int i; |
|---|
| 1255 | + |
|---|
| 1256 | + for (i = 0; i < edid_data->modes; i++) { |
|---|
| 1257 | + if (edid_data->mode_buf[i].invalid) |
|---|
| 1258 | + continue; |
|---|
| 1259 | + if (edid_data->mode_buf[i].clock <= 25000) |
|---|
| 1260 | + edid_data->mode_buf[i].invalid = true; |
|---|
| 1261 | + } |
|---|
| 1262 | +} |
|---|
| 1263 | + |
|---|
| 1264 | +static int _rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, |
|---|
| 1265 | + struct display_state *state, int edid_status) |
|---|
| 1266 | +{ |
|---|
| 1267 | + int i; |
|---|
| 1245 | 1268 | struct connector_state *conn_state = &state->conn_state; |
|---|
| 1246 | 1269 | struct drm_display_mode *mode = &conn_state->mode; |
|---|
| 1247 | 1270 | struct dw_hdmi_qp *hdmi = conn->data; |
|---|
| .. | .. |
|---|
| 1254 | 1277 | if (!hdmi) |
|---|
| 1255 | 1278 | return -EFAULT; |
|---|
| 1256 | 1279 | |
|---|
| 1257 | | - ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); |
|---|
| 1258 | | - if (!ret) { |
|---|
| 1280 | + if (!edid_status) { |
|---|
| 1259 | 1281 | hdmi->sink_is_hdmi = |
|---|
| 1260 | 1282 | drm_detect_hdmi_monitor(edid); |
|---|
| 1261 | 1283 | hdmi->sink_has_audio = drm_detect_monitor_audio(edid); |
|---|
| 1262 | | - ret = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); |
|---|
| 1284 | + edid_status = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); |
|---|
| 1263 | 1285 | } |
|---|
| 1264 | | - if (ret < 0) { |
|---|
| 1286 | + if (edid_status < 0) { |
|---|
| 1265 | 1287 | hdmi->sink_is_hdmi = true; |
|---|
| 1266 | 1288 | hdmi->sink_has_audio = true; |
|---|
| 1267 | 1289 | do_cea_modes(&hdmi->edid_data, def_modes_vic, |
|---|
| .. | .. |
|---|
| 1270 | 1292 | printf("failed to get edid\n"); |
|---|
| 1271 | 1293 | } |
|---|
| 1272 | 1294 | drm_rk_filter_whitelist(&hdmi->edid_data); |
|---|
| 1273 | | - if (hdmi->phy.ops->mode_valid) |
|---|
| 1274 | | - hdmi->phy.ops->mode_valid(hdmi->rk_hdmi, state); |
|---|
| 1295 | + rockchip_dw_hdmi_qp_mode_valid(hdmi); |
|---|
| 1275 | 1296 | drm_mode_max_resolution_filter(&hdmi->edid_data, |
|---|
| 1276 | 1297 | &state->crtc_state.max_output); |
|---|
| 1277 | 1298 | if (!drm_mode_prune_invalid(&hdmi->edid_data)) { |
|---|
| .. | .. |
|---|
| 1298 | 1319 | hdmi->hdmi_data.enc_out_bus_format = bus_format; |
|---|
| 1299 | 1320 | |
|---|
| 1300 | 1321 | switch (bus_format) { |
|---|
| 1301 | | - case MEDIA_BUS_FMT_UYVY10_1X20: |
|---|
| 1302 | | - conn_state->bus_format = MEDIA_BUS_FMT_YUV10_1X30; |
|---|
| 1322 | + case MEDIA_BUS_FMT_YUYV10_1X20: |
|---|
| 1323 | + conn_state->bus_format = MEDIA_BUS_FMT_YUYV10_1X20; |
|---|
| 1303 | 1324 | hdmi->hdmi_data.enc_in_bus_format = |
|---|
| 1304 | | - MEDIA_BUS_FMT_YUV10_1X30; |
|---|
| 1325 | + MEDIA_BUS_FMT_YUYV10_1X20; |
|---|
| 1326 | + conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422; |
|---|
| 1305 | 1327 | break; |
|---|
| 1306 | | - case MEDIA_BUS_FMT_UYVY8_1X16: |
|---|
| 1307 | | - conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24; |
|---|
| 1328 | + case MEDIA_BUS_FMT_YUYV8_1X16: |
|---|
| 1329 | + conn_state->bus_format = MEDIA_BUS_FMT_YUYV8_1X16; |
|---|
| 1308 | 1330 | hdmi->hdmi_data.enc_in_bus_format = |
|---|
| 1309 | | - MEDIA_BUS_FMT_YUV8_1X24; |
|---|
| 1331 | + MEDIA_BUS_FMT_YUYV8_1X16; |
|---|
| 1332 | + conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422; |
|---|
| 1310 | 1333 | break; |
|---|
| 1311 | 1334 | case MEDIA_BUS_FMT_UYYVYY8_0_5X24: |
|---|
| 1312 | 1335 | case MEDIA_BUS_FMT_UYYVYY10_0_5X30: |
|---|
| .. | .. |
|---|
| 1334 | 1357 | return 0; |
|---|
| 1335 | 1358 | } |
|---|
| 1336 | 1359 | |
|---|
| 1360 | +int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state) |
|---|
| 1361 | +{ |
|---|
| 1362 | + struct connector_state *conn_state = &state->conn_state; |
|---|
| 1363 | + struct dw_hdmi_qp *hdmi = conn->data; |
|---|
| 1364 | + int ret; |
|---|
| 1365 | + |
|---|
| 1366 | + ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); |
|---|
| 1367 | + |
|---|
| 1368 | + if (conn_state->secondary) |
|---|
| 1369 | + _rockchip_dw_hdmi_qp_get_timing(conn_state->secondary, state, ret); |
|---|
| 1370 | + |
|---|
| 1371 | + return _rockchip_dw_hdmi_qp_get_timing(conn, state, ret); |
|---|
| 1372 | +} |
|---|
| 1373 | + |
|---|
| 1374 | + |
|---|
| 1337 | 1375 | int rockchip_dw_hdmi_qp_detect(struct rockchip_connector *conn, struct display_state *state) |
|---|
| 1338 | 1376 | { |
|---|
| 1339 | 1377 | int ret; |
|---|