Commit ddff42e5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-4.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "This ended up with a larger set of fixes than wished, unfortunately.

  As diffstat shows, the majority of changes are for various ASoC
  drivers (Realtek, Wolfson codec drivers, etc), in addition to a couple
  of HD-audio regression fixes.  All these are reasonably small and
  nothing to scare much"

* tag 'sound-4.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (29 commits)
  ALSA: hda - Disable power_save_node for Thinkpads
  ALSA: hda/tegra - async probe for avoiding module loading deadlock
  ASoC: rt5645: Prevent the pop sound in case of playback and the jack is plugging
  ASoC: rt5645: Increase the delay time to remove the pop sound
  ASoC: rt5645: Use the type SOC_DAPM_SINGLE_AUTODISABLE to prevent the weird sound in runtime of power up
  ASoC: pxa: pxa2xx-ac97: fix dma requestor lines
  MAINTAINERS: Update website and git repo for Wolfson Microelectronics
  ASoC: fsl_ssi: Fix checking of dai format for AC97 mode
  ASoC: wm0010: fix error path
  ASoC: wm0010: fix memory leak
  ASoC: wm8960: correct the max register value of mic boost pga
  ASoC: wm8962: remove 64k sample rate support
  ASoC: davinci-mcasp: Fix devm_kasprintf format string
  ASoC: fix broken pxa SoC support
  ASoC: davinci-mcasp: Set .symmetric_rates = 1 in snd_soc_dai_driver
  ASoC: au1x: psc-i2s: Fix unused variable 'ret' warning
  ASoC: SPEAr: Make SND_SPEAR_SOC select SND_SOC_GENERIC_DMAENGINE_PCM
  ASoC: mediatek: Increase periods_min in capture
  ASoC: davinci-mcasp: Revise the FIFO threshold calculation
  ASoC: wm8960: correct gain value for input PGA and add microphone PGA
  ...
parents 966966a6 7f57d803
...@@ -11249,7 +11249,6 @@ VOLTAGE AND CURRENT REGULATOR FRAMEWORK ...@@ -11249,7 +11249,6 @@ VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <lgirdwood@gmail.com> M: Liam Girdwood <lgirdwood@gmail.com>
M: Mark Brown <broonie@kernel.org> M: Mark Brown <broonie@kernel.org>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
W: http://opensource.wolfsonmicro.com/node/15
W: http://www.slimlogic.co.uk/?p=48 W: http://www.slimlogic.co.uk/?p=48
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
S: Supported S: Supported
...@@ -11378,17 +11377,15 @@ WM97XX TOUCHSCREEN DRIVERS ...@@ -11378,17 +11377,15 @@ WM97XX TOUCHSCREEN DRIVERS
M: Mark Brown <broonie@kernel.org> M: Mark Brown <broonie@kernel.org>
M: Liam Girdwood <lrg@slimlogic.co.uk> M: Liam Girdwood <lrg@slimlogic.co.uk>
L: linux-input@vger.kernel.org L: linux-input@vger.kernel.org
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch W: https://github.com/CirrusLogic/linux-drivers/wiki
W: http://opensource.wolfsonmicro.com/node/7
S: Supported S: Supported
F: drivers/input/touchscreen/*wm97* F: drivers/input/touchscreen/*wm97*
F: include/linux/wm97xx.h F: include/linux/wm97xx.h
WOLFSON MICROELECTRONICS DRIVERS WOLFSON MICROELECTRONICS DRIVERS
L: patches@opensource.wolfsonmicro.com L: patches@opensource.wolfsonmicro.com
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc T: git https://github.com/CirrusLogic/linux-drivers.git
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus W: https://github.com/CirrusLogic/linux-drivers/wiki
W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
S: Supported S: Supported
F: Documentation/hwmon/wm83?? F: Documentation/hwmon/wm83??
F: arch/arm/mach-s3c64xx/mach-crag6410* F: arch/arm/mach-s3c64xx/mach-crag6410*
......
...@@ -9,6 +9,14 @@ menuconfig SND_ARM ...@@ -9,6 +9,14 @@ menuconfig SND_ARM
Drivers that are implemented on ASoC can be found in Drivers that are implemented on ASoC can be found in
"ALSA for SoC audio support" section. "ALSA for SoC audio support" section.
config SND_PXA2XX_LIB
tristate
select SND_AC97_CODEC if SND_PXA2XX_LIB_AC97
select SND_DMAENGINE_PCM
config SND_PXA2XX_LIB_AC97
bool
if SND_ARM if SND_ARM
config SND_ARMAACI config SND_ARMAACI
...@@ -21,13 +29,6 @@ config SND_PXA2XX_PCM ...@@ -21,13 +29,6 @@ config SND_PXA2XX_PCM
tristate tristate
select SND_PCM select SND_PCM
config SND_PXA2XX_LIB
tristate
select SND_AC97_CODEC if SND_PXA2XX_LIB_AC97
config SND_PXA2XX_LIB_AC97
bool
config SND_PXA2XX_AC97 config SND_PXA2XX_AC97
tristate "AC97 driver for the Intel PXA2xx chip" tristate "AC97 driver for the Intel PXA2xx chip"
depends on ARCH_PXA depends on ARCH_PXA
......
...@@ -73,6 +73,7 @@ struct hda_tegra { ...@@ -73,6 +73,7 @@ struct hda_tegra {
struct clk *hda2codec_2x_clk; struct clk *hda2codec_2x_clk;
struct clk *hda2hdmi_clk; struct clk *hda2hdmi_clk;
void __iomem *regs; void __iomem *regs;
struct work_struct probe_work;
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -294,7 +295,9 @@ static int hda_tegra_dev_disconnect(struct snd_device *device) ...@@ -294,7 +295,9 @@ static int hda_tegra_dev_disconnect(struct snd_device *device)
static int hda_tegra_dev_free(struct snd_device *device) static int hda_tegra_dev_free(struct snd_device *device)
{ {
struct azx *chip = device->device_data; struct azx *chip = device->device_data;
struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip);
cancel_work_sync(&hda->probe_work);
if (azx_bus(chip)->chip_init) { if (azx_bus(chip)->chip_init) {
azx_stop_all_streams(chip); azx_stop_all_streams(chip);
azx_stop_chip(chip); azx_stop_chip(chip);
...@@ -426,6 +429,9 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev) ...@@ -426,6 +429,9 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
/* /*
* constructor * constructor
*/ */
static void hda_tegra_probe_work(struct work_struct *work);
static int hda_tegra_create(struct snd_card *card, static int hda_tegra_create(struct snd_card *card,
unsigned int driver_caps, unsigned int driver_caps,
struct hda_tegra *hda) struct hda_tegra *hda)
...@@ -452,6 +458,8 @@ static int hda_tegra_create(struct snd_card *card, ...@@ -452,6 +458,8 @@ static int hda_tegra_create(struct snd_card *card,
chip->single_cmd = false; chip->single_cmd = false;
chip->snoop = true; chip->snoop = true;
INIT_WORK(&hda->probe_work, hda_tegra_probe_work);
err = azx_bus_init(chip, NULL, &hda_tegra_io_ops); err = azx_bus_init(chip, NULL, &hda_tegra_io_ops);
if (err < 0) if (err < 0)
return err; return err;
...@@ -499,6 +507,21 @@ static int hda_tegra_probe(struct platform_device *pdev) ...@@ -499,6 +507,21 @@ static int hda_tegra_probe(struct platform_device *pdev)
card->private_data = chip; card->private_data = chip;
dev_set_drvdata(&pdev->dev, card); dev_set_drvdata(&pdev->dev, card);
schedule_work(&hda->probe_work);
return 0;
out_free:
snd_card_free(card);
return err;
}
static void hda_tegra_probe_work(struct work_struct *work)
{
struct hda_tegra *hda = container_of(work, struct hda_tegra, probe_work);
struct azx *chip = &hda->chip;
struct platform_device *pdev = to_platform_device(hda->dev);
int err;
err = hda_tegra_first_init(chip, pdev); err = hda_tegra_first_init(chip, pdev);
if (err < 0) if (err < 0)
...@@ -520,11 +543,8 @@ static int hda_tegra_probe(struct platform_device *pdev) ...@@ -520,11 +543,8 @@ static int hda_tegra_probe(struct platform_device *pdev)
chip->running = 1; chip->running = 1;
snd_hda_set_power_save(&chip->bus, power_save * 1000); snd_hda_set_power_save(&chip->bus, power_save * 1000);
return 0; out_free:
return; /* no error return from async probe */
out_free:
snd_card_free(card);
return err;
} }
static int hda_tegra_remove(struct platform_device *pdev) static int hda_tegra_remove(struct platform_device *pdev)
......
...@@ -4188,6 +4188,24 @@ static void alc_fixup_disable_aamix(struct hda_codec *codec, ...@@ -4188,6 +4188,24 @@ static void alc_fixup_disable_aamix(struct hda_codec *codec,
} }
} }
/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
static void alc_fixup_tpt440_dock(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
{
static const struct hda_pintbl pincfgs[] = {
{ 0x16, 0x21211010 }, /* dock headphone */
{ 0x19, 0x21a11010 }, /* dock mic */
{ }
};
struct alc_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
codec->power_save_node = 0; /* avoid click noises */
snd_hda_apply_pincfgs(codec, pincfgs);
}
}
static void alc_shutup_dell_xps13(struct hda_codec *codec) static void alc_shutup_dell_xps13(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
...@@ -4562,7 +4580,6 @@ enum { ...@@ -4562,7 +4580,6 @@ enum {
ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC, ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC292_FIXUP_TPT440_DOCK, ALC292_FIXUP_TPT440_DOCK,
ALC292_FIXUP_TPT440_DOCK2,
ALC283_FIXUP_BXBT2807_MIC, ALC283_FIXUP_BXBT2807_MIC,
ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED,
ALC282_FIXUP_ASPIRE_V5_PINS, ALC282_FIXUP_ASPIRE_V5_PINS,
...@@ -5029,17 +5046,7 @@ static const struct hda_fixup alc269_fixups[] = { ...@@ -5029,17 +5046,7 @@ static const struct hda_fixup alc269_fixups[] = {
}, },
[ALC292_FIXUP_TPT440_DOCK] = { [ALC292_FIXUP_TPT440_DOCK] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc269_fixup_pincfg_no_hp_to_lineout, .v.func = alc_fixup_tpt440_dock,
.chained = true,
.chain_id = ALC292_FIXUP_TPT440_DOCK2
},
[ALC292_FIXUP_TPT440_DOCK2] = {
.type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) {
{ 0x16, 0x21211010 }, /* dock headphone */
{ 0x19, 0x21a11010 }, /* dock mic */
{ }
},
.chained = true, .chained = true,
.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
}, },
......
...@@ -296,7 +296,6 @@ static int au1xpsc_i2s_drvprobe(struct platform_device *pdev) ...@@ -296,7 +296,6 @@ static int au1xpsc_i2s_drvprobe(struct platform_device *pdev)
{ {
struct resource *iores, *dmares; struct resource *iores, *dmares;
unsigned long sel; unsigned long sel;
int ret;
struct au1xpsc_audio_data *wd; struct au1xpsc_audio_data *wd;
wd = devm_kzalloc(&pdev->dev, sizeof(struct au1xpsc_audio_data), wd = devm_kzalloc(&pdev->dev, sizeof(struct au1xpsc_audio_data),
......
...@@ -732,14 +732,14 @@ static const struct snd_kcontrol_new rt5645_mono_adc_r_mix[] = { ...@@ -732,14 +732,14 @@ static const struct snd_kcontrol_new rt5645_mono_adc_r_mix[] = {
static const struct snd_kcontrol_new rt5645_dac_l_mix[] = { static const struct snd_kcontrol_new rt5645_dac_l_mix[] = {
SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER,
RT5645_M_ADCMIX_L_SFT, 1, 1), RT5645_M_ADCMIX_L_SFT, 1, 1),
SOC_DAPM_SINGLE("DAC1 Switch", RT5645_AD_DA_MIXER, SOC_DAPM_SINGLE_AUTODISABLE("DAC1 Switch", RT5645_AD_DA_MIXER,
RT5645_M_DAC1_L_SFT, 1, 1), RT5645_M_DAC1_L_SFT, 1, 1),
}; };
static const struct snd_kcontrol_new rt5645_dac_r_mix[] = { static const struct snd_kcontrol_new rt5645_dac_r_mix[] = {
SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER,
RT5645_M_ADCMIX_R_SFT, 1, 1), RT5645_M_ADCMIX_R_SFT, 1, 1),
SOC_DAPM_SINGLE("DAC1 Switch", RT5645_AD_DA_MIXER, SOC_DAPM_SINGLE_AUTODISABLE("DAC1 Switch", RT5645_AD_DA_MIXER,
RT5645_M_DAC1_R_SFT, 1, 1), RT5645_M_DAC1_R_SFT, 1, 1),
}; };
...@@ -1381,7 +1381,7 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on) ...@@ -1381,7 +1381,7 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
regmap_write(rt5645->regmap, RT5645_PR_BASE + regmap_write(rt5645->regmap, RT5645_PR_BASE +
RT5645_MAMP_INT_REG2, 0xfc00); RT5645_MAMP_INT_REG2, 0xfc00);
snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140);
mdelay(5); msleep(40);
rt5645->hp_on = true; rt5645->hp_on = true;
} else { } else {
/* depop parameters */ /* depop parameters */
...@@ -2829,13 +2829,12 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) ...@@ -2829,13 +2829,12 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
snd_soc_dapm_sync(dapm); snd_soc_dapm_sync(dapm);
rt5645->jack_type = SND_JACK_HEADPHONE; rt5645->jack_type = SND_JACK_HEADPHONE;
} }
snd_soc_update_bits(codec, RT5645_CHARGE_PUMP, 0x0300, 0x0200);
snd_soc_write(codec, RT5645_DEPOP_M1, 0x001d);
snd_soc_write(codec, RT5645_DEPOP_M1, 0x0001);
} else { /* jack out */ } else { /* jack out */
rt5645->jack_type = 0; rt5645->jack_type = 0;
regmap_update_bits(rt5645->regmap, RT5645_HP_VOL,
RT5645_L_MUTE | RT5645_R_MUTE,
RT5645_L_MUTE | RT5645_R_MUTE);
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD); RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD);
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
...@@ -2880,8 +2879,6 @@ int rt5645_set_jack_detect(struct snd_soc_codec *codec, ...@@ -2880,8 +2879,6 @@ int rt5645_set_jack_detect(struct snd_soc_codec *codec,
rt5645->en_button_func = true; rt5645->en_button_func = true;
regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ); RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ);
regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1,
RT5645_HP_CB_MASK, RT5645_HP_CB_PU);
regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1,
RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL); RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL);
} }
...@@ -3205,6 +3202,13 @@ static const struct dmi_system_id dmi_platform_intel_braswell[] = { ...@@ -3205,6 +3202,13 @@ static const struct dmi_system_id dmi_platform_intel_braswell[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Celes"), DMI_MATCH(DMI_PRODUCT_NAME, "Celes"),
}, },
}, },
{
.ident = "Google Ultima",
.callback = strago_quirk_cb,
.matches = {
DMI_MATCH(DMI_PRODUCT_NAME, "Ultima"),
},
},
{ } { }
}; };
......
...@@ -577,7 +577,6 @@ static int wm0010_boot(struct snd_soc_codec *codec) ...@@ -577,7 +577,6 @@ static int wm0010_boot(struct snd_soc_codec *codec)
struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec); struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
unsigned long flags; unsigned long flags;
int ret; int ret;
const struct firmware *fw;
struct spi_message m; struct spi_message m;
struct spi_transfer t; struct spi_transfer t;
struct dfw_pllrec pll_rec; struct dfw_pllrec pll_rec;
...@@ -623,14 +622,6 @@ static int wm0010_boot(struct snd_soc_codec *codec) ...@@ -623,14 +622,6 @@ static int wm0010_boot(struct snd_soc_codec *codec)
wm0010->state = WM0010_OUT_OF_RESET; wm0010->state = WM0010_OUT_OF_RESET;
spin_unlock_irqrestore(&wm0010->irq_lock, flags); spin_unlock_irqrestore(&wm0010->irq_lock, flags);
/* First the bootloader */
ret = request_firmware(&fw, "wm0010_stage2.bin", codec->dev);
if (ret != 0) {
dev_err(codec->dev, "Failed to request stage2 loader: %d\n",
ret);
goto abort;
}
if (!wait_for_completion_timeout(&wm0010->boot_completion, if (!wait_for_completion_timeout(&wm0010->boot_completion,
msecs_to_jiffies(20))) msecs_to_jiffies(20)))
dev_err(codec->dev, "Failed to get interrupt from DSP\n"); dev_err(codec->dev, "Failed to get interrupt from DSP\n");
...@@ -673,7 +664,7 @@ static int wm0010_boot(struct snd_soc_codec *codec) ...@@ -673,7 +664,7 @@ static int wm0010_boot(struct snd_soc_codec *codec)
img_swap = kzalloc(len, GFP_KERNEL | GFP_DMA); img_swap = kzalloc(len, GFP_KERNEL | GFP_DMA);
if (!img_swap) if (!img_swap)
goto abort; goto abort_out;
/* We need to re-order for 0010 */ /* We need to re-order for 0010 */
byte_swap_64((u64 *)&pll_rec, img_swap, len); byte_swap_64((u64 *)&pll_rec, img_swap, len);
...@@ -688,16 +679,16 @@ static int wm0010_boot(struct snd_soc_codec *codec) ...@@ -688,16 +679,16 @@ static int wm0010_boot(struct snd_soc_codec *codec)
spi_message_add_tail(&t, &m); spi_message_add_tail(&t, &m);
ret = spi_sync(spi, &m); ret = spi_sync(spi, &m);
if (ret != 0) { if (ret) {
dev_err(codec->dev, "First PLL write failed: %d\n", ret); dev_err(codec->dev, "First PLL write failed: %d\n", ret);
goto abort; goto abort_swap;
} }
/* Use a second send of the message to get the return status */ /* Use a second send of the message to get the return status */
ret = spi_sync(spi, &m); ret = spi_sync(spi, &m);
if (ret != 0) { if (ret) {
dev_err(codec->dev, "Second PLL write failed: %d\n", ret); dev_err(codec->dev, "Second PLL write failed: %d\n", ret);
goto abort; goto abort_swap;
} }
p = (u32 *)out; p = (u32 *)out;
...@@ -730,6 +721,10 @@ static int wm0010_boot(struct snd_soc_codec *codec) ...@@ -730,6 +721,10 @@ static int wm0010_boot(struct snd_soc_codec *codec)
return 0; return 0;
abort_swap:
kfree(img_swap);
abort_out:
kfree(out);
abort: abort:
/* Put the chip back into reset */ /* Put the chip back into reset */
wm0010_halt(codec); wm0010_halt(codec);
......
...@@ -211,28 +211,38 @@ static int wm8960_put_deemph(struct snd_kcontrol *kcontrol, ...@@ -211,28 +211,38 @@ static int wm8960_put_deemph(struct snd_kcontrol *kcontrol,
return wm8960_set_deemph(codec); return wm8960_set_deemph(codec);
} }
static const DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 50, 0); static const DECLARE_TLV_DB_SCALE(adc_tlv, -9750, 50, 1);
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12700, 50, 1); static const DECLARE_TLV_DB_SCALE(inpga_tlv, -1725, 75, 0);
static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1);
static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0); static const DECLARE_TLV_DB_SCALE(bypass_tlv, -2100, 300, 0);
static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1); static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);
static const DECLARE_TLV_DB_SCALE(boost_tlv, -1200, 300, 1); static const DECLARE_TLV_DB_SCALE(lineinboost_tlv, -1500, 300, 1);
static const unsigned int micboost_tlv[] = {
TLV_DB_RANGE_HEAD(2),
0, 1, TLV_DB_SCALE_ITEM(0, 1300, 0),
2, 3, TLV_DB_SCALE_ITEM(2000, 900, 0),
};
static const struct snd_kcontrol_new wm8960_snd_controls[] = { static const struct snd_kcontrol_new wm8960_snd_controls[] = {
SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL, SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL,
0, 63, 0, adc_tlv), 0, 63, 0, inpga_tlv),
SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL, SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL,
6, 1, 0), 6, 1, 0),
SOC_DOUBLE_R("Capture Switch", WM8960_LINVOL, WM8960_RINVOL, SOC_DOUBLE_R("Capture Switch", WM8960_LINVOL, WM8960_RINVOL,
7, 1, 0), 7, 1, 0),
SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT3 Volume", SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT3 Volume",
WM8960_INBMIX1, 4, 7, 0, boost_tlv), WM8960_INBMIX1, 4, 7, 0, lineinboost_tlv),
SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT2 Volume", SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT2 Volume",
WM8960_INBMIX1, 1, 7, 0, boost_tlv), WM8960_INBMIX1, 1, 7, 0, lineinboost_tlv),
SOC_SINGLE_TLV("Left Input Boost Mixer LINPUT3 Volume", SOC_SINGLE_TLV("Left Input Boost Mixer LINPUT3 Volume",
WM8960_INBMIX2, 4, 7, 0, boost_tlv), WM8960_INBMIX2, 4, 7, 0, lineinboost_tlv),
SOC_SINGLE_TLV("Left Input Boost Mixer LINPUT2 Volume", SOC_SINGLE_TLV("Left Input Boost Mixer LINPUT2 Volume",
WM8960_INBMIX2, 1, 7, 0, boost_tlv), WM8960_INBMIX2, 1, 7, 0, lineinboost_tlv),
SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT1 Volume",
WM8960_RINPATH, 4, 3, 0, micboost_tlv),
SOC_SINGLE_TLV("Left Input Boost Mixer LINPUT1 Volume",
WM8960_LINPATH, 4, 3, 0, micboost_tlv),
SOC_DOUBLE_R_TLV("Playback Volume", WM8960_LDAC, WM8960_RDAC, SOC_DOUBLE_R_TLV("Playback Volume", WM8960_LDAC, WM8960_RDAC,
0, 255, 0, dac_tlv), 0, 255, 0, dac_tlv),
......
...@@ -2944,7 +2944,8 @@ static int wm8962_mute(struct snd_soc_dai *dai, int mute) ...@@ -2944,7 +2944,8 @@ static int wm8962_mute(struct snd_soc_dai *dai, int mute)
WM8962_DAC_MUTE, val); WM8962_DAC_MUTE, val);
} }
#define WM8962_RATES SNDRV_PCM_RATE_8000_96000 #define WM8962_RATES (SNDRV_PCM_RATE_8000_48000 |\
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
#define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ #define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
......
...@@ -663,7 +663,7 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, ...@@ -663,7 +663,7 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
u8 rx_ser = 0; u8 rx_ser = 0;
u8 slots = mcasp->tdm_slots; u8 slots = mcasp->tdm_slots;
u8 max_active_serializers = (channels + slots - 1) / slots; u8 max_active_serializers = (channels + slots - 1) / slots;
int active_serializers, numevt, n; int active_serializers, numevt;
u32 reg; u32 reg;
/* Default configuration */ /* Default configuration */
if (mcasp->version < MCASP_VERSION_3) if (mcasp->version < MCASP_VERSION_3)
...@@ -745,9 +745,8 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream, ...@@ -745,9 +745,8 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
* The number of words for numevt need to be in steps of active * The number of words for numevt need to be in steps of active
* serializers. * serializers.
*/ */
n = numevt % active_serializers; numevt = (numevt / active_serializers) * active_serializers;
if (n)
numevt += (active_serializers - n);
while (period_words % numevt && numevt > 0) while (period_words % numevt && numevt > 0)
numevt -= active_serializers; numevt -= active_serializers;
if (numevt <= 0) if (numevt <= 0)
...@@ -1299,6 +1298,7 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = { ...@@ -1299,6 +1298,7 @@ static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
.ops = &davinci_mcasp_dai_ops, .ops = &davinci_mcasp_dai_ops,
.symmetric_samplebits = 1, .symmetric_samplebits = 1,
.symmetric_rates = 1,
}, },
{ {
.name = "davinci-mcasp.1", .name = "davinci-mcasp.1",
...@@ -1685,7 +1685,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1685,7 +1685,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
irq = platform_get_irq_byname(pdev, "common"); irq = platform_get_irq_byname(pdev, "common");
if (irq >= 0) { if (irq >= 0) {
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common\n", irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common",
dev_name(&pdev->dev)); dev_name(&pdev->dev));
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
davinci_mcasp_common_irq_handler, davinci_mcasp_common_irq_handler,
...@@ -1702,7 +1702,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1702,7 +1702,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
irq = platform_get_irq_byname(pdev, "rx"); irq = platform_get_irq_byname(pdev, "rx");
if (irq >= 0) { if (irq >= 0) {
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx\n", irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx",
dev_name(&pdev->dev)); dev_name(&pdev->dev));
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
davinci_mcasp_rx_irq_handler, davinci_mcasp_rx_irq_handler,
...@@ -1717,7 +1717,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev) ...@@ -1717,7 +1717,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
irq = platform_get_irq_byname(pdev, "tx"); irq = platform_get_irq_byname(pdev, "tx");
if (irq >= 0) { if (irq >= 0) {
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_tx\n", irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_tx",
dev_name(&pdev->dev)); dev_name(&pdev->dev));
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
davinci_mcasp_tx_irq_handler, davinci_mcasp_tx_irq_handler,
......
...@@ -488,7 +488,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev) ...@@ -488,7 +488,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM; priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
} else { } else {
dev_err(&pdev->dev, "unknown Device Tree compatible\n"); dev_err(&pdev->dev, "unknown Device Tree compatible\n");
return -EINVAL; ret = -EINVAL;
goto asrc_fail;
} }
/* Common settings for corresponding Freescale CPU DAI driver */ /* Common settings for corresponding Freescale CPU DAI driver */
......
...@@ -249,7 +249,8 @@ MODULE_DEVICE_TABLE(of, fsl_ssi_ids); ...@@ -249,7 +249,8 @@ MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private) static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private)
{ {
return !!(ssi_private->dai_fmt & SND_SOC_DAIFMT_AC97); return (ssi_private->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
SND_SOC_DAIFMT_AC97;
} }
static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private) static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private)
...@@ -947,7 +948,7 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev, ...@@ -947,7 +948,7 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev,
CCSR_SSI_SCR_TCH_EN); CCSR_SSI_SCR_TCH_EN);
} }
if (fmt & SND_SOC_DAIFMT_AC97) if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_AC97)
fsl_ssi_setup_ac97(ssi_private); fsl_ssi_setup_ac97(ssi_private);
return 0; return 0;
......
...@@ -302,6 +302,10 @@ struct sst_hsw { ...@@ -302,6 +302,10 @@ struct sst_hsw {
struct sst_hsw_ipc_dx_reply dx; struct sst_hsw_ipc_dx_reply dx;
void *dx_context; void *dx_context;
dma_addr_t dx_context_paddr; dma_addr_t dx_context_paddr;
enum sst_hsw_device_id dx_dev;
enum sst_hsw_device_mclk dx_mclk;
enum sst_hsw_device_mode dx_mode;
u32 dx_clock_divider;
/* boot */ /* boot */
wait_queue_head_t boot_wait; wait_queue_head_t boot_wait;
...@@ -1400,10 +1404,10 @@ int sst_hsw_device_set_config(struct sst_hsw *hsw, ...@@ -1400,10 +1404,10 @@ int sst_hsw_device_set_config(struct sst_hsw *hsw,
trace_ipc_request("set device config", dev); trace_ipc_request("set device config", dev);
config.ssp_interface = dev; hsw->dx_dev = config.ssp_interface = dev;
config.clock_frequency = mclk; hsw->dx_mclk = config.clock_frequency = mclk;
config.mode = mode; hsw->dx_mode = config.mode = mode;
config.clock_divider = clock_divider; hsw->dx_clock_divider = config.clock_divider = clock_divider;
if (mode == SST_HSW_DEVICE_TDM_CLOCK_MASTER) if (mode == SST_HSW_DEVICE_TDM_CLOCK_MASTER)
config.channels = 4; config.channels = 4;
else else
...@@ -1704,10 +1708,10 @@ int sst_hsw_dsp_runtime_resume(struct sst_hsw *hsw) ...@@ -1704,10 +1708,10 @@ int sst_hsw_dsp_runtime_resume(struct sst_hsw *hsw)
return -EIO; return -EIO;
} }
/* Set ADSP SSP port settings */ /* Set ADSP SSP port settings - sadly the FW does not store SSP port
ret = sst_hsw_device_set_config(hsw, SST_HSW_DEVICE_SSP_0, settings as part of the PM context. */
SST_HSW_DEVICE_MCLK_FREQ_24_MHZ, ret = sst_hsw_device_set_config(hsw, hsw->dx_dev, hsw->dx_mclk,
SST_HSW_DEVICE_CLOCK_MASTER, 9); hsw->dx_mode, hsw->dx_clock_divider);
if (ret < 0) if (ret < 0)
dev_err(dev, "error: SSP re-initialization failed\n"); dev_err(dev, "error: SSP re-initialization failed\n");
......
...@@ -549,6 +549,23 @@ static int mtk_afe_dais_startup(struct snd_pcm_substream *substream, ...@@ -549,6 +549,23 @@ static int mtk_afe_dais_startup(struct snd_pcm_substream *substream,
memif->substream = substream; memif->substream = substream;
snd_soc_set_runtime_hwparams(substream, &mtk_afe_hardware); snd_soc_set_runtime_hwparams(substream, &mtk_afe_hardware);
/*
* Capture cannot use ping-pong buffer since hw_ptr at IRQ may be
* smaller than period_size due to AFE's internal buffer.
* This easily leads to overrun when avail_min is period_size.
* One more period can hold the possible unread buffer.
*/
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
ret = snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIODS,
3,
mtk_afe_hardware.periods_max);
if (ret < 0) {
dev_err(afe->dev, "hw_constraint_minmax failed\n");
return ret;
}
}
ret = snd_pcm_hw_constraint_integer(runtime, ret = snd_pcm_hw_constraint_integer(runtime,
SNDRV_PCM_HW_PARAM_PERIODS); SNDRV_PCM_HW_PARAM_PERIODS);
if (ret < 0) if (ret < 0)
......
config SND_PXA2XX_SOC config SND_PXA2XX_SOC
tristate "SoC Audio for the Intel PXA2xx chip" tristate "SoC Audio for the Intel PXA2xx chip"
depends on ARCH_PXA depends on ARCH_PXA
select SND_ARM
select SND_PXA2XX_LIB select SND_PXA2XX_LIB
help help
Say Y or M if you want to add support for codecs attached to Say Y or M if you want to add support for codecs attached to
...@@ -25,7 +24,6 @@ config SND_PXA2XX_AC97 ...@@ -25,7 +24,6 @@ config SND_PXA2XX_AC97
config SND_PXA2XX_SOC_AC97 config SND_PXA2XX_SOC_AC97
tristate tristate
select AC97_BUS select AC97_BUS
select SND_ARM
select SND_PXA2XX_LIB_AC97 select SND_PXA2XX_LIB_AC97
select SND_SOC_AC97_BUS select SND_SOC_AC97_BUS
......
...@@ -49,7 +49,7 @@ static struct snd_ac97_bus_ops pxa2xx_ac97_ops = { ...@@ -49,7 +49,7 @@ static struct snd_ac97_bus_ops pxa2xx_ac97_ops = {
.reset = pxa2xx_ac97_cold_reset, .reset = pxa2xx_ac97_cold_reset,
}; };
static unsigned long pxa2xx_ac97_pcm_stereo_in_req = 12; static unsigned long pxa2xx_ac97_pcm_stereo_in_req = 11;
static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_in = { static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_in = {
.addr = __PREG(PCDR), .addr = __PREG(PCDR),
.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES, .addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
...@@ -57,7 +57,7 @@ static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_in = { ...@@ -57,7 +57,7 @@ static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_in = {
.filter_data = &pxa2xx_ac97_pcm_stereo_in_req, .filter_data = &pxa2xx_ac97_pcm_stereo_in_req,
}; };
static unsigned long pxa2xx_ac97_pcm_stereo_out_req = 11; static unsigned long pxa2xx_ac97_pcm_stereo_out_req = 12;
static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_out = { static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_out = {
.addr = __PREG(PCDR), .addr = __PREG(PCDR),
.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES, .addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
......
...@@ -3501,7 +3501,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w, ...@@ -3501,7 +3501,7 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
default: default:
WARN(1, "Unknown event %d\n", event); WARN(1, "Unknown event %d\n", event);
return -EINVAL; ret = -EINVAL;
} }
out: out:
......
...@@ -101,6 +101,15 @@ static struct snd_soc_codec_driver dummy_codec; ...@@ -101,6 +101,15 @@ static struct snd_soc_codec_driver dummy_codec;
SNDRV_PCM_FMTBIT_S32_LE | \ SNDRV_PCM_FMTBIT_S32_LE | \
SNDRV_PCM_FMTBIT_U32_LE | \ SNDRV_PCM_FMTBIT_U32_LE | \
SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE) SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE)
/*
* The dummy CODEC is only meant to be used in situations where there is no
* actual hardware.
*
* If there is actual hardware even if it does not have a control bus
* the hardware will still have constraints like supported samplerates, etc.
* which should be modelled. And the data flow graph also should be modelled
* using DAPM.
*/
static struct snd_soc_dai_driver dummy_dai = { static struct snd_soc_dai_driver dummy_dai = {
.name = "snd-soc-dummy-dai", .name = "snd-soc-dummy-dai",
.playback = { .playback = {
......
config SND_SPEAR_SOC config SND_SPEAR_SOC
tristate tristate
select SND_DMAENGINE_PCM select SND_SOC_GENERIC_DMAENGINE_PCM
config SND_SPEAR_SPDIF_OUT config SND_SPEAR_SPDIF_OUT
tristate tristate
......
...@@ -989,8 +989,8 @@ static int uni_player_parse_dt(struct platform_device *pdev, ...@@ -989,8 +989,8 @@ static int uni_player_parse_dt(struct platform_device *pdev,
if (!info) if (!info)
return -ENOMEM; return -ENOMEM;
of_property_read_u32(pnode, "version", &player->ver); if (of_property_read_u32(pnode, "version", &player->ver) ||
if (player->ver == SND_ST_UNIPERIF_VERSION_UNKNOWN) { player->ver == SND_ST_UNIPERIF_VERSION_UNKNOWN) {
dev_err(dev, "Unknown uniperipheral version "); dev_err(dev, "Unknown uniperipheral version ");
return -EINVAL; return -EINVAL;
} }
...@@ -998,10 +998,16 @@ static int uni_player_parse_dt(struct platform_device *pdev, ...@@ -998,10 +998,16 @@ static int uni_player_parse_dt(struct platform_device *pdev,
if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
info->underflow_enabled = 1; info->underflow_enabled = 1;
of_property_read_u32(pnode, "uniperiph-id", &info->id); if (of_property_read_u32(pnode, "uniperiph-id", &info->id)) {
dev_err(dev, "uniperipheral id not defined");
return -EINVAL;
}
/* Read the device mode property */ /* Read the device mode property */
of_property_read_string(pnode, "mode", &mode); if (of_property_read_string(pnode, "mode", &mode)) {
dev_err(dev, "uniperipheral mode not defined");
return -EINVAL;
}
if (strcasecmp(mode, "hdmi") == 0) if (strcasecmp(mode, "hdmi") == 0)
info->player_type = SND_ST_UNIPERIF_PLAYER_TYPE_HDMI; info->player_type = SND_ST_UNIPERIF_PLAYER_TYPE_HDMI;
......
...@@ -316,7 +316,11 @@ static int uni_reader_parse_dt(struct platform_device *pdev, ...@@ -316,7 +316,11 @@ static int uni_reader_parse_dt(struct platform_device *pdev,
if (!info) if (!info)
return -ENOMEM; return -ENOMEM;
of_property_read_u32(node, "version", &reader->ver); if (of_property_read_u32(node, "version", &reader->ver) ||
reader->ver == SND_ST_UNIPERIF_VERSION_UNKNOWN) {
dev_err(&pdev->dev, "Unknown uniperipheral version ");
return -EINVAL;
}
/* Save the info structure */ /* Save the info structure */
reader->info = info; reader->info = info;
......
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