blob: 95727def6622ddd35ac9241b9800b10d9a245efb [file] [log] [blame]
Duy Truong790f06d2013-02-13 16:38:12 -08001/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
Utsab Bosebec5f502012-08-31 13:16:13 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/platform_device.h>
Utsab Bosebec5f502012-08-31 13:16:13 +053016#include <mach/board.h>
17
18#include "board-msm7627a.h"
19
20#define SND(desc, num) { .name = #desc, .id = num }
21static struct snd_endpoint snd_endpoints_list[] = {
22 SND(HANDSET, 0),
23 SND(MONO_HEADSET, 2),
24 SND(HEADSET, 3),
25 SND(SPEAKER, 6),
26 SND(TTY_HEADSET, 8),
27 SND(TTY_VCO, 9),
28 SND(TTY_HCO, 10),
29 SND(BT, 12),
30 SND(IN_S_SADC_OUT_HANDSET, 16),
31 SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25),
32 SND(FM_DIGITAL_STEREO_HEADSET, 26),
33 SND(FM_DIGITAL_SPEAKER_PHONE, 27),
34 SND(FM_DIGITAL_BT_A2DP_HEADSET, 28),
35 SND(STEREO_HEADSET_AND_SPEAKER, 31),
36 SND(CURRENT, 0x7FFFFFFE),
37 SND(FM_ANALOG_STEREO_HEADSET, 35),
38 SND(FM_ANALOG_STEREO_HEADSET_CODEC, 36),
39};
40#undef SND
41
42static struct msm_snd_endpoints msm_device_snd_endpoints = {
43 .endpoints = snd_endpoints_list,
44 .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint)
45};
46
47struct platform_device msm_device_snd = {
48 .name = "msm_snd",
49 .id = -1,
50 .dev = {
51 .platform_data = &msm_device_snd_endpoints
52 },
53};
54
55#define DEC0_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
56 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
57 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
58 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
59 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
60 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP)| \
61 (1<<MSM_ADSP_CODEC_AC3))
62#define DEC1_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
63 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
64 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
65 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
66 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
67 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
68#define DEC2_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
69 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
70 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
71 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
72 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
73 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
74#define DEC3_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
75 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
76 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
77 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
78 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
79 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
80#define DEC4_FORMAT (1<<MSM_ADSP_CODEC_MIDI)
81
82static unsigned int dec_concurrency_table[] = {
83 /* Audio LP */
84 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DMA)), 0,
85 0, 0, 0,
86
87 /* Concurrency 1 */
88 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
89 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
90 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
91 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
92 (DEC4_FORMAT),
93
94 /* Concurrency 2 */
95 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
96 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
97 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
98 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
99 (DEC4_FORMAT),
100
101 /* Concurrency 3 */
102 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
103 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
104 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
105 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
106 (DEC4_FORMAT),
107
108 /* Concurrency 4 */
109 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
110 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
111 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
112 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
113 (DEC4_FORMAT),
114
115 /* Concurrency 5 */
116 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
117 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
118 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
119 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
120 (DEC4_FORMAT),
121
122 /* Concurrency 6 */
123 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|
124 (1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
125 0, 0, 0, 0,
126
127 /* Concurrency 7 */
128 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
129 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
130 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
131 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
132 (DEC4_FORMAT),
133};
134
135#define DEC_INFO(name, queueid, decid, nr_codec) { .module_name = name, \
136 .module_queueid = queueid, .module_decid = decid, \
137 .nr_codec_support = nr_codec}
138
139static struct msm_adspdec_info dec_info_list[] = {
140 DEC_INFO("AUDPLAY0TASK", 13, 0, 11), /* AudPlay0BitStreamCtrlQueue */
141 DEC_INFO("AUDPLAY1TASK", 14, 1, 11), /* AudPlay1BitStreamCtrlQueue */
142 DEC_INFO("AUDPLAY2TASK", 15, 2, 11), /* AudPlay2BitStreamCtrlQueue */
143 DEC_INFO("AUDPLAY3TASK", 16, 3, 11), /* AudPlay3BitStreamCtrlQueue */
144 DEC_INFO("AUDPLAY4TASK", 17, 4, 1), /* AudPlay4BitStreamCtrlQueue */
145};
146
147static struct msm_adspdec_database msm_device_adspdec_database = {
148 .num_dec = ARRAY_SIZE(dec_info_list),
149 .num_concurrency_support = (ARRAY_SIZE(dec_concurrency_table) / \
150 ARRAY_SIZE(dec_info_list)),
151 .dec_concurrency_table = dec_concurrency_table,
152 .dec_info_list = dec_info_list,
153};
154
155struct platform_device msm_device_adspdec = {
156 .name = "msm_adspdec",
157 .id = -1,
158 .dev = {
159 .platform_data = &msm_device_adspdec_database
160 },
161};
162
163#define SNDDEV_CAP_NONE 0x0
164#define SNDDEV_CAP_RX 0x1 /* RX direction */
165#define SNDDEV_CAP_TX 0x2 /* TX direction */
166#define SNDDEV_CAP_VOICE 0x4 /* Support voice call */
167#define SNDDEV_CAP_FM 0x10 /* Support FM radio */
168#define SNDDEV_CAP_TTY 0x20 /* Support TTY */
169#define CAD(desc, num, cap) { .name = #desc, .id = num, .capability = cap, }
170static struct cad_endpoint cad_endpoints_list[] = {
171 CAD(NONE, 0, SNDDEV_CAP_NONE),
172 CAD(HANDSET_SPKR, 1, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
173 CAD(HANDSET_MIC, 2, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
174 CAD(HEADSET_MIC, 3, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
175 CAD(HEADSET_SPKR_MONO, 4, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
176 CAD(HEADSET_SPKR_STEREO, 5, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
177 CAD(SPEAKER_PHONE_MIC, 6, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
178 CAD(SPEAKER_PHONE_MONO, 7, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
179 CAD(SPEAKER_PHONE_STEREO, 8, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
180 CAD(BT_SCO_MIC, 9, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
181 CAD(BT_SCO_SPKR, 10, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
182 CAD(BT_A2DP_SPKR, 11, (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE)),
183 CAD(TTY_HEADSET_MIC, 12, (SNDDEV_CAP_TX | \
184 SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY)),
185 CAD(TTY_HEADSET_SPKR, 13, (SNDDEV_CAP_RX | \
186 SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY)),
187 CAD(HEADSET_STEREO_PLUS_SPKR_MONO_RX, 19, (SNDDEV_CAP_TX | \
188 SNDDEV_CAP_VOICE)),
189 CAD(LP_FM_HEADSET_SPKR_STEREO_RX, 25, (SNDDEV_CAP_TX | SNDDEV_CAP_FM)),
190 CAD(I2S_RX, 26, (SNDDEV_CAP_RX)),
191 CAD(SPEAKER_PHONE_MIC_ENDFIRE, 45, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
192 CAD(HANDSET_MIC_ENDFIRE, 46, (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE)),
193 CAD(I2S_TX, 48, (SNDDEV_CAP_TX)),
194 CAD(LP_FM_HEADSET_SPKR_STEREO_PLUS_HEADSET_SPKR_STEREO_RX, 57, \
195 (SNDDEV_CAP_FM | SNDDEV_CAP_RX)),
196 CAD(FM_DIGITAL_HEADSET_SPKR_STEREO, 65, \
197 (SNDDEV_CAP_FM | SNDDEV_CAP_RX)),
198 CAD(FM_DIGITAL_SPEAKER_PHONE_MONO, 67, \
199 (SNDDEV_CAP_FM | SNDDEV_CAP_RX)),
Shashi Kumarf6f48552012-09-07 16:18:14 +0530200 CAD(FM_DIGITAL_SPEAKER_PHONE_MIC, 68, \
201 (SNDDEV_CAP_FM | SNDDEV_CAP_TX)),
Utsab Bosebec5f502012-08-31 13:16:13 +0530202 CAD(FM_DIGITAL_BT_A2DP_SPKR, 69, \
203 (SNDDEV_CAP_FM | SNDDEV_CAP_RX)),
204 CAD(MAX, 80, SNDDEV_CAP_NONE),
205};
206#undef CAD
207
208static struct msm_cad_endpoints msm_device_cad_endpoints = {
209 .endpoints = cad_endpoints_list,
210 .num = sizeof(cad_endpoints_list) / sizeof(struct cad_endpoint)
211};
212
213struct platform_device msm_device_cad = {
214 .name = "msm_cad",
215 .id = -1,
216 .dev = {
217 .platform_data = &msm_device_cad_endpoints
218 },
219};