diff options
author | Dave Airlie <airlied@redhat.com> | 2016-11-24 18:55:33 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-11-24 18:55:33 -0500 |
commit | 7625e05286cf3f37c8a5e633379a4d014ddbe555 (patch) | |
tree | 40a4be339cec8dccebfea8cd8b4c557dee15d9c2 /drivers/gpu | |
parent | 4d5304d87034fe3f003cffa7ef2350d066ef7f3e (diff) | |
parent | 9b2502b6ebc632ff49743b3639ea12d4f08808a5 (diff) |
Merge branch 'drm-tda998x-devel' of git://git.armlinux.org.uk/~rmk/linux-arm into drm-next
These updates:
* improve the robustness of the driver wrt races
* improve the compliance for sending infoframes and audio
* re-organise the function order in the driver to group like functions
together. (This unfortunately causes a conflict with the change in
drm-misc, but it should be trivial to solve, although it looks more
scarey than it really is - sfr has already sent two reports about
this, one earlier today.)
* simplify tda998x_audio_get_eld and DPMS handling
* power down sections of the chip that we never use
* add some initial preparation for supporting the CEC driver
* 'drm-tda998x-devel' of git://git.armlinux.org.uk/~rmk/linux-arm:
drm/i2c: tda998x: fix spelling mistake
drm/i2c: tda998x: allow sharing of the CEC device accesses
drm/i2c: tda998x: allow interrupt to be shared
drm/i2c: tda998x: power down pre-filter and color conversion
drm/i2c: tda998x: switch to boolean is_on
drm/i2c: tda998x: remove complexity from tda998x_audio_get_eld()
drm/i2c: tda998x: group audio functions together
drm/i2c: tda998x: separate connector initialisation
drm/i2c: tda998x: group connector functions and funcs together
drm/i2c: tda998x: move and rename tda998x_encoder_set_config()
drm/i2c: tda998x: correct function name in comments
drm/i2c: tda998x: only enable audio if supported by sink
drm/i2c: tda998x: only configure infoframes and audio if supported
drm/i2c: tda998x: avoid race when programming audio
drm/i2c: tda998x: avoid racy access to mode clock
drm/i2c: tda998x: avoid race in tda998x_encoder_mode_set()
drm/i2c: tda998x: move audio mutex initialisation
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i2c/tda998x_drv.c | 856 |
1 files changed, 454 insertions, 402 deletions
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index 027521f30b6e..86f47e190309 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c | |||
@@ -41,12 +41,15 @@ struct tda998x_priv { | |||
41 | struct i2c_client *hdmi; | 41 | struct i2c_client *hdmi; |
42 | struct mutex mutex; | 42 | struct mutex mutex; |
43 | u16 rev; | 43 | u16 rev; |
44 | u8 cec_addr; | ||
44 | u8 current_page; | 45 | u8 current_page; |
45 | int dpms; | 46 | bool is_on; |
46 | bool is_hdmi_sink; | 47 | bool supports_infoframes; |
48 | bool sink_has_audio; | ||
47 | u8 vip_cntrl_0; | 49 | u8 vip_cntrl_0; |
48 | u8 vip_cntrl_1; | 50 | u8 vip_cntrl_1; |
49 | u8 vip_cntrl_2; | 51 | u8 vip_cntrl_2; |
52 | unsigned long tmds_clock; | ||
50 | struct tda998x_audio_params audio_params; | 53 | struct tda998x_audio_params audio_params; |
51 | 54 | ||
52 | struct platform_device *audio_pdev; | 55 | struct platform_device *audio_pdev; |
@@ -105,6 +108,8 @@ struct tda998x_priv { | |||
105 | # define I2C_MASTER_DIS_FILT (1 << 1) | 108 | # define I2C_MASTER_DIS_FILT (1 << 1) |
106 | # define I2C_MASTER_APP_STRT_LAT (1 << 2) | 109 | # define I2C_MASTER_APP_STRT_LAT (1 << 2) |
107 | #define REG_FEAT_POWERDOWN REG(0x00, 0x0e) /* read/write */ | 110 | #define REG_FEAT_POWERDOWN REG(0x00, 0x0e) /* read/write */ |
111 | # define FEAT_POWERDOWN_PREFILT BIT(0) | ||
112 | # define FEAT_POWERDOWN_CSC BIT(1) | ||
108 | # define FEAT_POWERDOWN_SPDIF (1 << 3) | 113 | # define FEAT_POWERDOWN_SPDIF (1 << 3) |
109 | #define REG_INT_FLAGS_0 REG(0x00, 0x0f) /* read/write */ | 114 | #define REG_INT_FLAGS_0 REG(0x00, 0x0f) /* read/write */ |
110 | #define REG_INT_FLAGS_1 REG(0x00, 0x10) /* read/write */ | 115 | #define REG_INT_FLAGS_1 REG(0x00, 0x10) /* read/write */ |
@@ -370,35 +375,46 @@ struct tda998x_priv { | |||
370 | static void | 375 | static void |
371 | cec_write(struct tda998x_priv *priv, u16 addr, u8 val) | 376 | cec_write(struct tda998x_priv *priv, u16 addr, u8 val) |
372 | { | 377 | { |
373 | struct i2c_client *client = priv->cec; | ||
374 | u8 buf[] = {addr, val}; | 378 | u8 buf[] = {addr, val}; |
379 | struct i2c_msg msg = { | ||
380 | .addr = priv->cec_addr, | ||
381 | .len = 2, | ||
382 | .buf = buf, | ||
383 | }; | ||
375 | int ret; | 384 | int ret; |
376 | 385 | ||
377 | ret = i2c_master_send(client, buf, sizeof(buf)); | 386 | ret = i2c_transfer(priv->hdmi->adapter, &msg, 1); |
378 | if (ret < 0) | 387 | if (ret < 0) |
379 | dev_err(&client->dev, "Error %d writing to cec:0x%x\n", ret, addr); | 388 | dev_err(&priv->hdmi->dev, "Error %d writing to cec:0x%x\n", |
389 | ret, addr); | ||
380 | } | 390 | } |
381 | 391 | ||
382 | static u8 | 392 | static u8 |
383 | cec_read(struct tda998x_priv *priv, u8 addr) | 393 | cec_read(struct tda998x_priv *priv, u8 addr) |
384 | { | 394 | { |
385 | struct i2c_client *client = priv->cec; | ||
386 | u8 val; | 395 | u8 val; |
396 | struct i2c_msg msg[2] = { | ||
397 | { | ||
398 | .addr = priv->cec_addr, | ||
399 | .len = 1, | ||
400 | .buf = &addr, | ||
401 | }, { | ||
402 | .addr = priv->cec_addr, | ||
403 | .flags = I2C_M_RD, | ||
404 | .len = 1, | ||
405 | .buf = &val, | ||
406 | }, | ||
407 | }; | ||
387 | int ret; | 408 | int ret; |
388 | 409 | ||
389 | ret = i2c_master_send(client, &addr, sizeof(addr)); | 410 | ret = i2c_transfer(priv->hdmi->adapter, msg, ARRAY_SIZE(msg)); |
390 | if (ret < 0) | 411 | if (ret < 0) { |
391 | goto fail; | 412 | dev_err(&priv->hdmi->dev, "Error %d reading from cec:0x%x\n", |
392 | 413 | ret, addr); | |
393 | ret = i2c_master_recv(client, &val, sizeof(val)); | 414 | val = 0; |
394 | if (ret < 0) | 415 | } |
395 | goto fail; | ||
396 | 416 | ||
397 | return val; | 417 | return val; |
398 | |||
399 | fail: | ||
400 | dev_err(&client->dev, "Error %d reading from cec:0x%x\n", ret, addr); | ||
401 | return 0; | ||
402 | } | 418 | } |
403 | 419 | ||
404 | static int | 420 | static int |
@@ -579,9 +595,9 @@ tda998x_reset(struct tda998x_priv *priv) | |||
579 | * HPD assertion: it needs a delay of 100ms to avoid timing out while | 595 | * HPD assertion: it needs a delay of 100ms to avoid timing out while |
580 | * trying to read EDID data. | 596 | * trying to read EDID data. |
581 | * | 597 | * |
582 | * However, tda998x_encoder_get_modes() may be called at any moment | 598 | * However, tda998x_connector_get_modes() may be called at any moment |
583 | * after tda998x_connector_detect() indicates that we are connected, so | 599 | * after tda998x_connector_detect() indicates that we are connected, so |
584 | * we need to delay probing modes in tda998x_encoder_get_modes() after | 600 | * we need to delay probing modes in tda998x_connector_get_modes() after |
585 | * we have seen a HPD inactive->active transition. This code implements | 601 | * we have seen a HPD inactive->active transition. This code implements |
586 | * that delay. | 602 | * that delay. |
587 | */ | 603 | */ |
@@ -630,28 +646,30 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data) | |||
630 | bool handled = false; | 646 | bool handled = false; |
631 | 647 | ||
632 | sta = cec_read(priv, REG_CEC_INTSTATUS); | 648 | sta = cec_read(priv, REG_CEC_INTSTATUS); |
633 | cec = cec_read(priv, REG_CEC_RXSHPDINT); | 649 | if (sta & CEC_INTSTATUS_HDMI) { |
634 | lvl = cec_read(priv, REG_CEC_RXSHPDLEV); | 650 | cec = cec_read(priv, REG_CEC_RXSHPDINT); |
635 | flag0 = reg_read(priv, REG_INT_FLAGS_0); | 651 | lvl = cec_read(priv, REG_CEC_RXSHPDLEV); |
636 | flag1 = reg_read(priv, REG_INT_FLAGS_1); | 652 | flag0 = reg_read(priv, REG_INT_FLAGS_0); |
637 | flag2 = reg_read(priv, REG_INT_FLAGS_2); | 653 | flag1 = reg_read(priv, REG_INT_FLAGS_1); |
638 | DRM_DEBUG_DRIVER( | 654 | flag2 = reg_read(priv, REG_INT_FLAGS_2); |
639 | "tda irq sta %02x cec %02x lvl %02x f0 %02x f1 %02x f2 %02x\n", | 655 | DRM_DEBUG_DRIVER( |
640 | sta, cec, lvl, flag0, flag1, flag2); | 656 | "tda irq sta %02x cec %02x lvl %02x f0 %02x f1 %02x f2 %02x\n", |
641 | 657 | sta, cec, lvl, flag0, flag1, flag2); | |
642 | if (cec & CEC_RXSHPDINT_HPD) { | 658 | |
643 | if (lvl & CEC_RXSHPDLEV_HPD) | 659 | if (cec & CEC_RXSHPDINT_HPD) { |
644 | tda998x_edid_delay_start(priv); | 660 | if (lvl & CEC_RXSHPDLEV_HPD) |
645 | else | 661 | tda998x_edid_delay_start(priv); |
646 | schedule_work(&priv->detect_work); | 662 | else |
647 | 663 | schedule_work(&priv->detect_work); | |
648 | handled = true; | 664 | |
649 | } | 665 | handled = true; |
666 | } | ||
650 | 667 | ||
651 | if ((flag2 & INT_FLAGS_2_EDID_BLK_RD) && priv->wq_edid_wait) { | 668 | if ((flag2 & INT_FLAGS_2_EDID_BLK_RD) && priv->wq_edid_wait) { |
652 | priv->wq_edid_wait = 0; | 669 | priv->wq_edid_wait = 0; |
653 | wake_up(&priv->wq_edid); | 670 | wake_up(&priv->wq_edid); |
654 | handled = true; | 671 | handled = true; |
672 | } | ||
655 | } | 673 | } |
656 | 674 | ||
657 | return IRQ_RETVAL(handled); | 675 | return IRQ_RETVAL(handled); |
@@ -700,6 +718,8 @@ tda998x_write_avi(struct tda998x_priv *priv, struct drm_display_mode *mode) | |||
700 | tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, &frame); | 718 | tda998x_write_if(priv, DIP_IF_FLAGS_IF2, REG_IF2_HB0, &frame); |
701 | } | 719 | } |
702 | 720 | ||
721 | /* Audio support */ | ||
722 | |||
703 | static void tda998x_audio_mute(struct tda998x_priv *priv, bool on) | 723 | static void tda998x_audio_mute(struct tda998x_priv *priv, bool on) |
704 | { | 724 | { |
705 | if (on) { | 725 | if (on) { |
@@ -713,8 +733,7 @@ static void tda998x_audio_mute(struct tda998x_priv *priv, bool on) | |||
713 | 733 | ||
714 | static int | 734 | static int |
715 | tda998x_configure_audio(struct tda998x_priv *priv, | 735 | tda998x_configure_audio(struct tda998x_priv *priv, |
716 | struct tda998x_audio_params *params, | 736 | struct tda998x_audio_params *params) |
717 | unsigned mode_clock) | ||
718 | { | 737 | { |
719 | u8 buf[6], clksel_aip, clksel_fs, cts_n, adiv; | 738 | u8 buf[6], clksel_aip, clksel_fs, cts_n, adiv; |
720 | u32 n; | 739 | u32 n; |
@@ -771,7 +790,7 @@ tda998x_configure_audio(struct tda998x_priv *priv, | |||
771 | * assume 100MHz requires larger divider. | 790 | * assume 100MHz requires larger divider. |
772 | */ | 791 | */ |
773 | adiv = AUDIO_DIV_SERCLK_8; | 792 | adiv = AUDIO_DIV_SERCLK_8; |
774 | if (mode_clock > 100000) | 793 | if (priv->tmds_clock > 100000) |
775 | adiv++; /* AUDIO_DIV_SERCLK_16 */ | 794 | adiv++; /* AUDIO_DIV_SERCLK_16 */ |
776 | 795 | ||
777 | /* S/PDIF asks for a larger divider */ | 796 | /* S/PDIF asks for a larger divider */ |
@@ -819,58 +838,281 @@ tda998x_configure_audio(struct tda998x_priv *priv, | |||
819 | return tda998x_write_aif(priv, ¶ms->cea); | 838 | return tda998x_write_aif(priv, ¶ms->cea); |
820 | } | 839 | } |
821 | 840 | ||
822 | /* DRM encoder functions */ | 841 | static int tda998x_audio_hw_params(struct device *dev, void *data, |
842 | struct hdmi_codec_daifmt *daifmt, | ||
843 | struct hdmi_codec_params *params) | ||
844 | { | ||
845 | struct tda998x_priv *priv = dev_get_drvdata(dev); | ||
846 | int i, ret; | ||
847 | struct tda998x_audio_params audio = { | ||
848 | .sample_width = params->sample_width, | ||
849 | .sample_rate = params->sample_rate, | ||
850 | .cea = params->cea, | ||
851 | }; | ||
852 | |||
853 | memcpy(audio.status, params->iec.status, | ||
854 | min(sizeof(audio.status), sizeof(params->iec.status))); | ||
823 | 855 | ||
824 | static void tda998x_encoder_set_config(struct tda998x_priv *priv, | 856 | switch (daifmt->fmt) { |
825 | const struct tda998x_encoder_params *p) | 857 | case HDMI_I2S: |
858 | if (daifmt->bit_clk_inv || daifmt->frame_clk_inv || | ||
859 | daifmt->bit_clk_master || daifmt->frame_clk_master) { | ||
860 | dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__, | ||
861 | daifmt->bit_clk_inv, daifmt->frame_clk_inv, | ||
862 | daifmt->bit_clk_master, | ||
863 | daifmt->frame_clk_master); | ||
864 | return -EINVAL; | ||
865 | } | ||
866 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) | ||
867 | if (priv->audio_port[i].format == AFMT_I2S) | ||
868 | audio.config = priv->audio_port[i].config; | ||
869 | audio.format = AFMT_I2S; | ||
870 | break; | ||
871 | case HDMI_SPDIF: | ||
872 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) | ||
873 | if (priv->audio_port[i].format == AFMT_SPDIF) | ||
874 | audio.config = priv->audio_port[i].config; | ||
875 | audio.format = AFMT_SPDIF; | ||
876 | break; | ||
877 | default: | ||
878 | dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt); | ||
879 | return -EINVAL; | ||
880 | } | ||
881 | |||
882 | if (audio.config == 0) { | ||
883 | dev_err(dev, "%s: No audio configuration found\n", __func__); | ||
884 | return -EINVAL; | ||
885 | } | ||
886 | |||
887 | mutex_lock(&priv->audio_mutex); | ||
888 | if (priv->supports_infoframes && priv->sink_has_audio) | ||
889 | ret = tda998x_configure_audio(priv, &audio); | ||
890 | else | ||
891 | ret = 0; | ||
892 | |||
893 | if (ret == 0) | ||
894 | priv->audio_params = audio; | ||
895 | mutex_unlock(&priv->audio_mutex); | ||
896 | |||
897 | return ret; | ||
898 | } | ||
899 | |||
900 | static void tda998x_audio_shutdown(struct device *dev, void *data) | ||
826 | { | 901 | { |
827 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(p->swap_a) | | 902 | struct tda998x_priv *priv = dev_get_drvdata(dev); |
828 | (p->mirr_a ? VIP_CNTRL_0_MIRR_A : 0) | | ||
829 | VIP_CNTRL_0_SWAP_B(p->swap_b) | | ||
830 | (p->mirr_b ? VIP_CNTRL_0_MIRR_B : 0); | ||
831 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(p->swap_c) | | ||
832 | (p->mirr_c ? VIP_CNTRL_1_MIRR_C : 0) | | ||
833 | VIP_CNTRL_1_SWAP_D(p->swap_d) | | ||
834 | (p->mirr_d ? VIP_CNTRL_1_MIRR_D : 0); | ||
835 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(p->swap_e) | | ||
836 | (p->mirr_e ? VIP_CNTRL_2_MIRR_E : 0) | | ||
837 | VIP_CNTRL_2_SWAP_F(p->swap_f) | | ||
838 | (p->mirr_f ? VIP_CNTRL_2_MIRR_F : 0); | ||
839 | 903 | ||
840 | priv->audio_params = p->audio_params; | 904 | mutex_lock(&priv->audio_mutex); |
905 | |||
906 | reg_write(priv, REG_ENA_AP, 0); | ||
907 | |||
908 | priv->audio_params.format = AFMT_UNUSED; | ||
909 | |||
910 | mutex_unlock(&priv->audio_mutex); | ||
841 | } | 911 | } |
842 | 912 | ||
843 | static void tda998x_encoder_dpms(struct drm_encoder *encoder, int mode) | 913 | int tda998x_audio_digital_mute(struct device *dev, void *data, bool enable) |
844 | { | 914 | { |
845 | struct tda998x_priv *priv = enc_to_tda998x_priv(encoder); | 915 | struct tda998x_priv *priv = dev_get_drvdata(dev); |
846 | 916 | ||
847 | /* we only care about on or off: */ | 917 | mutex_lock(&priv->audio_mutex); |
848 | if (mode != DRM_MODE_DPMS_ON) | ||
849 | mode = DRM_MODE_DPMS_OFF; | ||
850 | 918 | ||
851 | if (mode == priv->dpms) | 919 | tda998x_audio_mute(priv, enable); |
852 | return; | ||
853 | 920 | ||
854 | switch (mode) { | 921 | mutex_unlock(&priv->audio_mutex); |
855 | case DRM_MODE_DPMS_ON: | 922 | return 0; |
856 | /* enable video ports, audio will be enabled later */ | 923 | } |
857 | reg_write(priv, REG_ENA_VP_0, 0xff); | 924 | |
858 | reg_write(priv, REG_ENA_VP_1, 0xff); | 925 | static int tda998x_audio_get_eld(struct device *dev, void *data, |
859 | reg_write(priv, REG_ENA_VP_2, 0xff); | 926 | uint8_t *buf, size_t len) |
860 | /* set muxing after enabling ports: */ | 927 | { |
861 | reg_write(priv, REG_VIP_CNTRL_0, priv->vip_cntrl_0); | 928 | struct tda998x_priv *priv = dev_get_drvdata(dev); |
862 | reg_write(priv, REG_VIP_CNTRL_1, priv->vip_cntrl_1); | 929 | |
863 | reg_write(priv, REG_VIP_CNTRL_2, priv->vip_cntrl_2); | 930 | mutex_lock(&priv->audio_mutex); |
864 | break; | 931 | memcpy(buf, priv->connector.eld, |
865 | case DRM_MODE_DPMS_OFF: | 932 | min(sizeof(priv->connector.eld), len)); |
866 | /* disable video ports */ | 933 | mutex_unlock(&priv->audio_mutex); |
867 | reg_write(priv, REG_ENA_VP_0, 0x00); | 934 | |
868 | reg_write(priv, REG_ENA_VP_1, 0x00); | 935 | return 0; |
869 | reg_write(priv, REG_ENA_VP_2, 0x00); | 936 | } |
870 | break; | 937 | |
938 | static const struct hdmi_codec_ops audio_codec_ops = { | ||
939 | .hw_params = tda998x_audio_hw_params, | ||
940 | .audio_shutdown = tda998x_audio_shutdown, | ||
941 | .digital_mute = tda998x_audio_digital_mute, | ||
942 | .get_eld = tda998x_audio_get_eld, | ||
943 | }; | ||
944 | |||
945 | static int tda998x_audio_codec_init(struct tda998x_priv *priv, | ||
946 | struct device *dev) | ||
947 | { | ||
948 | struct hdmi_codec_pdata codec_data = { | ||
949 | .ops = &audio_codec_ops, | ||
950 | .max_i2s_channels = 2, | ||
951 | }; | ||
952 | int i; | ||
953 | |||
954 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) { | ||
955 | if (priv->audio_port[i].format == AFMT_I2S && | ||
956 | priv->audio_port[i].config != 0) | ||
957 | codec_data.i2s = 1; | ||
958 | if (priv->audio_port[i].format == AFMT_SPDIF && | ||
959 | priv->audio_port[i].config != 0) | ||
960 | codec_data.spdif = 1; | ||
871 | } | 961 | } |
872 | 962 | ||
873 | priv->dpms = mode; | 963 | priv->audio_pdev = platform_device_register_data( |
964 | dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, | ||
965 | &codec_data, sizeof(codec_data)); | ||
966 | |||
967 | return PTR_ERR_OR_ZERO(priv->audio_pdev); | ||
968 | } | ||
969 | |||
970 | /* DRM connector functions */ | ||
971 | |||
972 | static int tda998x_connector_dpms(struct drm_connector *connector, int mode) | ||
973 | { | ||
974 | if (drm_core_check_feature(connector->dev, DRIVER_ATOMIC)) | ||
975 | return drm_atomic_helper_connector_dpms(connector, mode); | ||
976 | else | ||
977 | return drm_helper_connector_dpms(connector, mode); | ||
978 | } | ||
979 | |||
980 | static int tda998x_connector_fill_modes(struct drm_connector *connector, | ||
981 | uint32_t maxX, uint32_t maxY) | ||
982 | { | ||
983 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
984 | int ret; | ||
985 | |||
986 | mutex_lock(&priv->audio_mutex); | ||
987 | ret = drm_helper_probe_single_connector_modes(connector, maxX, maxY); | ||
988 | |||
989 | if (connector->edid_blob_ptr) { | ||
990 | struct edid *edid = (void *)connector->edid_blob_ptr->data; | ||
991 | |||
992 | priv->sink_has_audio = drm_detect_monitor_audio(edid); | ||
993 | } else { | ||
994 | priv->sink_has_audio = false; | ||
995 | } | ||
996 | mutex_unlock(&priv->audio_mutex); | ||
997 | |||
998 | return ret; | ||
999 | } | ||
1000 | |||
1001 | static enum drm_connector_status | ||
1002 | tda998x_connector_detect(struct drm_connector *connector, bool force) | ||
1003 | { | ||
1004 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1005 | u8 val = cec_read(priv, REG_CEC_RXSHPDLEV); | ||
1006 | |||
1007 | return (val & CEC_RXSHPDLEV_HPD) ? connector_status_connected : | ||
1008 | connector_status_disconnected; | ||
1009 | } | ||
1010 | |||
1011 | static void tda998x_connector_destroy(struct drm_connector *connector) | ||
1012 | { | ||
1013 | drm_connector_cleanup(connector); | ||
1014 | } | ||
1015 | |||
1016 | static const struct drm_connector_funcs tda998x_connector_funcs = { | ||
1017 | .dpms = tda998x_connector_dpms, | ||
1018 | .reset = drm_atomic_helper_connector_reset, | ||
1019 | .fill_modes = tda998x_connector_fill_modes, | ||
1020 | .detect = tda998x_connector_detect, | ||
1021 | .destroy = tda998x_connector_destroy, | ||
1022 | .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, | ||
1023 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | ||
1024 | }; | ||
1025 | |||
1026 | static int read_edid_block(void *data, u8 *buf, unsigned int blk, size_t length) | ||
1027 | { | ||
1028 | struct tda998x_priv *priv = data; | ||
1029 | u8 offset, segptr; | ||
1030 | int ret, i; | ||
1031 | |||
1032 | offset = (blk & 1) ? 128 : 0; | ||
1033 | segptr = blk / 2; | ||
1034 | |||
1035 | reg_write(priv, REG_DDC_ADDR, 0xa0); | ||
1036 | reg_write(priv, REG_DDC_OFFS, offset); | ||
1037 | reg_write(priv, REG_DDC_SEGM_ADDR, 0x60); | ||
1038 | reg_write(priv, REG_DDC_SEGM, segptr); | ||
1039 | |||
1040 | /* enable reading EDID: */ | ||
1041 | priv->wq_edid_wait = 1; | ||
1042 | reg_write(priv, REG_EDID_CTRL, 0x1); | ||
1043 | |||
1044 | /* flag must be cleared by sw: */ | ||
1045 | reg_write(priv, REG_EDID_CTRL, 0x0); | ||
1046 | |||
1047 | /* wait for block read to complete: */ | ||
1048 | if (priv->hdmi->irq) { | ||
1049 | i = wait_event_timeout(priv->wq_edid, | ||
1050 | !priv->wq_edid_wait, | ||
1051 | msecs_to_jiffies(100)); | ||
1052 | if (i < 0) { | ||
1053 | dev_err(&priv->hdmi->dev, "read edid wait err %d\n", i); | ||
1054 | return i; | ||
1055 | } | ||
1056 | } else { | ||
1057 | for (i = 100; i > 0; i--) { | ||
1058 | msleep(1); | ||
1059 | ret = reg_read(priv, REG_INT_FLAGS_2); | ||
1060 | if (ret < 0) | ||
1061 | return ret; | ||
1062 | if (ret & INT_FLAGS_2_EDID_BLK_RD) | ||
1063 | break; | ||
1064 | } | ||
1065 | } | ||
1066 | |||
1067 | if (i == 0) { | ||
1068 | dev_err(&priv->hdmi->dev, "read edid timeout\n"); | ||
1069 | return -ETIMEDOUT; | ||
1070 | } | ||
1071 | |||
1072 | ret = reg_read_range(priv, REG_EDID_DATA_0, buf, length); | ||
1073 | if (ret != length) { | ||
1074 | dev_err(&priv->hdmi->dev, "failed to read edid block %d: %d\n", | ||
1075 | blk, ret); | ||
1076 | return ret; | ||
1077 | } | ||
1078 | |||
1079 | return 0; | ||
1080 | } | ||
1081 | |||
1082 | static int tda998x_connector_get_modes(struct drm_connector *connector) | ||
1083 | { | ||
1084 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1085 | struct edid *edid; | ||
1086 | int n; | ||
1087 | |||
1088 | /* | ||
1089 | * If we get killed while waiting for the HPD timeout, return | ||
1090 | * no modes found: we are not in a restartable path, so we | ||
1091 | * can't handle signals gracefully. | ||
1092 | */ | ||
1093 | if (tda998x_edid_delay_wait(priv)) | ||
1094 | return 0; | ||
1095 | |||
1096 | if (priv->rev == TDA19988) | ||
1097 | reg_clear(priv, REG_TX4, TX4_PD_RAM); | ||
1098 | |||
1099 | edid = drm_do_get_edid(connector, read_edid_block, priv); | ||
1100 | |||
1101 | if (priv->rev == TDA19988) | ||
1102 | reg_set(priv, REG_TX4, TX4_PD_RAM); | ||
1103 | |||
1104 | if (!edid) { | ||
1105 | dev_warn(&priv->hdmi->dev, "failed to read EDID\n"); | ||
1106 | return 0; | ||
1107 | } | ||
1108 | |||
1109 | drm_mode_connector_update_edid_property(connector, edid); | ||
1110 | n = drm_add_edid_modes(connector, edid); | ||
1111 | drm_edid_to_eld(connector, edid); | ||
1112 | |||
1113 | kfree(edid); | ||
1114 | |||
1115 | return n; | ||
874 | } | 1116 | } |
875 | 1117 | ||
876 | static int tda998x_connector_mode_valid(struct drm_connector *connector, | 1118 | static int tda998x_connector_mode_valid(struct drm_connector *connector, |
@@ -888,6 +1130,80 @@ static int tda998x_connector_mode_valid(struct drm_connector *connector, | |||
888 | return MODE_OK; | 1130 | return MODE_OK; |
889 | } | 1131 | } |
890 | 1132 | ||
1133 | static struct drm_encoder * | ||
1134 | tda998x_connector_best_encoder(struct drm_connector *connector) | ||
1135 | { | ||
1136 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1137 | |||
1138 | return &priv->encoder; | ||
1139 | } | ||
1140 | |||
1141 | static | ||
1142 | const struct drm_connector_helper_funcs tda998x_connector_helper_funcs = { | ||
1143 | .get_modes = tda998x_connector_get_modes, | ||
1144 | .mode_valid = tda998x_connector_mode_valid, | ||
1145 | .best_encoder = tda998x_connector_best_encoder, | ||
1146 | }; | ||
1147 | |||
1148 | static int tda998x_connector_init(struct tda998x_priv *priv, | ||
1149 | struct drm_device *drm) | ||
1150 | { | ||
1151 | struct drm_connector *connector = &priv->connector; | ||
1152 | int ret; | ||
1153 | |||
1154 | connector->interlace_allowed = 1; | ||
1155 | |||
1156 | if (priv->hdmi->irq) | ||
1157 | connector->polled = DRM_CONNECTOR_POLL_HPD; | ||
1158 | else | ||
1159 | connector->polled = DRM_CONNECTOR_POLL_CONNECT | | ||
1160 | DRM_CONNECTOR_POLL_DISCONNECT; | ||
1161 | |||
1162 | drm_connector_helper_add(connector, &tda998x_connector_helper_funcs); | ||
1163 | ret = drm_connector_init(drm, connector, &tda998x_connector_funcs, | ||
1164 | DRM_MODE_CONNECTOR_HDMIA); | ||
1165 | if (ret) | ||
1166 | return ret; | ||
1167 | |||
1168 | drm_mode_connector_attach_encoder(&priv->connector, &priv->encoder); | ||
1169 | |||
1170 | return 0; | ||
1171 | } | ||
1172 | |||
1173 | /* DRM encoder functions */ | ||
1174 | |||
1175 | static void tda998x_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
1176 | { | ||
1177 | struct tda998x_priv *priv = enc_to_tda998x_priv(encoder); | ||
1178 | bool on; | ||
1179 | |||
1180 | /* we only care about on or off: */ | ||
1181 | on = mode == DRM_MODE_DPMS_ON; | ||
1182 | |||
1183 | if (on == priv->is_on) | ||
1184 | return; | ||
1185 | |||
1186 | if (on) { | ||
1187 | /* enable video ports, audio will be enabled later */ | ||
1188 | reg_write(priv, REG_ENA_VP_0, 0xff); | ||
1189 | reg_write(priv, REG_ENA_VP_1, 0xff); | ||
1190 | reg_write(priv, REG_ENA_VP_2, 0xff); | ||
1191 | /* set muxing after enabling ports: */ | ||
1192 | reg_write(priv, REG_VIP_CNTRL_0, priv->vip_cntrl_0); | ||
1193 | reg_write(priv, REG_VIP_CNTRL_1, priv->vip_cntrl_1); | ||
1194 | reg_write(priv, REG_VIP_CNTRL_2, priv->vip_cntrl_2); | ||
1195 | |||
1196 | priv->is_on = true; | ||
1197 | } else { | ||
1198 | /* disable video ports */ | ||
1199 | reg_write(priv, REG_ENA_VP_0, 0x00); | ||
1200 | reg_write(priv, REG_ENA_VP_1, 0x00); | ||
1201 | reg_write(priv, REG_ENA_VP_2, 0x00); | ||
1202 | |||
1203 | priv->is_on = false; | ||
1204 | } | ||
1205 | } | ||
1206 | |||
891 | static void | 1207 | static void |
892 | tda998x_encoder_mode_set(struct drm_encoder *encoder, | 1208 | tda998x_encoder_mode_set(struct drm_encoder *encoder, |
893 | struct drm_display_mode *mode, | 1209 | struct drm_display_mode *mode, |
@@ -971,6 +1287,8 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
971 | div = 3; | 1287 | div = 3; |
972 | } | 1288 | } |
973 | 1289 | ||
1290 | mutex_lock(&priv->audio_mutex); | ||
1291 | |||
974 | /* mute the audio FIFO: */ | 1292 | /* mute the audio FIFO: */ |
975 | reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); | 1293 | reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO); |
976 | 1294 | ||
@@ -982,6 +1300,7 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
982 | /* no pre-filter or interpolator: */ | 1300 | /* no pre-filter or interpolator: */ |
983 | reg_write(priv, REG_HVF_CNTRL_0, HVF_CNTRL_0_PREFIL(0) | | 1301 | reg_write(priv, REG_HVF_CNTRL_0, HVF_CNTRL_0_PREFIL(0) | |
984 | HVF_CNTRL_0_INTPOL(0)); | 1302 | HVF_CNTRL_0_INTPOL(0)); |
1303 | reg_set(priv, REG_FEAT_POWERDOWN, FEAT_POWERDOWN_PREFILT); | ||
985 | reg_write(priv, REG_VIP_CNTRL_5, VIP_CNTRL_5_SP_CNT(0)); | 1304 | reg_write(priv, REG_VIP_CNTRL_5, VIP_CNTRL_5_SP_CNT(0)); |
986 | reg_write(priv, REG_VIP_CNTRL_4, VIP_CNTRL_4_BLANKIT(0) | | 1305 | reg_write(priv, REG_VIP_CNTRL_4, VIP_CNTRL_4_BLANKIT(0) | |
987 | VIP_CNTRL_4_BLC(0)); | 1306 | VIP_CNTRL_4_BLC(0)); |
@@ -1004,6 +1323,7 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
1004 | /* set color matrix bypass flag: */ | 1323 | /* set color matrix bypass flag: */ |
1005 | reg_write(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP | | 1324 | reg_write(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP | |
1006 | MAT_CONTRL_MAT_SC(1)); | 1325 | MAT_CONTRL_MAT_SC(1)); |
1326 | reg_set(priv, REG_FEAT_POWERDOWN, FEAT_POWERDOWN_CSC); | ||
1007 | 1327 | ||
1008 | /* set BIAS tmds value: */ | 1328 | /* set BIAS tmds value: */ |
1009 | reg_write(priv, REG_ANA_GENERAL, 0x09); | 1329 | reg_write(priv, REG_ANA_GENERAL, 0x09); |
@@ -1064,8 +1384,22 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
1064 | /* must be last register set: */ | 1384 | /* must be last register set: */ |
1065 | reg_write(priv, REG_TBG_CNTRL_0, 0); | 1385 | reg_write(priv, REG_TBG_CNTRL_0, 0); |
1066 | 1386 | ||
1067 | /* Only setup the info frames if the sink is HDMI */ | 1387 | priv->tmds_clock = adjusted_mode->clock; |
1068 | if (priv->is_hdmi_sink) { | 1388 | |
1389 | /* CEA-861B section 6 says that: | ||
1390 | * CEA version 1 (CEA-861) has no support for infoframes. | ||
1391 | * CEA version 2 (CEA-861A) supports version 1 AVI infoframes, | ||
1392 | * and optional basic audio. | ||
1393 | * CEA version 3 (CEA-861B) supports version 1 and 2 AVI infoframes, | ||
1394 | * and optional digital audio, with audio infoframes. | ||
1395 | * | ||
1396 | * Since we only support generation of version 2 AVI infoframes, | ||
1397 | * ignore CEA version 2 and below (iow, behave as if we're a | ||
1398 | * CEA-861 source.) | ||
1399 | */ | ||
1400 | priv->supports_infoframes = priv->connector.display_info.cea_rev >= 3; | ||
1401 | |||
1402 | if (priv->supports_infoframes) { | ||
1069 | /* We need to turn HDMI HDCP stuff on to get audio through */ | 1403 | /* We need to turn HDMI HDCP stuff on to get audio through */ |
1070 | reg &= ~TBG_CNTRL_1_DWIN_DIS; | 1404 | reg &= ~TBG_CNTRL_1_DWIN_DIS; |
1071 | reg_write(priv, REG_TBG_CNTRL_1, reg); | 1405 | reg_write(priv, REG_TBG_CNTRL_1, reg); |
@@ -1074,127 +1408,12 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, | |||
1074 | 1408 | ||
1075 | tda998x_write_avi(priv, adjusted_mode); | 1409 | tda998x_write_avi(priv, adjusted_mode); |
1076 | 1410 | ||
1077 | if (priv->audio_params.format != AFMT_UNUSED) { | 1411 | if (priv->audio_params.format != AFMT_UNUSED && |
1078 | mutex_lock(&priv->audio_mutex); | 1412 | priv->sink_has_audio) |
1079 | tda998x_configure_audio(priv, | 1413 | tda998x_configure_audio(priv, &priv->audio_params); |
1080 | &priv->audio_params, | ||
1081 | adjusted_mode->clock); | ||
1082 | mutex_unlock(&priv->audio_mutex); | ||
1083 | } | ||
1084 | } | 1414 | } |
1085 | } | ||
1086 | 1415 | ||
1087 | static enum drm_connector_status | 1416 | mutex_unlock(&priv->audio_mutex); |
1088 | tda998x_connector_detect(struct drm_connector *connector, bool force) | ||
1089 | { | ||
1090 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1091 | u8 val = cec_read(priv, REG_CEC_RXSHPDLEV); | ||
1092 | |||
1093 | return (val & CEC_RXSHPDLEV_HPD) ? connector_status_connected : | ||
1094 | connector_status_disconnected; | ||
1095 | } | ||
1096 | |||
1097 | static int read_edid_block(void *data, u8 *buf, unsigned int blk, size_t length) | ||
1098 | { | ||
1099 | struct tda998x_priv *priv = data; | ||
1100 | u8 offset, segptr; | ||
1101 | int ret, i; | ||
1102 | |||
1103 | offset = (blk & 1) ? 128 : 0; | ||
1104 | segptr = blk / 2; | ||
1105 | |||
1106 | reg_write(priv, REG_DDC_ADDR, 0xa0); | ||
1107 | reg_write(priv, REG_DDC_OFFS, offset); | ||
1108 | reg_write(priv, REG_DDC_SEGM_ADDR, 0x60); | ||
1109 | reg_write(priv, REG_DDC_SEGM, segptr); | ||
1110 | |||
1111 | /* enable reading EDID: */ | ||
1112 | priv->wq_edid_wait = 1; | ||
1113 | reg_write(priv, REG_EDID_CTRL, 0x1); | ||
1114 | |||
1115 | /* flag must be cleared by sw: */ | ||
1116 | reg_write(priv, REG_EDID_CTRL, 0x0); | ||
1117 | |||
1118 | /* wait for block read to complete: */ | ||
1119 | if (priv->hdmi->irq) { | ||
1120 | i = wait_event_timeout(priv->wq_edid, | ||
1121 | !priv->wq_edid_wait, | ||
1122 | msecs_to_jiffies(100)); | ||
1123 | if (i < 0) { | ||
1124 | dev_err(&priv->hdmi->dev, "read edid wait err %d\n", i); | ||
1125 | return i; | ||
1126 | } | ||
1127 | } else { | ||
1128 | for (i = 100; i > 0; i--) { | ||
1129 | msleep(1); | ||
1130 | ret = reg_read(priv, REG_INT_FLAGS_2); | ||
1131 | if (ret < 0) | ||
1132 | return ret; | ||
1133 | if (ret & INT_FLAGS_2_EDID_BLK_RD) | ||
1134 | break; | ||
1135 | } | ||
1136 | } | ||
1137 | |||
1138 | if (i == 0) { | ||
1139 | dev_err(&priv->hdmi->dev, "read edid timeout\n"); | ||
1140 | return -ETIMEDOUT; | ||
1141 | } | ||
1142 | |||
1143 | ret = reg_read_range(priv, REG_EDID_DATA_0, buf, length); | ||
1144 | if (ret != length) { | ||
1145 | dev_err(&priv->hdmi->dev, "failed to read edid block %d: %d\n", | ||
1146 | blk, ret); | ||
1147 | return ret; | ||
1148 | } | ||
1149 | |||
1150 | return 0; | ||
1151 | } | ||
1152 | |||
1153 | static int tda998x_connector_get_modes(struct drm_connector *connector) | ||
1154 | { | ||
1155 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1156 | struct edid *edid; | ||
1157 | int n; | ||
1158 | |||
1159 | /* | ||
1160 | * If we get killed while waiting for the HPD timeout, return | ||
1161 | * no modes found: we are not in a restartable path, so we | ||
1162 | * can't handle signals gracefully. | ||
1163 | */ | ||
1164 | if (tda998x_edid_delay_wait(priv)) | ||
1165 | return 0; | ||
1166 | |||
1167 | if (priv->rev == TDA19988) | ||
1168 | reg_clear(priv, REG_TX4, TX4_PD_RAM); | ||
1169 | |||
1170 | edid = drm_do_get_edid(connector, read_edid_block, priv); | ||
1171 | |||
1172 | if (priv->rev == TDA19988) | ||
1173 | reg_set(priv, REG_TX4, TX4_PD_RAM); | ||
1174 | |||
1175 | if (!edid) { | ||
1176 | dev_warn(&priv->hdmi->dev, "failed to read EDID\n"); | ||
1177 | return 0; | ||
1178 | } | ||
1179 | |||
1180 | drm_mode_connector_update_edid_property(connector, edid); | ||
1181 | n = drm_add_edid_modes(connector, edid); | ||
1182 | priv->is_hdmi_sink = drm_detect_hdmi_monitor(edid); | ||
1183 | drm_edid_to_eld(connector, edid); | ||
1184 | |||
1185 | kfree(edid); | ||
1186 | |||
1187 | return n; | ||
1188 | } | ||
1189 | |||
1190 | static void tda998x_encoder_set_polling(struct tda998x_priv *priv, | ||
1191 | struct drm_connector *connector) | ||
1192 | { | ||
1193 | if (priv->hdmi->irq) | ||
1194 | connector->polled = DRM_CONNECTOR_POLL_HPD; | ||
1195 | else | ||
1196 | connector->polled = DRM_CONNECTOR_POLL_CONNECT | | ||
1197 | DRM_CONNECTOR_POLL_DISCONNECT; | ||
1198 | } | 1417 | } |
1199 | 1418 | ||
1200 | static void tda998x_destroy(struct tda998x_priv *priv) | 1419 | static void tda998x_destroy(struct tda998x_priv *priv) |
@@ -1215,146 +1434,6 @@ static void tda998x_destroy(struct tda998x_priv *priv) | |||
1215 | i2c_unregister_device(priv->cec); | 1434 | i2c_unregister_device(priv->cec); |
1216 | } | 1435 | } |
1217 | 1436 | ||
1218 | static int tda998x_audio_hw_params(struct device *dev, void *data, | ||
1219 | struct hdmi_codec_daifmt *daifmt, | ||
1220 | struct hdmi_codec_params *params) | ||
1221 | { | ||
1222 | struct tda998x_priv *priv = dev_get_drvdata(dev); | ||
1223 | int i, ret; | ||
1224 | struct tda998x_audio_params audio = { | ||
1225 | .sample_width = params->sample_width, | ||
1226 | .sample_rate = params->sample_rate, | ||
1227 | .cea = params->cea, | ||
1228 | }; | ||
1229 | |||
1230 | if (!priv->encoder.crtc) | ||
1231 | return -ENODEV; | ||
1232 | |||
1233 | memcpy(audio.status, params->iec.status, | ||
1234 | min(sizeof(audio.status), sizeof(params->iec.status))); | ||
1235 | |||
1236 | switch (daifmt->fmt) { | ||
1237 | case HDMI_I2S: | ||
1238 | if (daifmt->bit_clk_inv || daifmt->frame_clk_inv || | ||
1239 | daifmt->bit_clk_master || daifmt->frame_clk_master) { | ||
1240 | dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__, | ||
1241 | daifmt->bit_clk_inv, daifmt->frame_clk_inv, | ||
1242 | daifmt->bit_clk_master, | ||
1243 | daifmt->frame_clk_master); | ||
1244 | return -EINVAL; | ||
1245 | } | ||
1246 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) | ||
1247 | if (priv->audio_port[i].format == AFMT_I2S) | ||
1248 | audio.config = priv->audio_port[i].config; | ||
1249 | audio.format = AFMT_I2S; | ||
1250 | break; | ||
1251 | case HDMI_SPDIF: | ||
1252 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) | ||
1253 | if (priv->audio_port[i].format == AFMT_SPDIF) | ||
1254 | audio.config = priv->audio_port[i].config; | ||
1255 | audio.format = AFMT_SPDIF; | ||
1256 | break; | ||
1257 | default: | ||
1258 | dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt); | ||
1259 | return -EINVAL; | ||
1260 | } | ||
1261 | |||
1262 | if (audio.config == 0) { | ||
1263 | dev_err(dev, "%s: No audio configutation found\n", __func__); | ||
1264 | return -EINVAL; | ||
1265 | } | ||
1266 | |||
1267 | mutex_lock(&priv->audio_mutex); | ||
1268 | ret = tda998x_configure_audio(priv, | ||
1269 | &audio, | ||
1270 | priv->encoder.crtc->hwmode.clock); | ||
1271 | |||
1272 | if (ret == 0) | ||
1273 | priv->audio_params = audio; | ||
1274 | mutex_unlock(&priv->audio_mutex); | ||
1275 | |||
1276 | return ret; | ||
1277 | } | ||
1278 | |||
1279 | static void tda998x_audio_shutdown(struct device *dev, void *data) | ||
1280 | { | ||
1281 | struct tda998x_priv *priv = dev_get_drvdata(dev); | ||
1282 | |||
1283 | mutex_lock(&priv->audio_mutex); | ||
1284 | |||
1285 | reg_write(priv, REG_ENA_AP, 0); | ||
1286 | |||
1287 | priv->audio_params.format = AFMT_UNUSED; | ||
1288 | |||
1289 | mutex_unlock(&priv->audio_mutex); | ||
1290 | } | ||
1291 | |||
1292 | static int | ||
1293 | tda998x_audio_digital_mute(struct device *dev, void *data, bool enable) | ||
1294 | { | ||
1295 | struct tda998x_priv *priv = dev_get_drvdata(dev); | ||
1296 | |||
1297 | mutex_lock(&priv->audio_mutex); | ||
1298 | |||
1299 | tda998x_audio_mute(priv, enable); | ||
1300 | |||
1301 | mutex_unlock(&priv->audio_mutex); | ||
1302 | return 0; | ||
1303 | } | ||
1304 | |||
1305 | static int tda998x_audio_get_eld(struct device *dev, void *data, | ||
1306 | uint8_t *buf, size_t len) | ||
1307 | { | ||
1308 | struct tda998x_priv *priv = dev_get_drvdata(dev); | ||
1309 | struct drm_mode_config *config = &priv->encoder.dev->mode_config; | ||
1310 | struct drm_connector *connector; | ||
1311 | int ret = -ENODEV; | ||
1312 | |||
1313 | mutex_lock(&config->mutex); | ||
1314 | list_for_each_entry(connector, &config->connector_list, head) { | ||
1315 | if (&priv->encoder == connector->encoder) { | ||
1316 | memcpy(buf, connector->eld, | ||
1317 | min(sizeof(connector->eld), len)); | ||
1318 | ret = 0; | ||
1319 | } | ||
1320 | } | ||
1321 | mutex_unlock(&config->mutex); | ||
1322 | |||
1323 | return ret; | ||
1324 | } | ||
1325 | |||
1326 | static const struct hdmi_codec_ops audio_codec_ops = { | ||
1327 | .hw_params = tda998x_audio_hw_params, | ||
1328 | .audio_shutdown = tda998x_audio_shutdown, | ||
1329 | .digital_mute = tda998x_audio_digital_mute, | ||
1330 | .get_eld = tda998x_audio_get_eld, | ||
1331 | }; | ||
1332 | |||
1333 | static int tda998x_audio_codec_init(struct tda998x_priv *priv, | ||
1334 | struct device *dev) | ||
1335 | { | ||
1336 | struct hdmi_codec_pdata codec_data = { | ||
1337 | .ops = &audio_codec_ops, | ||
1338 | .max_i2s_channels = 2, | ||
1339 | }; | ||
1340 | int i; | ||
1341 | |||
1342 | for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) { | ||
1343 | if (priv->audio_port[i].format == AFMT_I2S && | ||
1344 | priv->audio_port[i].config != 0) | ||
1345 | codec_data.i2s = 1; | ||
1346 | if (priv->audio_port[i].format == AFMT_SPDIF && | ||
1347 | priv->audio_port[i].config != 0) | ||
1348 | codec_data.spdif = 1; | ||
1349 | } | ||
1350 | |||
1351 | priv->audio_pdev = platform_device_register_data( | ||
1352 | dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, | ||
1353 | &codec_data, sizeof(codec_data)); | ||
1354 | |||
1355 | return PTR_ERR_OR_ZERO(priv->audio_pdev); | ||
1356 | } | ||
1357 | |||
1358 | /* I2C driver functions */ | 1437 | /* I2C driver functions */ |
1359 | 1438 | ||
1360 | static int tda998x_get_audio_ports(struct tda998x_priv *priv, | 1439 | static int tda998x_get_audio_ports(struct tda998x_priv *priv, |
@@ -1404,22 +1483,21 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
1404 | struct device_node *np = client->dev.of_node; | 1483 | struct device_node *np = client->dev.of_node; |
1405 | u32 video; | 1484 | u32 video; |
1406 | int rev_lo, rev_hi, ret; | 1485 | int rev_lo, rev_hi, ret; |
1407 | unsigned short cec_addr; | 1486 | |
1487 | mutex_init(&priv->audio_mutex); /* Protect access from audio thread */ | ||
1408 | 1488 | ||
1409 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3); | 1489 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3); |
1410 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1); | 1490 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1); |
1411 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5); | 1491 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5); |
1412 | 1492 | ||
1493 | /* CEC I2C address bound to TDA998x I2C addr by configuration pins */ | ||
1494 | priv->cec_addr = 0x34 + (client->addr & 0x03); | ||
1413 | priv->current_page = 0xff; | 1495 | priv->current_page = 0xff; |
1414 | priv->hdmi = client; | 1496 | priv->hdmi = client; |
1415 | /* CEC I2C address bound to TDA998x I2C addr by configuration pins */ | 1497 | priv->cec = i2c_new_dummy(client->adapter, priv->cec_addr); |
1416 | cec_addr = 0x34 + (client->addr & 0x03); | ||
1417 | priv->cec = i2c_new_dummy(client->adapter, cec_addr); | ||
1418 | if (!priv->cec) | 1498 | if (!priv->cec) |
1419 | return -ENODEV; | 1499 | return -ENODEV; |
1420 | 1500 | ||
1421 | priv->dpms = DRM_MODE_DPMS_OFF; | ||
1422 | |||
1423 | mutex_init(&priv->mutex); /* protect the page access */ | 1501 | mutex_init(&priv->mutex); /* protect the page access */ |
1424 | init_waitqueue_head(&priv->edid_delay_waitq); | 1502 | init_waitqueue_head(&priv->edid_delay_waitq); |
1425 | setup_timer(&priv->edid_delay_timer, tda998x_edid_delay_done, | 1503 | setup_timer(&priv->edid_delay_timer, tda998x_edid_delay_done, |
@@ -1479,7 +1557,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
1479 | 1557 | ||
1480 | /* initialize the optional IRQ */ | 1558 | /* initialize the optional IRQ */ |
1481 | if (client->irq) { | 1559 | if (client->irq) { |
1482 | int irqf_trigger; | 1560 | unsigned long irq_flags; |
1483 | 1561 | ||
1484 | /* init read EDID waitqueue and HDP work */ | 1562 | /* init read EDID waitqueue and HDP work */ |
1485 | init_waitqueue_head(&priv->wq_edid); | 1563 | init_waitqueue_head(&priv->wq_edid); |
@@ -1489,11 +1567,11 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
1489 | reg_read(priv, REG_INT_FLAGS_1); | 1567 | reg_read(priv, REG_INT_FLAGS_1); |
1490 | reg_read(priv, REG_INT_FLAGS_2); | 1568 | reg_read(priv, REG_INT_FLAGS_2); |
1491 | 1569 | ||
1492 | irqf_trigger = | 1570 | irq_flags = |
1493 | irqd_get_trigger_type(irq_get_irq_data(client->irq)); | 1571 | irqd_get_trigger_type(irq_get_irq_data(client->irq)); |
1572 | irq_flags |= IRQF_SHARED | IRQF_ONESHOT; | ||
1494 | ret = request_threaded_irq(client->irq, NULL, | 1573 | ret = request_threaded_irq(client->irq, NULL, |
1495 | tda998x_irq_thread, | 1574 | tda998x_irq_thread, irq_flags, |
1496 | irqf_trigger | IRQF_ONESHOT, | ||
1497 | "tda998x", priv); | 1575 | "tda998x", priv); |
1498 | if (ret) { | 1576 | if (ret) { |
1499 | dev_err(&client->dev, | 1577 | dev_err(&client->dev, |
@@ -1520,8 +1598,6 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) | |||
1520 | priv->vip_cntrl_2 = video; | 1598 | priv->vip_cntrl_2 = video; |
1521 | } | 1599 | } |
1522 | 1600 | ||
1523 | mutex_init(&priv->audio_mutex); /* Protect access from audio thread */ | ||
1524 | |||
1525 | ret = tda998x_get_audio_ports(priv, np); | 1601 | ret = tda998x_get_audio_ports(priv, np); |
1526 | if (ret) | 1602 | if (ret) |
1527 | goto fail; | 1603 | goto fail; |
@@ -1568,44 +1644,25 @@ static const struct drm_encoder_funcs tda998x_encoder_funcs = { | |||
1568 | .destroy = tda998x_encoder_destroy, | 1644 | .destroy = tda998x_encoder_destroy, |
1569 | }; | 1645 | }; |
1570 | 1646 | ||
1571 | static struct drm_encoder * | 1647 | static void tda998x_set_config(struct tda998x_priv *priv, |
1572 | tda998x_connector_best_encoder(struct drm_connector *connector) | 1648 | const struct tda998x_encoder_params *p) |
1573 | { | ||
1574 | struct tda998x_priv *priv = conn_to_tda998x_priv(connector); | ||
1575 | |||
1576 | return &priv->encoder; | ||
1577 | } | ||
1578 | |||
1579 | static | ||
1580 | const struct drm_connector_helper_funcs tda998x_connector_helper_funcs = { | ||
1581 | .get_modes = tda998x_connector_get_modes, | ||
1582 | .mode_valid = tda998x_connector_mode_valid, | ||
1583 | .best_encoder = tda998x_connector_best_encoder, | ||
1584 | }; | ||
1585 | |||
1586 | static void tda998x_connector_destroy(struct drm_connector *connector) | ||
1587 | { | 1649 | { |
1588 | drm_connector_cleanup(connector); | 1650 | priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(p->swap_a) | |
1589 | } | 1651 | (p->mirr_a ? VIP_CNTRL_0_MIRR_A : 0) | |
1652 | VIP_CNTRL_0_SWAP_B(p->swap_b) | | ||
1653 | (p->mirr_b ? VIP_CNTRL_0_MIRR_B : 0); | ||
1654 | priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(p->swap_c) | | ||
1655 | (p->mirr_c ? VIP_CNTRL_1_MIRR_C : 0) | | ||
1656 | VIP_CNTRL_1_SWAP_D(p->swap_d) | | ||
1657 | (p->mirr_d ? VIP_CNTRL_1_MIRR_D : 0); | ||
1658 | priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(p->swap_e) | | ||
1659 | (p->mirr_e ? VIP_CNTRL_2_MIRR_E : 0) | | ||
1660 | VIP_CNTRL_2_SWAP_F(p->swap_f) | | ||
1661 | (p->mirr_f ? VIP_CNTRL_2_MIRR_F : 0); | ||
1590 | 1662 | ||
1591 | static int tda998x_connector_dpms(struct drm_connector *connector, int mode) | 1663 | priv->audio_params = p->audio_params; |
1592 | { | ||
1593 | if (drm_core_check_feature(connector->dev, DRIVER_ATOMIC)) | ||
1594 | return drm_atomic_helper_connector_dpms(connector, mode); | ||
1595 | else | ||
1596 | return drm_helper_connector_dpms(connector, mode); | ||
1597 | } | 1664 | } |
1598 | 1665 | ||
1599 | static const struct drm_connector_funcs tda998x_connector_funcs = { | ||
1600 | .dpms = tda998x_connector_dpms, | ||
1601 | .reset = drm_atomic_helper_connector_reset, | ||
1602 | .fill_modes = drm_helper_probe_single_connector_modes, | ||
1603 | .detect = tda998x_connector_detect, | ||
1604 | .destroy = tda998x_connector_destroy, | ||
1605 | .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, | ||
1606 | .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | ||
1607 | }; | ||
1608 | |||
1609 | static int tda998x_bind(struct device *dev, struct device *master, void *data) | 1666 | static int tda998x_bind(struct device *dev, struct device *master, void *data) |
1610 | { | 1667 | { |
1611 | struct tda998x_encoder_params *params = dev->platform_data; | 1668 | struct tda998x_encoder_params *params = dev->platform_data; |
@@ -1630,7 +1687,6 @@ static int tda998x_bind(struct device *dev, struct device *master, void *data) | |||
1630 | crtcs = 1 << 0; | 1687 | crtcs = 1 << 0; |
1631 | } | 1688 | } |
1632 | 1689 | ||
1633 | priv->connector.interlace_allowed = 1; | ||
1634 | priv->encoder.possible_crtcs = crtcs; | 1690 | priv->encoder.possible_crtcs = crtcs; |
1635 | 1691 | ||
1636 | ret = tda998x_create(client, priv); | 1692 | ret = tda998x_create(client, priv); |
@@ -1638,9 +1694,7 @@ static int tda998x_bind(struct device *dev, struct device *master, void *data) | |||
1638 | return ret; | 1694 | return ret; |
1639 | 1695 | ||
1640 | if (!dev->of_node && params) | 1696 | if (!dev->of_node && params) |
1641 | tda998x_encoder_set_config(priv, params); | 1697 | tda998x_set_config(priv, params); |
1642 | |||
1643 | tda998x_encoder_set_polling(priv, &priv->connector); | ||
1644 | 1698 | ||
1645 | drm_encoder_helper_add(&priv->encoder, &tda998x_encoder_helper_funcs); | 1699 | drm_encoder_helper_add(&priv->encoder, &tda998x_encoder_helper_funcs); |
1646 | ret = drm_encoder_init(drm, &priv->encoder, &tda998x_encoder_funcs, | 1700 | ret = drm_encoder_init(drm, &priv->encoder, &tda998x_encoder_funcs, |
@@ -1648,16 +1702,10 @@ static int tda998x_bind(struct device *dev, struct device *master, void *data) | |||
1648 | if (ret) | 1702 | if (ret) |
1649 | goto err_encoder; | 1703 | goto err_encoder; |
1650 | 1704 | ||
1651 | drm_connector_helper_add(&priv->connector, | 1705 | ret = tda998x_connector_init(priv, drm); |
1652 | &tda998x_connector_helper_funcs); | ||
1653 | ret = drm_connector_init(drm, &priv->connector, | ||
1654 | &tda998x_connector_funcs, | ||
1655 | DRM_MODE_CONNECTOR_HDMIA); | ||
1656 | if (ret) | 1706 | if (ret) |
1657 | goto err_connector; | 1707 | goto err_connector; |
1658 | 1708 | ||
1659 | drm_mode_connector_attach_encoder(&priv->connector, &priv->encoder); | ||
1660 | |||
1661 | return 0; | 1709 | return 0; |
1662 | 1710 | ||
1663 | err_connector: | 1711 | err_connector: |
@@ -1685,6 +1733,10 @@ static const struct component_ops tda998x_ops = { | |||
1685 | static int | 1733 | static int |
1686 | tda998x_probe(struct i2c_client *client, const struct i2c_device_id *id) | 1734 | tda998x_probe(struct i2c_client *client, const struct i2c_device_id *id) |
1687 | { | 1735 | { |
1736 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
1737 | dev_warn(&client->dev, "adapter does not support I2C\n"); | ||
1738 | return -EIO; | ||
1739 | } | ||
1688 | return component_add(&client->dev, &tda998x_ops); | 1740 | return component_add(&client->dev, &tda998x_ops); |
1689 | } | 1741 | } |
1690 | 1742 | ||