blob: 0181cb53fd44622033f76ac712dfaade2bd72f3e [file] [log] [blame]
/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* 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.
*
*/
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/debugfs.h>
#include <linux/mfd/pmic8058.h>
#include <linux/mfd/pmic8901.h>
#include <linux/mfd/msm-adie-codec.h>
#include <linux/regulator/consumer.h>
#include <linux/regulator/machine.h>
#include <mach/qdsp6v2/audio_dev_ctl.h>
#include <sound/apr_audio.h>
#include <asm/mach-types.h>
#include <asm/uaccess.h>
#include <mach/board-msm8660.h>
#include "snddev_icodec.h"
#include "snddev_ecodec.h"
#include "timpani_profile_8x60.h"
#include "snddev_hdmi.h"
#include "snddev_mi2s.h"
#include "snddev_virtual.h"
#ifdef CONFIG_DEBUG_FS
static struct dentry *debugfs_hsed_config;
static void snddev_hsed_config_modify_setting(int type);
static void snddev_hsed_config_restore_setting(void);
#endif
/* GPIO_CLASS_D0_EN */
#define SNDDEV_GPIO_CLASS_D0_EN 227
/* GPIO_CLASS_D1_EN */
#define SNDDEV_GPIO_CLASS_D1_EN 229
#define SNDDEV_GPIO_MIC2_ANCR_SEL 294
#define SNDDEV_GPIO_MIC1_ANCL_SEL 295
#define SNDDEV_GPIO_HS_MIC4_SEL 296
#define DSP_RAM_BASE_8x60 0x46700000
#define DSP_RAM_SIZE_8x60 0x2000000
static int dspcrashd_pdata_8x60 = 0xDEADDEAD;
static struct resource resources_dspcrashd_8x60[] = {
{
.name = "msm_dspcrashd",
.start = DSP_RAM_BASE_8x60,
.end = DSP_RAM_BASE_8x60 + DSP_RAM_SIZE_8x60,
.flags = IORESOURCE_DMA,
},
};
struct platform_device msm_device_dspcrashd_8x60 = {
.name = "msm_dspcrashd",
.num_resources = ARRAY_SIZE(resources_dspcrashd_8x60),
.resource = resources_dspcrashd_8x60,
.dev = { .platform_data = &dspcrashd_pdata_8x60 },
};
static struct resource msm_cdcclk_ctl_resources[] = {
{
.name = "msm_snddev_tx_mclk",
.start = 108,
.end = 108,
.flags = IORESOURCE_IO,
},
{
.name = "msm_snddev_rx_mclk",
.start = 109,
.end = 109,
.flags = IORESOURCE_IO,
},
};
static struct platform_device msm_cdcclk_ctl_device = {
.name = "msm_cdcclk_ctl",
.num_resources = ARRAY_SIZE(msm_cdcclk_ctl_resources),
.resource = msm_cdcclk_ctl_resources,
};
static struct resource msm_aux_pcm_resources[] = {
{
.name = "aux_pcm_dout",
.start = 111,
.end = 111,
.flags = IORESOURCE_IO,
},
{
.name = "aux_pcm_din",
.start = 112,
.end = 112,
.flags = IORESOURCE_IO,
},
{
.name = "aux_pcm_syncout",
.start = 113,
.end = 113,
.flags = IORESOURCE_IO,
},
{
.name = "aux_pcm_clkin_a",
.start = 114,
.end = 114,
.flags = IORESOURCE_IO,
},
};
static struct platform_device msm_aux_pcm_device = {
.name = "msm_aux_pcm",
.num_resources = ARRAY_SIZE(msm_aux_pcm_resources),
.resource = msm_aux_pcm_resources,
};
static struct resource msm_mi2s_gpio_resources[] = {
{
.name = "mi2s_ws",
.start = 101,
.end = 101,
.flags = IORESOURCE_IO,
},
{
.name = "mi2s_sclk",
.start = 102,
.end = 102,
.flags = IORESOURCE_IO,
},
{
.name = "mi2s_mclk",
.start = 103,
.end = 103,
.flags = IORESOURCE_IO,
},
{
.name = "fm_mi2s_sd",
.start = 107,
.end = 107,
.flags = IORESOURCE_IO,
},
};
static struct platform_device msm_mi2s_device = {
.name = "msm_mi2s",
.num_resources = ARRAY_SIZE(msm_mi2s_gpio_resources),
.resource = msm_mi2s_gpio_resources,
};
/* Must be same size as msm_icodec_gpio_resources */
static int msm_icodec_gpio_defaults[] = {
0,
0,
};
static struct resource msm_icodec_gpio_resources[] = {
{
.name = "msm_icodec_speaker_left",
.start = SNDDEV_GPIO_CLASS_D0_EN,
.end = SNDDEV_GPIO_CLASS_D0_EN,
.flags = IORESOURCE_IO,
},
{
.name = "msm_icodec_speaker_right",
.start = SNDDEV_GPIO_CLASS_D1_EN,
.end = SNDDEV_GPIO_CLASS_D1_EN,
.flags = IORESOURCE_IO,
},
};
static struct platform_device msm_icodec_gpio_device = {
.name = "msm_icodec_gpio",
.num_resources = ARRAY_SIZE(msm_icodec_gpio_resources),
.resource = msm_icodec_gpio_resources,
.dev = { .platform_data = &msm_icodec_gpio_defaults },
};
static struct regulator *s3;
static struct regulator *mvs;
static int msm_snddev_enable_dmic_power(void)
{
int ret;
s3 = regulator_get(NULL, "8058_s3");
if (IS_ERR(s3)) {
ret = -EBUSY;
goto fail_get_s3;
}
ret = regulator_set_voltage(s3, 1800000, 1800000);
if (ret) {
pr_err("%s: error setting voltage\n", __func__);
goto fail_s3;
}
ret = regulator_enable(s3);
if (ret) {
pr_err("%s: error enabling regulator\n", __func__);
goto fail_s3;
}
mvs = regulator_get(NULL, "8901_mvs0");
if (IS_ERR(mvs))
goto fail_mvs0_get;
ret = regulator_enable(mvs);
if (ret) {
pr_err("%s: error setting regulator\n", __func__);
goto fail_mvs0_enable;
}
return ret;
fail_mvs0_enable:
regulator_put(mvs);
mvs = NULL;
fail_mvs0_get:
regulator_disable(s3);
fail_s3:
regulator_put(s3);
s3 = NULL;
fail_get_s3:
return ret;
}
static void msm_snddev_disable_dmic_power(void)
{
int ret;
if (mvs) {
ret = regulator_disable(mvs);
if (ret < 0)
pr_err("%s: error disabling vreg mvs\n", __func__);
regulator_put(mvs);
mvs = NULL;
}
if (s3) {
ret = regulator_disable(s3);
if (ret < 0)
pr_err("%s: error disabling regulator s3\n", __func__);
regulator_put(s3);
s3 = NULL;
}
}
#define PM8901_MPP_3 (2) /* PM8901 MPP starts from 0 */
static int config_class_d0_gpio(int enable)
{
int rc;
struct pm8xxx_mpp_config_data class_d0_mpp = {
.type = PM8XXX_MPP_TYPE_D_OUTPUT,
.level = PM8901_MPP_DIG_LEVEL_MSMIO,
};
if (enable) {
class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_HIGH;
rc = pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3),
&class_d0_mpp);
if (rc) {
pr_err("%s: CLASS_D0_EN failed\n", __func__);
return rc;
}
rc = gpio_request(SNDDEV_GPIO_CLASS_D0_EN, "CLASSD0_EN");
if (rc) {
pr_err("%s: spkr pamp gpio pm8901 mpp3 request"
"failed\n", __func__);
class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_LOW;
pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3),
&class_d0_mpp);
return rc;
}
gpio_direction_output(SNDDEV_GPIO_CLASS_D0_EN, 1);
gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D0_EN, 1);
} else {
class_d0_mpp.control = PM8XXX_MPP_DOUT_CTRL_LOW;
pm8xxx_mpp_config(PM8901_MPP_PM_TO_SYS(PM8901_MPP_3),
&class_d0_mpp);
gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D0_EN, 0);
gpio_free(SNDDEV_GPIO_CLASS_D0_EN);
}
return 0;
}
static int config_class_d1_gpio(int enable)
{
int rc;
if (enable) {
rc = gpio_request(SNDDEV_GPIO_CLASS_D1_EN, "CLASSD1_EN");
if (rc) {
pr_err("%s: Right Channel spkr gpio request"
" failed\n", __func__);
return rc;
}
gpio_direction_output(SNDDEV_GPIO_CLASS_D1_EN, 1);
gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D1_EN, 1);
} else {
gpio_set_value_cansleep(SNDDEV_GPIO_CLASS_D1_EN, 0);
gpio_free(SNDDEV_GPIO_CLASS_D1_EN);
}
return 0;
}
static atomic_t pamp_ref_cnt;
static int msm_snddev_poweramp_on(void)
{
int rc;
if (atomic_inc_return(&pamp_ref_cnt) > 1)
return 0;
pr_debug("%s: enable stereo spkr amp\n", __func__);
rc = config_class_d0_gpio(1);
if (rc) {
pr_err("%s: d0 gpio configuration failed\n", __func__);
goto config_gpio_fail;
}
rc = config_class_d1_gpio(1);
if (rc) {
pr_err("%s: d1 gpio configuration failed\n", __func__);
goto config_gpio_fail;
}
config_gpio_fail:
return rc;
}
static void msm_snddev_poweramp_off(void)
{
if (atomic_dec_return(&pamp_ref_cnt) == 0) {
pr_debug("%s: disable stereo spkr amp\n", __func__);
config_class_d0_gpio(0);
config_class_d1_gpio(0);
msleep(30);
}
}
/* Regulator 8058_l10 supplies regulator 8058_ncp. */
static struct regulator *snddev_reg_ncp;
static struct regulator *snddev_reg_l10;
static atomic_t preg_ref_cnt;
static int msm_snddev_voltage_on(void)
{
int rc;
pr_debug("%s\n", __func__);
if (atomic_inc_return(&preg_ref_cnt) > 1)
return 0;
snddev_reg_l10 = regulator_get(NULL, "8058_l10");
if (IS_ERR(snddev_reg_l10)) {
pr_err("%s: regulator_get(%s) failed (%ld)\n", __func__,
"l10", PTR_ERR(snddev_reg_l10));
return -EBUSY;
}
rc = regulator_set_voltage(snddev_reg_l10, 2600000, 2600000);
if (rc < 0)
pr_err("%s: regulator_set_voltage(l10) failed (%d)\n",
__func__, rc);
rc = regulator_enable(snddev_reg_l10);
if (rc < 0)
pr_err("%s: regulator_enable(l10) failed (%d)\n", __func__, rc);
snddev_reg_ncp = regulator_get(NULL, "8058_ncp");
if (IS_ERR(snddev_reg_ncp)) {
pr_err("%s: regulator_get(%s) failed (%ld)\n", __func__,
"ncp", PTR_ERR(snddev_reg_ncp));
return -EBUSY;
}
rc = regulator_set_voltage(snddev_reg_ncp, 1800000, 1800000);
if (rc < 0) {
pr_err("%s: regulator_set_voltage(ncp) failed (%d)\n",
__func__, rc);
goto regulator_fail;
}
rc = regulator_enable(snddev_reg_ncp);
if (rc < 0) {
pr_err("%s: regulator_enable(ncp) failed (%d)\n", __func__, rc);
goto regulator_fail;
}
return rc;
regulator_fail:
regulator_put(snddev_reg_ncp);
snddev_reg_ncp = NULL;
return rc;
}
static void msm_snddev_voltage_off(void)
{
int rc;
pr_debug("%s\n", __func__);
if (!snddev_reg_ncp)
goto done;
if (atomic_dec_return(&preg_ref_cnt) == 0) {
rc = regulator_disable(snddev_reg_ncp);
if (rc < 0)
pr_err("%s: regulator_disable(ncp) failed (%d)\n",
__func__, rc);
regulator_put(snddev_reg_ncp);
snddev_reg_ncp = NULL;
}
done:
if (!snddev_reg_l10)
return;
rc = regulator_disable(snddev_reg_l10);
if (rc < 0)
pr_err("%s: regulator_disable(l10) failed (%d)\n",
__func__, rc);
regulator_put(snddev_reg_l10);
snddev_reg_l10 = NULL;
}
static int msm_snddev_enable_amic_power(void)
{
int ret = 0;
#ifdef CONFIG_PMIC8058_OTHC
if (machine_is_msm8x60_fluid()) {
ret = pm8058_micbias_enable(OTHC_MICBIAS_0,
OTHC_SIGNAL_ALWAYS_ON);
if (ret)
pr_err("%s: Enabling amic power failed\n", __func__);
ret = gpio_request(SNDDEV_GPIO_MIC2_ANCR_SEL, "MIC2_ANCR_SEL");
if (ret) {
pr_err("%s: spkr pamp gpio %d request failed\n",
__func__, SNDDEV_GPIO_MIC2_ANCR_SEL);
return ret;
}
gpio_direction_output(SNDDEV_GPIO_MIC2_ANCR_SEL, 0);
ret = gpio_request(SNDDEV_GPIO_MIC1_ANCL_SEL, "MIC1_ANCL_SEL");
if (ret) {
pr_err("%s: mic1 ancl gpio %d request failed\n",
__func__, SNDDEV_GPIO_MIC1_ANCL_SEL);
gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL);
return ret;
}
gpio_direction_output(SNDDEV_GPIO_MIC1_ANCL_SEL, 0);
} else {
ret = pm8058_micbias_enable(OTHC_MICBIAS_2,
OTHC_SIGNAL_ALWAYS_ON);
if (ret)
pr_err("%s: Enabling amic power failed\n", __func__);
}
#endif
return ret;
}
static void msm_snddev_disable_amic_power(void)
{
#ifdef CONFIG_PMIC8058_OTHC
int ret;
if (machine_is_msm8x60_fluid()) {
ret = pm8058_micbias_enable(OTHC_MICBIAS_0,
OTHC_SIGNAL_OFF);
gpio_free(SNDDEV_GPIO_MIC1_ANCL_SEL);
gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL);
} else
ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF);
if (ret)
pr_err("%s: Disabling amic power failed\n", __func__);
#endif
}
static int msm_snddev_enable_anc_power(void)
{
int ret = 0;
#ifdef CONFIG_PMIC8058_OTHC
ret = pm8058_micbias_enable(OTHC_MICBIAS_2,
OTHC_SIGNAL_ALWAYS_ON);
if (ret)
pr_err("%s: Enabling anc micbias 2 failed\n", __func__);
if (machine_is_msm8x60_fluid()) {
ret = pm8058_micbias_enable(OTHC_MICBIAS_0,
OTHC_SIGNAL_ALWAYS_ON);
if (ret)
pr_err("%s: Enabling anc micbias 0 failed\n", __func__);
ret = gpio_request(SNDDEV_GPIO_MIC2_ANCR_SEL, "MIC2_ANCR_SEL");
if (ret) {
pr_err("%s: mic2 ancr gpio %d request failed\n",
__func__, SNDDEV_GPIO_MIC2_ANCR_SEL);
return ret;
}
gpio_direction_output(SNDDEV_GPIO_MIC2_ANCR_SEL, 1);
ret = gpio_request(SNDDEV_GPIO_MIC1_ANCL_SEL, "MIC1_ANCL_SEL");
if (ret) {
pr_err("%s: mic1 ancl gpio %d request failed\n",
__func__, SNDDEV_GPIO_MIC1_ANCL_SEL);
gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL);
return ret;
}
gpio_direction_output(SNDDEV_GPIO_MIC1_ANCL_SEL, 1);
}
#endif
return ret;
}
static void msm_snddev_disable_anc_power(void)
{
#ifdef CONFIG_PMIC8058_OTHC
int ret;
ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF);
if (machine_is_msm8x60_fluid()) {
ret |= pm8058_micbias_enable(OTHC_MICBIAS_0,
OTHC_SIGNAL_OFF);
gpio_free(SNDDEV_GPIO_MIC2_ANCR_SEL);
gpio_free(SNDDEV_GPIO_MIC1_ANCL_SEL);
}
if (ret)
pr_err("%s: Disabling anc power failed\n", __func__);
#endif
}
static int msm_snddev_enable_amic_sec_power(void)
{
#ifdef CONFIG_PMIC8058_OTHC
int ret;
if (machine_is_msm8x60_fluid()) {
ret = pm8058_micbias_enable(OTHC_MICBIAS_2,
OTHC_SIGNAL_ALWAYS_ON);
if (ret)
pr_err("%s: Enabling amic2 power failed\n", __func__);
ret = gpio_request(SNDDEV_GPIO_HS_MIC4_SEL,
"HS_MIC4_SEL");
if (ret) {
pr_err("%s: spkr pamp gpio %d request failed\n",
__func__, SNDDEV_GPIO_HS_MIC4_SEL);
return ret;
}
gpio_direction_output(SNDDEV_GPIO_HS_MIC4_SEL, 1);
}
#endif
msm_snddev_enable_amic_power();
return 0;
}
static void msm_snddev_disable_amic_sec_power(void)
{
#ifdef CONFIG_PMIC8058_OTHC
int ret;
if (machine_is_msm8x60_fluid()) {
ret = pm8058_micbias_enable(OTHC_MICBIAS_2,
OTHC_SIGNAL_OFF);
if (ret)
pr_err("%s: Disabling amic2 power failed\n", __func__);
gpio_free(SNDDEV_GPIO_HS_MIC4_SEL);
}
#endif
msm_snddev_disable_amic_power();
}
static int msm_snddev_enable_dmic_sec_power(void)
{
int ret;
ret = msm_snddev_enable_dmic_power();
if (ret) {
pr_err("%s: Error: Enabling dmic power failed\n", __func__);
return ret;
}
#ifdef CONFIG_PMIC8058_OTHC
ret = pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_ALWAYS_ON);
if (ret) {
pr_err("%s: Error: Enabling micbias failed\n", __func__);
msm_snddev_disable_dmic_power();
return ret;
}
#endif
return 0;
}
static void msm_snddev_disable_dmic_sec_power(void)
{
msm_snddev_disable_dmic_power();
#ifdef CONFIG_PMIC8058_OTHC
pm8058_micbias_enable(OTHC_MICBIAS_2, OTHC_SIGNAL_OFF);
#endif
}
static struct adie_codec_action_unit iearpiece_48KHz_osr256_actions[] =
EAR_PRI_MONO_8000_OSR_256;
static struct adie_codec_hwsetting_entry iearpiece_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = iearpiece_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(iearpiece_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile iearpiece_profile = {
.path_type = ADIE_CODEC_RX,
.settings = iearpiece_settings,
.setting_sz = ARRAY_SIZE(iearpiece_settings),
};
static struct snddev_icodec_data snddev_iearpiece_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "handset_rx",
.copp_id = 0,
.profile = &iearpiece_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
};
static struct platform_device msm_iearpiece_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_iearpiece_data },
};
static struct adie_codec_action_unit imic_48KHz_osr256_actions[] =
AMIC_PRI_MONO_OSR_256;
static struct adie_codec_hwsetting_entry imic_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = imic_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(imic_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile imic_profile = {
.path_type = ADIE_CODEC_TX,
.settings = imic_settings,
.setting_sz = ARRAY_SIZE(imic_settings),
};
static struct snddev_icodec_data snddev_imic_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_tx",
.copp_id = 1,
.profile = &imic_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
};
static struct platform_device msm_imic_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_imic_data },
};
static struct snddev_icodec_data snddev_fluid_ispkr_mic_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_mono_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &imic_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
};
static struct platform_device msm_fluid_ispkr_mic_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_fluid_ispkr_mic_data },
};
static struct adie_codec_action_unit headset_ab_cpls_48KHz_osr256_actions[] =
HEADSET_AB_CPLS_48000_OSR_256;
static struct adie_codec_hwsetting_entry headset_ab_cpls_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = headset_ab_cpls_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(headset_ab_cpls_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile headset_ab_cpls_profile = {
.path_type = ADIE_CODEC_RX,
.settings = headset_ab_cpls_settings,
.setting_sz = ARRAY_SIZE(headset_ab_cpls_settings),
};
static struct snddev_icodec_data snddev_ihs_stereo_rx_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "headset_stereo_rx",
.copp_id = 0,
.profile = &headset_ab_cpls_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
};
static struct platform_device msm_headset_stereo_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_ihs_stereo_rx_data },
};
static struct adie_codec_action_unit headset_anc_48KHz_osr256_actions[] =
ANC_HEADSET_CPLS_AMIC1_AUXL_RX1_48000_OSR_256;
static struct adie_codec_hwsetting_entry headset_anc_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = headset_anc_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(headset_anc_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile headset_anc_profile = {
.path_type = ADIE_CODEC_RX,
.settings = headset_anc_settings,
.setting_sz = ARRAY_SIZE(headset_anc_settings),
};
static struct snddev_icodec_data snddev_anc_headset_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_ANC),
.name = "anc_headset_stereo_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &headset_anc_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_anc_power,
.pamp_off = msm_snddev_disable_anc_power,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
};
static struct platform_device msm_anc_headset_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_anc_headset_data },
};
static struct adie_codec_action_unit ispkr_stereo_48KHz_osr256_actions[] =
SPEAKER_PRI_STEREO_48000_OSR_256;
static struct adie_codec_hwsetting_entry ispkr_stereo_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ispkr_stereo_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(ispkr_stereo_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile ispkr_stereo_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ispkr_stereo_settings,
.setting_sz = ARRAY_SIZE(ispkr_stereo_settings),
};
static struct snddev_icodec_data snddev_ispkr_stereo_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "speaker_stereo_rx",
.copp_id = 0,
.profile = &ispkr_stereo_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
};
static struct platform_device msm_ispkr_stereo_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_ispkr_stereo_data },
};
static struct adie_codec_action_unit idmic_mono_48KHz_osr256_actions[] =
DMIC1_PRI_MONO_OSR_256;
static struct adie_codec_hwsetting_entry idmic_mono_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = idmic_mono_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(idmic_mono_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile idmic_mono_profile = {
.path_type = ADIE_CODEC_TX,
.settings = idmic_mono_settings,
.setting_sz = ARRAY_SIZE(idmic_mono_settings),
};
static struct snddev_icodec_data snddev_ispkr_mic_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_mono_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &idmic_mono_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
};
static struct platform_device msm_ispkr_mic_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_ispkr_mic_data },
};
static struct adie_codec_action_unit iearpiece_ffa_48KHz_osr256_actions[] =
EAR_PRI_MONO_8000_OSR_256;
static struct adie_codec_hwsetting_entry iearpiece_ffa_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = iearpiece_ffa_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE(iearpiece_ffa_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile iearpiece_ffa_profile = {
.path_type = ADIE_CODEC_RX,
.settings = iearpiece_ffa_settings,
.setting_sz = ARRAY_SIZE(iearpiece_ffa_settings),
};
static struct snddev_icodec_data snddev_iearpiece_ffa_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "handset_rx",
.copp_id = 0,
.profile = &iearpiece_ffa_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
};
static struct platform_device msm_iearpiece_ffa_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_iearpiece_ffa_data },
};
static struct snddev_icodec_data snddev_imic_ffa_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &idmic_mono_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
};
static struct platform_device msm_imic_ffa_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_imic_ffa_data },
};
static struct adie_codec_action_unit dual_mic_endfire_8KHz_osr256_actions[] =
DMIC1_PRI_STEREO_OSR_256;
static struct adie_codec_hwsetting_entry dual_mic_endfire_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = dual_mic_endfire_8KHz_osr256_actions,
.action_sz = ARRAY_SIZE(dual_mic_endfire_8KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile dual_mic_endfire_profile = {
.path_type = ADIE_CODEC_TX,
.settings = dual_mic_endfire_settings,
.setting_sz = ARRAY_SIZE(dual_mic_endfire_settings),
};
static struct snddev_icodec_data snddev_dual_mic_endfire_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_dual_mic_endfire_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &dual_mic_endfire_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
};
static struct platform_device msm_hs_dual_mic_endfire_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_dual_mic_endfire_data },
};
static struct snddev_icodec_data snddev_dual_mic_spkr_endfire_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_dual_mic_endfire_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &dual_mic_endfire_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
};
static struct platform_device msm_spkr_dual_mic_endfire_device = {
.name = "snddev_icodec",
.id = 15,
.dev = { .platform_data = &snddev_dual_mic_spkr_endfire_data },
};
static struct adie_codec_action_unit dual_mic_broadside_8osr256_actions[] =
HS_DMIC2_STEREO_OSR_256;
static struct adie_codec_hwsetting_entry dual_mic_broadside_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = dual_mic_broadside_8osr256_actions,
.action_sz = ARRAY_SIZE(dual_mic_broadside_8osr256_actions),
}
};
static struct adie_codec_dev_profile dual_mic_broadside_profile = {
.path_type = ADIE_CODEC_TX,
.settings = dual_mic_broadside_settings,
.setting_sz = ARRAY_SIZE(dual_mic_broadside_settings),
};
static struct snddev_icodec_data snddev_hs_dual_mic_broadside_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_dual_mic_broadside_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &dual_mic_broadside_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_sec_power,
.pamp_off = msm_snddev_disable_dmic_sec_power,
};
static struct platform_device msm_hs_dual_mic_broadside_device = {
.name = "snddev_icodec",
.id = 21,
.dev = { .platform_data = &snddev_hs_dual_mic_broadside_data },
};
static struct snddev_icodec_data snddev_spkr_dual_mic_broadside_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_dual_mic_broadside_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &dual_mic_broadside_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_sec_power,
.pamp_off = msm_snddev_disable_dmic_sec_power,
};
static struct platform_device msm_spkr_dual_mic_broadside_device = {
.name = "snddev_icodec",
.id = 18,
.dev = { .platform_data = &snddev_spkr_dual_mic_broadside_data },
};
static struct adie_codec_action_unit
fluid_dual_mic_endfire_8KHz_osr256_actions[] =
FLUID_AMIC_DUAL_8000_OSR_256;
static struct adie_codec_hwsetting_entry fluid_dual_mic_endfire_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = fluid_dual_mic_endfire_8KHz_osr256_actions,
.action_sz =
ARRAY_SIZE(fluid_dual_mic_endfire_8KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile fluid_dual_mic_endfire_profile = {
.path_type = ADIE_CODEC_TX,
.settings = fluid_dual_mic_endfire_settings,
.setting_sz = ARRAY_SIZE(fluid_dual_mic_endfire_settings),
};
static struct snddev_icodec_data snddev_fluid_dual_mic_endfire_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_dual_mic_endfire_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &fluid_dual_mic_endfire_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_sec_power,
.pamp_off = msm_snddev_disable_amic_sec_power,
};
static struct platform_device msm_fluid_hs_dual_mic_endfire_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_fluid_dual_mic_endfire_data },
};
static struct snddev_icodec_data snddev_fluid_dual_mic_spkr_endfire_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_dual_mic_endfire_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &fluid_dual_mic_endfire_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_sec_power,
.pamp_off = msm_snddev_disable_amic_sec_power,
};
static struct platform_device msm_fluid_spkr_dual_mic_endfire_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_fluid_dual_mic_spkr_endfire_data },
};
static struct adie_codec_action_unit
fluid_dual_mic_broadside_8KHz_osr256_actions[] =
FLUID_AMIC_DUAL_BROADSIDE_8000_OSR_256;
static struct adie_codec_hwsetting_entry fluid_dual_mic_broadside_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = fluid_dual_mic_broadside_8KHz_osr256_actions,
.action_sz =
ARRAY_SIZE(fluid_dual_mic_broadside_8KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile fluid_dual_mic_broadside_profile = {
.path_type = ADIE_CODEC_TX,
.settings = fluid_dual_mic_broadside_settings,
.setting_sz = ARRAY_SIZE(fluid_dual_mic_broadside_settings),
};
static struct snddev_icodec_data snddev_fluid_dual_mic_broadside_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_dual_mic_broadside_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &fluid_dual_mic_broadside_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
};
static struct platform_device msm_fluid_hs_dual_mic_broadside_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_fluid_dual_mic_broadside_data },
};
static struct snddev_icodec_data snddev_fluid_dual_mic_spkr_broadside_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "speaker_dual_mic_broadside_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &fluid_dual_mic_broadside_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
};
static struct platform_device msm_fluid_spkr_dual_mic_broadside_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_fluid_dual_mic_spkr_broadside_data },
};
static struct snddev_hdmi_data snddev_hdmi_stereo_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "hdmi_stereo_rx",
.copp_id = HDMI_RX,
.channel_mode = 0,
.default_sample_rate = 48000,
};
static struct platform_device msm_snddev_hdmi_stereo_rx_device = {
.name = "snddev_hdmi",
.dev = { .platform_data = &snddev_hdmi_stereo_rx_data },
};
static struct snddev_mi2s_data snddev_mi2s_fm_tx_data = {
.capability = SNDDEV_CAP_TX ,
.name = "fmradio_stereo_tx",
.copp_id = MI2S_TX,
.channel_mode = 2, /* stereo */
.sd_lines = MI2S_SD3, /* sd3 */
.sample_rate = 48000,
};
static struct platform_device msm_mi2s_fm_tx_device = {
.name = "snddev_mi2s",
.dev = { .platform_data = &snddev_mi2s_fm_tx_data },
};
static struct snddev_mi2s_data snddev_mi2s_fm_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "fmradio_stereo_rx",
.copp_id = MI2S_RX,
.channel_mode = 2, /* stereo */
.sd_lines = MI2S_SD3, /* sd3 */
.sample_rate = 48000,
};
static struct platform_device msm_mi2s_fm_rx_device = {
.name = "snddev_mi2s",
.id = 1,
.dev = { .platform_data = &snddev_mi2s_fm_rx_data },
};
static struct adie_codec_action_unit iheadset_mic_tx_osr256_actions[] =
HEADSET_AMIC2_TX_MONO_PRI_OSR_256;
static struct adie_codec_hwsetting_entry iheadset_mic_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = iheadset_mic_tx_osr256_actions,
.action_sz = ARRAY_SIZE(iheadset_mic_tx_osr256_actions),
}
};
static struct adie_codec_dev_profile iheadset_mic_profile = {
.path_type = ADIE_CODEC_TX,
.settings = iheadset_mic_tx_settings,
.setting_sz = ARRAY_SIZE(iheadset_mic_tx_settings),
};
static struct snddev_icodec_data snddev_headset_mic_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "headset_mono_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &iheadset_mic_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
};
static struct platform_device msm_headset_mic_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_headset_mic_data },
};
static struct adie_codec_action_unit
ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions[] =
SPEAKER_HPH_AB_CPL_PRI_STEREO_48000_OSR_256;
static struct adie_codec_hwsetting_entry
ihs_stereo_speaker_stereo_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions,
.action_sz =
ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_48KHz_osr256_actions),
}
};
static struct adie_codec_dev_profile ihs_stereo_speaker_stereo_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ihs_stereo_speaker_stereo_rx_settings,
.setting_sz = ARRAY_SIZE(ihs_stereo_speaker_stereo_rx_settings),
};
static struct snddev_icodec_data snddev_ihs_stereo_speaker_stereo_rx_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "headset_stereo_speaker_stereo_rx",
.copp_id = 0,
.profile = &ihs_stereo_speaker_stereo_rx_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
};
static struct platform_device msm_ihs_stereo_speaker_stereo_rx_device = {
.name = "snddev_icodec",
.id = 22,
.dev = { .platform_data = &snddev_ihs_stereo_speaker_stereo_rx_data },
};
/* define the value for BT_SCO */
static struct snddev_ecodec_data snddev_bt_sco_earpiece_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "bt_sco_rx",
.copp_id = PCM_RX,
.channel_mode = 1,
};
static struct snddev_ecodec_data snddev_bt_sco_mic_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "bt_sco_tx",
.copp_id = PCM_TX,
.channel_mode = 1,
};
struct platform_device msm_bt_sco_earpiece_device = {
.name = "msm_snddev_ecodec",
.dev = { .platform_data = &snddev_bt_sco_earpiece_data },
};
struct platform_device msm_bt_sco_mic_device = {
.name = "msm_snddev_ecodec",
.dev = { .platform_data = &snddev_bt_sco_mic_data },
};
static struct adie_codec_action_unit itty_mono_tx_actions[] =
TTY_HEADSET_MONO_TX_OSR_256;
static struct adie_codec_hwsetting_entry itty_mono_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = itty_mono_tx_actions,
.action_sz = ARRAY_SIZE(itty_mono_tx_actions),
},
};
static struct adie_codec_dev_profile itty_mono_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = itty_mono_tx_settings,
.setting_sz = ARRAY_SIZE(itty_mono_tx_settings),
};
static struct snddev_icodec_data snddev_itty_mono_tx_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY),
.name = "tty_headset_mono_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &itty_mono_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
};
static struct platform_device msm_itty_mono_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_itty_mono_tx_data },
};
static struct adie_codec_action_unit itty_mono_rx_actions[] =
TTY_HEADSET_MONO_RX_8000_OSR_256;
static struct adie_codec_hwsetting_entry itty_mono_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = itty_mono_rx_actions,
.action_sz = ARRAY_SIZE(itty_mono_rx_actions),
},
};
static struct adie_codec_dev_profile itty_mono_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = itty_mono_rx_settings,
.setting_sz = ARRAY_SIZE(itty_mono_rx_settings),
};
static struct snddev_icodec_data snddev_itty_mono_rx_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE | SNDDEV_CAP_TTY),
.name = "tty_headset_mono_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &itty_mono_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
};
static struct platform_device msm_itty_mono_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_itty_mono_rx_data },
};
static struct adie_codec_action_unit linein_pri_actions[] =
LINEIN_PRI_STEREO_OSR_256;
static struct adie_codec_hwsetting_entry linein_pri_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = linein_pri_actions,
.action_sz = ARRAY_SIZE(linein_pri_actions),
},
};
static struct adie_codec_dev_profile linein_pri_profile = {
.path_type = ADIE_CODEC_TX,
.settings = linein_pri_settings,
.setting_sz = ARRAY_SIZE(linein_pri_settings),
};
static struct snddev_icodec_data snddev_linein_pri_data = {
.capability = SNDDEV_CAP_TX,
.name = "linein_pri_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &linein_pri_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
};
static struct platform_device msm_linein_pri_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_linein_pri_data },
};
static struct adie_codec_action_unit auxpga_lp_lo_actions[] =
LB_AUXPGA_LO_STEREO;
static struct adie_codec_hwsetting_entry auxpga_lp_lo_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = auxpga_lp_lo_actions,
.action_sz = ARRAY_SIZE(auxpga_lp_lo_actions),
},
};
static struct adie_codec_dev_profile auxpga_lp_lo_profile = {
.path_type = ADIE_CODEC_LB,
.settings = auxpga_lp_lo_settings,
.setting_sz = ARRAY_SIZE(auxpga_lp_lo_settings),
};
static struct snddev_icodec_data snddev_auxpga_lp_lo_data = {
.capability = SNDDEV_CAP_LB,
.name = "speaker_stereo_lb",
.copp_id = PRIMARY_I2S_RX,
.profile = &auxpga_lp_lo_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_ANALOG,
};
static struct platform_device msm_auxpga_lp_lo_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_auxpga_lp_lo_data },
};
static struct adie_codec_action_unit auxpga_lp_hs_actions[] =
LB_AUXPGA_HPH_AB_CPLS_STEREO;
static struct adie_codec_hwsetting_entry auxpga_lp_hs_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = auxpga_lp_hs_actions,
.action_sz = ARRAY_SIZE(auxpga_lp_hs_actions),
},
};
static struct adie_codec_dev_profile auxpga_lp_hs_profile = {
.path_type = ADIE_CODEC_LB,
.settings = auxpga_lp_hs_settings,
.setting_sz = ARRAY_SIZE(auxpga_lp_hs_settings),
};
static struct snddev_icodec_data snddev_auxpga_lp_hs_data = {
.capability = SNDDEV_CAP_LB,
.name = "hs_stereo_lb",
.copp_id = PRIMARY_I2S_RX,
.profile = &auxpga_lp_hs_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_ANALOG,
};
static struct platform_device msm_auxpga_lp_hs_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &snddev_auxpga_lp_hs_data },
};
#ifdef CONFIG_MSM8X60_FTM_AUDIO_DEVICES
static struct adie_codec_action_unit ftm_headset_mono_rx_actions[] =
HPH_PRI_AB_CPLS_MONO;
static struct adie_codec_hwsetting_entry ftm_headset_mono_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_mono_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_mono_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_mono_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_mono_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_mono_rx_settings),
};
static struct snddev_icodec_data ftm_headset_mono_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_mono_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_mono_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_mono_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_mono_rx_data},
};
static struct adie_codec_action_unit ftm_headset_mono_diff_rx_actions[] =
HEADSET_MONO_DIFF_RX;
static struct adie_codec_hwsetting_entry ftm_headset_mono_diff_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_mono_diff_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_mono_diff_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_mono_diff_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_mono_diff_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_mono_diff_rx_settings),
};
static struct snddev_icodec_data ftm_headset_mono_diff_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_mono_diff_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_mono_diff_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_mono_diff_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_mono_diff_rx_data},
};
static struct adie_codec_action_unit ftm_spkr_mono_rx_actions[] =
SPEAKER_PRI_STEREO_48000_OSR_256;
static struct adie_codec_hwsetting_entry ftm_spkr_mono_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_mono_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_mono_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_mono_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_mono_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_mono_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_mono_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spkr_mono_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_mono_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spkr_mono_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_mono_rx_data},
};
static struct adie_codec_action_unit ftm_spkr_l_rx_actions[] =
FTM_SPKR_L_RX;
static struct adie_codec_hwsetting_entry ftm_spkr_l_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_l_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_l_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_l_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_l_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_l_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_l_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spkr_l_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_l_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spkr_l_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_l_rx_data},
};
static struct adie_codec_action_unit ftm_spkr_r_rx_actions[] =
SPKR_R_RX;
static struct adie_codec_hwsetting_entry ftm_spkr_r_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_r_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_r_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_r_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_r_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_r_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_r_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spkr_r_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_r_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spkr_r_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_r_rx_data},
};
static struct adie_codec_action_unit ftm_spkr_mono_diff_rx_actions[] =
SPKR_MONO_DIFF_RX;
static struct adie_codec_hwsetting_entry ftm_spkr_mono_diff_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_mono_diff_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_mono_diff_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_mono_diff_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_mono_diff_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_mono_diff_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_mono_diff_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spkr_mono_diff_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_mono_diff_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spkr_mono_diff_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_mono_diff_rx_data},
};
static struct adie_codec_action_unit ftm_headset_mono_l_rx_actions[] =
HPH_PRI_AB_CPLS_MONO_LEFT;
static struct adie_codec_hwsetting_entry ftm_headset_mono_l_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_mono_l_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_mono_l_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_mono_l_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_mono_l_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_mono_l_rx_settings),
};
static struct snddev_icodec_data ftm_headset_mono_l_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_mono_l_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_mono_l_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_mono_l_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_mono_l_rx_data},
};
static struct adie_codec_action_unit ftm_headset_mono_r_rx_actions[] =
HPH_PRI_AB_CPLS_MONO_RIGHT;
static struct adie_codec_hwsetting_entry ftm_headset_mono_r_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_mono_r_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_mono_r_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_mono_r_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_mono_r_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_mono_r_rx_settings),
};
static struct snddev_icodec_data ftm_headset_mono_r_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_mono_r_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_mono_r_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_mono_r_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_mono_r_rx_data},
};
static struct adie_codec_action_unit ftm_linein_l_tx_actions[] =
LINEIN_MONO_L_TX;
static struct adie_codec_hwsetting_entry ftm_linein_l_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_linein_l_tx_actions,
.action_sz = ARRAY_SIZE(ftm_linein_l_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_linein_l_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_linein_l_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_linein_l_tx_settings),
};
static struct snddev_icodec_data ftm_linein_l_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_linein_l_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_linein_l_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_linein_l_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_linein_l_tx_data },
};
static struct adie_codec_action_unit ftm_linein_r_tx_actions[] =
LINEIN_MONO_R_TX;
static struct adie_codec_hwsetting_entry ftm_linein_r_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_linein_r_tx_actions,
.action_sz = ARRAY_SIZE(ftm_linein_r_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_linein_r_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_linein_r_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_linein_r_tx_settings),
};
static struct snddev_icodec_data ftm_linein_r_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_linein_r_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_linein_r_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_linein_r_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_linein_r_tx_data },
};
static struct adie_codec_action_unit ftm_aux_out_rx_actions[] =
AUX_OUT_RX;
static struct adie_codec_hwsetting_entry ftm_aux_out_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_aux_out_rx_actions,
.action_sz = ARRAY_SIZE(ftm_aux_out_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_aux_out_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_aux_out_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_aux_out_rx_settings),
};
static struct snddev_icodec_data ftm_aux_out_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_aux_out_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_aux_out_rx_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_aux_out_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_aux_out_rx_data},
};
static struct adie_codec_action_unit ftm_dmic1_left_tx_actions[] =
DMIC1_LEFT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic1_left_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic1_left_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic1_left_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic1_left_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic1_left_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic1_left_tx_settings),
};
static struct snddev_icodec_data ftm_dmic1_left_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic1_left_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic1_left_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic1_left_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic1_left_tx_data},
};
static struct adie_codec_action_unit ftm_dmic1_right_tx_actions[] =
DMIC1_RIGHT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic1_right_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic1_right_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic1_right_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic1_right_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic1_right_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic1_right_tx_settings),
};
static struct snddev_icodec_data ftm_dmic1_right_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic1_right_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic1_right_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic1_right_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic1_right_tx_data},
};
static struct adie_codec_action_unit ftm_dmic1_l_and_r_tx_actions[] =
DMIC1_LEFT_AND_RIGHT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic1_l_and_r_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic1_l_and_r_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic1_l_and_r_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic1_l_and_r_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic1_l_and_r_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic1_l_and_r_tx_settings),
};
static struct snddev_icodec_data ftm_dmic1_l_and_r_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic1_l_and_r_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic1_l_and_r_tx_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic1_l_and_r_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic1_l_and_r_tx_data},
};
static struct adie_codec_action_unit ftm_dmic2_left_tx_actions[] =
DMIC2_LEFT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic2_left_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic2_left_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic2_left_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic2_left_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic2_left_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic2_left_tx_settings),
};
static struct snddev_icodec_data ftm_dmic2_left_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic2_left_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic2_left_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic2_left_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic2_left_tx_data },
};
static struct adie_codec_action_unit ftm_dmic2_right_tx_actions[] =
DMIC2_RIGHT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic2_right_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic2_right_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic2_right_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic2_right_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic2_right_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic2_right_tx_settings),
};
static struct snddev_icodec_data ftm_dmic2_right_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic2_right_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic2_right_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic2_right_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic2_right_tx_data },
};
static struct adie_codec_action_unit ftm_dmic2_l_and_r_tx_actions[] =
DMIC2_LEFT_AND_RIGHT_TX;
static struct adie_codec_hwsetting_entry ftm_dmic2_l_and_r_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_dmic2_l_and_r_tx_actions,
.action_sz = ARRAY_SIZE(ftm_dmic2_l_and_r_tx_actions),
},
};
static struct adie_codec_dev_profile ftm_dmic2_l_and_r_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_dmic2_l_and_r_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_dmic2_l_and_r_tx_settings),
};
static struct snddev_icodec_data ftm_dmic2_l_and_r_tx_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_dmic2_l_and_r_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_dmic2_l_and_r_tx_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_dmic_power,
.pamp_off = msm_snddev_disable_dmic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_dmic2_l_and_r_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_dmic2_l_and_r_tx_data},
};
static struct adie_codec_action_unit ftm_handset_mic1_aux_in_actions[] =
HANDSET_MIC1_AUX_IN;
static struct adie_codec_hwsetting_entry ftm_handset_mic1_aux_in_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_handset_mic1_aux_in_actions,
.action_sz = ARRAY_SIZE(ftm_handset_mic1_aux_in_actions),
},
};
static struct adie_codec_dev_profile ftm_handset_mic1_aux_in_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_handset_mic1_aux_in_settings,
.setting_sz = ARRAY_SIZE(ftm_handset_mic1_aux_in_settings),
};
static struct snddev_icodec_data ftm_handset_mic1_aux_in_data = {
.capability = SNDDEV_CAP_TX,
.name = "ftm_handset_mic1_aux_in",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_handset_mic1_aux_in_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
/* Assumption is that inputs are not tied to analog mic, so
* no need to enable mic bias.
*/
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_handset_mic1_aux_in_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_handset_mic1_aux_in_data},
};
static struct snddev_mi2s_data snddev_mi2s_sd0_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "mi2s_sd0_rx",
.copp_id = MI2S_RX,
.channel_mode = 2, /* stereo */
.sd_lines = MI2S_SD0, /* sd0 */
.sample_rate = 48000,
};
static struct platform_device ftm_mi2s_sd0_rx_device = {
.name = "snddev_mi2s",
.dev = { .platform_data = &snddev_mi2s_sd0_rx_data },
};
static struct snddev_mi2s_data snddev_mi2s_sd1_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "mi2s_sd1_rx",
.copp_id = MI2S_RX,
.channel_mode = 2, /* stereo */
.sd_lines = MI2S_SD1, /* sd1 */
.sample_rate = 48000,
};
static struct platform_device ftm_mi2s_sd1_rx_device = {
.name = "snddev_mi2s",
.dev = { .platform_data = &snddev_mi2s_sd1_rx_data },
};
static struct snddev_mi2s_data snddev_mi2s_sd2_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "mi2s_sd2_rx",
.copp_id = MI2S_RX,
.channel_mode = 2, /* stereo */
.sd_lines = MI2S_SD2, /* sd2 */
.sample_rate = 48000,
};
static struct platform_device ftm_mi2s_sd2_rx_device = {
.name = "snddev_mi2s",
.dev = { .platform_data = &snddev_mi2s_sd2_rx_data },
};
/* earpiece */
static struct adie_codec_action_unit ftm_handset_adie_lp_rx_actions[] =
EAR_PRI_MONO_LB;
static struct adie_codec_hwsetting_entry ftm_handset_adie_lp_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_handset_adie_lp_rx_actions,
.action_sz = ARRAY_SIZE(ftm_handset_adie_lp_rx_actions),
}
};
static struct adie_codec_dev_profile ftm_handset_adie_lp_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_handset_adie_lp_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_handset_adie_lp_rx_settings),
};
static struct snddev_icodec_data ftm_handset_adie_lp_rx_data = {
.capability = (SNDDEV_CAP_RX | SNDDEV_CAP_VOICE),
.name = "ftm_handset_adie_lp_rx",
.copp_id = 0,
.profile = &ftm_handset_adie_lp_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_handset_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_handset_adie_lp_rx_data },
};
static struct adie_codec_action_unit ftm_headset_l_adie_lp_rx_actions[] =
FTM_HPH_PRI_AB_CPLS_MONO_LB_LEFT;
static struct adie_codec_hwsetting_entry ftm_headset_l_adie_lp_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_l_adie_lp_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_l_adie_lp_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_l_adie_lp_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_l_adie_lp_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_l_adie_lp_rx_settings),
};
static struct snddev_icodec_data ftm_headset_l_adie_lp_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_l_adie_lp_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_l_adie_lp_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_l_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_l_adie_lp_rx_data },
};
static struct adie_codec_action_unit ftm_headset_r_adie_lp_rx_actions[] =
FTM_HPH_PRI_AB_CPLS_MONO_LB_RIGHT;
static struct adie_codec_hwsetting_entry ftm_headset_r_adie_lp_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_r_adie_lp_rx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_r_adie_lp_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_headset_r_adie_lp_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_headset_r_adie_lp_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_r_adie_lp_rx_settings),
};
static struct snddev_icodec_data ftm_headset_r_adie_lp_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_headset_r_adie_lp_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_headset_r_adie_lp_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.voltage_on = msm_snddev_voltage_on,
.voltage_off = msm_snddev_voltage_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_r_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_r_adie_lp_rx_data },
};
static struct adie_codec_action_unit ftm_spkr_l_rx_lp_actions[] =
FTM_SPKR_L_RX;
static struct adie_codec_hwsetting_entry ftm_spkr_l_rx_lp_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_l_rx_lp_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_l_rx_lp_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_l_rx_lp_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_l_rx_lp_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_l_rx_lp_settings),
};
static struct snddev_icodec_data ftm_spkr_l_rx_lp_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spk_l_adie_lp_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_l_rx_lp_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spk_l_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_l_rx_lp_data},
};
static struct adie_codec_action_unit ftm_spkr_r_adie_lp_rx_actions[] =
SPKR_R_RX;
static struct adie_codec_hwsetting_entry ftm_spkr_r_adie_lp_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_r_adie_lp_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_r_adie_lp_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_r_adie_lp_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_r_adie_lp_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_r_adie_lp_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_r_adie_lp_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spk_r_adie_lp_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_r_adie_lp_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spk_r_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_r_adie_lp_rx_data},
};
static struct adie_codec_action_unit ftm_spkr_adie_lp_rx_actions[] =
FTM_SPKR_RX_LB;
static struct adie_codec_hwsetting_entry ftm_spkr_adie_lp_rx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_spkr_adie_lp_rx_actions,
.action_sz = ARRAY_SIZE(ftm_spkr_adie_lp_rx_actions),
},
};
static struct adie_codec_dev_profile ftm_spkr_adie_lp_rx_profile = {
.path_type = ADIE_CODEC_RX,
.settings = ftm_spkr_adie_lp_rx_settings,
.setting_sz = ARRAY_SIZE(ftm_spkr_adie_lp_rx_settings),
};
static struct snddev_icodec_data ftm_spkr_adie_lp_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "ftm_spk_adie_lp_rx",
.copp_id = PRIMARY_I2S_RX,
.profile = &ftm_spkr_adie_lp_rx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_poweramp_on,
.pamp_off = msm_snddev_poweramp_off,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_spk_adie_lp_rx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_spkr_adie_lp_rx_data},
};
static struct adie_codec_action_unit ftm_handset_dual_tx_lp_actions[] =
FTM_AMIC_DUAL_HANDSET_TX_LB;
static struct adie_codec_hwsetting_entry ftm_handset_dual_tx_lp_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_handset_dual_tx_lp_actions,
.action_sz = ARRAY_SIZE(ftm_handset_dual_tx_lp_actions),
}
};
static struct adie_codec_dev_profile ftm_handset_dual_tx_lp_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_handset_dual_tx_lp_settings,
.setting_sz = ARRAY_SIZE(ftm_handset_dual_tx_lp_settings),
};
static struct snddev_icodec_data ftm_handset_dual_tx_lp_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "handset_mic1_handset_mic2",
.copp_id = 1,
.profile = &ftm_handset_dual_tx_lp_profile,
.channel_mode = 2,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_handset_dual_tx_lp_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_handset_dual_tx_lp_data },
};
static struct adie_codec_action_unit ftm_handset_mic_adie_lp_tx_actions[] =
FTM_HANDSET_LB_TX;
static struct adie_codec_hwsetting_entry
ftm_handset_mic_adie_lp_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_handset_mic_adie_lp_tx_actions,
.action_sz = ARRAY_SIZE(ftm_handset_mic_adie_lp_tx_actions),
}
};
static struct adie_codec_dev_profile ftm_handset_mic_adie_lp_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_handset_mic_adie_lp_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_handset_mic_adie_lp_tx_settings),
};
static struct snddev_icodec_data ftm_handset_mic_adie_lp_tx_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "ftm_handset_mic_adie_lp_tx",
.copp_id = 1,
.profile = &ftm_handset_mic_adie_lp_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.pamp_on = msm_snddev_enable_amic_power,
.pamp_off = msm_snddev_disable_amic_power,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_handset_mic_adie_lp_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_handset_mic_adie_lp_tx_data },
};
static struct adie_codec_action_unit ftm_headset_mic_adie_lp_tx_actions[] =
FTM_HEADSET_LB_TX;
static struct adie_codec_hwsetting_entry
ftm_headset_mic_adie_lp_tx_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions = ftm_headset_mic_adie_lp_tx_actions,
.action_sz = ARRAY_SIZE(ftm_headset_mic_adie_lp_tx_actions),
}
};
static struct adie_codec_dev_profile ftm_headset_mic_adie_lp_tx_profile = {
.path_type = ADIE_CODEC_TX,
.settings = ftm_headset_mic_adie_lp_tx_settings,
.setting_sz = ARRAY_SIZE(ftm_headset_mic_adie_lp_tx_settings),
};
static struct snddev_icodec_data ftm_headset_mic_adie_lp_tx_data = {
.capability = (SNDDEV_CAP_TX | SNDDEV_CAP_VOICE),
.name = "ftm_headset_mic_adie_lp_tx",
.copp_id = PRIMARY_I2S_TX,
.profile = &ftm_headset_mic_adie_lp_tx_profile,
.channel_mode = 1,
.default_sample_rate = 48000,
.dev_vol_type = SNDDEV_DEV_VOL_DIGITAL,
};
static struct platform_device ftm_headset_mic_adie_lp_tx_device = {
.name = "snddev_icodec",
.dev = { .platform_data = &ftm_headset_mic_adie_lp_tx_data },
};
#endif /* CONFIG_MSM8X60_FTM_AUDIO_DEVICES */
static struct snddev_virtual_data snddev_uplink_rx_data = {
.capability = SNDDEV_CAP_RX,
.name = "uplink_rx",
.copp_id = VOICE_PLAYBACK_TX,
};
static struct platform_device msm_uplink_rx_device = {
.name = "snddev_virtual",
.dev = { .platform_data = &snddev_uplink_rx_data },
};
static struct snddev_hdmi_data snddev_hdmi_non_linear_pcm_rx_data = {
.capability = SNDDEV_CAP_RX ,
.name = "hdmi_pass_through",
.default_sample_rate = 48000,
.on_apps = 1,
};
static struct platform_device msm_snddev_hdmi_non_linear_pcm_rx_device = {
.name = "snddev_hdmi",
.dev = { .platform_data = &snddev_hdmi_non_linear_pcm_rx_data },
};
#ifdef CONFIG_DEBUG_FS
static struct adie_codec_action_unit
ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions[] =
HPH_PRI_D_LEG_STEREO;
static struct adie_codec_hwsetting_entry
ihs_stereo_rx_class_d_legacy_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions =
ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE
(ihs_stereo_rx_class_d_legacy_48KHz_osr256_actions),
}
};
static struct adie_codec_action_unit
ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions[] =
HPH_PRI_AB_LEG_STEREO;
static struct adie_codec_hwsetting_entry
ihs_stereo_rx_class_ab_legacy_settings[] = {
{
.freq_plan = 48000,
.osr = 256,
.actions =
ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions,
.action_sz = ARRAY_SIZE
(ihs_stereo_rx_class_ab_legacy_48KHz_osr256_actions),
}
};
static void snddev_hsed_config_modify_setting(int type)
{
struct platform_device *device;
struct snddev_icodec_data *icodec_data;
device = &msm_headset_stereo_device;
icodec_data = (struct snddev_icodec_data *)device->dev.platform_data;
if (icodec_data) {
if (type == 1) {
icodec_data->voltage_on = NULL;
icodec_data->voltage_off = NULL;
icodec_data->profile->settings =
ihs_stereo_rx_class_d_legacy_settings;
icodec_data->profile->setting_sz =
ARRAY_SIZE(ihs_stereo_rx_class_d_legacy_settings);
} else if (type == 2) {
icodec_data->voltage_on = NULL;
icodec_data->voltage_off = NULL;
icodec_data->profile->settings =
ihs_stereo_rx_class_ab_legacy_settings;
icodec_data->profile->setting_sz =
ARRAY_SIZE(ihs_stereo_rx_class_ab_legacy_settings);
}
}
}
static void snddev_hsed_config_restore_setting(void)
{
struct platform_device *device;
struct snddev_icodec_data *icodec_data;
device = &msm_headset_stereo_device;
icodec_data = (struct snddev_icodec_data *)device->dev.platform_data;
if (icodec_data) {
icodec_data->voltage_on = msm_snddev_voltage_on;
icodec_data->voltage_off = msm_snddev_voltage_off;
icodec_data->profile->settings = headset_ab_cpls_settings;
icodec_data->profile->setting_sz =
ARRAY_SIZE(headset_ab_cpls_settings);
}
}
static ssize_t snddev_hsed_config_debug_write(struct file *filp,
const char __user *ubuf, size_t cnt, loff_t *ppos)
{
char *lb_str = filp->private_data;
char cmd;
if (get_user(cmd, ubuf))
return -EFAULT;
if (!strcmp(lb_str, "msm_hsed_config")) {
switch (cmd) {
case '0':
snddev_hsed_config_restore_setting();
break;
case '1':
snddev_hsed_config_modify_setting(1);
break;
case '2':
snddev_hsed_config_modify_setting(2);
break;
default:
break;
}
}
return cnt;
}
static int snddev_hsed_config_debug_open(struct inode *inode, struct file *file)
{
file->private_data = inode->i_private;
return 0;
}
static const struct file_operations snddev_hsed_config_debug_fops = {
.open = snddev_hsed_config_debug_open,
.write = snddev_hsed_config_debug_write
};
#endif
static struct platform_device *snd_devices_ffa[] __initdata = {
&msm_iearpiece_ffa_device,
&msm_imic_ffa_device,
&msm_ispkr_stereo_device,
&msm_snddev_hdmi_stereo_rx_device,
&msm_headset_mic_device,
&msm_ispkr_mic_device,
&msm_bt_sco_earpiece_device,
&msm_bt_sco_mic_device,
&msm_headset_stereo_device,
&msm_itty_mono_tx_device,
&msm_itty_mono_rx_device,
&msm_mi2s_fm_tx_device,
&msm_mi2s_fm_rx_device,
&msm_hs_dual_mic_endfire_device,
&msm_spkr_dual_mic_endfire_device,
&msm_hs_dual_mic_broadside_device,
&msm_spkr_dual_mic_broadside_device,
&msm_ihs_stereo_speaker_stereo_rx_device,
&msm_anc_headset_device,
&msm_auxpga_lp_hs_device,
&msm_auxpga_lp_lo_device,
&msm_linein_pri_device,
&msm_icodec_gpio_device,
&msm_snddev_hdmi_non_linear_pcm_rx_device,
};
static struct platform_device *snd_devices_surf[] __initdata = {
&msm_iearpiece_device,
&msm_imic_device,
&msm_ispkr_stereo_device,
&msm_snddev_hdmi_stereo_rx_device,
&msm_headset_mic_device,
&msm_ispkr_mic_device,
&msm_bt_sco_earpiece_device,
&msm_bt_sco_mic_device,
&msm_headset_stereo_device,
&msm_itty_mono_tx_device,
&msm_itty_mono_rx_device,
&msm_mi2s_fm_tx_device,
&msm_mi2s_fm_rx_device,
&msm_ihs_stereo_speaker_stereo_rx_device,
&msm_auxpga_lp_hs_device,
&msm_auxpga_lp_lo_device,
&msm_linein_pri_device,
&msm_icodec_gpio_device,
&msm_snddev_hdmi_non_linear_pcm_rx_device,
};
static struct platform_device *snd_devices_fluid[] __initdata = {
&msm_iearpiece_device,
&msm_imic_device,
&msm_ispkr_stereo_device,
&msm_snddev_hdmi_stereo_rx_device,
&msm_headset_stereo_device,
&msm_headset_mic_device,
&msm_fluid_ispkr_mic_device,
&msm_bt_sco_earpiece_device,
&msm_bt_sco_mic_device,
&msm_mi2s_fm_tx_device,
&msm_mi2s_fm_rx_device,
&msm_fluid_hs_dual_mic_endfire_device,
&msm_fluid_spkr_dual_mic_endfire_device,
&msm_fluid_hs_dual_mic_broadside_device,
&msm_fluid_spkr_dual_mic_broadside_device,
&msm_anc_headset_device,
&msm_auxpga_lp_hs_device,
&msm_auxpga_lp_lo_device,
&msm_icodec_gpio_device,
&msm_snddev_hdmi_non_linear_pcm_rx_device,
};
static struct platform_device *snd_devices_common[] __initdata = {
&msm_aux_pcm_device,
&msm_cdcclk_ctl_device,
&msm_mi2s_device,
&msm_uplink_rx_device,
&msm_device_dspcrashd_8x60,
};
#ifdef CONFIG_MSM8X60_FTM_AUDIO_DEVICES
static struct platform_device *snd_devices_ftm[] __initdata = {
&ftm_headset_mono_rx_device,
&ftm_headset_mono_l_rx_device,
&ftm_headset_mono_r_rx_device,
&ftm_headset_mono_diff_rx_device,
&ftm_spkr_mono_rx_device,
&ftm_spkr_l_rx_device,
&ftm_spkr_r_rx_device,
&ftm_spkr_mono_diff_rx_device,
&ftm_linein_l_tx_device,
&ftm_linein_r_tx_device,
&ftm_aux_out_rx_device,
&ftm_dmic1_left_tx_device,
&ftm_dmic1_right_tx_device,
&ftm_dmic1_l_and_r_tx_device,
&ftm_dmic2_left_tx_device,
&ftm_dmic2_right_tx_device,
&ftm_dmic2_l_and_r_tx_device,
&ftm_handset_mic1_aux_in_device,
&ftm_mi2s_sd0_rx_device,
&ftm_mi2s_sd1_rx_device,
&ftm_mi2s_sd2_rx_device,
&ftm_handset_mic_adie_lp_tx_device,
&ftm_headset_mic_adie_lp_tx_device,
&ftm_handset_adie_lp_rx_device,
&ftm_headset_l_adie_lp_rx_device,
&ftm_headset_r_adie_lp_rx_device,
&ftm_spk_l_adie_lp_rx_device,
&ftm_spk_r_adie_lp_rx_device,
&ftm_spk_adie_lp_rx_device,
&ftm_handset_dual_tx_lp_device,
};
#else
static struct platform_device *snd_devices_ftm[] __initdata = {};
#endif
void __init msm_snddev_init(void)
{
int i;
int dev_id;
atomic_set(&pamp_ref_cnt, 0);
atomic_set(&preg_ref_cnt, 0);
for (i = 0, dev_id = 0; i < ARRAY_SIZE(snd_devices_common); i++)
snd_devices_common[i]->id = dev_id++;
platform_add_devices(snd_devices_common,
ARRAY_SIZE(snd_devices_common));
/* Auto detect device base on machine info */
if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) {
for (i = 0; i < ARRAY_SIZE(snd_devices_surf); i++)
snd_devices_surf[i]->id = dev_id++;
platform_add_devices(snd_devices_surf,
ARRAY_SIZE(snd_devices_surf));
} else if (machine_is_msm8x60_ffa() ||
machine_is_msm8x60_fusn_ffa()) {
for (i = 0; i < ARRAY_SIZE(snd_devices_ffa); i++)
snd_devices_ffa[i]->id = dev_id++;
platform_add_devices(snd_devices_ffa,
ARRAY_SIZE(snd_devices_ffa));
} else if (machine_is_msm8x60_fluid()) {
for (i = 0; i < ARRAY_SIZE(snd_devices_fluid); i++)
snd_devices_fluid[i]->id = dev_id++;
platform_add_devices(snd_devices_fluid,
ARRAY_SIZE(snd_devices_fluid));
}
if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa()
|| machine_is_msm8x60_fusion()
|| machine_is_msm8x60_fusn_ffa()) {
for (i = 0; i < ARRAY_SIZE(snd_devices_ftm); i++)
snd_devices_ftm[i]->id = dev_id++;
platform_add_devices(snd_devices_ftm,
ARRAY_SIZE(snd_devices_ftm));
}
#ifdef CONFIG_DEBUG_FS
debugfs_hsed_config = debugfs_create_file("msm_hsed_config",
S_IFREG | S_IRUGO, NULL,
(void *) "msm_hsed_config", &snddev_hsed_config_debug_fops);
#endif
}