Commit 26b9b559 authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/asoc' into for-linus

parents 468c5458 18036b58
...@@ -5532,6 +5532,7 @@ F: include/media/*7146* ...@@ -5532,6 +5532,7 @@ F: include/media/*7146*
SAMSUNG AUDIO (ASoC) DRIVERS SAMSUNG AUDIO (ASoC) DRIVERS
M: Jassi Brar <jassisinghbrar@gmail.com> M: Jassi Brar <jassisinghbrar@gmail.com>
M: Sangbeom Kim <sbkim73@samsung.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Supported S: Supported
F: sound/soc/samsung F: sound/soc/samsung
......
...@@ -56,7 +56,7 @@ static int bf5xx_ad193x_hw_params(struct snd_pcm_substream *substream, ...@@ -56,7 +56,7 @@ static int bf5xx_ad193x_hw_params(struct snd_pcm_substream *substream,
switch (params_rate(params)) { switch (params_rate(params)) {
case 48000: case 48000:
clk = 12288000; clk = 24576000;
break; break;
} }
......
...@@ -27,11 +27,6 @@ struct ad193x_priv { ...@@ -27,11 +27,6 @@ struct ad193x_priv {
int sysclk; int sysclk;
}; };
/* ad193x register cache & default register settings */
static const u8 ad193x_reg[AD193X_NUM_REGS] = {
0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0,
};
/* /*
* AD193X volume/mute/de-emphasis etc. controls * AD193X volume/mute/de-emphasis etc. controls
*/ */
...@@ -307,7 +302,8 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream, ...@@ -307,7 +302,8 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream,
snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg); snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg);
reg = snd_soc_read(codec, AD193X_DAC_CTRL2); reg = snd_soc_read(codec, AD193X_DAC_CTRL2);
reg = (reg & (~AD193X_DAC_WORD_LEN_MASK)) | word_len; reg = (reg & (~AD193X_DAC_WORD_LEN_MASK))
| (word_len << AD193X_DAC_WORD_LEN_SHFT);
snd_soc_write(codec, AD193X_DAC_CTRL2, reg); snd_soc_write(codec, AD193X_DAC_CTRL2, reg);
reg = snd_soc_read(codec, AD193X_ADC_CTRL1); reg = snd_soc_read(codec, AD193X_ADC_CTRL1);
...@@ -389,9 +385,6 @@ static int ad193x_probe(struct snd_soc_codec *codec) ...@@ -389,9 +385,6 @@ static int ad193x_probe(struct snd_soc_codec *codec)
static struct snd_soc_codec_driver soc_codec_dev_ad193x = { static struct snd_soc_codec_driver soc_codec_dev_ad193x = {
.probe = ad193x_probe, .probe = ad193x_probe,
.reg_cache_default = ad193x_reg,
.reg_cache_size = AD193X_NUM_REGS,
.reg_word_size = sizeof(u16),
}; };
#if defined(CONFIG_SPI_MASTER) #if defined(CONFIG_SPI_MASTER)
......
...@@ -34,7 +34,8 @@ ...@@ -34,7 +34,8 @@
#define AD193X_DAC_LEFT_HIGH (1 << 3) #define AD193X_DAC_LEFT_HIGH (1 << 3)
#define AD193X_DAC_BCLK_INV (1 << 7) #define AD193X_DAC_BCLK_INV (1 << 7)
#define AD193X_DAC_CTRL2 0x804 #define AD193X_DAC_CTRL2 0x804
#define AD193X_DAC_WORD_LEN_MASK 0xC #define AD193X_DAC_WORD_LEN_SHFT 3
#define AD193X_DAC_WORD_LEN_MASK 0x18
#define AD193X_DAC_MASTER_MUTE 1 #define AD193X_DAC_MASTER_MUTE 1
#define AD193X_DAC_CHNL_MUTE 0x805 #define AD193X_DAC_CHNL_MUTE 0x805
#define AD193X_DACL1_MUTE 0 #define AD193X_DACL1_MUTE 0
...@@ -63,7 +64,7 @@ ...@@ -63,7 +64,7 @@
#define AD193X_ADC_CTRL1 0x80f #define AD193X_ADC_CTRL1 0x80f
#define AD193X_ADC_SERFMT_MASK 0x60 #define AD193X_ADC_SERFMT_MASK 0x60
#define AD193X_ADC_SERFMT_STEREO (0 << 5) #define AD193X_ADC_SERFMT_STEREO (0 << 5)
#define AD193X_ADC_SERFMT_TDM (1 << 2) #define AD193X_ADC_SERFMT_TDM (1 << 5)
#define AD193X_ADC_SERFMT_AUX (2 << 5) #define AD193X_ADC_SERFMT_AUX (2 << 5)
#define AD193X_ADC_WORD_LEN_MASK 0x3 #define AD193X_ADC_WORD_LEN_MASK 0x3
#define AD193X_ADC_CTRL2 0x810 #define AD193X_ADC_CTRL2 0x810
......
...@@ -857,6 +857,7 @@ static __devinit int sta32x_i2c_probe(struct i2c_client *i2c, ...@@ -857,6 +857,7 @@ static __devinit int sta32x_i2c_probe(struct i2c_client *i2c,
ret = snd_soc_register_codec(&i2c->dev, &sta32x_codec, &sta32x_dai, 1); ret = snd_soc_register_codec(&i2c->dev, &sta32x_codec, &sta32x_dai, 1);
if (ret != 0) { if (ret != 0) {
dev_err(&i2c->dev, "Failed to register codec (%d)\n", ret); dev_err(&i2c->dev, "Failed to register codec (%d)\n", ret);
kfree(sta32x);
return ret; return ret;
} }
......
...@@ -2221,6 +2221,8 @@ static int sysclk_event(struct snd_soc_dapm_widget *w, ...@@ -2221,6 +2221,8 @@ static int sysclk_event(struct snd_soc_dapm_widget *w,
switch (event) { switch (event) {
case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU:
if (fll) { if (fll) {
try_wait_for_completion(&wm8962->fll_lock);
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_ENA, WM8962_FLL_ENA); WM8962_FLL_ENA, WM8962_FLL_ENA);
if (wm8962->irq) { if (wm8962->irq) {
...@@ -2927,10 +2929,6 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, ...@@ -2927,10 +2929,6 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec,
WM8962_BIAS_ENA | 0x180); WM8962_BIAS_ENA | 0x180);
msleep(5); msleep(5);
snd_soc_update_bits(codec, WM8962_CLOCKING2,
WM8962_CLKREG_OVD,
WM8962_CLKREG_OVD);
} }
/* VMID 2*250k */ /* VMID 2*250k */
...@@ -3288,6 +3286,8 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source, ...@@ -3288,6 +3286,8 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda); snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda);
snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n); snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n);
try_wait_for_completion(&wm8962->fll_lock);
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK | WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK |
WM8962_FLL_ENA, fll1); WM8962_FLL_ENA, fll1);
...@@ -3868,6 +3868,10 @@ static int wm8962_probe(struct snd_soc_codec *codec) ...@@ -3868,6 +3868,10 @@ static int wm8962_probe(struct snd_soc_codec *codec)
*/ */
snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_ENA, 0); snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_ENA, 0);
/* Ensure we have soft control over all registers */
snd_soc_update_bits(codec, WM8962_CLOCKING2,
WM8962_CLKREG_OVD, WM8962_CLKREG_OVD);
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
if (pdata) { if (pdata) {
......
...@@ -420,7 +420,7 @@ static const char *sidetone_hpf_text[] = { ...@@ -420,7 +420,7 @@ static const char *sidetone_hpf_text[] = {
}; };
static const struct soc_enum sidetone_hpf = static const struct soc_enum sidetone_hpf =
SOC_ENUM_SINGLE(WM8996_SIDETONE, 7, 6, sidetone_hpf_text); SOC_ENUM_SINGLE(WM8996_SIDETONE, 7, 7, sidetone_hpf_text);
static const char *hpf_mode_text[] = { static const char *hpf_mode_text[] = {
"HiFi", "Custom", "Voice" "HiFi", "Custom", "Voice"
...@@ -988,15 +988,10 @@ SND_SOC_DAPM_MICBIAS("MICB1", WM8996_POWER_MANAGEMENT_1, 8, 0), ...@@ -988,15 +988,10 @@ SND_SOC_DAPM_MICBIAS("MICB1", WM8996_POWER_MANAGEMENT_1, 8, 0),
SND_SOC_DAPM_PGA("IN1L PGA", WM8996_POWER_MANAGEMENT_2, 5, 0, NULL, 0), SND_SOC_DAPM_PGA("IN1L PGA", WM8996_POWER_MANAGEMENT_2, 5, 0, NULL, 0),
SND_SOC_DAPM_PGA("IN1R PGA", WM8996_POWER_MANAGEMENT_2, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("IN1R PGA", WM8996_POWER_MANAGEMENT_2, 4, 0, NULL, 0),
SND_SOC_DAPM_MUX("IN1L Mux", SND_SOC_NOPM, 0, 0, &in1_mux), SND_SOC_DAPM_MUX("IN1L Mux", WM8996_POWER_MANAGEMENT_7, 2, 0, &in1_mux),
SND_SOC_DAPM_MUX("IN1R Mux", SND_SOC_NOPM, 0, 0, &in1_mux), SND_SOC_DAPM_MUX("IN1R Mux", WM8996_POWER_MANAGEMENT_7, 3, 0, &in1_mux),
SND_SOC_DAPM_MUX("IN2L Mux", SND_SOC_NOPM, 0, 0, &in2_mux), SND_SOC_DAPM_MUX("IN2L Mux", WM8996_POWER_MANAGEMENT_7, 6, 0, &in2_mux),
SND_SOC_DAPM_MUX("IN2R Mux", SND_SOC_NOPM, 0, 0, &in2_mux), SND_SOC_DAPM_MUX("IN2R Mux", WM8996_POWER_MANAGEMENT_7, 7, 0, &in2_mux),
SND_SOC_DAPM_PGA("IN1L", WM8996_POWER_MANAGEMENT_7, 2, 0, NULL, 0),
SND_SOC_DAPM_PGA("IN1R", WM8996_POWER_MANAGEMENT_7, 3, 0, NULL, 0),
SND_SOC_DAPM_PGA("IN2L", WM8996_POWER_MANAGEMENT_7, 6, 0, NULL, 0),
SND_SOC_DAPM_PGA("IN2R", WM8996_POWER_MANAGEMENT_7, 7, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("DMIC2", WM8996_POWER_MANAGEMENT_7, 9, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("DMIC2", WM8996_POWER_MANAGEMENT_7, 9, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("DMIC1", WM8996_POWER_MANAGEMENT_7, 8, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("DMIC1", WM8996_POWER_MANAGEMENT_7, 8, 0, NULL, 0),
...@@ -1213,6 +1208,16 @@ static const struct snd_soc_dapm_route wm8996_dapm_routes[] = { ...@@ -1213,6 +1208,16 @@ static const struct snd_soc_dapm_route wm8996_dapm_routes[] = {
{ "AIF2RX0", NULL, "AIFCLK" }, { "AIF2RX0", NULL, "AIFCLK" },
{ "AIF2RX1", NULL, "AIFCLK" }, { "AIF2RX1", NULL, "AIFCLK" },
{ "AIF1TX0", NULL, "AIFCLK" },
{ "AIF1TX1", NULL, "AIFCLK" },
{ "AIF1TX2", NULL, "AIFCLK" },
{ "AIF1TX3", NULL, "AIFCLK" },
{ "AIF1TX4", NULL, "AIFCLK" },
{ "AIF1TX5", NULL, "AIFCLK" },
{ "AIF2TX0", NULL, "AIFCLK" },
{ "AIF2TX1", NULL, "AIFCLK" },
{ "DSP1RXL", NULL, "SYSDSPCLK" }, { "DSP1RXL", NULL, "SYSDSPCLK" },
{ "DSP1RXR", NULL, "SYSDSPCLK" }, { "DSP1RXR", NULL, "SYSDSPCLK" },
{ "DSP2RXL", NULL, "SYSDSPCLK" }, { "DSP2RXL", NULL, "SYSDSPCLK" },
...@@ -2106,6 +2111,9 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source, ...@@ -2106,6 +2111,9 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
snd_soc_write(codec, WM8996_FLL_EFS_1, fll_div.lambda); snd_soc_write(codec, WM8996_FLL_EFS_1, fll_div.lambda);
/* Clear any pending completions (eg, from failed startups) */
try_wait_for_completion(&wm8996->fll_lock);
snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1, snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1,
WM8996_FLL_ENA, WM8996_FLL_ENA); WM8996_FLL_ENA, WM8996_FLL_ENA);
......
...@@ -385,14 +385,14 @@ static int ep93xx_i2s_probe(struct platform_device *pdev) ...@@ -385,14 +385,14 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) { if (!res) {
err = -ENODEV; err = -ENODEV;
goto fail; goto fail_free_info;
} }
info->mem = request_mem_region(res->start, resource_size(res), info->mem = request_mem_region(res->start, resource_size(res),
pdev->name); pdev->name);
if (!info->mem) { if (!info->mem) {
err = -EBUSY; err = -EBUSY;
goto fail; goto fail_free_info;
} }
info->regs = ioremap(info->mem->start, resource_size(info->mem)); info->regs = ioremap(info->mem->start, resource_size(info->mem));
...@@ -435,6 +435,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev) ...@@ -435,6 +435,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
iounmap(info->regs); iounmap(info->regs);
fail_release_mem: fail_release_mem:
release_mem_region(info->mem->start, resource_size(info->mem)); release_mem_region(info->mem->start, resource_size(info->mem));
fail_free_info:
kfree(info); kfree(info);
fail: fail:
return err; return err;
......
...@@ -879,10 +879,12 @@ static struct device_node *find_ssi_node(struct device_node *dma_channel_np) ...@@ -879,10 +879,12 @@ static struct device_node *find_ssi_node(struct device_node *dma_channel_np)
* assume that device_node pointers are a valid comparison. * assume that device_node pointers are a valid comparison.
*/ */
np = of_parse_phandle(ssi_np, "fsl,playback-dma", 0); np = of_parse_phandle(ssi_np, "fsl,playback-dma", 0);
of_node_put(np);
if (np == dma_channel_np) if (np == dma_channel_np)
return ssi_np; return ssi_np;
np = of_parse_phandle(ssi_np, "fsl,capture-dma", 0); np = of_parse_phandle(ssi_np, "fsl,capture-dma", 0);
of_node_put(np);
if (np == dma_channel_np) if (np == dma_channel_np)
return ssi_np; return ssi_np;
} }
......
...@@ -345,8 +345,10 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev) ...@@ -345,8 +345,10 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
} }
machine_data = kzalloc(sizeof(struct mpc8610_hpcd_data), GFP_KERNEL); machine_data = kzalloc(sizeof(struct mpc8610_hpcd_data), GFP_KERNEL);
if (!machine_data) if (!machine_data) {
return -ENOMEM; ret = -ENOMEM;
goto error_alloc;
}
machine_data->dai[0].cpu_dai_name = dev_name(&ssi_pdev->dev); machine_data->dai[0].cpu_dai_name = dev_name(&ssi_pdev->dev);
machine_data->dai[0].ops = &mpc8610_hpcd_ops; machine_data->dai[0].ops = &mpc8610_hpcd_ops;
...@@ -494,7 +496,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev) ...@@ -494,7 +496,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
ret = platform_device_add(sound_device); ret = platform_device_add(sound_device);
if (ret) { if (ret) {
dev_err(&pdev->dev, "platform device add failed\n"); dev_err(&pdev->dev, "platform device add failed\n");
goto error; goto error_sound;
} }
dev_set_drvdata(&pdev->dev, sound_device); dev_set_drvdata(&pdev->dev, sound_device);
...@@ -502,14 +504,12 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev) ...@@ -502,14 +504,12 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
return 0; return 0;
error_sound:
platform_device_unregister(sound_device);
error: error:
of_node_put(codec_np);
if (sound_device)
platform_device_unregister(sound_device);
kfree(machine_data); kfree(machine_data);
error_alloc:
of_node_put(codec_np);
return ret; return ret;
} }
......
...@@ -297,8 +297,10 @@ static int get_dma_channel(struct device_node *ssi_np, ...@@ -297,8 +297,10 @@ static int get_dma_channel(struct device_node *ssi_np,
* dai->platform name should already point to an allocated buffer. * dai->platform name should already point to an allocated buffer.
*/ */
ret = of_address_to_resource(dma_channel_np, 0, &res); ret = of_address_to_resource(dma_channel_np, 0, &res);
if (ret) if (ret) {
of_node_put(dma_channel_np);
return ret; return ret;
}
snprintf((char *)dai->platform_name, DAI_NAME_SIZE, "%llx.%s", snprintf((char *)dai->platform_name, DAI_NAME_SIZE, "%llx.%s",
(unsigned long long) res.start, dma_channel_np->name); (unsigned long long) res.start, dma_channel_np->name);
......
...@@ -424,7 +424,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev) ...@@ -424,7 +424,7 @@ static __devinit int kirkwood_i2s_dev_probe(struct platform_device *pdev)
if (!priv->mem) { if (!priv->mem) {
dev_err(&pdev->dev, "request_mem_region failed\n"); dev_err(&pdev->dev, "request_mem_region failed\n");
err = -EBUSY; err = -EBUSY;
goto error; goto error_alloc;
} }
priv->io = ioremap(priv->mem->start, SZ_16K); priv->io = ioremap(priv->mem->start, SZ_16K);
......
...@@ -514,7 +514,7 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd) ...@@ -514,7 +514,7 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
} }
/* Set codec bias level */ /* Set codec bias level */
ams_delta_set_bias_level(card, SND_SOC_BIAS_STANDBY); ams_delta_set_bias_level(card, dapm, SND_SOC_BIAS_STANDBY);
/* Add hook switch - can be used to control the codec from userspace /* Add hook switch - can be used to control the codec from userspace
* even if line discipline fails */ * even if line discipline fails */
...@@ -649,7 +649,9 @@ static void __exit ams_delta_module_exit(void) ...@@ -649,7 +649,9 @@ static void __exit ams_delta_module_exit(void)
ams_delta_hook_switch_gpios); ams_delta_hook_switch_gpios);
/* Keep modem power on */ /* Keep modem power on */
ams_delta_set_bias_level(&ams_delta_audio_card, SND_SOC_BIAS_STANDBY); ams_delta_set_bias_level(&ams_delta_audio_card,
&ams_delta_audio_card.rtd[0].codec->dapm,
SND_SOC_BIAS_STANDBY);
platform_device_unregister(cx20442_platform_device); platform_device_unregister(cx20442_platform_device);
platform_device_unregister(ams_delta_audio_platform_device); platform_device_unregister(ams_delta_audio_platform_device);
......
...@@ -185,6 +185,7 @@ config SND_SOC_SPEYSIDE ...@@ -185,6 +185,7 @@ config SND_SOC_SPEYSIDE
select SND_SAMSUNG_I2S select SND_SAMSUNG_I2S
select SND_SOC_WM8996 select SND_SOC_WM8996
select SND_SOC_WM9081 select SND_SOC_WM9081
select SND_SOC_WM1250_EV1
config SND_SOC_SPEYSIDE_WM8962 config SND_SOC_SPEYSIDE_WM8962
tristate "Audio support for Wolfson Speyside with WM8962" tristate "Audio support for Wolfson Speyside with WM8962"
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
* *
*/ */
#include <linux/types.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <sound/soc.h> #include <sound/soc.h>
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
* *
*/ */
#include <linux/types.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <sound/soc.h> #include <sound/soc.h>
......
...@@ -23,6 +23,9 @@ static int speyside_wm8962_set_bias_level(struct snd_soc_card *card, ...@@ -23,6 +23,9 @@ static int speyside_wm8962_set_bias_level(struct snd_soc_card *card,
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
int ret; int ret;
if (dapm->dev != codec_dai->dev)
return 0;
switch (level) { switch (level) {
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
...@@ -57,6 +60,9 @@ static int speyside_wm8962_set_bias_level_post(struct snd_soc_card *card, ...@@ -57,6 +60,9 @@ static int speyside_wm8962_set_bias_level_post(struct snd_soc_card *card,
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
int ret; int ret;
if (dapm->dev != codec_dai->dev)
return 0;
switch (level) { switch (level) {
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK, ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
......
...@@ -1913,7 +1913,7 @@ struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, ...@@ -1913,7 +1913,7 @@ struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
if (prefix) { if (prefix) {
name_len = strlen(long_name) + strlen(prefix) + 2; name_len = strlen(long_name) + strlen(prefix) + 2;
name = kmalloc(name_len, GFP_ATOMIC); name = kmalloc(name_len, GFP_KERNEL);
if (!name) if (!name)
return NULL; return NULL;
......
...@@ -205,6 +205,25 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec, ...@@ -205,6 +205,25 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec,
#define snd_soc_16_8_read_i2c NULL #define snd_soc_16_8_read_i2c NULL
#endif #endif
#if defined(CONFIG_SPI_MASTER)
static unsigned int snd_soc_16_8_read_spi(struct snd_soc_codec *codec,
unsigned int r)
{
struct spi_device *spi = codec->control_data;
const u16 reg = cpu_to_be16(r | 0x100);
u8 data;
int ret;
ret = spi_write_then_read(spi, &reg, 2, &data, 1);
if (ret < 0)
return 0;
return data;
}
#else
#define snd_soc_16_8_read_spi NULL
#endif
static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
unsigned int value) unsigned int value)
{ {
...@@ -295,6 +314,7 @@ static struct { ...@@ -295,6 +314,7 @@ static struct {
int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int); int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int);
unsigned int (*read)(struct snd_soc_codec *, unsigned int); unsigned int (*read)(struct snd_soc_codec *, unsigned int);
unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int); unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int);
unsigned int (*spi_read)(struct snd_soc_codec *, unsigned int);
} io_types[] = { } io_types[] = {
{ {
.addr_bits = 4, .data_bits = 12, .addr_bits = 4, .data_bits = 12,
...@@ -318,6 +338,7 @@ static struct { ...@@ -318,6 +338,7 @@ static struct {
.addr_bits = 16, .data_bits = 8, .addr_bits = 16, .data_bits = 8,
.write = snd_soc_16_8_write, .write = snd_soc_16_8_write,
.i2c_read = snd_soc_16_8_read_i2c, .i2c_read = snd_soc_16_8_read_i2c,
.spi_read = snd_soc_16_8_read_spi,
}, },
{ {
.addr_bits = 16, .data_bits = 16, .addr_bits = 16, .data_bits = 16,
...@@ -383,6 +404,8 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, ...@@ -383,6 +404,8 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
#ifdef CONFIG_SPI_MASTER #ifdef CONFIG_SPI_MASTER
codec->hw_write = do_spi_write; codec->hw_write = do_spi_write;
#endif #endif
if (io_types[i].spi_read)
codec->hw_read = io_types[i].spi_read;
codec->control_data = container_of(codec->dev, codec->control_data = container_of(codec->dev,
struct spi_device, struct spi_device,
......
...@@ -327,7 +327,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, ...@@ -327,7 +327,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
IRQF_TRIGGER_FALLING, IRQF_TRIGGER_FALLING,
gpios[i].name, gpios[i].name,
&gpios[i]); &gpios[i]);
if (ret) if (ret < 0)
goto err; goto err;
if (gpios[i].wake) { if (gpios[i].wake) {
......
...@@ -290,6 +290,9 @@ static int soc_pcm_close(struct snd_pcm_substream *substream) ...@@ -290,6 +290,9 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
codec_dai->active--; codec_dai->active--;
codec->active--; codec->active--;
if (!cpu_dai->active && !codec_dai->active)
rtd->rate = 0;
/* Muting the DAC suppresses artifacts caused during digital /* Muting the DAC suppresses artifacts caused during digital
* shutdown, for example from stopping clocks. * shutdown, for example from stopping clocks.
*/ */
......
...@@ -319,7 +319,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) ...@@ -319,7 +319,7 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
snd_soc_dapm_force_enable_pin(dapm, "Mic Bias"); snd_soc_dapm_force_enable_pin(dapm, "Mic Bias");
/* FIXME: Calculate automatically based on DAPM routes? */ /* FIXME: Calculate automatically based on DAPM routes? */
if (!machine_is_harmony() && !machine_is_ventana()) if (!machine_is_harmony())
snd_soc_dapm_nc_pin(dapm, "IN1L"); snd_soc_dapm_nc_pin(dapm, "IN1L");
if (!machine_is_seaboard() && !machine_is_aebl()) if (!machine_is_seaboard() && !machine_is_aebl())
snd_soc_dapm_nc_pin(dapm, "IN1R"); snd_soc_dapm_nc_pin(dapm, "IN1R");
...@@ -395,7 +395,7 @@ static __devinit int tegra_wm8903_driver_probe(struct platform_device *pdev) ...@@ -395,7 +395,7 @@ static __devinit int tegra_wm8903_driver_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, card); platform_set_drvdata(pdev, card);
snd_soc_card_set_drvdata(card, machine); snd_soc_card_set_drvdata(card, machine);
if (machine_is_harmony() || machine_is_ventana()) { if (machine_is_harmony()) {
card->dapm_routes = harmony_audio_map; card->dapm_routes = harmony_audio_map;
card->num_dapm_routes = ARRAY_SIZE(harmony_audio_map); card->num_dapm_routes = ARRAY_SIZE(harmony_audio_map);
} else if (machine_is_seaboard()) { } else if (machine_is_seaboard()) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment