1/* sound/soc/s3c24xx/s3c24xx_simtec_tlv320aic23.c 2 * 3 * Copyright 2009 Simtec Electronics 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8*/ 9 10#include <linux/module.h> 11#include <linux/clk.h> 12#include <linux/platform_device.h> 13 14#include <sound/core.h> 15#include <sound/pcm.h> 16#include <sound/soc.h> 17#include <sound/soc-dapm.h> 18 19#include <plat/audio-simtec.h> 20 21#include "s3c-dma.h" 22#include "s3c24xx-i2s.h" 23#include "s3c24xx_simtec.h" 24 25#include "../codecs/tlv320aic23.h" 26 27/* supported machines: 28 * 29 * Machine Connections AMP 30 * ------- ----------- --- 31 * BAST MIC, HPOUT, LOUT, LIN TPA2001D1 (HPOUTL,R) (gain hardwired) 32 * VR1000 HPOUT, LIN None 33 * VR2000 LIN, LOUT, MIC, HP LM4871 (HPOUTL,R) 34 * DePicture LIN, LOUT, MIC, HP LM4871 (HPOUTL,R) 35 * Anubis LIN, LOUT, MIC, HP TPA2001D1 (HPOUTL,R) 36 */ 37 38static const struct snd_soc_dapm_widget dapm_widgets[] = { 39 SND_SOC_DAPM_HP("Headphone Jack", NULL), 40 SND_SOC_DAPM_LINE("Line In", NULL), 41 SND_SOC_DAPM_LINE("Line Out", NULL), 42 SND_SOC_DAPM_MIC("Mic Jack", NULL), 43}; 44 45static const struct snd_soc_dapm_route base_map[] = { 46 { "Headphone Jack", NULL, "LHPOUT"}, 47 { "Headphone Jack", NULL, "RHPOUT"}, 48 49 { "Line Out", NULL, "LOUT" }, 50 { "Line Out", NULL, "ROUT" }, 51 52 { "LLINEIN", NULL, "Line In"}, 53 { "RLINEIN", NULL, "Line In"}, 54 55 { "MICIN", NULL, "Mic Jack"}, 56}; 57 58/** 59 * simtec_tlv320aic23_init - initialise and add controls 60 * @codec; The codec instance to attach to. 61 * 62 * Attach our controls and configure the necessary codec 63 * mappings for our sound card instance. 64*/ 65static int simtec_tlv320aic23_init(struct snd_soc_codec *codec) 66{ 67 snd_soc_dapm_new_controls(codec, dapm_widgets, 68 ARRAY_SIZE(dapm_widgets)); 69 70 snd_soc_dapm_add_routes(codec, base_map, ARRAY_SIZE(base_map)); 71 72 snd_soc_dapm_enable_pin(codec, "Headphone Jack"); 73 snd_soc_dapm_enable_pin(codec, "Line In"); 74 snd_soc_dapm_enable_pin(codec, "Line Out"); 75 snd_soc_dapm_enable_pin(codec, "Mic Jack"); 76 77 simtec_audio_init(codec); 78 snd_soc_dapm_sync(codec); 79 80 return 0; 81} 82 83static struct snd_soc_dai_link simtec_dai_aic23 = { 84 .name = "tlv320aic23", 85 .stream_name = "TLV320AIC23", 86 .cpu_dai = &s3c24xx_i2s_dai, 87 .codec_dai = &tlv320aic23_dai, 88 .init = simtec_tlv320aic23_init, 89}; 90 91/* simtec audio machine driver */ 92static struct snd_soc_card snd_soc_machine_simtec_aic23 = { 93 .name = "Simtec", 94 .platform = &s3c24xx_soc_platform, 95 .dai_link = &simtec_dai_aic23, 96 .num_links = 1, 97}; 98 99/* simtec audio subsystem */ 100static struct snd_soc_device simtec_snd_devdata_aic23 = { 101 .card = &snd_soc_machine_simtec_aic23, 102 .codec_dev = &soc_codec_dev_tlv320aic23, 103}; 104 105static int __devinit simtec_audio_tlv320aic23_probe(struct platform_device *pd) 106{ 107 return simtec_audio_core_probe(pd, &simtec_snd_devdata_aic23); 108} 109 110static struct platform_driver simtec_audio_tlv320aic23_platdrv = { 111 .driver = { 112 .owner = THIS_MODULE, 113 .name = "s3c24xx-simtec-tlv320aic23", 114 .pm = simtec_audio_pm, 115 }, 116 .probe = simtec_audio_tlv320aic23_probe, 117 .remove = __devexit_p(simtec_audio_remove), 118}; 119 120MODULE_ALIAS("platform:s3c24xx-simtec-tlv320aic23"); 121 122static int __init simtec_tlv320aic23_modinit(void) 123{ 124 return platform_driver_register(&simtec_audio_tlv320aic23_platdrv); 125} 126 127static void __exit simtec_tlv320aic23_modexit(void) 128{ 129 platform_driver_unregister(&simtec_audio_tlv320aic23_platdrv); 130} 131 132module_init(simtec_tlv320aic23_modinit); 133module_exit(simtec_tlv320aic23_modexit); 134 135MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 136MODULE_DESCRIPTION("ALSA SoC Simtec Audio support"); 137MODULE_LICENSE("GPL"); 138