/*++ * linux/sound/soc/codecs/wmt_hwdac.c * WonderMedia I2S audio driver for ALSA * * Copyright c 2010 WonderMedia Technologies, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * WonderMedia Technologies, Inc. * 4F, 533, Chung-Cheng Road, Hsin-Tien, Taipei 231, R.O.C --*/ #include #include #include #include #include #include #include #include #include /* * Debug */ #define AUDIO_NAME "HW_DAC" //#define WMT_HWDAC_DEBUG 1 //#define WMT_HWDAC_DEBUG_DETAIL 1 #ifdef WMT_HWDAC_DEBUG #define DPRINTK(format, arg...) \ printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg) #else #define DPRINTK(format, arg...) do {} while (0) #endif #ifdef WMT_HWDAC_DEBUG_DETAIL #define DBG_DETAIL(format, arg...) \ printk(KERN_INFO AUDIO_NAME ": [%s]" format "\n" , __FUNCTION__, ## arg) #else #define DBG_DETAIL(format, arg...) do {} while (0) #endif #define err(format, arg...) \ printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg) #define info(format, arg...) \ printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg) #define warn(format, arg...) \ printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg) extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen); static int hwdac_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { DBG_DETAIL(); return 0; } #define HWDAC_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | \ SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | \ SNDRV_PCM_RATE_96000) #define HWDAC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_FLOAT) static struct snd_soc_dai_ops hwdac_dai_ops = { .hw_params = hwdac_pcm_hw_params, }; struct snd_soc_dai_driver hwdac_dai = { .name = "HWDAC", .playback = { .stream_name = "Playback", .channels_min = 1, .channels_max = 2, .rates = HWDAC_RATES, .formats = HWDAC_FORMATS, }, .capture = { .stream_name = "Capture", .channels_min = 1, .channels_max = 2, .rates = HWDAC_RATES, .formats = HWDAC_FORMATS, }, .ops = &hwdac_dai_ops, }; static int hwdac_probe(struct snd_soc_codec *codec) { DBG_DETAIL(); return 0; } /* remove everything here */ static int hwdac_remove(struct snd_soc_codec *codec) { DBG_DETAIL(); return 0; } struct snd_soc_codec_driver soc_codec_dev_hwdac = { .probe = hwdac_probe, .remove = hwdac_remove, }; static int __devinit hwdac_platform_probe(struct platform_device *pdev) { int ret = 0; DBG_DETAIL(); ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_hwdac, &hwdac_dai, 1); if (ret) info("snd_soc_register_codec fail"); return ret; } static int __devexit hwdac_platform_remove(struct platform_device *pdev) { DBG_DETAIL(); snd_soc_unregister_codec(&pdev->dev); return 0; } static struct platform_driver wmt_hwdac_driver = { .driver = { .name = "wmt-i2s-hwdac", .owner = THIS_MODULE, }, .probe = hwdac_platform_probe, .remove = __devexit_p(hwdac_platform_remove), }; static int __init wmt_hwdac_platform_init(void) { char buf[80]; int varlen = 80; char codec_name[5]; int ret = 0; DBG_DETAIL(); /*ret = wmt_getsyspara("wmt.audio.i2s", buf, &varlen); if (ret == 0) { sscanf(buf, "%5s", codec_name); if (strcmp(codec_name, "hwdac")) { info("hwdac string not found"); return -EINVAL; } }*/ return platform_driver_register(&wmt_hwdac_driver); } module_init(wmt_hwdac_platform_init); static void __exit wmt_hwdac_platform_exit(void) { DBG_DETAIL(); platform_driver_unregister(&wmt_hwdac_driver); } module_exit(wmt_hwdac_platform_exit); MODULE_DESCRIPTION("WMT [ALSA SoC] driver"); MODULE_AUTHOR("WonderMedia Technologies, Inc."); MODULE_LICENSE("GPL");