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