sound fixes for 4.2-rc5

This became a relative big update as it includes the collected
 ASoC fixes.  There are a few fixes in ASoC core side, mostly for DAPM
 and the new topology API.  The rest are various ASoC driver-specific
 fixes, as well as the usual HD-audio and USB-audio quirks.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIcBAABCAAGBQJVu8yvAAoJEGwxgFQ9KSmkfygP/2JUuKj3RwqAgEyiXcF8WzUx
 2qvDa+Bz+aPRtHi6JBfh2TlAx/4iNGfCEzmd3+QddTKjDbnHUcbDrzcN8+6BK4kb
 0BXFSxRQrRTBZV3gtI7faXrzKl4sxFkaLFZ/vyKvcbXtpuiwEwiWwnGhAE4VEN0C
 pd1HuULIt855kC4BWNTnm82qKP3U9nAh6zNaOxG8SzWeaXJtnKC2Ut6RZSL8BOhr
 eq1QS4g/Uc+B0z+WMKQdrAYzfJ9qzMoRgJ0iqHkf7I8chmtYqXXrEAGMpVUa3+dj
 QC+0QX+c7B3XD+shk2AfJRh1ywS3XniKhVHJVYvW/vBoPGSjNY9KOgId7WwZobtx
 Ssi/nyS9eh5WI9A66uqpburTrkSwTHGEQ8GgSJh8Bb96TehP+bKE3QHDfWk40Wu1
 BaNNGq1OKyaOGWVOtK88852+niQWXgmnofufQQmi9pjyst5/c/ZrWQtf8ME2c5qg
 7piNIpjhtEWK3X2Vx63sHQMRJBQL2ScoVPhiT5hUix9I2HRGWWufElUUIHvythIv
 g7CaGl+y90++K6RDpv9R78a/YRNlLqcUU4b8j68Jy6Wjh6D9biEm1zk5gVSxyY+B
 B1kQ33P9x43yZq9Zl7/GG4HMHRdpyTkg/E3lnmvgszf3wGWH605B7758w1KLgilN
 p8UqRGy0DSme+eljmLvl
 =blL8
 -----END PGP SIGNATURE-----

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

Pull sound fixes from Takashi Iwai:
 "This became a relative big update as it includes the collected ASoC
  fixes.  There are a few fixes in ASoC core side, mostly for DAPM and
  the new topology API.  The rest are various ASoC driver-specific
  fixes, as well as the usual HD-audio and USB-audio quirks"

* tag 'sound-4.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (29 commits)
  ALSA: hda - Fix MacBook Pro 5,2 quirk
  ALSA: hda - Fix race between PM ops and HDA init/probe
  ALSA: usb-audio: add dB range mapping for some devices
  ALSA: hda - Apply a fixup to Dell Vostro 5480
  ALSA: hda - Add pin quirk for the headset mic jack detection on Dell laptop
  ALSA: hda - Apply fixup for another Toshiba Satellite S50D
  ALSA: fireworks: add support for AudioFire2 quirk
  ALSA: hda - Fix the headset mic that will not work on Dell desktop machine
  ALSA: hda - fix cs4210_spdif_automute()
  ASoC: pcm1681: Fix setting de-emphasis sampling rate selection
  ASoC: ssm4567: Keep TDM_BCLKS in ssm4567_set_dai_fmt
  ASoC: sgtl5000: Fix up define for SGTL5000_SMALL_POP
  ASoC: dapm: Don't add prefix to widget stream name
  ASoC: rt5645: Check if codec is initialized in workqueue handler
  ASoC: Intel: Get correct usage_count value to load firmware
  ASoC: topology: Fix to add dapm mixer info
  ASoC: zx: spdif: Fix devm_ioremap_resource return value check
  ASoC: zx: i2s: Fix devm_ioremap_resource return value check
  ASoC: mediatek: Use platform_of_node for machine drivers
  ASoC: Free card DAPM context on snd_soc_instantiate_card() error path
  ...
This commit is contained in:
Linus Torvalds 2015-07-31 17:00:25 -07:00
commit c6fd4fc708
27 changed files with 164 additions and 69 deletions

View File

@ -3,11 +3,13 @@ MT8173 with MAX98090 CODEC
Required properties: Required properties:
- compatible : "mediatek,mt8173-max98090" - compatible : "mediatek,mt8173-max98090"
- mediatek,audio-codec: the phandle of the MAX98090 audio codec - mediatek,audio-codec: the phandle of the MAX98090 audio codec
- mediatek,platform: the phandle of MT8173 ASoC platform
Example: Example:
sound { sound {
compatible = "mediatek,mt8173-max98090"; compatible = "mediatek,mt8173-max98090";
mediatek,audio-codec = <&max98090>; mediatek,audio-codec = <&max98090>;
mediatek,platform = <&afe>;
}; };

View File

@ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS
Required properties: Required properties:
- compatible : "mediatek,mt8173-rt5650-rt5676" - compatible : "mediatek,mt8173-rt5650-rt5676"
- mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
- mediatek,platform: the phandle of MT8173 ASoC platform
Example: Example:
sound { sound {
compatible = "mediatek,mt8173-rt5650-rt5676"; compatible = "mediatek,mt8173-rt5650-rt5676";
mediatek,audio-codec = <&rt5650 &rt5676>; mediatek,audio-codec = <&rt5650 &rt5676>;
mediatek,platform = <&afe>;
}; };

View File

@ -110,7 +110,7 @@
/* /*
* Block Header. * Block Header.
* This header preceeds all object and object arrays below. * This header precedes all object and object arrays below.
*/ */
struct snd_soc_tplg_hdr { struct snd_soc_tplg_hdr {
__le32 magic; /* magic number */ __le32 magic; /* magic number */
@ -222,7 +222,7 @@ struct snd_soc_tplg_stream_config {
/* /*
* Manifest. List totals for each payload type. Not used in parsing, but will * Manifest. List totals for each payload type. Not used in parsing, but will
* be passed to the component driver before any other objects in order for any * be passed to the component driver before any other objects in order for any
* global componnent resource allocations. * global component resource allocations.
* *
* File block representation for manifest :- * File block representation for manifest :-
* +-----------------------------------+----+ * +-----------------------------------+----+

View File

@ -248,6 +248,8 @@ efw_probe(struct fw_unit *unit,
err = get_hardware_info(efw); err = get_hardware_info(efw);
if (err < 0) if (err < 0)
goto error; goto error;
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2)
efw->is_af2 = true;
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9) if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9)
efw->is_af9 = true; efw->is_af9 = true;

View File

@ -70,6 +70,7 @@ struct snd_efw {
bool resp_addr_changable; bool resp_addr_changable;
/* for quirks */ /* for quirks */
bool is_af2;
bool is_af9; bool is_af9;
u32 firmware_version; u32 firmware_version;

View File

@ -172,6 +172,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT;
/* Fireworks reset dbc at bus reset. */ /* Fireworks reset dbc at bus reset. */
efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK;
/* AudioFire2 starts packets with non-zero dbc. */
if (efw->is_af2)
efw->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK;
/* AudioFire9 always reports wrong dbs. */ /* AudioFire9 always reports wrong dbs. */
if (efw->is_af9) if (efw->is_af9)
efw->tx_stream.flags |= CIP_WRONG_DBS; efw->tx_stream.flags |= CIP_WRONG_DBS;

View File

@ -867,7 +867,7 @@ static int azx_suspend(struct device *dev)
chip = card->private_data; chip = card->private_data;
hda = container_of(chip, struct hda_intel, chip); hda = container_of(chip, struct hda_intel, chip);
if (chip->disabled || hda->init_failed) if (chip->disabled || hda->init_failed || !chip->running)
return 0; return 0;
bus = azx_bus(chip); bus = azx_bus(chip);
@ -902,7 +902,7 @@ static int azx_resume(struct device *dev)
chip = card->private_data; chip = card->private_data;
hda = container_of(chip, struct hda_intel, chip); hda = container_of(chip, struct hda_intel, chip);
if (chip->disabled || hda->init_failed) if (chip->disabled || hda->init_failed || !chip->running)
return 0; return 0;
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL
@ -1027,7 +1027,7 @@ static int azx_runtime_idle(struct device *dev)
return 0; return 0;
if (!power_save_controller || !azx_has_pm_runtime(chip) || if (!power_save_controller || !azx_has_pm_runtime(chip) ||
azx_bus(chip)->codec_powered) azx_bus(chip)->codec_powered || !chip->running)
return -EBUSY; return -EBUSY;
return 0; return 0;

View File

@ -999,9 +999,7 @@ static void cs4210_spdif_automute(struct hda_codec *codec,
spec->spdif_present = spdif_present; spec->spdif_present = spdif_present;
/* SPDIF TX on/off */ /* SPDIF TX on/off */
if (spdif_present) snd_hda_set_pin_ctl(codec, spdif_pin, spdif_present ? PIN_OUT : 0);
snd_hda_set_pin_ctl(codec, spdif_pin,
spdif_present ? PIN_OUT : 0);
cs_automute(codec); cs_automute(codec);
} }

View File

@ -2222,7 +2222,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
@ -5185,6 +5185,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13), SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
@ -5398,8 +5399,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{0x19, 0x411111f0}, \ {0x19, 0x411111f0}, \
{0x1a, 0x411111f0}, \ {0x1a, 0x411111f0}, \
{0x1b, 0x411111f0}, \ {0x1b, 0x411111f0}, \
{0x1d, 0x40700001}, \
{0x1e, 0x411111f0}, \
{0x21, 0x02211020} {0x21, 0x02211020}
#define ALC282_STANDARD_PINS \ #define ALC282_STANDARD_PINS \
@ -5472,6 +5471,28 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
{0x1d, 0x4054c029}, {0x1d, 0x4054c029},
{0x1e, 0x411111f0}, {0x1e, 0x411111f0},
{0x21, 0x0221103f}), {0x21, 0x0221103f}),
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
{0x12, 0x40000000},
{0x14, 0x90170150},
{0x17, 0x411111f0},
{0x18, 0x411111f0},
{0x19, 0x411111f0},
{0x1a, 0x411111f0},
{0x1b, 0x02011020},
{0x1d, 0x4054c029},
{0x1e, 0x411111f0},
{0x21, 0x0221105f}),
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
{0x12, 0x40000000},
{0x14, 0x90170110},
{0x17, 0x411111f0},
{0x18, 0x411111f0},
{0x19, 0x411111f0},
{0x1a, 0x411111f0},
{0x1b, 0x01014020},
{0x1d, 0x4054c029},
{0x1e, 0x411111f0},
{0x21, 0x0221101f}),
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
{0x12, 0x90a60160}, {0x12, 0x90a60160},
{0x14, 0x90170120}, {0x14, 0x90170120},
@ -5534,10 +5555,19 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
{0x21, 0x02211030}), {0x21, 0x02211030}),
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC256_STANDARD_PINS, ALC256_STANDARD_PINS,
{0x13, 0x40000000}), {0x13, 0x40000000},
{0x1d, 0x40700001},
{0x1e, 0x411111f0}),
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC256_STANDARD_PINS, ALC256_STANDARD_PINS,
{0x13, 0x411111f0}), {0x13, 0x411111f0},
{0x1d, 0x40700001},
{0x1e, 0x411111f0}),
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC256_STANDARD_PINS,
{0x13, 0x411111f0},
{0x1d, 0x4077992d},
{0x1e, 0x411111ff}),
SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
{0x12, 0x90a60130}, {0x12, 0x90a60130},
{0x13, 0x40000000}, {0x13, 0x40000000},

View File

@ -2920,7 +2920,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = {
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a, SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a,
"HP Mini", STAC_92HD83XXX_HP_LED), "HP Mini", STAC_92HD83XXX_HP_LED),
SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP), SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP),
SND_PCI_QUIRK(PCI_VENDOR_ID_TOSHIBA, 0xfa91, /* match both for 0xfa91 and 0xfa93 */
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91,
"Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD),
{} /* terminator */ {} /* terminator */
}; };

View File

@ -102,7 +102,7 @@ static int pcm1681_set_deemph(struct snd_soc_codec *codec)
if (val != -1) { if (val != -1) {
regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL, regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL,
PCM1681_DEEMPH_RATE_MASK, val); PCM1681_DEEMPH_RATE_MASK, val << 3);
enable = 1; enable = 1;
} else } else
enable = 0; enable = 0;

View File

@ -2943,6 +2943,9 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
{ {
int val, btn_type, gpio_state = 0, report = 0; int val, btn_type, gpio_state = 0, report = 0;
if (!rt5645->codec)
return -EINVAL;
switch (rt5645->pdata.jd_mode) { switch (rt5645->pdata.jd_mode) {
case 0: /* Not using rt5645 JD */ case 0: /* Not using rt5645 JD */
if (rt5645->gpiod_hp_det) { if (rt5645->gpiod_hp_det) {

View File

@ -275,7 +275,7 @@
#define SGTL5000_BIAS_CTRL_MASK 0x000e #define SGTL5000_BIAS_CTRL_MASK 0x000e
#define SGTL5000_BIAS_CTRL_SHIFT 1 #define SGTL5000_BIAS_CTRL_SHIFT 1
#define SGTL5000_BIAS_CTRL_WIDTH 3 #define SGTL5000_BIAS_CTRL_WIDTH 3
#define SGTL5000_SMALL_POP 0 #define SGTL5000_SMALL_POP 1
/* /*
* SGTL5000_CHIP_MIC_CTRL * SGTL5000_CHIP_MIC_CTRL

View File

@ -315,7 +315,13 @@ static int ssm4567_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
if (invert_fclk) if (invert_fclk)
ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC; ctrl1 |= SSM4567_SAI_CTRL_1_FSYNC;
return regmap_write(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1, ctrl1); return regmap_update_bits(ssm4567->regmap, SSM4567_REG_SAI_CTRL_1,
SSM4567_SAI_CTRL_1_BCLK |
SSM4567_SAI_CTRL_1_FSYNC |
SSM4567_SAI_CTRL_1_LJ |
SSM4567_SAI_CTRL_1_TDM |
SSM4567_SAI_CTRL_1_PDM,
ctrl1);
} }
static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable)

View File

@ -633,7 +633,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
sub *= 100000; sub *= 100000;
do_div(sub, freq); do_div(sub, freq);
if (sub < savesub) { if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) {
baudrate = tmprate; baudrate = tmprate;
savesub = sub; savesub = sub;
pm = i; pm = i;

View File

@ -7,4 +7,4 @@ obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/
obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/ obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/
# Machine support # Machine support
obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/ obj-$(CONFIG_SND_SOC) += boards/

View File

@ -42,6 +42,11 @@
#define MIN_FRAGMENT_SIZE (50 * 1024) #define MIN_FRAGMENT_SIZE (50 * 1024)
#define MAX_FRAGMENT_SIZE (1024 * 1024) #define MAX_FRAGMENT_SIZE (1024 * 1024)
#define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1) #define SST_GET_BYTES_PER_SAMPLE(pcm_wd_sz) (((pcm_wd_sz + 15) >> 4) << 1)
#ifdef CONFIG_PM
#define GET_USAGE_COUNT(dev) (atomic_read(&dev->power.usage_count))
#else
#define GET_USAGE_COUNT(dev) 1
#endif
int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id) int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id)
{ {
@ -141,15 +146,9 @@ static int sst_power_control(struct device *dev, bool state)
int ret = 0; int ret = 0;
int usage_count = 0; int usage_count = 0;
#ifdef CONFIG_PM
usage_count = atomic_read(&dev->power.usage_count);
#else
usage_count = 1;
#endif
if (state == true) { if (state == true) {
ret = pm_runtime_get_sync(dev); ret = pm_runtime_get_sync(dev);
usage_count = GET_USAGE_COUNT(dev);
dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count); dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count);
if (ret < 0) { if (ret < 0) {
dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret); dev_err(ctx->dev, "Runtime get failed with err: %d\n", ret);
@ -164,6 +163,7 @@ static int sst_power_control(struct device *dev, bool state)
} }
} }
} else { } else {
usage_count = GET_USAGE_COUNT(dev);
dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count); dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count);
return sst_pm_runtime_put(ctx); return sst_pm_runtime_put(ctx);
} }

View File

@ -69,12 +69,12 @@ static const struct snd_soc_dapm_route cht_audio_map[] = {
{"Headphone", NULL, "HPR"}, {"Headphone", NULL, "HPR"},
{"Ext Spk", NULL, "SPKL"}, {"Ext Spk", NULL, "SPKL"},
{"Ext Spk", NULL, "SPKR"}, {"Ext Spk", NULL, "SPKR"},
{"AIF1 Playback", NULL, "ssp2 Tx"}, {"HiFi Playback", NULL, "ssp2 Tx"},
{"ssp2 Tx", NULL, "codec_out0"}, {"ssp2 Tx", NULL, "codec_out0"},
{"ssp2 Tx", NULL, "codec_out1"}, {"ssp2 Tx", NULL, "codec_out1"},
{"codec_in0", NULL, "ssp2 Rx" }, {"codec_in0", NULL, "ssp2 Rx" },
{"codec_in1", NULL, "ssp2 Rx" }, {"codec_in1", NULL, "ssp2 Rx" },
{"ssp2 Rx", NULL, "AIF1 Capture"}, {"ssp2 Rx", NULL, "HiFi Capture"},
}; };
static const struct snd_kcontrol_new cht_mc_controls[] = { static const struct snd_kcontrol_new cht_mc_controls[] = {

View File

@ -103,7 +103,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = {
.name = "MAX98090 Playback", .name = "MAX98090 Playback",
.stream_name = "MAX98090 Playback", .stream_name = "MAX98090 Playback",
.cpu_dai_name = "DL1", .cpu_dai_name = "DL1",
.platform_name = "11220000.mt8173-afe-pcm",
.codec_name = "snd-soc-dummy", .codec_name = "snd-soc-dummy",
.codec_dai_name = "snd-soc-dummy-dai", .codec_dai_name = "snd-soc-dummy-dai",
.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
@ -114,7 +113,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = {
.name = "MAX98090 Capture", .name = "MAX98090 Capture",
.stream_name = "MAX98090 Capture", .stream_name = "MAX98090 Capture",
.cpu_dai_name = "VUL", .cpu_dai_name = "VUL",
.platform_name = "11220000.mt8173-afe-pcm",
.codec_name = "snd-soc-dummy", .codec_name = "snd-soc-dummy",
.codec_dai_name = "snd-soc-dummy-dai", .codec_dai_name = "snd-soc-dummy-dai",
.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
@ -125,7 +123,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = {
{ {
.name = "Codec", .name = "Codec",
.cpu_dai_name = "I2S", .cpu_dai_name = "I2S",
.platform_name = "11220000.mt8173-afe-pcm",
.no_pcm = 1, .no_pcm = 1,
.codec_dai_name = "HiFi", .codec_dai_name = "HiFi",
.init = mt8173_max98090_init, .init = mt8173_max98090_init,
@ -152,9 +149,21 @@ static struct snd_soc_card mt8173_max98090_card = {
static int mt8173_max98090_dev_probe(struct platform_device *pdev) static int mt8173_max98090_dev_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card = &mt8173_max98090_card; struct snd_soc_card *card = &mt8173_max98090_card;
struct device_node *codec_node; struct device_node *codec_node, *platform_node;
int ret, i; int ret, i;
platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!platform_node) {
dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
return -EINVAL;
}
for (i = 0; i < card->num_links; i++) {
if (mt8173_max98090_dais[i].platform_name)
continue;
mt8173_max98090_dais[i].platform_of_node = platform_node;
}
codec_node = of_parse_phandle(pdev->dev.of_node, codec_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,audio-codec", 0); "mediatek,audio-codec", 0);
if (!codec_node) { if (!codec_node) {

View File

@ -138,7 +138,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
.name = "rt5650_rt5676 Playback", .name = "rt5650_rt5676 Playback",
.stream_name = "rt5650_rt5676 Playback", .stream_name = "rt5650_rt5676 Playback",
.cpu_dai_name = "DL1", .cpu_dai_name = "DL1",
.platform_name = "11220000.mt8173-afe-pcm",
.codec_name = "snd-soc-dummy", .codec_name = "snd-soc-dummy",
.codec_dai_name = "snd-soc-dummy-dai", .codec_dai_name = "snd-soc-dummy-dai",
.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
@ -149,7 +148,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
.name = "rt5650_rt5676 Capture", .name = "rt5650_rt5676 Capture",
.stream_name = "rt5650_rt5676 Capture", .stream_name = "rt5650_rt5676 Capture",
.cpu_dai_name = "VUL", .cpu_dai_name = "VUL",
.platform_name = "11220000.mt8173-afe-pcm",
.codec_name = "snd-soc-dummy", .codec_name = "snd-soc-dummy",
.codec_dai_name = "snd-soc-dummy-dai", .codec_dai_name = "snd-soc-dummy-dai",
.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
@ -161,7 +159,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
{ {
.name = "Codec", .name = "Codec",
.cpu_dai_name = "I2S", .cpu_dai_name = "I2S",
.platform_name = "11220000.mt8173-afe-pcm",
.no_pcm = 1, .no_pcm = 1,
.codecs = mt8173_rt5650_rt5676_codecs, .codecs = mt8173_rt5650_rt5676_codecs,
.num_codecs = 2, .num_codecs = 2,
@ -209,7 +206,21 @@ static struct snd_soc_card mt8173_rt5650_rt5676_card = {
static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev) static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card = &mt8173_rt5650_rt5676_card; struct snd_soc_card *card = &mt8173_rt5650_rt5676_card;
int ret; struct device_node *platform_node;
int i, ret;
platform_node = of_parse_phandle(pdev->dev.of_node,
"mediatek,platform", 0);
if (!platform_node) {
dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
return -EINVAL;
}
for (i = 0; i < card->num_links; i++) {
if (mt8173_rt5650_rt5676_dais[i].platform_name)
continue;
mt8173_rt5650_rt5676_dais[i].platform_of_node = platform_node;
}
mt8173_rt5650_rt5676_codecs[0].of_node = mt8173_rt5650_rt5676_codecs[0].of_node =
of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0);

View File

@ -1199,6 +1199,8 @@ err_pm_disable:
static int mtk_afe_pcm_dev_remove(struct platform_device *pdev) static int mtk_afe_pcm_dev_remove(struct platform_device *pdev)
{ {
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev))
mtk_afe_runtime_suspend(&pdev->dev);
snd_soc_unregister_component(&pdev->dev); snd_soc_unregister_component(&pdev->dev);
snd_soc_unregister_platform(&pdev->dev); snd_soc_unregister_platform(&pdev->dev);
return 0; return 0;

View File

@ -1716,6 +1716,7 @@ card_probe_error:
if (card->remove) if (card->remove)
card->remove(card); card->remove(card);
snd_soc_dapm_free(&card->dapm);
soc_cleanup_card_debugfs(card); soc_cleanup_card_debugfs(card);
snd_card_free(card->snd_card); snd_card_free(card->snd_card);

View File

@ -358,9 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
data->widget = data->widget =
snd_soc_dapm_new_control_unlocked(widget->dapm, snd_soc_dapm_new_control_unlocked(widget->dapm,
&template); &template);
kfree(name);
if (!data->widget) { if (!data->widget) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_name; goto err_data;
} }
} }
break; break;
@ -389,11 +390,12 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
data->value = template.on_val; data->value = template.on_val;
data->widget = snd_soc_dapm_new_control(widget->dapm, data->widget = snd_soc_dapm_new_control_unlocked(
&template); widget->dapm, &template);
kfree(name);
if (!data->widget) { if (!data->widget) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_name; goto err_data;
} }
snd_soc_dapm_add_path(widget->dapm, data->widget, snd_soc_dapm_add_path(widget->dapm, data->widget,
@ -408,8 +410,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
return 0; return 0;
err_name:
kfree(name);
err_data: err_data:
kfree(data); kfree(data);
return ret; return ret;
@ -418,8 +418,6 @@ err_data:
static void dapm_kcontrol_free(struct snd_kcontrol *kctl) static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
{ {
struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
if (data->widget)
kfree(data->widget->name);
kfree(data->wlist); kfree(data->wlist);
kfree(data); kfree(data);
} }
@ -1952,6 +1950,7 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct snd_soc_dapm_widget *w = file->private_data; struct snd_soc_dapm_widget *w = file->private_data;
struct snd_soc_card *card = w->dapm->card;
char *buf; char *buf;
int in, out; int in, out;
ssize_t ret; ssize_t ret;
@ -1961,6 +1960,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
mutex_lock(&card->dapm_mutex);
/* Supply widgets are not handled by is_connected_{input,output}_ep() */ /* Supply widgets are not handled by is_connected_{input,output}_ep() */
if (w->is_supply) { if (w->is_supply) {
in = 0; in = 0;
@ -2007,6 +2008,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
p->sink->name); p->sink->name);
} }
mutex_unlock(&card->dapm_mutex);
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
kfree(buf); kfree(buf);
@ -2281,11 +2284,15 @@ static ssize_t dapm_widget_show(struct device *dev,
struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev); struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
int i, count = 0; int i, count = 0;
mutex_lock(&rtd->card->dapm_mutex);
for (i = 0; i < rtd->num_codecs; i++) { for (i = 0; i < rtd->num_codecs; i++) {
struct snd_soc_codec *codec = rtd->codec_dais[i]->codec; struct snd_soc_codec *codec = rtd->codec_dais[i]->codec;
count += dapm_widget_show_codec(codec, buf + count); count += dapm_widget_show_codec(codec, buf + count);
} }
mutex_unlock(&rtd->card->dapm_mutex);
return count; return count;
} }
@ -3334,16 +3341,10 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
} }
prefix = soc_dapm_prefix(dapm); prefix = soc_dapm_prefix(dapm);
if (prefix) { if (prefix)
w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name); w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name);
if (widget->sname) else
w->sname = kasprintf(GFP_KERNEL, "%s %s", prefix,
widget->sname);
} else {
w->name = kasprintf(GFP_KERNEL, "%s", widget->name); w->name = kasprintf(GFP_KERNEL, "%s", widget->name);
if (widget->sname)
w->sname = kasprintf(GFP_KERNEL, "%s", widget->sname);
}
if (w->name == NULL) { if (w->name == NULL) {
kfree(w); kfree(w);
return NULL; return NULL;
@ -3792,7 +3793,7 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
break; break;
} }
if (!w->sname || !strstr(w->sname, dai_w->name)) if (!w->sname || !strstr(w->sname, dai_w->sname))
continue; continue;
if (dai_w->id == snd_soc_dapm_dai_in) { if (dai_w->id == snd_soc_dapm_dai_in) {

View File

@ -144,7 +144,7 @@ static const struct snd_soc_tplg_kcontrol_ops io_ops[] = {
{SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe,
snd_soc_put_strobe, NULL}, snd_soc_put_strobe, NULL},
{SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw,
snd_soc_dapm_put_volsw, NULL}, snd_soc_dapm_put_volsw, snd_soc_info_volsw},
{SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double,
snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, snd_soc_dapm_put_enum_double, snd_soc_info_enum_double},
{SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double,
@ -580,27 +580,26 @@ static int soc_tplg_init_kcontrol(struct soc_tplg *tplg,
} }
static int soc_tplg_create_tlv(struct soc_tplg *tplg, static int soc_tplg_create_tlv(struct soc_tplg *tplg,
struct snd_kcontrol_new *kc, u32 tlv_size) struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_tlv *tplg_tlv)
{ {
struct snd_soc_tplg_ctl_tlv *tplg_tlv;
struct snd_ctl_tlv *tlv; struct snd_ctl_tlv *tlv;
int size;
if (tlv_size == 0) if (tplg_tlv->count == 0)
return 0; return 0;
tplg_tlv = (struct snd_soc_tplg_ctl_tlv *) tplg->pos; size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) &
tplg->pos += tlv_size; ~(sizeof(unsigned int) - 1));
tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL);
tlv = kzalloc(sizeof(*tlv) + tlv_size, GFP_KERNEL);
if (tlv == NULL) if (tlv == NULL)
return -ENOMEM; return -ENOMEM;
dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n", dev_dbg(tplg->dev, " created TLV type %d size %d bytes\n",
tplg_tlv->numid, tplg_tlv->size); tplg_tlv->numid, size);
tlv->numid = tplg_tlv->numid; tlv->numid = tplg_tlv->numid;
tlv->length = tplg_tlv->size; tlv->length = size;
memcpy(tlv->tlv, tplg_tlv + 1, tplg_tlv->size); memcpy(&tlv->tlv[0], tplg_tlv->data, size);
kc->tlv.p = (void *)tlv; kc->tlv.p = (void *)tlv;
return 0; return 0;
@ -773,7 +772,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
} }
/* create any TLV data */ /* create any TLV data */
soc_tplg_create_tlv(tplg, &kc, mc->hdr.tlv_size); soc_tplg_create_tlv(tplg, &kc, &mc->tlv);
/* register control here */ /* register control here */
err = soc_tplg_add_kcontrol(tplg, &kc, err = soc_tplg_add_kcontrol(tplg, &kc,

View File

@ -393,9 +393,9 @@ static int zx_i2s_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
zx_i2s->mapbase = res->start; zx_i2s->mapbase = res->start;
zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res); zx_i2s->reg_base = devm_ioremap_resource(&pdev->dev, res);
if (!zx_i2s->reg_base) { if (IS_ERR(zx_i2s->reg_base)) {
dev_err(&pdev->dev, "ioremap failed!\n"); dev_err(&pdev->dev, "ioremap failed!\n");
return -EIO; return PTR_ERR(zx_i2s->reg_base);
} }
writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL); writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL);

View File

@ -322,9 +322,9 @@ static int zx_spdif_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
zx_spdif->mapbase = res->start; zx_spdif->mapbase = res->start;
zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res); zx_spdif->reg_base = devm_ioremap_resource(&pdev->dev, res);
if (!zx_spdif->reg_base) { if (IS_ERR(zx_spdif->reg_base)) {
dev_err(&pdev->dev, "ioremap failed!\n"); dev_err(&pdev->dev, "ioremap failed!\n");
return -EIO; return PTR_ERR(zx_spdif->reg_base);
} }
zx_spdif_dev_init(zx_spdif->reg_base); zx_spdif_dev_init(zx_spdif->reg_base);

View File

@ -341,6 +341,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
{ 0 } { 0 }
}; };
/* Bose companion 5, the dB conversion factor is 16 instead of 256 */
static struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
static struct usbmix_name_map bose_companion5_map[] = {
{ 3, NULL, .dB = &bose_companion5_dB },
{ 0 } /* terminator */
};
/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */
static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000};
static struct usbmix_name_map dragonfly_1_2_map[] = {
{ 7, NULL, .dB = &dragonfly_1_2_dB },
{ 0 } /* terminator */
};
/* /*
* Control map entries * Control map entries
*/ */
@ -451,6 +465,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
.id = USB_ID(0x25c4, 0x0003), .id = USB_ID(0x25c4, 0x0003),
.map = scms_usb3318_map, .map = scms_usb3318_map,
}, },
{
/* Bose Companion 5 */
.id = USB_ID(0x05a7, 0x1020),
.map = bose_companion5_map,
},
{
/* Dragonfly DAC 1.2 */
.id = USB_ID(0x21b4, 0x0081),
.map = dragonfly_1_2_map,
},
{ 0 } /* terminator */ { 0 } /* terminator */
}; };