.. | .. |
---|
7 | 7 | #include <common.h> |
---|
8 | 8 | #include <malloc.h> |
---|
9 | 9 | #include <syscon.h> |
---|
| 10 | +#include <asm/gpio.h> |
---|
10 | 11 | #include <asm/arch-rockchip/clock.h> |
---|
11 | 12 | #include <asm/arch/vendor.h> |
---|
12 | 13 | #include <edid.h> |
---|
.. | .. |
---|
27 | 28 | #define HDCP_PRIVATE_KEY_SIZE 280 |
---|
28 | 29 | #define HDCP_KEY_SHA_SIZE 20 |
---|
29 | 30 | #define HDMI_HDCP1X_ID 5 |
---|
| 31 | +#define HDMI_EDID_BLOCK_LEN 128 |
---|
30 | 32 | /* |
---|
31 | 33 | * Unless otherwise noted, entries in this table are 100% optimization. |
---|
32 | 34 | * Values can be obtained from hdmi_compute_n() but that function is |
---|
.. | .. |
---|
181 | 183 | bool sink_has_audio; |
---|
182 | 184 | void *regs; |
---|
183 | 185 | void *grf; |
---|
| 186 | + void *gpio_base; |
---|
184 | 187 | struct dw_hdmi_i2c *i2c; |
---|
185 | 188 | |
---|
186 | 189 | struct { |
---|
.. | .. |
---|
203 | 206 | |
---|
204 | 207 | bool hdcp1x_enable; |
---|
205 | 208 | bool output_bus_format_rgb; |
---|
| 209 | + |
---|
| 210 | + struct gpio_desc hpd_gpiod; |
---|
206 | 211 | }; |
---|
207 | 212 | |
---|
208 | 213 | static void dw_hdmi_writel(struct dw_hdmi *hdmi, u8 val, int offset) |
---|
.. | .. |
---|
409 | 414 | { |
---|
410 | 415 | struct dw_hdmi_i2c *i2c = hdmi->i2c; |
---|
411 | 416 | int interrupt = 0, i = 20; |
---|
| 417 | + bool read_edid = false; |
---|
412 | 418 | |
---|
413 | 419 | if (!i2c->is_regaddr) { |
---|
414 | 420 | printf("set read register address to 0\n"); |
---|
.. | .. |
---|
416 | 422 | i2c->is_regaddr = true; |
---|
417 | 423 | } |
---|
418 | 424 | |
---|
419 | | - while (length--) { |
---|
420 | | - hdmi_writeb(hdmi, i2c->slave_reg++, HDMI_I2CM_ADDRESS); |
---|
421 | | - if (i2c->is_segment) |
---|
422 | | - hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT, |
---|
423 | | - HDMI_I2CM_OPERATION); |
---|
424 | | - else |
---|
425 | | - hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ, |
---|
426 | | - HDMI_I2CM_OPERATION); |
---|
| 425 | + /* edid reads are in 128 bytes. scdc reads are in 1 byte */ |
---|
| 426 | + if (length == HDMI_EDID_BLOCK_LEN) |
---|
| 427 | + read_edid = true; |
---|
| 428 | + |
---|
| 429 | + while (length > 0) { |
---|
| 430 | + hdmi_writeb(hdmi, i2c->slave_reg, HDMI_I2CM_ADDRESS); |
---|
| 431 | + |
---|
| 432 | + if (read_edid) { |
---|
| 433 | + i2c->slave_reg += 8; |
---|
| 434 | + length -= 8; |
---|
| 435 | + } else { |
---|
| 436 | + i2c->slave_reg++; |
---|
| 437 | + length--; |
---|
| 438 | + } |
---|
| 439 | + |
---|
| 440 | + if (i2c->is_segment) { |
---|
| 441 | + if (read_edid) |
---|
| 442 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8_EXT, |
---|
| 443 | + HDMI_I2CM_OPERATION); |
---|
| 444 | + else |
---|
| 445 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT, |
---|
| 446 | + HDMI_I2CM_OPERATION); |
---|
| 447 | + } else { |
---|
| 448 | + if (read_edid) |
---|
| 449 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8, |
---|
| 450 | + HDMI_I2CM_OPERATION); |
---|
| 451 | + else |
---|
| 452 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ, |
---|
| 453 | + HDMI_I2CM_OPERATION); |
---|
| 454 | + } |
---|
427 | 455 | |
---|
428 | 456 | while (i--) { |
---|
429 | 457 | udelay(1000); |
---|
.. | .. |
---|
439 | 467 | if (!interrupt) { |
---|
440 | 468 | printf("[%s] i2c read reg[0x%02x] no interrupt\n", |
---|
441 | 469 | __func__, i2c->slave_reg); |
---|
| 470 | + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); |
---|
| 471 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, |
---|
| 472 | + HDMI_I2CM_OPERATION); |
---|
| 473 | + udelay(1000); |
---|
442 | 474 | return -EAGAIN; |
---|
443 | 475 | } |
---|
444 | 476 | |
---|
.. | .. |
---|
446 | 478 | if (interrupt & HDMI_IH_I2CM_STAT0_ERROR) { |
---|
447 | 479 | printf("[%s] read reg[0x%02x] data error:0x%02x\n", |
---|
448 | 480 | __func__, i2c->slave_reg, interrupt); |
---|
| 481 | + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); |
---|
| 482 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, |
---|
| 483 | + HDMI_I2CM_OPERATION); |
---|
| 484 | + udelay(1000); |
---|
449 | 485 | return -EIO; |
---|
450 | 486 | } |
---|
451 | 487 | |
---|
452 | 488 | i = 20; |
---|
453 | | - *buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI); |
---|
| 489 | + if (read_edid) |
---|
| 490 | + for (i = 0; i < 8; i++) |
---|
| 491 | + *buf++ = hdmi_readb(hdmi, HDMI_I2CM_READ_BUFF0 + i); |
---|
| 492 | + else |
---|
| 493 | + *buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI); |
---|
454 | 494 | } |
---|
455 | 495 | i2c->is_segment = false; |
---|
456 | 496 | |
---|
.. | .. |
---|
490 | 530 | break; |
---|
491 | 531 | } |
---|
492 | 532 | |
---|
| 533 | + if (!interrupt) { |
---|
| 534 | + printf("[%s] i2c write reg[0x%02x] no interrupt\n", |
---|
| 535 | + __func__, i2c->slave_reg); |
---|
| 536 | + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); |
---|
| 537 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, |
---|
| 538 | + HDMI_I2CM_OPERATION); |
---|
| 539 | + udelay(1000); |
---|
| 540 | + return -EAGAIN; |
---|
| 541 | + } |
---|
| 542 | + |
---|
493 | 543 | if ((interrupt & m_I2CM_ERROR) || (i == -1)) { |
---|
494 | 544 | printf("[%s] write data error\n", __func__); |
---|
| 545 | + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); |
---|
| 546 | + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, |
---|
| 547 | + HDMI_I2CM_OPERATION); |
---|
| 548 | + udelay(1000); |
---|
495 | 549 | return -EIO; |
---|
496 | 550 | } else if (interrupt & m_I2CM_DONE) { |
---|
497 | 551 | printf("[%s] write offset %02x success\n", |
---|
.. | .. |
---|
959 | 1013 | * but it has a vedor phy. |
---|
960 | 1014 | */ |
---|
961 | 1015 | if (phy_type == DW_HDMI_PHY_VENDOR_PHY || |
---|
| 1016 | + hdmi->dev_type == RK3528_HDMI || |
---|
962 | 1017 | hdmi->dev_type == RK3328_HDMI || |
---|
963 | 1018 | hdmi->dev_type == RK3228_HDMI) { |
---|
964 | 1019 | /* Vendor PHYs require support from the glue layer. */ |
---|
.. | .. |
---|
1042 | 1097 | vmode->mpixelclock, vmode->mtmdsclock); |
---|
1043 | 1098 | |
---|
1044 | 1099 | /* Set up HDMI_FC_INVIDCONF |
---|
1045 | | - * fc_invidconf.HDCP_keepout must be set (1'b1) |
---|
1046 | | - * when activate the scrambler feature. |
---|
| 1100 | + * Some display equipments require that the interval |
---|
| 1101 | + * between Video Data and Data island must be at least 58 pixels, |
---|
| 1102 | + * and fc_invidconf.HDCP_keepout set (1'b1) can meet the requirement. |
---|
1047 | 1103 | */ |
---|
1048 | | - inv_val = (vmode->mtmdsclock > 340000000 || |
---|
1049 | | - (hdmi_info->scdc.scrambling.low_rates && |
---|
1050 | | - hdmi->scramble_low_rates) ? |
---|
1051 | | - HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE : |
---|
1052 | | - HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE); |
---|
| 1104 | + inv_val = HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE; |
---|
1053 | 1105 | |
---|
1054 | 1106 | inv_val |= mode->flags & DRM_MODE_FLAG_PVSYNC ? |
---|
1055 | 1107 | HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH : |
---|
.. | .. |
---|
1418 | 1470 | HDMI_VP_CONF_PR_EN_MASK | |
---|
1419 | 1471 | HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF); |
---|
1420 | 1472 | |
---|
1421 | | - if ((color_depth == 5 && hdmi->previous_mode.htotal % 4) || |
---|
1422 | | - (color_depth == 6 && hdmi->previous_mode.htotal % 2)) |
---|
1423 | | - hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, |
---|
1424 | | - HDMI_VP_STUFF); |
---|
1425 | | - else |
---|
1426 | | - hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET, |
---|
1427 | | - HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF); |
---|
| 1473 | + hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, |
---|
| 1474 | + HDMI_VP_STUFF); |
---|
1428 | 1475 | |
---|
1429 | 1476 | hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP); |
---|
1430 | 1477 | |
---|
.. | .. |
---|
1887 | 1934 | hdmi->sample_rate); |
---|
1888 | 1935 | } |
---|
1889 | 1936 | |
---|
| 1937 | +#ifndef CONFIG_SPL_BUILD |
---|
1890 | 1938 | static int dw_hdmi_hdcp_load_key(struct dw_hdmi *hdmi) |
---|
1891 | 1939 | { |
---|
1892 | 1940 | int i, j, ret, val; |
---|
.. | .. |
---|
1952 | 2000 | free(hdcp_keys); |
---|
1953 | 2001 | return 0; |
---|
1954 | 2002 | } |
---|
| 2003 | +#endif |
---|
1955 | 2004 | |
---|
1956 | 2005 | static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi, |
---|
1957 | 2006 | const struct drm_display_mode *mode) |
---|
.. | .. |
---|
1981 | 2030 | hdmi_modb(hdmi, hdmi_dvi, HDMI_A_HDCPCFG0_HDMIDVI_MASK, |
---|
1982 | 2031 | HDMI_A_HDCPCFG0); |
---|
1983 | 2032 | |
---|
| 2033 | +#ifndef CONFIG_SPL_BUILD |
---|
1984 | 2034 | if (!(hdmi_readb(hdmi, HDMI_HDCPREG_RMSTS) & 0x3f)) |
---|
1985 | 2035 | dw_hdmi_hdcp_load_key(hdmi); |
---|
| 2036 | +#endif |
---|
1986 | 2037 | |
---|
1987 | 2038 | hdmi_modb(hdmi, HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE, |
---|
1988 | 2039 | HDMI_FC_INVIDCONF_HDCP_KEEPOUT_MASK, |
---|
.. | .. |
---|
2269 | 2320 | { |
---|
2270 | 2321 | struct connector_state *conn_state = &state->conn_state; |
---|
2271 | 2322 | const struct dw_hdmi_plat_data *pdata = |
---|
| 2323 | +#ifdef CONFIG_SPL_BUILD |
---|
| 2324 | + (const struct dw_hdmi_plat_data *)conn->data; |
---|
| 2325 | +#else |
---|
2272 | 2326 | (const struct dw_hdmi_plat_data *)dev_get_driver_data(conn->dev); |
---|
| 2327 | + ofnode hdmi_node = conn->dev->node; |
---|
| 2328 | + struct device_node *ddc_node; |
---|
| 2329 | + int ret; |
---|
| 2330 | +#endif |
---|
2273 | 2331 | struct crtc_state *crtc_state = &state->crtc_state; |
---|
2274 | 2332 | struct dw_hdmi *hdmi; |
---|
2275 | 2333 | struct drm_display_mode *mode_buf; |
---|
2276 | | - ofnode hdmi_node = conn->dev->node; |
---|
2277 | 2334 | u32 val; |
---|
2278 | | - struct device_node *ddc_node; |
---|
2279 | 2335 | |
---|
2280 | 2336 | hdmi = malloc(sizeof(struct dw_hdmi)); |
---|
2281 | 2337 | if (!hdmi) |
---|
.. | .. |
---|
2285 | 2341 | mode_buf = malloc(MODE_LEN * sizeof(struct drm_display_mode)); |
---|
2286 | 2342 | if (!mode_buf) |
---|
2287 | 2343 | return -ENOMEM; |
---|
| 2344 | + |
---|
| 2345 | +#ifdef CONFIG_SPL_BUILD |
---|
| 2346 | + hdmi->id = 0; |
---|
| 2347 | + hdmi->regs = (void *)RK3528_HDMI_BASE; |
---|
| 2348 | + hdmi->io_width = 4; |
---|
| 2349 | + hdmi->scramble_low_rates = false; |
---|
| 2350 | + hdmi->hdcp1x_enable = false; |
---|
| 2351 | + hdmi->output_bus_format_rgb = false; |
---|
| 2352 | + conn_state->type = DRM_MODE_CONNECTOR_HDMIA; |
---|
| 2353 | +#else |
---|
2288 | 2354 | hdmi->id = of_alias_get_id(ofnode_to_np(hdmi_node), "hdmi"); |
---|
2289 | 2355 | if (hdmi->id < 0) |
---|
2290 | 2356 | hdmi->id = 0; |
---|
2291 | | - conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); |
---|
| 2357 | + conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); |
---|
| 2358 | +#endif |
---|
2292 | 2359 | |
---|
2293 | 2360 | memset(mode_buf, 0, MODE_LEN * sizeof(struct drm_display_mode)); |
---|
2294 | 2361 | |
---|
| 2362 | + hdmi->dev_type = pdata->dev_type; |
---|
| 2363 | + hdmi->plat_data = pdata; |
---|
| 2364 | + |
---|
| 2365 | +#ifndef CONFIG_SPL_BUILD |
---|
2295 | 2366 | hdmi->regs = dev_read_addr_ptr(conn->dev); |
---|
2296 | 2367 | hdmi->io_width = ofnode_read_s32_default(hdmi_node, "reg-io-width", -1); |
---|
2297 | 2368 | |
---|
.. | .. |
---|
2309 | 2380 | else |
---|
2310 | 2381 | hdmi->output_bus_format_rgb = false; |
---|
2311 | 2382 | |
---|
| 2383 | + ret = dev_read_size(conn->dev, "rockchip,phy-table"); |
---|
| 2384 | + if (ret > 0 && hdmi->plat_data->phy_config) { |
---|
| 2385 | + u32 phy_config[ret / 4]; |
---|
| 2386 | + int i; |
---|
| 2387 | + |
---|
| 2388 | + dev_read_u32_array(conn->dev, "rockchip,phy-table", phy_config, ret / 4); |
---|
| 2389 | + |
---|
| 2390 | + for (i = 0; i < ret / 16; i++) { |
---|
| 2391 | + if (phy_config[i * 4] != 0) |
---|
| 2392 | + hdmi->plat_data->phy_config[i].mpixelclock = (u64)phy_config[i * 4]; |
---|
| 2393 | + else |
---|
| 2394 | + hdmi->plat_data->phy_config[i].mpixelclock = ~0UL; |
---|
| 2395 | + hdmi->plat_data->phy_config[i].sym_ctr = (u16)phy_config[i * 4 + 1]; |
---|
| 2396 | + hdmi->plat_data->phy_config[i].term = (u16)phy_config[i * 4 + 2]; |
---|
| 2397 | + hdmi->plat_data->phy_config[i].vlev_ctr = (u16)phy_config[i * 4 + 3]; |
---|
| 2398 | + } |
---|
| 2399 | + } |
---|
| 2400 | + |
---|
2312 | 2401 | ddc_node = of_parse_phandle(ofnode_to_np(hdmi_node), "ddc-i2c-bus", 0); |
---|
2313 | 2402 | if (ddc_node) { |
---|
2314 | 2403 | uclass_get_device_by_ofnode(UCLASS_I2C, np_to_ofnode(ddc_node), |
---|
.. | .. |
---|
2316 | 2405 | if (hdmi->adap.i2c_bus) |
---|
2317 | 2406 | hdmi->adap.ops = i2c_get_ops(hdmi->adap.i2c_bus); |
---|
2318 | 2407 | } |
---|
| 2408 | +#endif |
---|
2319 | 2409 | |
---|
2320 | 2410 | hdmi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); |
---|
2321 | 2411 | if (hdmi->grf <= 0) { |
---|
.. | .. |
---|
2323 | 2413 | __func__, hdmi->grf); |
---|
2324 | 2414 | return -ENXIO; |
---|
2325 | 2415 | } |
---|
| 2416 | + |
---|
| 2417 | +#ifdef CONFIG_SPL_BUILD |
---|
| 2418 | + hdmi->gpio_base = (void *)RK3528_GPIO_BASE; |
---|
| 2419 | +#else |
---|
| 2420 | + ret = gpio_request_by_name(conn->dev, "hpd-gpios", 0, |
---|
| 2421 | + &hdmi->hpd_gpiod, GPIOD_IS_IN); |
---|
| 2422 | + if (ret && ret != -ENOENT) { |
---|
| 2423 | + printf("%s: Cannot get HPD GPIO: %d\n", __func__, ret); |
---|
| 2424 | + return ret; |
---|
| 2425 | + } |
---|
| 2426 | + hdmi->gpio_base = (void *)dev_read_addr_index(conn->dev, 1); |
---|
| 2427 | +#endif |
---|
| 2428 | + if (!hdmi->gpio_base) |
---|
| 2429 | + return -ENODEV; |
---|
2326 | 2430 | |
---|
2327 | 2431 | dw_hdmi_set_reg_wr(hdmi); |
---|
2328 | 2432 | |
---|
.. | .. |
---|
2345 | 2449 | * Read high and low time from device tree. If not available use |
---|
2346 | 2450 | * the default timing scl clock rate is about 99.6KHz. |
---|
2347 | 2451 | */ |
---|
| 2452 | +#ifdef CONFIG_SPL_BUILD |
---|
| 2453 | + hdmi->i2c->scl_high_ns = 9625; |
---|
| 2454 | + hdmi->i2c->scl_low_ns = 10000; |
---|
| 2455 | +#else |
---|
2348 | 2456 | hdmi->i2c->scl_high_ns = |
---|
2349 | 2457 | ofnode_read_s32_default(hdmi_node, |
---|
2350 | 2458 | "ddc-i2c-scl-high-time-ns", 4708); |
---|
2351 | 2459 | hdmi->i2c->scl_low_ns = |
---|
2352 | 2460 | ofnode_read_s32_default(hdmi_node, |
---|
2353 | 2461 | "ddc-i2c-scl-low-time-ns", 4916); |
---|
| 2462 | +#endif |
---|
2354 | 2463 | |
---|
2355 | 2464 | dw_hdmi_i2c_init(hdmi); |
---|
2356 | 2465 | conn_state->output_if |= VOP_OUTPUT_IF_HDMI0; |
---|
2357 | 2466 | conn_state->output_mode = ROCKCHIP_OUT_MODE_AAAA; |
---|
2358 | 2467 | |
---|
2359 | | - hdmi->dev_type = pdata->dev_type; |
---|
2360 | | - hdmi->plat_data = pdata; |
---|
2361 | 2468 | hdmi->edid_data.mode_buf = mode_buf; |
---|
2362 | 2469 | hdmi->sample_rate = 48000; |
---|
2363 | 2470 | |
---|
2364 | 2471 | conn->data = hdmi; |
---|
2365 | | - dw_hdmi_set_iomux(hdmi->grf, hdmi->dev_type); |
---|
| 2472 | + dw_hdmi_set_iomux(hdmi->grf, hdmi->gpio_base, |
---|
| 2473 | + &hdmi->hpd_gpiod, hdmi->dev_type); |
---|
2366 | 2474 | dw_hdmi_detect_phy(hdmi); |
---|
2367 | 2475 | dw_hdmi_dev_init(hdmi); |
---|
2368 | 2476 | |
---|
.. | .. |
---|
2413 | 2521 | |
---|
2414 | 2522 | int rockchip_dw_hdmi_get_timing(struct rockchip_connector *conn, struct display_state *state) |
---|
2415 | 2523 | { |
---|
2416 | | - int ret, i; |
---|
| 2524 | + int ret, i, vic; |
---|
2417 | 2525 | struct connector_state *conn_state = &state->conn_state; |
---|
2418 | 2526 | struct drm_display_mode *mode = &conn_state->mode; |
---|
2419 | 2527 | struct dw_hdmi *hdmi = conn->data; |
---|
.. | .. |
---|
2439 | 2547 | hdmi->sink_has_audio = true; |
---|
2440 | 2548 | do_cea_modes(&hdmi->edid_data, def_modes_vic, |
---|
2441 | 2549 | sizeof(def_modes_vic)); |
---|
| 2550 | + hdmi->edid_data.mode_buf[0].type |= DRM_MODE_TYPE_PREFERRED; |
---|
2442 | 2551 | hdmi->edid_data.preferred_mode = &hdmi->edid_data.mode_buf[0]; |
---|
2443 | 2552 | printf("failed to get edid\n"); |
---|
2444 | 2553 | } |
---|
| 2554 | +#ifdef CONFIG_SPL_BUILD |
---|
| 2555 | + conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); |
---|
| 2556 | +#endif |
---|
2445 | 2557 | drm_rk_filter_whitelist(&hdmi->edid_data); |
---|
2446 | 2558 | if (hdmi->phy.ops->mode_valid) |
---|
2447 | 2559 | hdmi->phy.ops->mode_valid(conn, hdmi, state); |
---|
.. | .. |
---|
2452 | 2564 | return -EINVAL; |
---|
2453 | 2565 | } |
---|
2454 | 2566 | |
---|
2455 | | - for (i = 0; i < hdmi->edid_data.modes; i++) |
---|
| 2567 | + for (i = 0; i < hdmi->edid_data.modes; i++) { |
---|
2456 | 2568 | hdmi->edid_data.mode_buf[i].vrefresh = |
---|
2457 | 2569 | drm_mode_vrefresh(&hdmi->edid_data.mode_buf[i]); |
---|
| 2570 | + |
---|
| 2571 | + vic = drm_match_cea_mode(&hdmi->edid_data.mode_buf[i]); |
---|
| 2572 | + if (hdmi->edid_data.mode_buf[i].picture_aspect_ratio == HDMI_PICTURE_ASPECT_NONE) { |
---|
| 2573 | + if (vic >= 93 && vic <= 95) |
---|
| 2574 | + hdmi->edid_data.mode_buf[i].picture_aspect_ratio = |
---|
| 2575 | + HDMI_PICTURE_ASPECT_16_9; |
---|
| 2576 | + else if (vic == 98) |
---|
| 2577 | + hdmi->edid_data.mode_buf[i].picture_aspect_ratio = |
---|
| 2578 | + HDMI_PICTURE_ASPECT_256_135; |
---|
| 2579 | + } |
---|
| 2580 | + } |
---|
2458 | 2581 | |
---|
2459 | 2582 | drm_mode_sort(&hdmi->edid_data); |
---|
2460 | 2583 | drm_rk_selete_output(&hdmi->edid_data, conn_state, &bus_format, |
---|
.. | .. |
---|
2463 | 2586 | *mode = *hdmi->edid_data.preferred_mode; |
---|
2464 | 2587 | hdmi->vic = drm_match_cea_mode(mode); |
---|
2465 | 2588 | |
---|
2466 | | - printf("mode:%dx%d\n", mode->hdisplay, mode->vdisplay); |
---|
2467 | 2589 | if (state->force_output) |
---|
2468 | 2590 | bus_format = state->force_bus_format; |
---|
2469 | 2591 | conn_state->bus_format = bus_format; |
---|