Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i2c: tda998x: add video and audio input configuration

This patch adds tda998x specific parameters to allow it to be configured
for different boards using it. Also, this implements rudimentary audio
support for S/PDIF attached controllers.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tested-by: Darren Etheridge <detheridge@ti.com>
Tested-by: Russell King <rmk_kernel@arm.linux.org.uk>
Tested-by: Russell King <rmk_kernel@arm.linux.org.uk>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Russell King and committed by
Dave Airlie
c4c11dd1 5e74c22c

+290 -8
+260 -8
drivers/gpu/drm/i2c/tda998x_drv.c
··· 23 23 #include <drm/drm_crtc_helper.h> 24 24 #include <drm/drm_encoder_slave.h> 25 25 #include <drm/drm_edid.h> 26 - 26 + #include <drm/i2c/tda998x.h> 27 27 28 28 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__) 29 29 ··· 32 32 uint16_t rev; 33 33 uint8_t current_page; 34 34 int dpms; 35 + bool is_hdmi_sink; 35 36 u8 vip_cntrl_0; 36 37 u8 vip_cntrl_1; 37 38 u8 vip_cntrl_2; 39 + struct tda998x_encoder_params params; 38 40 }; 39 41 40 42 #define to_tda998x_priv(x) ((struct tda998x_priv *)to_encoder_slave(x)->slave_priv) ··· 73 71 # define I2C_MASTER_DIS_MM (1 << 0) 74 72 # define I2C_MASTER_DIS_FILT (1 << 1) 75 73 # define I2C_MASTER_APP_STRT_LAT (1 << 2) 74 + #define REG_FEAT_POWERDOWN REG(0x00, 0x0e) /* read/write */ 75 + # define FEAT_POWERDOWN_SPDIF (1 << 3) 76 76 #define REG_INT_FLAGS_0 REG(0x00, 0x0f) /* read/write */ 77 77 #define REG_INT_FLAGS_1 REG(0x00, 0x10) /* read/write */ 78 78 #define REG_INT_FLAGS_2 REG(0x00, 0x11) /* read/write */ 79 79 # define INT_FLAGS_2_EDID_BLK_RD (1 << 1) 80 + #define REG_ENA_ACLK REG(0x00, 0x16) /* read/write */ 80 81 #define REG_ENA_VP_0 REG(0x00, 0x18) /* read/write */ 81 82 #define REG_ENA_VP_1 REG(0x00, 0x19) /* read/write */ 82 83 #define REG_ENA_VP_2 REG(0x00, 0x1a) /* read/write */ ··· 118 113 #define REG_VIP_CNTRL_5 REG(0x00, 0x25) /* write */ 119 114 # define VIP_CNTRL_5_CKCASE (1 << 0) 120 115 # define VIP_CNTRL_5_SP_CNT(x) (((x) & 3) << 1) 116 + #define REG_MUX_AP REG(0x00, 0x26) /* read/write */ 121 117 #define REG_MUX_VP_VIP_OUT REG(0x00, 0x27) /* read/write */ 122 118 #define REG_MAT_CONTRL REG(0x00, 0x80) /* write */ 123 119 # define MAT_CONTRL_MAT_SC(x) (((x) & 3) << 0) ··· 181 175 # define HVF_CNTRL_1_PAD(x) (((x) & 3) << 4) 182 176 # define HVF_CNTRL_1_SEMI_PLANAR (1 << 6) 183 177 #define REG_RPT_CNTRL REG(0x00, 0xf0) /* write */ 178 + #define REG_I2S_FORMAT REG(0x00, 0xfc) /* read/write */ 179 + # define I2S_FORMAT(x) (((x) & 3) << 0) 180 + #define REG_AIP_CLKSEL REG(0x00, 0xfd) /* write */ 181 + # define AIP_CLKSEL_FS(x) (((x) & 3) << 0) 182 + # define AIP_CLKSEL_CLK_POL(x) (((x) & 1) << 2) 183 + # define AIP_CLKSEL_AIP(x) (((x) & 7) << 3) 184 184 185 185 186 186 /* Page 02h: PLL settings */ ··· 210 198 #define REG_PLL_SCGR1 REG(0x02, 0x09) /* read/write */ 211 199 #define REG_PLL_SCGR2 REG(0x02, 0x0a) /* read/write */ 212 200 #define REG_AUDIO_DIV REG(0x02, 0x0e) /* read/write */ 201 + # define AUDIO_DIV_SERCLK_1 0 202 + # define AUDIO_DIV_SERCLK_2 1 203 + # define AUDIO_DIV_SERCLK_4 2 204 + # define AUDIO_DIV_SERCLK_8 3 205 + # define AUDIO_DIV_SERCLK_16 4 206 + # define AUDIO_DIV_SERCLK_32 5 213 207 #define REG_SEL_CLK REG(0x02, 0x11) /* read/write */ 214 208 # define SEL_CLK_SEL_CLK1 (1 << 0) 215 209 # define SEL_CLK_SEL_VRF_CLK(x) (((x) & 3) << 1) ··· 234 216 235 217 236 218 /* Page 10h: information frames and packets */ 219 + #define REG_IF1_HB0 REG(0x10, 0x20) /* read/write */ 220 + #define REG_IF2_HB0 REG(0x10, 0x40) /* read/write */ 221 + #define REG_IF3_HB0 REG(0x10, 0x60) /* read/write */ 222 + #define REG_IF4_HB0 REG(0x10, 0x80) /* read/write */ 223 + #define REG_IF5_HB0 REG(0x10, 0xa0) /* read/write */ 237 224 238 225 239 226 /* Page 11h: audio settings and content info packets */ ··· 248 225 # define AIP_CNTRL_0_LAYOUT (1 << 2) 249 226 # define AIP_CNTRL_0_ACR_MAN (1 << 5) 250 227 # define AIP_CNTRL_0_RST_CTS (1 << 6) 228 + #define REG_CA_I2S REG(0x11, 0x01) /* read/write */ 229 + # define CA_I2S_CA_I2S(x) (((x) & 31) << 0) 230 + # define CA_I2S_HBR_CHSTAT (1 << 6) 231 + #define REG_LATENCY_RD REG(0x11, 0x04) /* read/write */ 232 + #define REG_ACR_CTS_0 REG(0x11, 0x05) /* read/write */ 233 + #define REG_ACR_CTS_1 REG(0x11, 0x06) /* read/write */ 234 + #define REG_ACR_CTS_2 REG(0x11, 0x07) /* read/write */ 235 + #define REG_ACR_N_0 REG(0x11, 0x08) /* read/write */ 236 + #define REG_ACR_N_1 REG(0x11, 0x09) /* read/write */ 237 + #define REG_ACR_N_2 REG(0x11, 0x0a) /* read/write */ 238 + #define REG_CTS_N REG(0x11, 0x0c) /* read/write */ 239 + # define CTS_N_K(x) (((x) & 7) << 0) 240 + # define CTS_N_M(x) (((x) & 3) << 4) 251 241 #define REG_ENC_CNTRL REG(0x11, 0x0d) /* read/write */ 252 242 # define ENC_CNTRL_RST_ENC (1 << 0) 253 243 # define ENC_CNTRL_RST_SEL (1 << 1) 254 244 # define ENC_CNTRL_CTL_CODE(x) (((x) & 3) << 2) 245 + #define REG_DIP_FLAGS REG(0x11, 0x0e) /* read/write */ 246 + # define DIP_FLAGS_ACR (1 << 0) 247 + # define DIP_FLAGS_GC (1 << 1) 248 + #define REG_DIP_IF_FLAGS REG(0x11, 0x0f) /* read/write */ 249 + # define DIP_IF_FLAGS_IF1 (1 << 1) 250 + # define DIP_IF_FLAGS_IF2 (1 << 2) 251 + # define DIP_IF_FLAGS_IF3 (1 << 3) 252 + # define DIP_IF_FLAGS_IF4 (1 << 4) 253 + # define DIP_IF_FLAGS_IF5 (1 << 5) 254 + #define REG_CH_STAT_B(x) REG(0x11, 0x14 + (x)) /* read/write */ 255 255 256 256 257 257 /* Page 12h: HDCP and OTP */ ··· 390 344 return ret; 391 345 } 392 346 347 + static void 348 + reg_write_range(struct drm_encoder *encoder, uint16_t reg, uint8_t *p, int cnt) 349 + { 350 + struct i2c_client *client = drm_i2c_encoder_get_client(encoder); 351 + uint8_t buf[cnt+1]; 352 + int ret; 353 + 354 + buf[0] = REG2ADDR(reg); 355 + memcpy(&buf[1], p, cnt); 356 + 357 + set_page(encoder, reg); 358 + 359 + ret = i2c_master_send(client, buf, cnt + 1); 360 + if (ret < 0) 361 + dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg); 362 + } 363 + 393 364 static uint8_t 394 365 reg_read(struct drm_encoder *encoder, uint16_t reg) 395 366 { ··· 475 412 reg_write(encoder, REG_SERIALIZER, 0x00); 476 413 reg_write(encoder, REG_BUFFER_OUT, 0x00); 477 414 reg_write(encoder, REG_PLL_SCG1, 0x00); 478 - reg_write(encoder, REG_AUDIO_DIV, 0x03); 415 + reg_write(encoder, REG_AUDIO_DIV, AUDIO_DIV_SERCLK_8); 479 416 reg_write(encoder, REG_SEL_CLK, SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK); 480 417 reg_write(encoder, REG_PLL_SCGN1, 0xfa); 481 418 reg_write(encoder, REG_PLL_SCGN2, 0x00); ··· 487 424 reg_write(encoder, REG_MUX_VP_VIP_OUT, 0x24); 488 425 } 489 426 427 + static uint8_t tda998x_cksum(uint8_t *buf, size_t bytes) 428 + { 429 + uint8_t sum = 0; 430 + 431 + while (bytes--) 432 + sum += *buf++; 433 + return (255 - sum) + 1; 434 + } 435 + 436 + #define HB(x) (x) 437 + #define PB(x) (HB(2) + 1 + (x)) 438 + 439 + static void 440 + tda998x_write_if(struct drm_encoder *encoder, uint8_t bit, uint16_t addr, 441 + uint8_t *buf, size_t size) 442 + { 443 + buf[PB(0)] = tda998x_cksum(buf, size); 444 + 445 + reg_clear(encoder, REG_DIP_IF_FLAGS, bit); 446 + reg_write_range(encoder, addr, buf, size); 447 + reg_set(encoder, REG_DIP_IF_FLAGS, bit); 448 + } 449 + 450 + static void 451 + tda998x_write_aif(struct drm_encoder *encoder, struct tda998x_encoder_params *p) 452 + { 453 + uint8_t buf[PB(5) + 1]; 454 + 455 + buf[HB(0)] = 0x84; 456 + buf[HB(1)] = 0x01; 457 + buf[HB(2)] = 10; 458 + buf[PB(0)] = 0; 459 + buf[PB(1)] = p->audio_frame[1] & 0x07; /* CC */ 460 + buf[PB(2)] = p->audio_frame[2] & 0x1c; /* SF */ 461 + buf[PB(4)] = p->audio_frame[4]; 462 + buf[PB(5)] = p->audio_frame[5] & 0xf8; /* DM_INH + LSV */ 463 + 464 + tda998x_write_if(encoder, DIP_IF_FLAGS_IF4, REG_IF4_HB0, buf, 465 + sizeof(buf)); 466 + } 467 + 468 + static void 469 + tda998x_write_avi(struct drm_encoder *encoder, struct drm_display_mode *mode) 470 + { 471 + uint8_t buf[PB(13) + 1]; 472 + 473 + memset(buf, 0, sizeof(buf)); 474 + buf[HB(0)] = 0x82; 475 + buf[HB(1)] = 0x02; 476 + buf[HB(2)] = 13; 477 + buf[PB(4)] = drm_match_cea_mode(mode); 478 + 479 + tda998x_write_if(encoder, DIP_IF_FLAGS_IF2, REG_IF2_HB0, buf, 480 + sizeof(buf)); 481 + } 482 + 483 + static void tda998x_audio_mute(struct drm_encoder *encoder, bool on) 484 + { 485 + if (on) { 486 + reg_set(encoder, REG_SOFTRESET, SOFTRESET_AUDIO); 487 + reg_clear(encoder, REG_SOFTRESET, SOFTRESET_AUDIO); 488 + reg_set(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); 489 + } else { 490 + reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); 491 + } 492 + } 493 + 494 + static void 495 + tda998x_configure_audio(struct drm_encoder *encoder, 496 + struct drm_display_mode *mode, struct tda998x_encoder_params *p) 497 + { 498 + uint8_t buf[6], clksel_aip, clksel_fs, ca_i2s, cts_n, adiv; 499 + uint32_t n; 500 + 501 + /* Enable audio ports */ 502 + reg_write(encoder, REG_ENA_AP, p->audio_cfg); 503 + reg_write(encoder, REG_ENA_ACLK, p->audio_clk_cfg); 504 + 505 + /* Set audio input source */ 506 + switch (p->audio_format) { 507 + case AFMT_SPDIF: 508 + reg_write(encoder, REG_MUX_AP, 0x40); 509 + clksel_aip = AIP_CLKSEL_AIP(0); 510 + /* FS64SPDIF */ 511 + clksel_fs = AIP_CLKSEL_FS(2); 512 + cts_n = CTS_N_M(3) | CTS_N_K(3); 513 + ca_i2s = 0; 514 + break; 515 + 516 + case AFMT_I2S: 517 + reg_write(encoder, REG_MUX_AP, 0x64); 518 + clksel_aip = AIP_CLKSEL_AIP(1); 519 + /* ACLK */ 520 + clksel_fs = AIP_CLKSEL_FS(0); 521 + cts_n = CTS_N_M(3) | CTS_N_K(3); 522 + ca_i2s = CA_I2S_CA_I2S(0); 523 + break; 524 + } 525 + 526 + reg_write(encoder, REG_AIP_CLKSEL, clksel_aip); 527 + reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_LAYOUT); 528 + 529 + /* Enable automatic CTS generation */ 530 + reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_ACR_MAN); 531 + reg_write(encoder, REG_CTS_N, cts_n); 532 + 533 + /* 534 + * Audio input somehow depends on HDMI line rate which is 535 + * related to pixclk. Testing showed that modes with pixclk 536 + * >100MHz need a larger divider while <40MHz need the default. 537 + * There is no detailed info in the datasheet, so we just 538 + * assume 100MHz requires larger divider. 539 + */ 540 + if (mode->clock > 100000) 541 + adiv = AUDIO_DIV_SERCLK_16; 542 + else 543 + adiv = AUDIO_DIV_SERCLK_8; 544 + reg_write(encoder, REG_AUDIO_DIV, adiv); 545 + 546 + /* 547 + * This is the approximate value of N, which happens to be 548 + * the recommended values for non-coherent clocks. 549 + */ 550 + n = 128 * p->audio_sample_rate / 1000; 551 + 552 + /* Write the CTS and N values */ 553 + buf[0] = 0x44; 554 + buf[1] = 0x42; 555 + buf[2] = 0x01; 556 + buf[3] = n; 557 + buf[4] = n >> 8; 558 + buf[5] = n >> 16; 559 + reg_write_range(encoder, REG_ACR_CTS_0, buf, 6); 560 + 561 + /* Set CTS clock reference */ 562 + reg_write(encoder, REG_AIP_CLKSEL, clksel_aip | clksel_fs); 563 + 564 + /* Reset CTS generator */ 565 + reg_set(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); 566 + reg_clear(encoder, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_CTS); 567 + 568 + /* Write the channel status */ 569 + buf[0] = 0x04; 570 + buf[1] = 0x00; 571 + buf[2] = 0x00; 572 + buf[3] = 0xf1; 573 + reg_write_range(encoder, REG_CH_STAT_B(0), buf, 4); 574 + 575 + tda998x_audio_mute(encoder, true); 576 + mdelay(20); 577 + tda998x_audio_mute(encoder, false); 578 + 579 + /* Write the audio information packet */ 580 + tda998x_write_aif(encoder, p); 581 + } 582 + 490 583 /* DRM encoder functions */ 491 584 492 585 static void 493 586 tda998x_encoder_set_config(struct drm_encoder *encoder, void *params) 494 587 { 588 + struct tda998x_priv *priv = to_tda998x_priv(encoder); 589 + struct tda998x_encoder_params *p = params; 590 + 591 + priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(p->swap_a) | 592 + (p->mirr_a ? VIP_CNTRL_0_MIRR_A : 0) | 593 + VIP_CNTRL_0_SWAP_B(p->swap_b) | 594 + (p->mirr_b ? VIP_CNTRL_0_MIRR_B : 0); 595 + priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(p->swap_c) | 596 + (p->mirr_c ? VIP_CNTRL_1_MIRR_C : 0) | 597 + VIP_CNTRL_1_SWAP_D(p->swap_d) | 598 + (p->mirr_d ? VIP_CNTRL_1_MIRR_D : 0); 599 + priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(p->swap_e) | 600 + (p->mirr_e ? VIP_CNTRL_2_MIRR_E : 0) | 601 + VIP_CNTRL_2_SWAP_F(p->swap_f) | 602 + (p->mirr_f ? VIP_CNTRL_2_MIRR_F : 0); 603 + 604 + priv->params = *p; 495 605 } 496 606 497 607 static void ··· 681 445 682 446 switch (mode) { 683 447 case DRM_MODE_DPMS_ON: 684 - /* enable audio and video ports */ 685 - reg_write(encoder, REG_ENA_AP, 0xff); 448 + /* enable video ports, audio will be enabled later */ 686 449 reg_write(encoder, REG_ENA_VP_0, 0xff); 687 450 reg_write(encoder, REG_ENA_VP_1, 0xff); 688 451 reg_write(encoder, REG_ENA_VP_2, 0xff); ··· 843 608 reg_write16(encoder, REG_REFPIX_MSB, ref_pix); 844 609 reg_write16(encoder, REG_REFLINE_MSB, ref_line); 845 610 846 - reg = TBG_CNTRL_1_VHX_EXT_DE | 847 - TBG_CNTRL_1_VHX_EXT_HS | 848 - TBG_CNTRL_1_VHX_EXT_VS | 849 - TBG_CNTRL_1_DWIN_DIS | /* HDCP off */ 611 + reg = TBG_CNTRL_1_DWIN_DIS | /* HDCP off */ 850 612 TBG_CNTRL_1_VH_TGL_2; 613 + /* 614 + * It is questionable whether this is correct - the nxp driver 615 + * does not set VH_TGL_2 and the below for all display modes. 616 + */ 851 617 if (mode->flags & (DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC)) 852 618 reg |= TBG_CNTRL_1_VH_TGL_0; 853 619 reg_set(encoder, REG_TBG_CNTRL_1, reg); 854 620 855 621 /* must be last register set: */ 856 622 reg_clear(encoder, REG_TBG_CNTRL_0, TBG_CNTRL_0_SYNC_ONCE); 623 + 624 + /* Only setup the info frames if the sink is HDMI */ 625 + if (priv->is_hdmi_sink) { 626 + /* We need to turn HDMI HDCP stuff on to get audio through */ 627 + reg_clear(encoder, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS); 628 + reg_write(encoder, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1)); 629 + reg_set(encoder, REG_TX33, TX33_HDMI); 630 + 631 + tda998x_write_avi(encoder, adjusted_mode); 632 + 633 + if (priv->params.audio_cfg) 634 + tda998x_configure_audio(encoder, adjusted_mode, 635 + &priv->params); 636 + } 857 637 } 858 638 859 639 static enum drm_connector_status ··· 994 744 tda998x_encoder_get_modes(struct drm_encoder *encoder, 995 745 struct drm_connector *connector) 996 746 { 747 + struct tda998x_priv *priv = to_tda998x_priv(encoder); 997 748 struct edid *edid = (struct edid *)do_get_edid(encoder); 998 749 int n = 0; 999 750 1000 751 if (edid) { 1001 752 drm_mode_connector_update_edid_property(connector, edid); 1002 753 n = drm_add_edid_modes(connector, edid); 754 + priv->is_hdmi_sink = drm_detect_hdmi_monitor(edid); 1003 755 kfree(edid); 1004 756 } 1005 757
+30
include/drm/i2c/tda998x.h
··· 1 + #ifndef __DRM_I2C_TDA998X_H__ 2 + #define __DRM_I2C_TDA998X_H__ 3 + 4 + struct tda998x_encoder_params { 5 + u8 swap_b:3; 6 + u8 mirr_b:1; 7 + u8 swap_a:3; 8 + u8 mirr_a:1; 9 + u8 swap_d:3; 10 + u8 mirr_d:1; 11 + u8 swap_c:3; 12 + u8 mirr_c:1; 13 + u8 swap_f:3; 14 + u8 mirr_f:1; 15 + u8 swap_e:3; 16 + u8 mirr_e:1; 17 + 18 + u8 audio_cfg; 19 + u8 audio_clk_cfg; 20 + u8 audio_frame[6]; 21 + 22 + enum { 23 + AFMT_SPDIF, 24 + AFMT_I2S 25 + } audio_format; 26 + 27 + unsigned audio_sample_rate; 28 + }; 29 + 30 + #endif