Merge remote-tracking branches 'asoc/topic/atmel', 'asoc/topic/cirrus' and 'asoc/topic/cleanup' into asoc-next
This commit is contained in:
commit
62e951ea65
@ -83,16 +83,26 @@ EXPORT_SYMBOL(ssc_free);
|
|||||||
|
|
||||||
static struct atmel_ssc_platform_data at91rm9200_config = {
|
static struct atmel_ssc_platform_data at91rm9200_config = {
|
||||||
.use_dma = 0,
|
.use_dma = 0,
|
||||||
|
.has_fslen_ext = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct atmel_ssc_platform_data at91sam9rl_config = {
|
||||||
|
.use_dma = 0,
|
||||||
|
.has_fslen_ext = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct atmel_ssc_platform_data at91sam9g45_config = {
|
static struct atmel_ssc_platform_data at91sam9g45_config = {
|
||||||
.use_dma = 1,
|
.use_dma = 1,
|
||||||
|
.has_fslen_ext = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct platform_device_id atmel_ssc_devtypes[] = {
|
static const struct platform_device_id atmel_ssc_devtypes[] = {
|
||||||
{
|
{
|
||||||
.name = "at91rm9200_ssc",
|
.name = "at91rm9200_ssc",
|
||||||
.driver_data = (unsigned long) &at91rm9200_config,
|
.driver_data = (unsigned long) &at91rm9200_config,
|
||||||
|
}, {
|
||||||
|
.name = "at91sam9rl_ssc",
|
||||||
|
.driver_data = (unsigned long) &at91sam9rl_config,
|
||||||
}, {
|
}, {
|
||||||
.name = "at91sam9g45_ssc",
|
.name = "at91sam9g45_ssc",
|
||||||
.driver_data = (unsigned long) &at91sam9g45_config,
|
.driver_data = (unsigned long) &at91sam9g45_config,
|
||||||
@ -106,6 +116,9 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
|
|||||||
{
|
{
|
||||||
.compatible = "atmel,at91rm9200-ssc",
|
.compatible = "atmel,at91rm9200-ssc",
|
||||||
.data = &at91rm9200_config,
|
.data = &at91rm9200_config,
|
||||||
|
}, {
|
||||||
|
.compatible = "atmel,at91sam9rl-ssc",
|
||||||
|
.data = &at91sam9rl_config,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "atmel,at91sam9g45-ssc",
|
.compatible = "atmel,at91sam9g45-ssc",
|
||||||
.data = &at91sam9g45_config,
|
.data = &at91sam9g45_config,
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
struct atmel_ssc_platform_data {
|
struct atmel_ssc_platform_data {
|
||||||
int use_dma;
|
int use_dma;
|
||||||
|
int has_fslen_ext;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssc_device {
|
struct ssc_device {
|
||||||
@ -71,6 +72,12 @@ void ssc_free(struct ssc_device *ssc);
|
|||||||
#define SSC_RFMR_DATNB_OFFSET 8
|
#define SSC_RFMR_DATNB_OFFSET 8
|
||||||
#define SSC_RFMR_FSEDGE_SIZE 1
|
#define SSC_RFMR_FSEDGE_SIZE 1
|
||||||
#define SSC_RFMR_FSEDGE_OFFSET 24
|
#define SSC_RFMR_FSEDGE_OFFSET 24
|
||||||
|
/*
|
||||||
|
* The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
|
||||||
|
* at91sam9g20, and at91sam9g45 and newer SoCs
|
||||||
|
*/
|
||||||
|
#define SSC_RFMR_FSLEN_EXT_SIZE 4
|
||||||
|
#define SSC_RFMR_FSLEN_EXT_OFFSET 28
|
||||||
#define SSC_RFMR_FSLEN_SIZE 4
|
#define SSC_RFMR_FSLEN_SIZE 4
|
||||||
#define SSC_RFMR_FSLEN_OFFSET 16
|
#define SSC_RFMR_FSLEN_OFFSET 16
|
||||||
#define SSC_RFMR_FSOS_SIZE 4
|
#define SSC_RFMR_FSOS_SIZE 4
|
||||||
@ -109,6 +116,12 @@ void ssc_free(struct ssc_device *ssc);
|
|||||||
#define SSC_TFMR_FSDEN_OFFSET 23
|
#define SSC_TFMR_FSDEN_OFFSET 23
|
||||||
#define SSC_TFMR_FSEDGE_SIZE 1
|
#define SSC_TFMR_FSEDGE_SIZE 1
|
||||||
#define SSC_TFMR_FSEDGE_OFFSET 24
|
#define SSC_TFMR_FSEDGE_OFFSET 24
|
||||||
|
/*
|
||||||
|
* The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
|
||||||
|
* at91sam9g20, and at91sam9g45 and newer SoCs
|
||||||
|
*/
|
||||||
|
#define SSC_TFMR_FSLEN_EXT_SIZE 4
|
||||||
|
#define SSC_TFMR_FSLEN_EXT_OFFSET 28
|
||||||
#define SSC_TFMR_FSLEN_SIZE 4
|
#define SSC_TFMR_FSLEN_SIZE 4
|
||||||
#define SSC_TFMR_FSLEN_OFFSET 16
|
#define SSC_TFMR_FSLEN_OFFSET 16
|
||||||
#define SSC_TFMR_FSOS_SIZE 3
|
#define SSC_TFMR_FSOS_SIZE 3
|
||||||
|
@ -347,6 +347,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||||||
u32 tfmr, rfmr, tcmr, rcmr;
|
u32 tfmr, rfmr, tcmr, rcmr;
|
||||||
int start_event;
|
int start_event;
|
||||||
int ret;
|
int ret;
|
||||||
|
int fslen, fslen_ext;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Currently, there is only one set of dma params for
|
* Currently, there is only one set of dma params for
|
||||||
@ -387,18 +388,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The SSC only supports up to 16-bit samples in I2S format, due
|
|
||||||
* to the size of the Frame Mode Register FSLEN field.
|
|
||||||
*/
|
|
||||||
if ((ssc_p->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S
|
|
||||||
&& bits > 16) {
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"atmel_ssc_dai: sample size %d "
|
|
||||||
"is too large for I2S\n", bits);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute SSC register settings.
|
* Compute SSC register settings.
|
||||||
*/
|
*/
|
||||||
@ -413,6 +402,17 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||||||
* from the MCK divider, and the BCLK signal
|
* from the MCK divider, and the BCLK signal
|
||||||
* is output on the SSC TK line.
|
* is output on the SSC TK line.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (bits > 16 && !ssc->pdata->has_fslen_ext) {
|
||||||
|
dev_err(dai->dev,
|
||||||
|
"sample size %d is too large for SSC device\n",
|
||||||
|
bits);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
fslen_ext = (bits - 1) / 16;
|
||||||
|
fslen = (bits - 1) % 16;
|
||||||
|
|
||||||
rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
|
rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
|
||||||
| SSC_BF(RCMR_STTDLY, START_DELAY)
|
| SSC_BF(RCMR_STTDLY, START_DELAY)
|
||||||
| SSC_BF(RCMR_START, SSC_START_FALLING_RF)
|
| SSC_BF(RCMR_START, SSC_START_FALLING_RF)
|
||||||
@ -420,9 +420,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||||||
| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
|
| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
|
||||||
| SSC_BF(RCMR_CKS, SSC_CKS_DIV);
|
| SSC_BF(RCMR_CKS, SSC_CKS_DIV);
|
||||||
|
|
||||||
rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
rfmr = SSC_BF(RFMR_FSLEN_EXT, fslen_ext)
|
||||||
|
| SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
||||||
| SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
|
| SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
|
||||||
| SSC_BF(RFMR_FSLEN, (bits - 1))
|
| SSC_BF(RFMR_FSLEN, fslen)
|
||||||
| SSC_BF(RFMR_DATNB, (channels - 1))
|
| SSC_BF(RFMR_DATNB, (channels - 1))
|
||||||
| SSC_BIT(RFMR_MSBF)
|
| SSC_BIT(RFMR_MSBF)
|
||||||
| SSC_BF(RFMR_LOOP, 0)
|
| SSC_BF(RFMR_LOOP, 0)
|
||||||
@ -435,10 +436,11 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||||||
| SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
|
| SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
|
||||||
| SSC_BF(TCMR_CKS, SSC_CKS_DIV);
|
| SSC_BF(TCMR_CKS, SSC_CKS_DIV);
|
||||||
|
|
||||||
tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
tfmr = SSC_BF(TFMR_FSLEN_EXT, fslen_ext)
|
||||||
|
| SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
||||||
| SSC_BF(TFMR_FSDEN, 0)
|
| SSC_BF(TFMR_FSDEN, 0)
|
||||||
| SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
|
| SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
|
||||||
| SSC_BF(TFMR_FSLEN, (bits - 1))
|
| SSC_BF(TFMR_FSLEN, fslen)
|
||||||
| SSC_BF(TFMR_DATNB, (channels - 1))
|
| SSC_BF(TFMR_DATNB, (channels - 1))
|
||||||
| SSC_BIT(TFMR_MSBF)
|
| SSC_BIT(TFMR_MSBF)
|
||||||
| SSC_BF(TFMR_DATDEF, 0)
|
| SSC_BF(TFMR_DATDEF, 0)
|
||||||
|
@ -18,10 +18,6 @@
|
|||||||
#include "../codecs/wm8904.h"
|
#include "../codecs/wm8904.h"
|
||||||
#include "atmel_ssc_dai.h"
|
#include "atmel_ssc_dai.h"
|
||||||
|
|
||||||
#define MCLK_RATE 32768
|
|
||||||
|
|
||||||
static struct clk *mclk;
|
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget atmel_asoc_wm8904_dapm_widgets[] = {
|
static const struct snd_soc_dapm_widget atmel_asoc_wm8904_dapm_widgets[] = {
|
||||||
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||||
SND_SOC_DAPM_MIC("Mic", NULL),
|
SND_SOC_DAPM_MIC("Mic", NULL),
|
||||||
@ -61,26 +57,6 @@ static struct snd_soc_ops atmel_asoc_wm8904_ops = {
|
|||||||
.hw_params = atmel_asoc_wm8904_hw_params,
|
.hw_params = atmel_asoc_wm8904_hw_params,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int atmel_set_bias_level(struct snd_soc_card *card,
|
|
||||||
struct snd_soc_dapm_context *dapm,
|
|
||||||
enum snd_soc_bias_level level)
|
|
||||||
{
|
|
||||||
if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
|
|
||||||
switch (level) {
|
|
||||||
case SND_SOC_BIAS_PREPARE:
|
|
||||||
clk_prepare_enable(mclk);
|
|
||||||
break;
|
|
||||||
case SND_SOC_BIAS_OFF:
|
|
||||||
clk_disable_unprepare(mclk);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
|
static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
|
||||||
.name = "WM8904",
|
.name = "WM8904",
|
||||||
.stream_name = "WM8904 PCM",
|
.stream_name = "WM8904 PCM",
|
||||||
@ -94,7 +70,6 @@ static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
|
|||||||
static struct snd_soc_card atmel_asoc_wm8904_card = {
|
static struct snd_soc_card atmel_asoc_wm8904_card = {
|
||||||
.name = "atmel_asoc_wm8904",
|
.name = "atmel_asoc_wm8904",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.set_bias_level = atmel_set_bias_level,
|
|
||||||
.dai_link = &atmel_asoc_wm8904_dailink,
|
.dai_link = &atmel_asoc_wm8904_dailink,
|
||||||
.num_links = 1,
|
.num_links = 1,
|
||||||
.dapm_widgets = atmel_asoc_wm8904_dapm_widgets,
|
.dapm_widgets = atmel_asoc_wm8904_dapm_widgets,
|
||||||
@ -153,7 +128,6 @@ static int atmel_asoc_wm8904_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct snd_soc_card *card = &atmel_asoc_wm8904_card;
|
struct snd_soc_card *card = &atmel_asoc_wm8904_card;
|
||||||
struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;
|
struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;
|
||||||
struct clk *clk_src;
|
|
||||||
int id, ret;
|
int id, ret;
|
||||||
|
|
||||||
card->dev = &pdev->dev;
|
card->dev = &pdev->dev;
|
||||||
@ -170,30 +144,6 @@ static int atmel_asoc_wm8904_probe(struct platform_device *pdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
mclk = clk_get(NULL, "pck0");
|
|
||||||
if (IS_ERR(mclk)) {
|
|
||||||
dev_err(&pdev->dev, "failed to get pck0\n");
|
|
||||||
ret = PTR_ERR(mclk);
|
|
||||||
goto err_set_audio;
|
|
||||||
}
|
|
||||||
|
|
||||||
clk_src = clk_get(NULL, "clk32k");
|
|
||||||
if (IS_ERR(clk_src)) {
|
|
||||||
dev_err(&pdev->dev, "failed to get clk32k\n");
|
|
||||||
ret = PTR_ERR(clk_src);
|
|
||||||
goto err_set_audio;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = clk_set_parent(mclk, clk_src);
|
|
||||||
clk_put(clk_src);
|
|
||||||
if (ret != 0) {
|
|
||||||
dev_err(&pdev->dev, "failed to set MCLK parent\n");
|
|
||||||
goto err_set_audio;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_info(&pdev->dev, "setting pck0 to %dHz\n", MCLK_RATE);
|
|
||||||
clk_set_rate(mclk, MCLK_RATE);
|
|
||||||
|
|
||||||
ret = snd_soc_register_card(card);
|
ret = snd_soc_register_card(card);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "snd_soc_register_card failed\n");
|
dev_err(&pdev->dev, "snd_soc_register_card failed\n");
|
||||||
|
@ -399,15 +399,15 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
|
|||||||
CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv),
|
CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL,
|
SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL,
|
||||||
CS42L52_HPB_VOL, 0, 0x34, 0xCC, hpd_tlv),
|
CS42L52_HPB_VOL, 0, 0x34, 0xC0, hpd_tlv),
|
||||||
|
|
||||||
SOC_ENUM("Headphone Analog Gain", hp_gain_enum),
|
SOC_ENUM("Headphone Analog Gain", hp_gain_enum),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL,
|
SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL,
|
||||||
CS42L52_SPKB_VOL, 0, 0x1, 0xff, hl_tlv),
|
CS42L52_SPKB_VOL, 0, 0x40, 0xC0, hl_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,
|
SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,
|
||||||
CS42L52_PASSTHRUB_VOL, 6, 0x18, 0x90, pga_tlv),
|
CS42L52_PASSTHRUB_VOL, 0, 0x88, 0x90, pga_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),
|
SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),
|
||||||
|
|
||||||
@ -417,10 +417,10 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
|
|||||||
SOC_ENUM("MIC Bias Level", mic_bias_level_enum),
|
SOC_ENUM("MIC Bias Level", mic_bias_level_enum),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL,
|
SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL,
|
||||||
CS42L52_ADCB_VOL, 7, 0x80, 0xA0, ipd_tlv),
|
CS42L52_ADCB_VOL, 0, 0xA0, 0x78, ipd_tlv),
|
||||||
SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume",
|
SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume",
|
||||||
CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL,
|
CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL,
|
||||||
6, 0x7f, 0x19, ipd_tlv),
|
0, 0x19, 0x7F, ipd_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0),
|
SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0),
|
||||||
|
|
||||||
@ -428,11 +428,11 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
|
|||||||
CS42L52_ADCB_MIXER_VOL, 7, 1, 1),
|
CS42L52_ADCB_MIXER_VOL, 7, 1, 1),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL,
|
SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL,
|
||||||
CS42L52_PGAB_CTL, 0, 0x28, 0x30, pga_tlv),
|
CS42L52_PGAB_CTL, 0, 0x28, 0x24, pga_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
|
SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
|
||||||
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
|
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
|
||||||
0, 0x7f, 0x19, mix_tlv),
|
0, 0x19, 0x7f, mix_tlv),
|
||||||
SOC_DOUBLE_R("PCM Mixer Switch",
|
SOC_DOUBLE_R("PCM Mixer Switch",
|
||||||
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),
|
CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),
|
||||||
|
|
||||||
|
@ -421,15 +421,15 @@ static const struct soc_enum ng_delay_enum =
|
|||||||
static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
|
static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Master Volume", CS42L56_MASTER_A_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("Master Volume", CS42L56_MASTER_A_VOLUME,
|
||||||
CS42L56_MASTER_B_VOLUME, 0, 0x34, 0xfd, adv_tlv),
|
CS42L56_MASTER_B_VOLUME, 0, 0x34, 0xE4, adv_tlv),
|
||||||
SOC_DOUBLE("Master Mute Switch", CS42L56_DSP_MUTE_CTL, 0, 1, 1, 1),
|
SOC_DOUBLE("Master Mute Switch", CS42L56_DSP_MUTE_CTL, 0, 1, 1, 1),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L56_ADCA_MIX_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L56_ADCA_MIX_VOLUME,
|
||||||
CS42L56_ADCB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv),
|
CS42L56_ADCB_MIX_VOLUME, 0, 0x88, 0x90, hl_tlv),
|
||||||
SOC_DOUBLE("ADC Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 6, 7, 1, 1),
|
SOC_DOUBLE("ADC Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 6, 7, 1, 1),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L56_PCMA_MIX_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L56_PCMA_MIX_VOLUME,
|
||||||
CS42L56_PCMB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv),
|
CS42L56_PCMB_MIX_VOLUME, 0, 0x88, 0x90, hl_tlv),
|
||||||
SOC_DOUBLE("PCM Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 4, 5, 1, 1),
|
SOC_DOUBLE("PCM Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 4, 5, 1, 1),
|
||||||
|
|
||||||
SOC_SINGLE_TLV("Analog Advisory Volume",
|
SOC_SINGLE_TLV("Analog Advisory Volume",
|
||||||
@ -438,16 +438,16 @@ static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
|
|||||||
CS42L56_DIGINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv),
|
CS42L56_DIGINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L56_PGAA_MUX_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L56_PGAA_MUX_VOLUME,
|
||||||
CS42L56_PGAB_MUX_VOLUME, 0, 0x34, 0xfd, pga_tlv),
|
CS42L56_PGAB_MUX_VOLUME, 0, 0x34, 0x24, pga_tlv),
|
||||||
SOC_DOUBLE_R_TLV("ADC Volume", CS42L56_ADCA_ATTENUATOR,
|
SOC_DOUBLE_R_TLV("ADC Volume", CS42L56_ADCA_ATTENUATOR,
|
||||||
CS42L56_ADCB_ATTENUATOR, 0, 0x00, 1, adc_tlv),
|
CS42L56_ADCB_ATTENUATOR, 0, 0x00, 1, adc_tlv),
|
||||||
SOC_DOUBLE("ADC Mute Switch", CS42L56_MISC_ADC_CTL, 2, 3, 1, 1),
|
SOC_DOUBLE("ADC Mute Switch", CS42L56_MISC_ADC_CTL, 2, 3, 1, 1),
|
||||||
SOC_DOUBLE("ADC Boost Switch", CS42L56_GAIN_BIAS_CTL, 3, 2, 1, 1),
|
SOC_DOUBLE("ADC Boost Switch", CS42L56_GAIN_BIAS_CTL, 3, 2, 1, 1),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L56_HPA_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L56_HPA_VOLUME,
|
||||||
CS42L56_HPB_VOLUME, 0, 0x44, 0x55, hl_tlv),
|
CS42L56_HPB_VOLUME, 0, 0x84, 0x48, hl_tlv),
|
||||||
SOC_DOUBLE_R_SX_TLV("LineOut Volume", CS42L56_LOA_VOLUME,
|
SOC_DOUBLE_R_SX_TLV("LineOut Volume", CS42L56_LOA_VOLUME,
|
||||||
CS42L56_LOB_VOLUME, 0, 0x44, 0x55, hl_tlv),
|
CS42L56_LOB_VOLUME, 0, 0x84, 0x48, hl_tlv),
|
||||||
|
|
||||||
SOC_SINGLE_TLV("Bass Shelving Volume", CS42L56_TONE_CTL,
|
SOC_SINGLE_TLV("Bass Shelving Volume", CS42L56_TONE_CTL,
|
||||||
0, 0x00, 1, tone_tlv),
|
0, 0x00, 1, tone_tlv),
|
||||||
|
@ -401,7 +401,7 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = {
|
|||||||
CS42L73_LOBAVOL, 0, 0x41, 0x4B, hpaloa_tlv),
|
CS42L73_LOBAVOL, 0, 0x41, 0x4B, hpaloa_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL,
|
SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL,
|
||||||
CS42L73_MICBPREPGABVOL, 5, 0x34,
|
CS42L73_MICBPREPGABVOL, 0, 0x34,
|
||||||
0x24, micpga_tlv),
|
0x24, micpga_tlv),
|
||||||
|
|
||||||
SOC_DOUBLE_R("MIC Preamp Switch", CS42L73_MICAPREPGAAVOL,
|
SOC_DOUBLE_R("MIC Preamp Switch", CS42L73_MICAPREPGAAVOL,
|
||||||
|
@ -344,17 +344,16 @@ static void twl4030_init_chip(struct snd_soc_codec *codec)
|
|||||||
static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable)
|
static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable)
|
||||||
{
|
{
|
||||||
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
|
struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
|
||||||
int status = -1;
|
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
twl4030->apll_enabled++;
|
twl4030->apll_enabled++;
|
||||||
if (twl4030->apll_enabled == 1)
|
if (twl4030->apll_enabled == 1)
|
||||||
status = twl4030_audio_enable_resource(
|
twl4030_audio_enable_resource(
|
||||||
TWL4030_AUDIO_RES_APLL);
|
TWL4030_AUDIO_RES_APLL);
|
||||||
} else {
|
} else {
|
||||||
twl4030->apll_enabled--;
|
twl4030->apll_enabled--;
|
||||||
if (!twl4030->apll_enabled)
|
if (!twl4030->apll_enabled)
|
||||||
status = twl4030_audio_disable_resource(
|
twl4030_audio_disable_resource(
|
||||||
TWL4030_AUDIO_RES_APLL);
|
TWL4030_AUDIO_RES_APLL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1341,21 +1341,18 @@ int wm8350_hp_jack_detect(struct snd_soc_codec *codec, enum wm8350_jack which,
|
|||||||
{
|
{
|
||||||
struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec);
|
struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec);
|
||||||
struct wm8350 *wm8350 = priv->wm8350;
|
struct wm8350 *wm8350 = priv->wm8350;
|
||||||
int irq;
|
|
||||||
int ena;
|
int ena;
|
||||||
|
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case WM8350_JDL:
|
case WM8350_JDL:
|
||||||
priv->hpl.jack = jack;
|
priv->hpl.jack = jack;
|
||||||
priv->hpl.report = report;
|
priv->hpl.report = report;
|
||||||
irq = WM8350_IRQ_CODEC_JCK_DET_L;
|
|
||||||
ena = WM8350_JDL_ENA;
|
ena = WM8350_JDL_ENA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM8350_JDR:
|
case WM8350_JDR:
|
||||||
priv->hpr.jack = jack;
|
priv->hpr.jack = jack;
|
||||||
priv->hpr.report = report;
|
priv->hpr.report = report;
|
||||||
irq = WM8350_IRQ_CODEC_JCK_DET_R;
|
|
||||||
ena = WM8350_JDR_ENA;
|
ena = WM8350_JDR_ENA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -620,15 +620,12 @@ static int bg_event(struct snd_soc_dapm_widget *w,
|
|||||||
static int cp_event(struct snd_soc_dapm_widget *w,
|
static int cp_event(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
struct snd_kcontrol *kcontrol, int event)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
msleep(5);
|
msleep(5);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN(1, "Invalid event %d\n", event);
|
WARN(1, "Invalid event %d\n", event);
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user