Loading drivers/misc/atmel-ssc.c +13 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading include/linux/atmel-ssc.h +13 −0 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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 Loading Loading @@ -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 Loading sound/soc/atmel/atmel_ssc_dai.c +18 −16 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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. */ */ Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading sound/soc/atmel/atmel_wm8904.c +0 −50 Original line number Original line Diff line number Diff line Loading @@ -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), Loading Loading @@ -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", Loading @@ -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, Loading Loading @@ -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; Loading @@ -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"); Loading sound/soc/codecs/cs42l52.c +7 −7 Original line number Original line Diff line number Diff line Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading Loading
drivers/misc/atmel-ssc.c +13 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading
include/linux/atmel-ssc.h +13 −0 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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 Loading Loading @@ -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 Loading
sound/soc/atmel/atmel_ssc_dai.c +18 −16 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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. */ */ Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading
sound/soc/atmel/atmel_wm8904.c +0 −50 Original line number Original line Diff line number Diff line Loading @@ -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), Loading Loading @@ -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", Loading @@ -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, Loading Loading @@ -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; Loading @@ -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"); Loading
sound/soc/codecs/cs42l52.c +7 −7 Original line number Original line Diff line number Diff line Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading