diff options
author | Ricardo Neri <ricardo.neri@ti.com> | 2012-03-15 14:58:51 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-05-11 08:15:18 -0400 |
commit | 7c3291f06b4e025c4bd373adbb3f6354080f5097 (patch) | |
tree | b4f825147f46ddc8aaf83d57b5168072adb99ce1 /drivers/video | |
parent | c0456be38fef2866b1dbeceb756485b001fa23b9 (diff) |
OMAPDSS: HDMI: Remove ASoC codec
Remove the ASoC OMAP HDMI audio codec. The goal of removing the codec
is to, in subsequent patches, give way to the implementation of the HDMI
audio support using the DSS device driver audio interface. This
approach will expose the HDMI audio functionality to any interested entity.
In a separate patch, ASoC will use this new approach to expose HDMI audio
to ALSA.
Signed-off-by: Ricardo Neri <ricardo.neri@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/omap2/dss/hdmi.c | 236 | ||||
-rw-r--r-- | drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h | 5 |
2 files changed, 0 insertions, 241 deletions
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index 8f0549a2e796..0f8efc961e6b 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c | |||
@@ -33,12 +33,6 @@ | |||
33 | #include <linux/pm_runtime.h> | 33 | #include <linux/pm_runtime.h> |
34 | #include <linux/clk.h> | 34 | #include <linux/clk.h> |
35 | #include <video/omapdss.h> | 35 | #include <video/omapdss.h> |
36 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | ||
37 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | ||
38 | #include <sound/soc.h> | ||
39 | #include <sound/pcm_params.h> | ||
40 | #include "ti_hdmi_4xxx_ip.h" | ||
41 | #endif | ||
42 | 36 | ||
43 | #include "ti_hdmi.h" | 37 | #include "ti_hdmi.h" |
44 | #include "dss.h" | 38 | #include "dss.h" |
@@ -539,220 +533,6 @@ void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev) | |||
539 | mutex_unlock(&hdmi.lock); | 533 | mutex_unlock(&hdmi.lock); |
540 | } | 534 | } |
541 | 535 | ||
542 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | ||
543 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | ||
544 | |||
545 | static int hdmi_audio_trigger(struct snd_pcm_substream *substream, int cmd, | ||
546 | struct snd_soc_dai *dai) | ||
547 | { | ||
548 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
549 | struct snd_soc_codec *codec = rtd->codec; | ||
550 | struct platform_device *pdev = to_platform_device(codec->dev); | ||
551 | struct hdmi_ip_data *ip_data = snd_soc_codec_get_drvdata(codec); | ||
552 | int err = 0; | ||
553 | |||
554 | if (!(ip_data->ops) && !(ip_data->ops->audio_enable)) { | ||
555 | dev_err(&pdev->dev, "Cannot enable/disable audio\n"); | ||
556 | return -ENODEV; | ||
557 | } | ||
558 | |||
559 | switch (cmd) { | ||
560 | case SNDRV_PCM_TRIGGER_START: | ||
561 | case SNDRV_PCM_TRIGGER_RESUME: | ||
562 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | ||
563 | ip_data->ops->audio_enable(ip_data); | ||
564 | break; | ||
565 | case SNDRV_PCM_TRIGGER_STOP: | ||
566 | case SNDRV_PCM_TRIGGER_SUSPEND: | ||
567 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | ||
568 | ip_data->ops->audio_disable(ip_data); | ||
569 | break; | ||
570 | default: | ||
571 | err = -EINVAL; | ||
572 | } | ||
573 | return err; | ||
574 | } | ||
575 | |||
576 | static int hdmi_audio_hw_params(struct snd_pcm_substream *substream, | ||
577 | struct snd_pcm_hw_params *params, | ||
578 | struct snd_soc_dai *dai) | ||
579 | { | ||
580 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
581 | struct snd_soc_codec *codec = rtd->codec; | ||
582 | struct hdmi_ip_data *ip_data = snd_soc_codec_get_drvdata(codec); | ||
583 | struct hdmi_audio_format audio_format; | ||
584 | struct hdmi_audio_dma audio_dma; | ||
585 | struct hdmi_core_audio_config core_cfg; | ||
586 | struct hdmi_core_infoframe_audio aud_if_cfg; | ||
587 | int err, n, cts; | ||
588 | enum hdmi_core_audio_sample_freq sample_freq; | ||
589 | |||
590 | switch (params_format(params)) { | ||
591 | case SNDRV_PCM_FORMAT_S16_LE: | ||
592 | core_cfg.i2s_cfg.word_max_length = | ||
593 | HDMI_AUDIO_I2S_MAX_WORD_20BITS; | ||
594 | core_cfg.i2s_cfg.word_length = HDMI_AUDIO_I2S_CHST_WORD_16_BITS; | ||
595 | core_cfg.i2s_cfg.in_length_bits = | ||
596 | HDMI_AUDIO_I2S_INPUT_LENGTH_16; | ||
597 | core_cfg.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_LEFT; | ||
598 | audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_TWOSAMPLES; | ||
599 | audio_format.sample_size = HDMI_AUDIO_SAMPLE_16BITS; | ||
600 | audio_format.justification = HDMI_AUDIO_JUSTIFY_LEFT; | ||
601 | audio_dma.transfer_size = 0x10; | ||
602 | break; | ||
603 | case SNDRV_PCM_FORMAT_S24_LE: | ||
604 | core_cfg.i2s_cfg.word_max_length = | ||
605 | HDMI_AUDIO_I2S_MAX_WORD_24BITS; | ||
606 | core_cfg.i2s_cfg.word_length = HDMI_AUDIO_I2S_CHST_WORD_24_BITS; | ||
607 | core_cfg.i2s_cfg.in_length_bits = | ||
608 | HDMI_AUDIO_I2S_INPUT_LENGTH_24; | ||
609 | audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_ONESAMPLE; | ||
610 | audio_format.sample_size = HDMI_AUDIO_SAMPLE_24BITS; | ||
611 | audio_format.justification = HDMI_AUDIO_JUSTIFY_RIGHT; | ||
612 | core_cfg.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_RIGHT; | ||
613 | audio_dma.transfer_size = 0x20; | ||
614 | break; | ||
615 | default: | ||
616 | return -EINVAL; | ||
617 | } | ||
618 | |||
619 | switch (params_rate(params)) { | ||
620 | case 32000: | ||
621 | sample_freq = HDMI_AUDIO_FS_32000; | ||
622 | break; | ||
623 | case 44100: | ||
624 | sample_freq = HDMI_AUDIO_FS_44100; | ||
625 | break; | ||
626 | case 48000: | ||
627 | sample_freq = HDMI_AUDIO_FS_48000; | ||
628 | break; | ||
629 | default: | ||
630 | return -EINVAL; | ||
631 | } | ||
632 | |||
633 | err = hdmi_config_audio_acr(ip_data, params_rate(params), &n, &cts); | ||
634 | if (err < 0) | ||
635 | return err; | ||
636 | |||
637 | /* Audio wrapper config */ | ||
638 | audio_format.stereo_channels = HDMI_AUDIO_STEREO_ONECHANNEL; | ||
639 | audio_format.active_chnnls_msk = 0x03; | ||
640 | audio_format.type = HDMI_AUDIO_TYPE_LPCM; | ||
641 | audio_format.sample_order = HDMI_AUDIO_SAMPLE_LEFT_FIRST; | ||
642 | /* Disable start/stop signals of IEC 60958 blocks */ | ||
643 | audio_format.en_sig_blk_strt_end = HDMI_AUDIO_BLOCK_SIG_STARTEND_OFF; | ||
644 | |||
645 | audio_dma.block_size = 0xC0; | ||
646 | audio_dma.mode = HDMI_AUDIO_TRANSF_DMA; | ||
647 | audio_dma.fifo_threshold = 0x20; /* in number of samples */ | ||
648 | |||
649 | hdmi_wp_audio_config_dma(ip_data, &audio_dma); | ||
650 | hdmi_wp_audio_config_format(ip_data, &audio_format); | ||
651 | |||
652 | /* | ||
653 | * I2S config | ||
654 | */ | ||
655 | core_cfg.i2s_cfg.en_high_bitrate_aud = false; | ||
656 | /* Only used with high bitrate audio */ | ||
657 | core_cfg.i2s_cfg.cbit_order = false; | ||
658 | /* Serial data and word select should change on sck rising edge */ | ||
659 | core_cfg.i2s_cfg.sck_edge_mode = HDMI_AUDIO_I2S_SCK_EDGE_RISING; | ||
660 | core_cfg.i2s_cfg.vbit = HDMI_AUDIO_I2S_VBIT_FOR_PCM; | ||
661 | /* Set I2S word select polarity */ | ||
662 | core_cfg.i2s_cfg.ws_polarity = HDMI_AUDIO_I2S_WS_POLARITY_LOW_IS_LEFT; | ||
663 | core_cfg.i2s_cfg.direction = HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST; | ||
664 | /* Set serial data to word select shift. See Phillips spec. */ | ||
665 | core_cfg.i2s_cfg.shift = HDMI_AUDIO_I2S_FIRST_BIT_SHIFT; | ||
666 | /* Enable one of the four available serial data channels */ | ||
667 | core_cfg.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN; | ||
668 | |||
669 | /* Core audio config */ | ||
670 | core_cfg.freq_sample = sample_freq; | ||
671 | core_cfg.n = n; | ||
672 | core_cfg.cts = cts; | ||
673 | if (dss_has_feature(FEAT_HDMI_CTS_SWMODE)) { | ||
674 | core_cfg.aud_par_busclk = 0; | ||
675 | core_cfg.cts_mode = HDMI_AUDIO_CTS_MODE_SW; | ||
676 | core_cfg.use_mclk = dss_has_feature(FEAT_HDMI_AUDIO_USE_MCLK); | ||
677 | } else { | ||
678 | core_cfg.aud_par_busclk = (((128 * 31) - 1) << 8); | ||
679 | core_cfg.cts_mode = HDMI_AUDIO_CTS_MODE_HW; | ||
680 | core_cfg.use_mclk = true; | ||
681 | } | ||
682 | |||
683 | if (core_cfg.use_mclk) | ||
684 | core_cfg.mclk_mode = HDMI_AUDIO_MCLK_128FS; | ||
685 | core_cfg.layout = HDMI_AUDIO_LAYOUT_2CH; | ||
686 | core_cfg.en_spdif = false; | ||
687 | /* Use sample frequency from channel status word */ | ||
688 | core_cfg.fs_override = true; | ||
689 | /* Enable ACR packets */ | ||
690 | core_cfg.en_acr_pkt = true; | ||
691 | /* Disable direct streaming digital audio */ | ||
692 | core_cfg.en_dsd_audio = false; | ||
693 | /* Use parallel audio interface */ | ||
694 | core_cfg.en_parallel_aud_input = true; | ||
695 | |||
696 | hdmi_core_audio_config(ip_data, &core_cfg); | ||
697 | |||
698 | /* | ||
699 | * Configure packet | ||
700 | * info frame audio see doc CEA861-D page 74 | ||
701 | */ | ||
702 | aud_if_cfg.db1_coding_type = HDMI_INFOFRAME_AUDIO_DB1CT_FROM_STREAM; | ||
703 | aud_if_cfg.db1_channel_count = 2; | ||
704 | aud_if_cfg.db2_sample_freq = HDMI_INFOFRAME_AUDIO_DB2SF_FROM_STREAM; | ||
705 | aud_if_cfg.db2_sample_size = HDMI_INFOFRAME_AUDIO_DB2SS_FROM_STREAM; | ||
706 | aud_if_cfg.db4_channel_alloc = 0x00; | ||
707 | aud_if_cfg.db5_downmix_inh = false; | ||
708 | aud_if_cfg.db5_lsv = 0; | ||
709 | |||
710 | hdmi_core_audio_infoframe_config(ip_data, &aud_if_cfg); | ||
711 | return 0; | ||
712 | } | ||
713 | |||
714 | static int hdmi_audio_startup(struct snd_pcm_substream *substream, | ||
715 | struct snd_soc_dai *dai) | ||
716 | { | ||
717 | if (!hdmi.ip_data.cfg.cm.mode) { | ||
718 | pr_err("Current video settings do not support audio.\n"); | ||
719 | return -EIO; | ||
720 | } | ||
721 | return 0; | ||
722 | } | ||
723 | |||
724 | static int hdmi_audio_codec_probe(struct snd_soc_codec *codec) | ||
725 | { | ||
726 | struct hdmi_ip_data *priv = &hdmi.ip_data; | ||
727 | |||
728 | snd_soc_codec_set_drvdata(codec, priv); | ||
729 | return 0; | ||
730 | } | ||
731 | |||
732 | static struct snd_soc_codec_driver hdmi_audio_codec_drv = { | ||
733 | .probe = hdmi_audio_codec_probe, | ||
734 | }; | ||
735 | |||
736 | static struct snd_soc_dai_ops hdmi_audio_codec_ops = { | ||
737 | .hw_params = hdmi_audio_hw_params, | ||
738 | .trigger = hdmi_audio_trigger, | ||
739 | .startup = hdmi_audio_startup, | ||
740 | }; | ||
741 | |||
742 | static struct snd_soc_dai_driver hdmi_codec_dai_drv = { | ||
743 | .name = "hdmi-audio-codec", | ||
744 | .playback = { | ||
745 | .channels_min = 2, | ||
746 | .channels_max = 2, | ||
747 | .rates = SNDRV_PCM_RATE_32000 | | ||
748 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000, | ||
749 | .formats = SNDRV_PCM_FMTBIT_S16_LE | | ||
750 | SNDRV_PCM_FMTBIT_S24_LE, | ||
751 | }, | ||
752 | .ops = &hdmi_audio_codec_ops, | ||
753 | }; | ||
754 | #endif | ||
755 | |||
756 | static int hdmi_get_clocks(struct platform_device *pdev) | 536 | static int hdmi_get_clocks(struct platform_device *pdev) |
757 | { | 537 | { |
758 | struct clk *clk; | 538 | struct clk *clk; |
@@ -841,17 +621,6 @@ static int __init omapdss_hdmihw_probe(struct platform_device *pdev) | |||
841 | 621 | ||
842 | hdmi_probe_pdata(pdev); | 622 | hdmi_probe_pdata(pdev); |
843 | 623 | ||
844 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | ||
845 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | ||
846 | |||
847 | /* Register ASoC codec DAI */ | ||
848 | r = snd_soc_register_codec(&pdev->dev, &hdmi_audio_codec_drv, | ||
849 | &hdmi_codec_dai_drv, 1); | ||
850 | if (r) { | ||
851 | DSSERR("can't register ASoC HDMI audio codec\n"); | ||
852 | return r; | ||
853 | } | ||
854 | #endif | ||
855 | return 0; | 624 | return 0; |
856 | } | 625 | } |
857 | 626 | ||
@@ -861,11 +630,6 @@ static int __exit omapdss_hdmihw_remove(struct platform_device *pdev) | |||
861 | 630 | ||
862 | hdmi_panel_exit(); | 631 | hdmi_panel_exit(); |
863 | 632 | ||
864 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | ||
865 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | ||
866 | snd_soc_unregister_codec(&pdev->dev); | ||
867 | #endif | ||
868 | |||
869 | pm_runtime_disable(&pdev->dev); | 633 | pm_runtime_disable(&pdev->dev); |
870 | 634 | ||
871 | hdmi_put_clocks(); | 635 | hdmi_put_clocks(); |
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h index b724bc68307a..bc221435a984 100644 --- a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h +++ b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h | |||
@@ -24,11 +24,6 @@ | |||
24 | #include <linux/string.h> | 24 | #include <linux/string.h> |
25 | #include <video/omapdss.h> | 25 | #include <video/omapdss.h> |
26 | #include "ti_hdmi.h" | 26 | #include "ti_hdmi.h" |
27 | #if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \ | ||
28 | defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE) | ||
29 | #include <sound/soc.h> | ||
30 | #include <sound/pcm_params.h> | ||
31 | #endif | ||
32 | 27 | ||
33 | /* HDMI Wrapper */ | 28 | /* HDMI Wrapper */ |
34 | 29 | ||