diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2014-01-25 12:14:47 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-02-13 14:41:34 -0500 |
commit | 2f7f730a4f0fd3376dda9266203f29ceccd0a67f (patch) | |
tree | c1dc66d2a7f21872d953777d90686ba2847a78c8 /drivers/gpu/drm/i2c | |
parent | f0b33b282c17337276504d6a700d0f558f1a6891 (diff) |
drm/i2c: tda998x: simplify the i2c read/write functions
This patch simplifies the i2c read/write functions and permits them to
be easily called in more contexts.
Tested-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/gpu/drm/i2c')
-rw-r--r-- | drivers/gpu/drm/i2c/tda998x_drv.c | 322 |
1 files changed, 162 insertions, 160 deletions
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index e5b764b95866..7df73baf3f9b 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | struct tda998x_priv { | 32 | struct tda998x_priv { |
33 | struct i2c_client *cec; | 33 | struct i2c_client *cec; |
34 | struct i2c_client *hdmi; | ||
34 | uint16_t rev; | 35 | uint16_t rev; |
35 | uint8_t current_page; | 36 | uint8_t current_page; |
36 | int dpms; | 37 | int dpms; |
@@ -329,9 +330,9 @@ struct tda998x_priv { | |||
329 | #define TDA19988 0x0301 | 330 | #define TDA19988 0x0301 |
330 | 331 | ||
331 | static void | 332 | static void |
332 | cec_write(struct drm_encoder *encoder, uint16_t addr, uint8_t val) | 333 | cec_write(struct tda998x_priv *priv, uint16_t addr, uint8_t val) |
333 | { | 334 | { |
334 | struct i2c_client *client = to_tda998x_priv(encoder)->cec; | 335 | struct i2c_client *client = priv->cec; |
335 | uint8_t buf[] = {addr, val}; | 336 | uint8_t buf[] = {addr, val}; |
336 | int ret; | 337 | int ret; |
337 | 338 | ||
@@ -341,9 +342,9 @@ cec_write(struct drm_encoder *encoder, uint16_t addr, uint8_t val) | |||
341 | } | 342 | } |
342 | 343 | ||
343 | static uint8_t | 344 | static uint8_t |
344 | cec_read(struct drm_encoder *encoder, uint8_t addr) | 345 | cec_read(struct tda998x_priv *priv, uint8_t addr) |
345 | { | 346 | { |
346 | struct i2c_client *client = to_tda998x_priv(encoder)->cec; | 347 | struct i2c_client *client = priv->cec; |
347 | uint8_t val; | 348 | uint8_t val; |
348 | int ret; | 349 | int ret; |
349 | 350 | ||
@@ -363,12 +364,10 @@ fail: | |||
363 | } | 364 | } |
364 | 365 | ||
365 | static void | 366 | static void |
366 | set_page(struct drm_encoder *encoder, uint16_t reg) | 367 | set_page(struct tda998x_priv *priv, uint16_t reg) |
367 | { | 368 | { |
368 | struct tda998x_priv *priv = to_tda998x_priv(encoder); | ||
369 | |||
370 | if (REG2PAGE(reg) != priv->current_page) { | 369 | if (REG2PAGE(reg) != priv->current_page) { |
371 | struct i2c_client *client = drm_i2c_encoder_get_client(encoder); | 370 | struct i2c_client *client = priv->hdmi; |
372 | uint8_t buf[] = { | 371 | uint8_t buf[] = { |
373 | REG_CURPAGE, REG2PAGE(reg) | 372 | REG_CURPAGE, REG2PAGE(reg) |
374 | }; | 373 | }; |
@@ -381,13 +380,13 @@ set_page(struct drm_encoder *encoder, uint16_t reg) | |||
381 | } | 380 | } |
382 | 381 | ||
383 | static int | 382 | static int |
384 | reg_read_range(struct drm_encoder *encoder, uint16_t reg, char *buf, int cnt) | 383 | reg_read_range(struct tda998x_priv *priv, uint16_t reg, char *buf, int cnt) |
385 | { | 384 | { |
386 | struct i2c_client *client = drm_i2c_encoder_get_client(encoder); | 385 | struct i2c_client *client = priv->hdmi; |
387 | uint8_t addr = REG2ADDR(reg); | 386 | uint8_t addr = REG2ADDR(reg); |
388 | int ret; | 387 | int ret; |
389 | 388 | ||
390 | set_page(encoder, reg); | 389 | set_page(priv, reg); |
391 | 390 | ||
392 | ret = i2c_master_send(client, &addr, sizeof(addr)); | 391 | ret = i2c_master_send(client, &addr, sizeof(addr)); |
393 | if (ret < 0) | 392 | if (ret < 0) |
@@ -405,16 +404,16 @@ fail: | |||
405 | } | 404 | } |
406 | 405 | ||
407 | static void | 406 | static void |
408 | reg_write_range(struct drm_encoder *encoder, uint16_t reg, uint8_t *p, int cnt) | 407 | reg_write_range(struct tda998x_priv *priv, uint16_t reg, uint8_t *p, int cnt) |
409 | { | 408 | { |
410 | struct i2c_client *client = drm_i2c_encoder_get_client(encoder); | 409 | struct i2c_client *client = priv->hdmi; |
411 | uint8_t buf[cnt+1]; | 410 | uint8_t buf[cnt+1]; |
412 | int ret; | 411 | int ret; |
413 | 412 | ||
414 | buf[0] = REG2ADDR(reg); | 413 | buf[0] = REG2ADDR(reg); |
415 | memcpy(&buf[1], p, cnt); | 414 | memcpy(&buf[1], p, cnt); |
416 | 415 | ||
417 | set_page(encoder, reg); | 416 | set_page(priv, reg); |
418 | 417 | ||
419 | ret = i2c_master_send(client, buf, cnt + 1); | 418 | ret = i2c_master_send(client, buf, cnt + 1); |
420 | if (ret < 0) | 419 | if (ret < 0) |
@@ -422,21 +421,21 @@ reg_write_range(struct drm_encoder *encoder, uint16_t reg, uint8_t *p, int cnt) | |||
422 | } | 421 | } |
423 | 422 | ||
424 | static uint8_t | 423 | static uint8_t |
425 | reg_read(struct drm_encoder *encoder, uint16_t reg) | 424 | reg_read(struct tda998x_priv *priv, uint16_t reg) |
426 | { | 425 | { |
427 | uint8_t val = 0; | 426 | uint8_t val = 0; |
428 | reg_read_range(encoder, reg, &val, sizeof(val)); | 427 | reg_read_range(priv, reg, &val, sizeof(val)); |
429 | return val; | 428 | return val; |
430 | } | 429 | } |
431 | 430 | ||
432 | static void | 431 | static void |
433 | reg_write(struct drm_encoder *encoder, uint16_t reg, uint8_t val) | 432 | reg_write(struct tda998x_priv *priv, uint16_t reg, uint8_t val) |
434 | { | 433 | { |
435 | struct i2c_client *client = drm_i2c_encoder_get_client(encoder); | 434 | struct i2c_client *client = priv->hdmi; |
436 | uint8_t buf[] = {REG2ADDR(reg), val}; | 435 | uint8_t buf[] = {REG2ADDR(reg), val}; |
437 | int ret; | 436 | int ret; |
438 | 437 | ||
439 | set_page(encoder, reg); | 438 | set_page(priv, reg); |
440 | 439 | ||
441 | ret = i2c_master_send(client, buf, ARRAY_SIZE(buf)); | 440 | ret = i2c_master_send(client, buf, ARRAY_SIZE(buf)); |
442 | if (ret < 0) | 441 | if (ret < 0) |
@@ -444,13 +443,13 @@ reg_write(struct drm_encoder *encoder, uint16_t reg, uint8_t val) | |||
444 | } | 443 | } |
445 | 444 | ||
446 | static void | 445 | static void |
447 | reg_write16(struct drm_encoder *encoder, uint16_t reg, uint16_t val) | 446 | reg_write16(struct tda998x_priv *priv, uint16_t reg, uint16_t val) |
448 | { | 447 | { |
449 | struct i2c_client *client = drm_i2c_encoder_get_client(encoder); | 448 | struct i2c_client *client = priv->hdmi; |
450 | uint8_t buf[] = {REG2ADDR(reg), val >> 8, val}; | 449 | uint8_t buf[] = {REG2ADDR(reg), val >> 8, val}; |
451 | int ret; | 450 | int ret; |
452 | 451 | ||
453 | set_page(encoder, reg); | 452 | set_page(priv, reg); |
454 | 453 | ||
455 | ret = i2c_master_send(client, buf, ARRAY_SIZE(buf)); | 454 | ret = i2c_master_send(client, buf, ARRAY_SIZE(buf)); |
456 | if (ret < 0) | 455 | if (ret < 0) |
@@ -458,47 +457,47 @@ reg_write16(struct drm_encoder *encoder, uint16_t reg, uint16_t val) | |||
458 | } | 457 | } |
459 | 458 | ||
460 | static void | 459 | static void |
461 | reg_set(struct drm_encoder *encoder, uint16_t reg, uint8_t val) | 460 | reg_set(struct tda998x_priv *priv, uint16_t reg, uint8_t val) |
462 | { | 461 | { |
463 | reg_write(encoder, reg, reg_read(encoder, reg) | val); | 462 | reg_write(priv, reg, reg_read(priv, reg) | val); |
464 | } | 463 | } |
465 | 464 | ||
466 | static void | 465 | static void |
467 | reg_clear(struct drm_encoder *encoder, uint16_t reg, uint8_t val) | 466 | reg_clear(struct tda998x_priv *priv, uint16_t reg, uint8_t val) |
468 | { | 467 | { |
469 | reg_write(encoder, reg, reg_read(encoder, reg) & ~val); | 468 | reg_write(priv, reg, reg_read(priv, reg) & ~val); |
470 | } | 469 | } |
471 | 470 | ||
472 | static void | 471 | static void |
473 | tda998x_reset(struct drm_encoder *encoder) | 472 | tda998x_reset(struct tda998x_priv *priv) |
474 | { | 473 | { |
475 | /* reset audio and i2c master: */ | 474 | /* reset audio and i2c master: */ |
476 | reg_set(encoder, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); | 475 | reg_set(priv, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); |
477 | msleep(50); | 476 | msleep(50); |
478 | reg_clear(encoder, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); | 477 | reg_clear(priv, REG_SOFTRESET, SOFTRESET_AUDIO | SOFTRESET_I2C_MASTER); |
479 | msleep(50); | 478 | msleep(50); |
480 | 479 | ||
481 | /* reset transmitter: */ | 480 | /* reset transmitter: */ |
482 | reg_set(encoder, REG_MAIN_CNTRL0, MAIN_CNTRL0_SR); | 481 | reg_set(priv, REG_MAIN_CNTRL0, MAIN_CNTRL0_SR); |
483 | reg_clear(encoder, REG_MAIN_CNTRL0, MAIN_CNTRL0_SR); | 482 | reg_clear(priv, REG_MAIN_CNTRL0, MAIN_CNTRL0_SR); |
484 | 483 | ||
485 | /* PLL registers common configuration */ | 484 | /* PLL registers common configuration */ |
486 | reg_write(encoder, REG_PLL_SERIAL_1, 0x00); | 485 | reg_write(priv, REG_PLL_SERIAL_1, 0x00); |
487 | reg_write(encoder, REG_PLL_SERIAL_2, PLL_SERIAL_2_SRL_NOSC(1)); | 486 | reg_write(priv, REG_PLL_SERIAL_2, PLL_SERIAL_2_SRL_NOSC(1)); |
488 | reg_write(encoder, REG_PLL_SERIAL_3, 0x00); | 487 | reg_write(priv, REG_PLL_SERIAL_3, 0x00); |
489 | reg_write(encoder, REG_SERIALIZER, 0x00); | 488 | reg_write(priv, REG_SERIALIZER, 0x00); |
490 | reg_write(encoder, REG_BUFFER_OUT, 0x00); | 489 | reg_write(priv, REG_BUFFER_OUT, 0x00); |
491 | reg_write(encoder, REG_PLL_SCG1, 0x00); | 490 | reg_write(priv, REG_PLL_SCG1, 0x00); |
492 | reg_write(encoder, REG_AUDIO_DIV, AUDIO_DIV_SERCLK_8); | 491 | reg_write(priv, REG_AUDIO_DIV, AUDIO_DIV_SERCLK_8); |
493 | reg_write(encoder, REG_SEL_CLK, SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK); | 492 | reg_write(priv, REG_SEL_CLK, SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK); |
494 | reg_write(encoder, REG_PLL_SCGN1, 0xfa); | 493 | reg_write(priv, REG_PLL_SCGN1, 0xfa); |
495 | reg_write(encoder, REG_PLL_SCGN2, 0x00); | 494 | reg_write(priv, REG_PLL_SCGN2, 0x00); |
496 | reg_write(encoder, REG_PLL_SCGR1, 0x5b); | 495 | reg_write(priv, REG_PLL_SCGR1, 0x5b); |
497 | reg_write(encoder, REG_PLL_SCGR2, 0x00); | 496 | reg_write(priv, REG_PLL_SCGR2, 0x00); |
498 | reg_write(encoder, REG_PLL_SCG2, 0x10); | 497 | reg_write(priv, REG_PLL_SCG2, 0x10); |
499 | 498 | ||
500 | /* Write the default value MUX register */ | 499 | /* Write the default value MUX register */ |
501 | reg_write(encoder, REG_MUX_VP_VIP_OUT, 0x24); | 500 | reg_write(priv, REG_MUX_VP_VIP_OUT, 0x24); |
502 | } | 501 | } |
503 | 502 | ||
504 | static uint8_t tda998x_cksum(uint8_t *buf, size_t bytes) | 503 | static uint8_t tda998x_cksum(uint8_t *buf, size_t bytes) |
@@ -514,18 +513,18 @@ static uint8_t tda998x_cksum(uint8_t *buf, size_t bytes) | |||
514 | #define PB(x) (HB(2) + 1 + (x)) | 513 | #define PB(x) (HB(2) + 1 + (x)) |
515 | 514 | ||
516 | static void | 515 | static void |
517 | tda998x_write_if(struct drm_encoder *encoder, uint8_t bit, uint16_t addr, | 516 | tda998x_write_if(struct tda998x_priv *priv, uint8_t bit, uint16_t addr, |
518 | uint8_t *buf, size_t size) | 517 | uint8_t *buf, size_t size) |
519 | { | 518 | { |
520 | buf[PB(0)] = tda998x_cksum(buf, size); | 519 | buf[PB(0)] = tda998x_cksum(buf, size); |
521 | 520 | ||
522 | reg_clear(encoder, REG_DIP_IF_FLAGS, bit); | 521 | reg_clear(priv, REG_DIP_IF_FLAGS, bit); |
523 | reg_write_range(encoder, addr, buf, size); | 522 | reg_write_range(priv, addr, buf, size); |
524 | reg_set(encoder, REG_DIP_IF_FLAGS, bit); | 523 | reg_set(priv, REG_DIP_IF_FLAGS, bit); |
525 | } | 524 | } |
526 | 525 | ||
527 | static void | 526 | static void |
528 | tda998x_write_aif(struct drm_encoder *encoder, struct tda998x_encoder_params *p) | 527 | tda998x_write_aif(struct tda998x_priv *priv, struct tda998x_encoder_params *p) |
529 | { | 528 | { |
530 | u8 buf[PB(HDMI_AUDIO_INFOFRAME_SIZE) + 1]; | 529 | u8 buf[PB(HDMI_AUDIO_INFOFRAME_SIZE) + 1]; |
531 | 530 | ||
@@ -538,12 +537,12 @@ tda998x_write_aif(struct drm_encoder *encoder, struct tda998x_encoder_params *p) | |||
538 | buf[PB(4)] = p->audio_frame[4]; | 537 | buf[PB(4)] = p->audio_frame[4]; |
539 | buf[PB(5)] = p->audio_frame[5] & 0xf8; /* DM_INH + LSV */ | 538 | buf[PB(5)] = p->audio_frame[5] & 0xf8; /* DM_INH + LSV */ |
540 | 539 | ||
541 | tda998x_write_if(encoder, DIP_IF_FLAGS_IF4, REG_IF4_HB0, buf, | 540 | tda998x_write_if(priv, DIP_IF_FLAGS_IF4, REG_IF4_HB0, buf, |
542 | sizeof(buf)); | 541 | sizeof(buf)); |
543 | } | 542 | } |
544 | 543 | ||
545 | static void | 544 | static void |
546 | tda998x_write_avi(struct drm_encoder *encoder, struct drm_display_mode *mode) | 545 | tda998x_write_avi(struct tda998x_priv *priv, struct drm_display_mode *mode) |
547 | { | 546 | { |
548 | u8 buf[PB(HDMI_AVI_INFOFRAME_SIZE) + 1]; | 547 | u8 buf[PB(HDMI_AVI_INFOFRAME_SIZE) + 1]; |
549 | 548 | ||
@@ -556,36 +555,36 @@ tda998x_write_avi(struct drm_encoder *encoder, struct drm_display_mode *mode) | |||
556 | buf[PB(3)] = HDMI_QUANTIZATION_RANGE_FULL << 2; | 555 | buf[PB(3)] = HDMI_QUANTIZATION_RANGE_FULL << 2; |
557 | buf[PB(4)] = drm_match_cea_mode(mode); | 556 | buf[PB(4)] = drm_match_cea_mode(mode); |
558 | 557 | ||
559 | tda998x_write_if(encoder, DIP_IF_FLAGS_IF2, REG_IF2_HB0, buf, | 558 | tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, buf, |
560 | sizeof(buf)); | 559 | sizeof(buf)); |
561 | } | 560 | } |
562 | 561 | ||
563 | static void tda998x_audio_mute(struct drm_encoder *encoder, bool on) | 562 | static void tda998x_audio_mute(struct tda998x_priv *priv, bool on) |
564 | { | 563 | { |
565 | if (on) { | 564 | if (on) { |
566 | reg_set(encoder, REG_SOFTRESET, SOFTRESET_AUDIO); | 565 | reg_set(priv, REG_SOFTRESET, SOFTRESET_AUDIO); |
567 | reg_clear(encoder, REG_SOFTRESET, SOFTRESET_AUDIO); | 566 | reg_clear(priv, REG_SOFTRESET, SOFTRESET_AUDIO); |
568 | reg_set(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); | 567 | reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); |
569 | } else { | 568 | } else { |
570 | reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); | 569 | reg_clear(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); |
571 | } | 570 | } |
572 | } | 571 | } |
573 | 572 | ||
574 | static void | 573 | static void |
575 | tda998x_configure_audio(struct drm_encoder *encoder, | 574 | tda998x_configure_audio(struct tda998x_priv *priv, |
576 | struct drm_display_mode *mode, struct tda998x_encoder_params *p) | 575 | struct drm_display_mode *mode, struct tda998x_encoder_params *p) |
577 | { | 576 | { |
578 | uint8_t buf[6], clksel_aip, clksel_fs, ca_i2s, cts_n, adiv; | 577 | uint8_t buf[6], clksel_aip, clksel_fs, ca_i2s, cts_n, adiv; |
579 | uint32_t n; | 578 | uint32_t n; |
580 | 579 | ||
581 | /* Enable audio ports */ | 580 | /* Enable audio ports */ |
582 | reg_write(encoder, REG_ENA_AP, p->audio_cfg); | 581 | reg_write(priv, REG_ENA_AP, p->audio_cfg); |
583 | reg_write(encoder, REG_ENA_ACLK, p->audio_clk_cfg); | 582 | reg_write(priv, REG_ENA_ACLK, p->audio_clk_cfg); |
584 | 583 | ||
585 | /* Set audio input source */ | 584 | /* Set audio input source */ |
586 | switch (p->audio_format) { | 585 | switch (p->audio_format) { |
587 | case AFMT_SPDIF: | 586 | case AFMT_SPDIF: |
588 | reg_write(encoder, REG_MUX_AP, 0x40); | 587 | reg_write(priv, REG_MUX_AP, 0x40); |
589 | clksel_aip = AIP_CLKSEL_AIP(0); | 588 | clksel_aip = AIP_CLKSEL_AIP(0); |
590 | /* FS64SPDIF */ | 589 | /* FS64SPDIF */ |
591 | clksel_fs = AIP_CLKSEL_FS(2); | 590 | clksel_fs = AIP_CLKSEL_FS(2); |
@@ -594,7 +593,7 @@ tda998x_configure_audio(struct drm_encoder *encoder, | |||
594 | break; | 593 | break; |
595 | 594 | ||
596 | case AFMT_I2S: | 595 | case AFMT_I2S: |
597 | reg_write(encoder, REG_MUX_AP, 0x64); | 596 | reg_write(priv, REG_MUX_AP, 0x64); |
598 | clksel_aip = AIP_CLKSEL_AIP(1); | 597 | clksel_aip = AIP_CLKSEL_AIP(1); |
599 | /* ACLK */ | 598 | /* ACLK */ |
600 | clksel_fs = AIP_CLKSEL_FS(0); | 599 | clksel_fs = AIP_CLKSEL_FS(0); |
@@ -607,12 +606,12 @@ tda998x_configure_audio(struct drm_encoder *encoder, | |||
607 | return; | 606 | return; |
608 | } | 607 | } |
609 | 608 | ||
610 | reg_write(encoder, REG_AIP_CLKSEL, clksel_aip); | 609 | reg_write(priv, REG_AIP_CLKSEL, clksel_aip); |
611 | reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_LAYOUT); | 610 | reg_clear(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_LAYOUT); |
612 | 611 | ||
613 | /* Enable automatic CTS generation */ | 612 | /* Enable automatic CTS generation */ |
614 | reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_ACR_MAN); | 613 | reg_clear(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_ACR_MAN); |
615 | reg_write(encoder, REG_CTS_N, cts_n); | 614 | reg_write(priv, REG_CTS_N, cts_n); |
616 | 615 | ||
617 | /* | 616 | /* |
618 | * Audio input somehow depends on HDMI line rate which is | 617 | * Audio input somehow depends on HDMI line rate which is |
@@ -625,7 +624,7 @@ tda998x_configure_audio(struct drm_encoder *encoder, | |||
625 | adiv = AUDIO_DIV_SERCLK_16; | 624 | adiv = AUDIO_DIV_SERCLK_16; |
626 | else | 625 | else |
627 | adiv = AUDIO_DIV_SERCLK_8; | 626 | adiv = AUDIO_DIV_SERCLK_8; |
628 | reg_write(encoder, REG_AUDIO_DIV, adiv); | 627 | reg_write(priv, REG_AUDIO_DIV, adiv); |
629 | 628 | ||
630 | /* | 629 | /* |
631 | * This is the approximate value of N, which happens to be | 630 | * This is the approximate value of N, which happens to be |
@@ -640,14 +639,14 @@ tda998x_configure_audio(struct drm_encoder *encoder, | |||
640 | buf[3] = n; | 639 | buf[3] = n; |
641 | buf[4] = n >> 8; | 640 | buf[4] = n >> 8; |
642 | buf[5] = n >> 16; | 641 | buf[5] = n >> 16; |
643 | reg_write_range(encoder, REG_ACR_CTS_0, buf, 6); | 642 | reg_write_range(priv, REG_ACR_CTS_0, buf, 6); |
644 | 643 | ||
645 | /* Set CTS clock reference */ | 644 | /* Set CTS clock reference */ |
646 | reg_write(encoder, REG_AIP_CLKSEL, clksel_aip | clksel_fs); | 645 | reg_write(priv, REG_AIP_CLKSEL, clksel_aip | clksel_fs); |
647 | 646 | ||
648 | /* Reset CTS generator */ | 647 | /* Reset CTS generator */ |
649 | reg_set(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); | 648 | reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); |
650 | reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); | 649 | reg_clear(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); |
651 | 650 | ||
652 | /* Write the channel status */ | 651 | /* Write the channel status */ |
653 | buf[0] = IEC958_AES0_CON_NOT_COPYRIGHT; | 652 | buf[0] = IEC958_AES0_CON_NOT_COPYRIGHT; |
@@ -655,14 +654,14 @@ tda998x_configure_audio(struct drm_encoder *encoder, | |||
655 | buf[2] = IEC958_AES3_CON_FS_NOTID; | 654 | buf[2] = IEC958_AES3_CON_FS_NOTID; |
656 | buf[3] = IEC958_AES4_CON_ORIGFS_NOTID | | 655 | buf[3] = IEC958_AES4_CON_ORIGFS_NOTID | |
657 | IEC958_AES4_CON_MAX_WORDLEN_24; | 656 | IEC958_AES4_CON_MAX_WORDLEN_24; |
658 | reg_write_range(encoder, REG_CH_STAT_B(0), buf, 4); | 657 | reg_write_range(priv, REG_CH_STAT_B(0), buf, 4); |
659 | 658 | ||
660 | tda998x_audio_mute(encoder, true); | 659 | tda998x_audio_mute(priv, true); |
661 | mdelay(20); | 660 | mdelay(20); |
662 | tda998x_audio_mute(encoder, false); | 661 | tda998x_audio_mute(priv, false); |
663 | 662 | ||
664 | /* Write the audio information packet */ | 663 | /* Write the audio information packet */ |
665 | tda998x_write_aif(encoder, p); | 664 | tda998x_write_aif(priv, p); |
666 | } | 665 | } |
667 | 666 | ||
668 | /* DRM encoder functions */ | 667 | /* DRM encoder functions */ |
@@ -704,19 +703,19 @@ tda998x_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
704 | switch (mode) { | 703 | switch (mode) { |
705 | case DRM_MODE_DPMS_ON: | 704 | case DRM_MODE_DPMS_ON: |
706 | /* enable video ports, audio will be enabled later */ | 705 | /* enable video ports, audio will be enabled later */ |
707 | reg_write(encoder, REG_ENA_VP_0, 0xff); | 706 | reg_write(priv, REG_ENA_VP_0, 0xff); |
708 | reg_write(encoder, REG_ENA_VP_1, 0xff); | 707 | reg_write(priv, REG_ENA_VP_1, 0xff); |
709 | reg_write(encoder, REG_ENA_VP_2, 0xff); | 708 | reg_write(priv, REG_ENA_VP_2, 0xff); |
710 | /* set muxing after enabling ports: */ | 709 | /* set muxing after enabling ports: */ |
711 | reg_write(encoder, REG_VIP_CNTRL_0, priv->vip_cntrl_0); | 710 | reg_write(priv, REG_VIP_CNTRL_0, priv->vip_cntrl_0); |
712 | reg_write(encoder, REG_VIP_CNTRL_1, priv->vip_cntrl_1); | 711 | reg_write(priv, REG_VIP_CNTRL_1, priv->vip_cntrl_1); |
713 | reg_write(encoder, REG_VIP_CNTRL_2, priv->vip_cntrl_2); | 712 | reg_write(priv, REG_VIP_CNTRL_2, priv->vip_cntrl_2); |
714 | break; | 713 | break; |
715 | case DRM_MODE_DPMS_OFF: | 714 | case DRM_MODE_DPMS_OFF: |
716 | /* disable video ports */ | 715 | /* disable video ports */ |
717 | reg_write(encoder, REG_ENA_VP_0, 0x00); | 716 | reg_write(priv, REG_ENA_VP_0, 0x00); |
718 | reg_write(encoder, REG_ENA_VP_1, 0x00); | 717 | reg_write(priv, REG_ENA_VP_1, 0x00); |
719 | reg_write(encoder, REG_ENA_VP_2, 0x00); | 718 | reg_write(priv, REG_ENA_VP_2, 0x00); |
720 | break; | 719 | break; |
721 | } | 720 | } |
722 | 721 | ||
@@ -834,57 +833,57 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
834 | } | 833 | } |
835 | 834 | ||
836 | /* mute the audio FIFO: */ | 835 | /* mute the audio FIFO: */ |
837 | reg_set(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); | 836 | reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); |
838 | 837 | ||
839 | /* set HDMI HDCP mode off: */ | 838 | /* set HDMI HDCP mode off: */ |
840 | reg_set(encoder, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); | 839 | reg_set(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); |
841 | reg_clear(encoder, REG_TX33, TX33_HDMI); | 840 | reg_clear(priv, REG_TX33, TX33_HDMI); |
841 | reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(0)); | ||
842 | 842 | ||
843 | reg_write(encoder, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(0)); | ||
844 | /* no pre-filter or interpolator: */ | 843 | /* no pre-filter or interpolator: */ |
845 | reg_write(encoder, REG_HVF_CNTRL_0, HVF_CNTRL_0_PREFIL(0) | | 844 | reg_write(priv, REG_HVF_CNTRL_0, HVF_CNTRL_0_PREFIL(0) | |
846 | HVF_CNTRL_0_INTPOL(0)); | 845 | HVF_CNTRL_0_INTPOL(0)); |
847 | reg_write(encoder, REG_VIP_CNTRL_5, VIP_CNTRL_5_SP_CNT(0)); | 846 | reg_write(priv, REG_VIP_CNTRL_5, VIP_CNTRL_5_SP_CNT(0)); |
848 | reg_write(encoder, REG_VIP_CNTRL_4, VIP_CNTRL_4_BLANKIT(0) | | 847 | reg_write(priv, REG_VIP_CNTRL_4, VIP_CNTRL_4_BLANKIT(0) | |
849 | VIP_CNTRL_4_BLC(0)); | 848 | VIP_CNTRL_4_BLC(0)); |
850 | reg_clear(encoder, REG_PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR); | 849 | reg_clear(priv, REG_PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR); |
851 | 850 | ||
852 | reg_clear(encoder, REG_PLL_SERIAL_1, PLL_SERIAL_1_SRL_MAN_IZ); | 851 | reg_clear(priv, REG_PLL_SERIAL_1, PLL_SERIAL_1_SRL_MAN_IZ); |
853 | reg_clear(encoder, REG_PLL_SERIAL_3, PLL_SERIAL_3_SRL_DE); | 852 | reg_clear(priv, REG_PLL_SERIAL_3, PLL_SERIAL_3_SRL_DE); |
854 | reg_write(encoder, REG_SERIALIZER, 0); | 853 | reg_write(priv, REG_SERIALIZER, 0); |
855 | reg_write(encoder, REG_HVF_CNTRL_1, HVF_CNTRL_1_VQR(0)); | 854 | reg_write(priv, REG_HVF_CNTRL_1, HVF_CNTRL_1_VQR(0)); |
856 | 855 | ||
857 | /* TODO enable pixel repeat for pixel rates less than 25Msamp/s */ | 856 | /* TODO enable pixel repeat for pixel rates less than 25Msamp/s */ |
858 | rep = 0; | 857 | rep = 0; |
859 | reg_write(encoder, REG_RPT_CNTRL, 0); | 858 | reg_write(priv, REG_RPT_CNTRL, 0); |
860 | reg_write(encoder, REG_SEL_CLK, SEL_CLK_SEL_VRF_CLK(0) | | 859 | reg_write(priv, REG_SEL_CLK, SEL_CLK_SEL_VRF_CLK(0) | |
861 | SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK); | 860 | SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK); |
862 | 861 | ||
863 | reg_write(encoder, REG_PLL_SERIAL_2, PLL_SERIAL_2_SRL_NOSC(div) | | 862 | reg_write(priv, REG_PLL_SERIAL_2, PLL_SERIAL_2_SRL_NOSC(div) | |
864 | PLL_SERIAL_2_SRL_PR(rep)); | 863 | PLL_SERIAL_2_SRL_PR(rep)); |
865 | 864 | ||
866 | /* set color matrix bypass flag: */ | 865 | /* set color matrix bypass flag: */ |
867 | reg_set(encoder, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP); | 866 | reg_set(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP); |
868 | 867 | ||
869 | /* set BIAS tmds value: */ | 868 | /* set BIAS tmds value: */ |
870 | reg_write(encoder, REG_ANA_GENERAL, 0x09); | 869 | reg_write(priv, REG_ANA_GENERAL, 0x09); |
871 | 870 | ||
872 | reg_clear(encoder, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_MTHD); | 871 | reg_clear(priv, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_MTHD); |
873 | 872 | ||
874 | /* | 873 | /* |
875 | * Sync on rising HSYNC/VSYNC | 874 | * Sync on rising HSYNC/VSYNC |
876 | */ | 875 | */ |
877 | reg_write(encoder, REG_VIP_CNTRL_3, 0); | 876 | reg_write(priv, REG_VIP_CNTRL_3, 0); |
878 | reg_set(encoder, REG_VIP_CNTRL_3, VIP_CNTRL_3_SYNC_HS); | 877 | reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_SYNC_HS); |
879 | 878 | ||
880 | /* | 879 | /* |
881 | * TDA19988 requires high-active sync at input stage, | 880 | * TDA19988 requires high-active sync at input stage, |
882 | * so invert low-active sync provided by master encoder here | 881 | * so invert low-active sync provided by master encoder here |
883 | */ | 882 | */ |
884 | if (mode->flags & DRM_MODE_FLAG_NHSYNC) | 883 | if (mode->flags & DRM_MODE_FLAG_NHSYNC) |
885 | reg_set(encoder, REG_VIP_CNTRL_3, VIP_CNTRL_3_H_TGL); | 884 | reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_H_TGL); |
886 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) | 885 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) |
887 | reg_set(encoder, REG_VIP_CNTRL_3, VIP_CNTRL_3_V_TGL); | 886 | reg_set(priv, REG_VIP_CNTRL_3, VIP_CNTRL_3_V_TGL); |
888 | 887 | ||
889 | /* | 888 | /* |
890 | * Always generate sync polarity relative to input sync and | 889 | * Always generate sync polarity relative to input sync and |
@@ -895,49 +894,49 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
895 | reg |= TBG_CNTRL_1_H_TGL; | 894 | reg |= TBG_CNTRL_1_H_TGL; |
896 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) | 895 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) |
897 | reg |= TBG_CNTRL_1_V_TGL; | 896 | reg |= TBG_CNTRL_1_V_TGL; |
898 | reg_write(encoder, REG_TBG_CNTRL_1, reg); | 897 | reg_write(priv, REG_TBG_CNTRL_1, reg); |
899 | 898 | ||
900 | reg_write(encoder, REG_VIDFORMAT, 0x00); | 899 | reg_write(priv, REG_VIDFORMAT, 0x00); |
901 | reg_write16(encoder, REG_REFPIX_MSB, ref_pix); | 900 | reg_write16(priv, REG_REFPIX_MSB, ref_pix); |
902 | reg_write16(encoder, REG_REFLINE_MSB, ref_line); | 901 | reg_write16(priv, REG_REFLINE_MSB, ref_line); |
903 | reg_write16(encoder, REG_NPIX_MSB, n_pix); | 902 | reg_write16(priv, REG_NPIX_MSB, n_pix); |
904 | reg_write16(encoder, REG_NLINE_MSB, n_line); | 903 | reg_write16(priv, REG_NLINE_MSB, n_line); |
905 | reg_write16(encoder, REG_VS_LINE_STRT_1_MSB, vs1_line_s); | 904 | reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s); |
906 | reg_write16(encoder, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); | 905 | reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); |
907 | reg_write16(encoder, REG_VS_LINE_END_1_MSB, vs1_line_e); | 906 | reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e); |
908 | reg_write16(encoder, REG_VS_PIX_END_1_MSB, vs1_pix_e); | 907 | reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e); |
909 | reg_write16(encoder, REG_VS_LINE_STRT_2_MSB, vs2_line_s); | 908 | reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s); |
910 | reg_write16(encoder, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); | 909 | reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); |
911 | reg_write16(encoder, REG_VS_LINE_END_2_MSB, vs2_line_e); | 910 | reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e); |
912 | reg_write16(encoder, REG_VS_PIX_END_2_MSB, vs2_pix_e); | 911 | reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e); |
913 | reg_write16(encoder, REG_HS_PIX_START_MSB, hs_pix_s); | 912 | reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s); |
914 | reg_write16(encoder, REG_HS_PIX_STOP_MSB, hs_pix_e); | 913 | reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e); |
915 | reg_write16(encoder, REG_VWIN_START_1_MSB, vwin1_line_s); | 914 | reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s); |
916 | reg_write16(encoder, REG_VWIN_END_1_MSB, vwin1_line_e); | 915 | reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e); |
917 | reg_write16(encoder, REG_VWIN_START_2_MSB, vwin2_line_s); | 916 | reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s); |
918 | reg_write16(encoder, REG_VWIN_END_2_MSB, vwin2_line_e); | 917 | reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e); |
919 | reg_write16(encoder, REG_DE_START_MSB, de_pix_s); | 918 | reg_write16(priv, REG_DE_START_MSB, de_pix_s); |
920 | reg_write16(encoder, REG_DE_STOP_MSB, de_pix_e); | 919 | reg_write16(priv, REG_DE_STOP_MSB, de_pix_e); |
921 | 920 | ||
922 | if (priv->rev == TDA19988) { | 921 | if (priv->rev == TDA19988) { |
923 | /* let incoming pixels fill the active space (if any) */ | 922 | /* let incoming pixels fill the active space (if any) */ |
924 | reg_write(encoder, REG_ENABLE_SPACE, 0x00); | 923 | reg_write(priv, REG_ENABLE_SPACE, 0x00); |
925 | } | 924 | } |
926 | 925 | ||
927 | /* must be last register set: */ | 926 | /* must be last register set: */ |
928 | reg_clear(encoder, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_ONCE); | 927 | reg_clear(priv, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_ONCE); |
929 | 928 | ||
930 | /* Only setup the info frames if the sink is HDMI */ | 929 | /* Only setup the info frames if the sink is HDMI */ |
931 | if (priv->is_hdmi_sink) { | 930 | if (priv->is_hdmi_sink) { |
932 | /* We need to turn HDMI HDCP stuff on to get audio through */ | 931 | /* We need to turn HDMI HDCP stuff on to get audio through */ |
933 | reg_clear(encoder, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); | 932 | reg_clear(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); |
934 | reg_write(encoder, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1)); | 933 | reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1)); |
935 | reg_set(encoder, REG_TX33, TX33_HDMI); | 934 | reg_set(priv, REG_TX33, TX33_HDMI); |
936 | 935 | ||
937 | tda998x_write_avi(encoder, adjusted_mode); | 936 | tda998x_write_avi(priv, adjusted_mode); |
938 | 937 | ||
939 | if (priv->params.audio_cfg) | 938 | if (priv->params.audio_cfg) |
940 | tda998x_configure_audio(encoder, adjusted_mode, | 939 | tda998x_configure_audio(priv, adjusted_mode, |
941 | &priv->params); | 940 | &priv->params); |
942 | } | 941 | } |
943 | } | 942 | } |
@@ -946,7 +945,9 @@ static enum drm_connector_status | |||
946 | tda998x_encoder_detect(struct drm_encoder *encoder, | 945 | tda998x_encoder_detect(struct drm_encoder *encoder, |
947 | struct drm_connector *connector) | 946 | struct drm_connector *connector) |
948 | { | 947 | { |
949 | uint8_t val = cec_read(encoder, REG_CEC_RXSHPDLEV); | 948 | struct tda998x_priv *priv = to_tda998x_priv(encoder); |
949 | uint8_t val = cec_read(priv, REG_CEC_RXSHPDLEV); | ||
950 | |||
950 | return (val & CEC_RXSHPDLEV_HPD) ? connector_status_connected : | 951 | return (val & CEC_RXSHPDLEV_HPD) ? connector_status_connected : |
951 | connector_status_disconnected; | 952 | connector_status_disconnected; |
952 | } | 953 | } |
@@ -954,29 +955,30 @@ tda998x_encoder_detect(struct drm_encoder *encoder, | |||
954 | static int | 955 | static int |
955 | read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk) | 956 | read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk) |
956 | { | 957 | { |
958 | struct tda998x_priv *priv = to_tda998x_priv(encoder); | ||
957 | uint8_t offset, segptr; | 959 | uint8_t offset, segptr; |
958 | int ret, i; | 960 | int ret, i; |
959 | 961 | ||
960 | /* enable EDID read irq: */ | 962 | /* enable EDID read irq: */ |
961 | reg_set(encoder, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); | 963 | reg_set(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); |
962 | 964 | ||
963 | offset = (blk & 1) ? 128 : 0; | 965 | offset = (blk & 1) ? 128 : 0; |
964 | segptr = blk / 2; | 966 | segptr = blk / 2; |
965 | 967 | ||
966 | reg_write(encoder, REG_DDC_ADDR, 0xa0); | 968 | reg_write(priv, REG_DDC_ADDR, 0xa0); |
967 | reg_write(encoder, REG_DDC_OFFS, offset); | 969 | reg_write(priv, REG_DDC_OFFS, offset); |
968 | reg_write(encoder, REG_DDC_SEGM_ADDR, 0x60); | 970 | reg_write(priv, REG_DDC_SEGM_ADDR, 0x60); |
969 | reg_write(encoder, REG_DDC_SEGM, segptr); | 971 | reg_write(priv, REG_DDC_SEGM, segptr); |
970 | 972 | ||
971 | /* enable reading EDID: */ | 973 | /* enable reading EDID: */ |
972 | reg_write(encoder, REG_EDID_CTRL, 0x1); | 974 | reg_write(priv, REG_EDID_CTRL, 0x1); |
973 | 975 | ||
974 | /* flag must be cleared by sw: */ | 976 | /* flag must be cleared by sw: */ |
975 | reg_write(encoder, REG_EDID_CTRL, 0x0); | 977 | reg_write(priv, REG_EDID_CTRL, 0x0); |
976 | 978 | ||
977 | /* wait for block read to complete: */ | 979 | /* wait for block read to complete: */ |
978 | for (i = 100; i > 0; i--) { | 980 | for (i = 100; i > 0; i--) { |
979 | uint8_t val = reg_read(encoder, REG_INT_FLAGS_2); | 981 | uint8_t val = reg_read(priv, REG_INT_FLAGS_2); |
980 | if (val & INT_FLAGS_2_EDID_BLK_RD) | 982 | if (val & INT_FLAGS_2_EDID_BLK_RD) |
981 | break; | 983 | break; |
982 | msleep(1); | 984 | msleep(1); |
@@ -985,14 +987,14 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk) | |||
985 | if (i == 0) | 987 | if (i == 0) |
986 | return -ETIMEDOUT; | 988 | return -ETIMEDOUT; |
987 | 989 | ||
988 | ret = reg_read_range(encoder, REG_EDID_DATA_0, buf, EDID_LENGTH); | 990 | ret = reg_read_range(priv, REG_EDID_DATA_0, buf, EDID_LENGTH); |
989 | if (ret != EDID_LENGTH) { | 991 | if (ret != EDID_LENGTH) { |
990 | dev_err(encoder->dev->dev, "failed to read edid block %d: %d", | 992 | dev_err(encoder->dev->dev, "failed to read edid block %d: %d", |
991 | blk, ret); | 993 | blk, ret); |
992 | return ret; | 994 | return ret; |
993 | } | 995 | } |
994 | 996 | ||
995 | reg_clear(encoder, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); | 997 | reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD); |
996 | 998 | ||
997 | return 0; | 999 | return 0; |
998 | } | 1000 | } |
@@ -1009,7 +1011,7 @@ do_get_edid(struct drm_encoder *encoder) | |||
1009 | return NULL; | 1011 | return NULL; |
1010 | 1012 | ||
1011 | if (priv->rev == TDA19988) | 1013 | if (priv->rev == TDA19988) |
1012 | reg_clear(encoder, REG_TX4, TX4_PD_RAM); | 1014 | reg_clear(priv, REG_TX4, TX4_PD_RAM); |
1013 | 1015 | ||
1014 | /* base block fetch */ | 1016 | /* base block fetch */ |
1015 | if (read_edid_block(encoder, block, 0)) | 1017 | if (read_edid_block(encoder, block, 0)) |
@@ -1049,13 +1051,13 @@ do_get_edid(struct drm_encoder *encoder) | |||
1049 | 1051 | ||
1050 | done: | 1052 | done: |
1051 | if (priv->rev == TDA19988) | 1053 | if (priv->rev == TDA19988) |
1052 | reg_set(encoder, REG_TX4, TX4_PD_RAM); | 1054 | reg_set(priv, REG_TX4, TX4_PD_RAM); |
1053 | 1055 | ||
1054 | return block; | 1056 | return block; |
1055 | 1057 | ||
1056 | fail: | 1058 | fail: |
1057 | if (priv->rev == TDA19988) | 1059 | if (priv->rev == TDA19988) |
1058 | reg_set(encoder, REG_TX4, TX4_PD_RAM); | 1060 | reg_set(priv, REG_TX4, TX4_PD_RAM); |
1059 | dev_warn(encoder->dev->dev, "failed to read EDID\n"); | 1061 | dev_warn(encoder->dev->dev, "failed to read EDID\n"); |
1060 | kfree(block); | 1062 | kfree(block); |
1061 | return NULL; | 1063 | return NULL; |
@@ -1141,7 +1143,6 @@ tda998x_encoder_init(struct i2c_client *client, | |||
1141 | struct drm_device *dev, | 1143 | struct drm_device *dev, |
1142 | struct drm_encoder_slave *encoder_slave) | 1144 | struct drm_encoder_slave *encoder_slave) |
1143 | { | 1145 | { |
1144 | struct drm_encoder *encoder = &encoder_slave->base; | ||
1145 | struct tda998x_priv *priv; | 1146 | struct tda998x_priv *priv; |
1146 | 1147 | ||
1147 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 1148 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
@@ -1153,6 +1154,7 @@ tda998x_encoder_init(struct i2c_client *client, | |||
1153 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5); | 1154 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5); |
1154 | 1155 | ||
1155 | priv->current_page = 0xff; | 1156 | priv->current_page = 0xff; |
1157 | priv->hdmi = client; | ||
1156 | priv->cec = i2c_new_dummy(client->adapter, 0x34); | 1158 | priv->cec = i2c_new_dummy(client->adapter, 0x34); |
1157 | if (!priv->cec) { | 1159 | if (!priv->cec) { |
1158 | kfree(priv); | 1160 | kfree(priv); |
@@ -1164,14 +1166,14 @@ tda998x_encoder_init(struct i2c_client *client, | |||
1164 | encoder_slave->slave_funcs = &tda998x_encoder_funcs; | 1166 | encoder_slave->slave_funcs = &tda998x_encoder_funcs; |
1165 | 1167 | ||
1166 | /* wake up the device: */ | 1168 | /* wake up the device: */ |
1167 | cec_write(encoder, REG_CEC_ENAMODS, | 1169 | cec_write(priv, REG_CEC_ENAMODS, |
1168 | CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI); | 1170 | CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI); |
1169 | 1171 | ||
1170 | tda998x_reset(encoder); | 1172 | tda998x_reset(priv); |
1171 | 1173 | ||
1172 | /* read version: */ | 1174 | /* read version: */ |
1173 | priv->rev = reg_read(encoder, REG_VERSION_LSB) | | 1175 | priv->rev = reg_read(priv, REG_VERSION_LSB) | |
1174 | reg_read(encoder, REG_VERSION_MSB) << 8; | 1176 | reg_read(priv, REG_VERSION_MSB) << 8; |
1175 | 1177 | ||
1176 | /* mask off feature bits: */ | 1178 | /* mask off feature bits: */ |
1177 | priv->rev &= ~0x30; /* not-hdcp and not-scalar bit */ | 1179 | priv->rev &= ~0x30; /* not-hdcp and not-scalar bit */ |
@@ -1187,16 +1189,16 @@ tda998x_encoder_init(struct i2c_client *client, | |||
1187 | } | 1189 | } |
1188 | 1190 | ||
1189 | /* after reset, enable DDC: */ | 1191 | /* after reset, enable DDC: */ |
1190 | reg_write(encoder, REG_DDC_DISABLE, 0x00); | 1192 | reg_write(priv, REG_DDC_DISABLE, 0x00); |
1191 | 1193 | ||
1192 | /* set clock on DDC channel: */ | 1194 | /* set clock on DDC channel: */ |
1193 | reg_write(encoder, REG_TX3, 39); | 1195 | reg_write(priv, REG_TX3, 39); |
1194 | 1196 | ||
1195 | /* if necessary, disable multi-master: */ | 1197 | /* if necessary, disable multi-master: */ |
1196 | if (priv->rev == TDA19989) | 1198 | if (priv->rev == TDA19989) |
1197 | reg_set(encoder, REG_I2C_MASTER, I2C_MASTER_DIS_MM); | 1199 | reg_set(priv, REG_I2C_MASTER, I2C_MASTER_DIS_MM); |
1198 | 1200 | ||
1199 | cec_write(encoder, REG_CEC_FRO_IM_CLK_CTRL, | 1201 | cec_write(priv, REG_CEC_FRO_IM_CLK_CTRL, |
1200 | CEC_FRO_IM_CLK_CTRL_GHOST_DIS | CEC_FRO_IM_CLK_CTRL_IMCLK_SEL); | 1202 | CEC_FRO_IM_CLK_CTRL_GHOST_DIS | CEC_FRO_IM_CLK_CTRL_IMCLK_SEL); |
1201 | 1203 | ||
1202 | return 0; | 1204 | return 0; |