.. | .. |
---|
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; |
---|