1/* 2 * ALSA SoC codec driver for HDMI audio codecs. 3 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ 4 * Author: Ricardo Neri <ricardo.neri@ti.com> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * version 2 as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 18 * 02110-1301 USA 19 * 20 */ 21#include <linux/module.h> 22#include <sound/soc.h> 23#include <linux/of.h> 24#include <linux/of_device.h> 25 26#define DRV_NAME "hdmi-audio-codec" 27 28static const struct snd_soc_dapm_widget hdmi_widgets[] = { 29 SND_SOC_DAPM_INPUT("RX"), 30 SND_SOC_DAPM_OUTPUT("TX"), 31}; 32 33static const struct snd_soc_dapm_route hdmi_routes[] = { 34 { "Capture", NULL, "RX" }, 35 { "TX", NULL, "Playback" }, 36}; 37 38static struct snd_soc_dai_driver hdmi_codec_dai = { 39 .name = "hdmi-hifi", 40 .playback = { 41 .stream_name = "Playback", 42 .channels_min = 2, 43 .channels_max = 8, 44 .rates = SNDRV_PCM_RATE_32000 | 45 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | 46 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | 47 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000, 48 .formats = SNDRV_PCM_FMTBIT_S16_LE | 49 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE, 50 .sig_bits = 24, 51 }, 52 .capture = { 53 .stream_name = "Capture", 54 .channels_min = 2, 55 .channels_max = 2, 56 .rates = SNDRV_PCM_RATE_32000 | 57 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | 58 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | 59 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000, 60 .formats = SNDRV_PCM_FMTBIT_S16_LE | 61 SNDRV_PCM_FMTBIT_S24_LE, 62 }, 63 64}; 65 66#ifdef CONFIG_OF 67static const struct of_device_id hdmi_audio_codec_ids[] = { 68 { .compatible = "linux,hdmi-audio", }, 69 { } 70}; 71MODULE_DEVICE_TABLE(of, hdmi_audio_codec_ids); 72#endif 73 74static struct snd_soc_codec_driver hdmi_codec = { 75 .dapm_widgets = hdmi_widgets, 76 .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), 77 .dapm_routes = hdmi_routes, 78 .num_dapm_routes = ARRAY_SIZE(hdmi_routes), 79 .ignore_pmdown_time = true, 80}; 81 82static int hdmi_codec_probe(struct platform_device *pdev) 83{ 84 return snd_soc_register_codec(&pdev->dev, &hdmi_codec, 85 &hdmi_codec_dai, 1); 86} 87 88static int hdmi_codec_remove(struct platform_device *pdev) 89{ 90 snd_soc_unregister_codec(&pdev->dev); 91 return 0; 92} 93 94static struct platform_driver hdmi_codec_driver = { 95 .driver = { 96 .name = DRV_NAME, 97 .of_match_table = of_match_ptr(hdmi_audio_codec_ids), 98 }, 99 100 .probe = hdmi_codec_probe, 101 .remove = hdmi_codec_remove, 102}; 103 104module_platform_driver(hdmi_codec_driver); 105 106MODULE_AUTHOR("Ricardo Neri <ricardo.neri@ti.com>"); 107MODULE_DESCRIPTION("ASoC generic HDMI codec driver"); 108MODULE_LICENSE("GPL"); 109MODULE_ALIAS("platform:" DRV_NAME); 110