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:
commit
c6fd4fc708
|
@ -3,11 +3,13 @@ MT8173 with MAX98090 CODEC
|
|||
Required properties:
|
||||
- compatible : "mediatek,mt8173-max98090"
|
||||
- mediatek,audio-codec: the phandle of the MAX98090 audio codec
|
||||
- mediatek,platform: the phandle of MT8173 ASoC platform
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt8173-max98090";
|
||||
mediatek,audio-codec = <&max98090>;
|
||||
mediatek,platform = <&afe>;
|
||||
};
|
||||
|
||||
|
|
|
@ -3,11 +3,13 @@ MT8173 with RT5650 RT5676 CODECS
|
|||
Required properties:
|
||||
- compatible : "mediatek,mt8173-rt5650-rt5676"
|
||||
- mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
|
||||
- mediatek,platform: the phandle of MT8173 ASoC platform
|
||||
|
||||
Example:
|
||||
|
||||
sound {
|
||||
compatible = "mediatek,mt8173-rt5650-rt5676";
|
||||
mediatek,audio-codec = <&rt5650 &rt5676>;
|
||||
mediatek,platform = <&afe>;
|
||||
};
|
||||
|
||||
|
|
|
@ -110,7 +110,7 @@
|
|||
|
||||
/*
|
||||
* 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 {
|
||||
__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
|
||||
* 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 :-
|
||||
* +-----------------------------------+----+
|
||||
|
|
|
@ -248,6 +248,8 @@ efw_probe(struct fw_unit *unit,
|
|||
err = get_hardware_info(efw);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2)
|
||||
efw->is_af2 = true;
|
||||
if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9)
|
||||
efw->is_af9 = true;
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ struct snd_efw {
|
|||
bool resp_addr_changable;
|
||||
|
||||
/* for quirks */
|
||||
bool is_af2;
|
||||
bool is_af9;
|
||||
u32 firmware_version;
|
||||
|
||||
|
|
|
@ -172,6 +172,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
|
|||
efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT;
|
||||
/* Fireworks reset dbc at bus reset. */
|
||||
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. */
|
||||
if (efw->is_af9)
|
||||
efw->tx_stream.flags |= CIP_WRONG_DBS;
|
||||
|
|
|
@ -867,7 +867,7 @@ static int azx_suspend(struct device *dev)
|
|||
|
||||
chip = card->private_data;
|
||||
hda = container_of(chip, struct hda_intel, chip);
|
||||
if (chip->disabled || hda->init_failed)
|
||||
if (chip->disabled || hda->init_failed || !chip->running)
|
||||
return 0;
|
||||
|
||||
bus = azx_bus(chip);
|
||||
|
@ -902,7 +902,7 @@ static int azx_resume(struct device *dev)
|
|||
|
||||
chip = card->private_data;
|
||||
hda = container_of(chip, struct hda_intel, chip);
|
||||
if (chip->disabled || hda->init_failed)
|
||||
if (chip->disabled || hda->init_failed || !chip->running)
|
||||
return 0;
|
||||
|
||||
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL
|
||||
|
@ -1027,7 +1027,7 @@ static int azx_runtime_idle(struct device *dev)
|
|||
return 0;
|
||||
|
||||
if (!power_save_controller || !azx_has_pm_runtime(chip) ||
|
||||
azx_bus(chip)->codec_powered)
|
||||
azx_bus(chip)->codec_powered || !chip->running)
|
||||
return -EBUSY;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -999,9 +999,7 @@ static void cs4210_spdif_automute(struct hda_codec *codec,
|
|||
|
||||
spec->spdif_present = spdif_present;
|
||||
/* 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);
|
||||
}
|
||||
|
|
|
@ -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, 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, 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(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, 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, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
|
||||
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, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
|
@ -5398,8 +5399,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{0x19, 0x411111f0}, \
|
||||
{0x1a, 0x411111f0}, \
|
||||
{0x1b, 0x411111f0}, \
|
||||
{0x1d, 0x40700001}, \
|
||||
{0x1e, 0x411111f0}, \
|
||||
{0x21, 0x02211020}
|
||||
|
||||
#define ALC282_STANDARD_PINS \
|
||||
|
@ -5472,6 +5471,28 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x1d, 0x4054c029},
|
||||
{0x1e, 0x411111f0},
|
||||
{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,
|
||||
{0x12, 0x90a60160},
|
||||
{0x14, 0x90170120},
|
||||
|
@ -5534,10 +5555,19 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC256_STANDARD_PINS,
|
||||
{0x13, 0x40000000}),
|
||||
{0x13, 0x40000000},
|
||||
{0x1d, 0x40700001},
|
||||
{0x1e, 0x411111f0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
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,
|
||||
{0x12, 0x90a60130},
|
||||
{0x13, 0x40000000},
|
||||
|
|
|
@ -2920,7 +2920,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a,
|
||||
"HP Mini", STAC_92HD83XXX_HP_LED),
|
||||
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),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
|
|
@ -102,7 +102,7 @@ static int pcm1681_set_deemph(struct snd_soc_codec *codec)
|
|||
|
||||
if (val != -1) {
|
||||
regmap_update_bits(priv->regmap, PCM1681_DEEMPH_CONTROL,
|
||||
PCM1681_DEEMPH_RATE_MASK, val);
|
||||
PCM1681_DEEMPH_RATE_MASK, val << 3);
|
||||
enable = 1;
|
||||
} else
|
||||
enable = 0;
|
||||
|
|
|
@ -2943,6 +2943,9 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
|
|||
{
|
||||
int val, btn_type, gpio_state = 0, report = 0;
|
||||
|
||||
if (!rt5645->codec)
|
||||
return -EINVAL;
|
||||
|
||||
switch (rt5645->pdata.jd_mode) {
|
||||
case 0: /* Not using rt5645 JD */
|
||||
if (rt5645->gpiod_hp_det) {
|
||||
|
|
|
@ -275,7 +275,7 @@
|
|||
#define SGTL5000_BIAS_CTRL_MASK 0x000e
|
||||
#define SGTL5000_BIAS_CTRL_SHIFT 1
|
||||
#define SGTL5000_BIAS_CTRL_WIDTH 3
|
||||
#define SGTL5000_SMALL_POP 0
|
||||
#define SGTL5000_SMALL_POP 1
|
||||
|
||||
/*
|
||||
* SGTL5000_CHIP_MIC_CTRL
|
||||
|
|
|
@ -315,7 +315,13 @@ static int ssm4567_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||
if (invert_fclk)
|
||||
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)
|
||||
|
|
|
@ -633,7 +633,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
|
|||
sub *= 100000;
|
||||
do_div(sub, freq);
|
||||
|
||||
if (sub < savesub) {
|
||||
if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) {
|
||||
baudrate = tmprate;
|
||||
savesub = sub;
|
||||
pm = i;
|
||||
|
|
|
@ -7,4 +7,4 @@ obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/
|
|||
obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/
|
||||
|
||||
# Machine support
|
||||
obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/
|
||||
obj-$(CONFIG_SND_SOC) += boards/
|
||||
|
|
|
@ -42,6 +42,11 @@
|
|||
#define MIN_FRAGMENT_SIZE (50 * 1024)
|
||||
#define MAX_FRAGMENT_SIZE (1024 * 1024)
|
||||
#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)
|
||||
{
|
||||
|
@ -141,15 +146,9 @@ static int sst_power_control(struct device *dev, bool state)
|
|||
int ret = 0;
|
||||
int usage_count = 0;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
usage_count = atomic_read(&dev->power.usage_count);
|
||||
#else
|
||||
usage_count = 1;
|
||||
#endif
|
||||
|
||||
if (state == true) {
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
|
||||
usage_count = GET_USAGE_COUNT(dev);
|
||||
dev_dbg(ctx->dev, "Enable: pm usage count: %d\n", usage_count);
|
||||
if (ret < 0) {
|
||||
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 {
|
||||
usage_count = GET_USAGE_COUNT(dev);
|
||||
dev_dbg(ctx->dev, "Disable: pm usage count: %d\n", usage_count);
|
||||
return sst_pm_runtime_put(ctx);
|
||||
}
|
||||
|
|
|
@ -69,12 +69,12 @@ static const struct snd_soc_dapm_route cht_audio_map[] = {
|
|||
{"Headphone", NULL, "HPR"},
|
||||
{"Ext Spk", NULL, "SPKL"},
|
||||
{"Ext Spk", NULL, "SPKR"},
|
||||
{"AIF1 Playback", NULL, "ssp2 Tx"},
|
||||
{"HiFi Playback", NULL, "ssp2 Tx"},
|
||||
{"ssp2 Tx", NULL, "codec_out0"},
|
||||
{"ssp2 Tx", NULL, "codec_out1"},
|
||||
{"codec_in0", 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[] = {
|
||||
|
|
|
@ -103,7 +103,6 @@ static struct snd_soc_dai_link mt8173_max98090_dais[] = {
|
|||
.name = "MAX98090 Playback",
|
||||
.stream_name = "MAX98090 Playback",
|
||||
.cpu_dai_name = "DL1",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.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",
|
||||
.stream_name = "MAX98090 Capture",
|
||||
.cpu_dai_name = "VUL",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.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",
|
||||
.cpu_dai_name = "I2S",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.no_pcm = 1,
|
||||
.codec_dai_name = "HiFi",
|
||||
.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)
|
||||
{
|
||||
struct snd_soc_card *card = &mt8173_max98090_card;
|
||||
struct device_node *codec_node;
|
||||
struct device_node *codec_node, *platform_node;
|
||||
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,
|
||||
"mediatek,audio-codec", 0);
|
||||
if (!codec_node) {
|
||||
|
|
|
@ -138,7 +138,6 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
|
|||
.name = "rt5650_rt5676 Playback",
|
||||
.stream_name = "rt5650_rt5676 Playback",
|
||||
.cpu_dai_name = "DL1",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.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",
|
||||
.stream_name = "rt5650_rt5676 Capture",
|
||||
.cpu_dai_name = "VUL",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.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",
|
||||
.cpu_dai_name = "I2S",
|
||||
.platform_name = "11220000.mt8173-afe-pcm",
|
||||
.no_pcm = 1,
|
||||
.codecs = mt8173_rt5650_rt5676_codecs,
|
||||
.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)
|
||||
{
|
||||
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 =
|
||||
of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0);
|
||||
|
|
|
@ -1199,6 +1199,8 @@ err_pm_disable:
|
|||
static int mtk_afe_pcm_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
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_platform(&pdev->dev);
|
||||
return 0;
|
||||
|
|
|
@ -1716,6 +1716,7 @@ card_probe_error:
|
|||
if (card->remove)
|
||||
card->remove(card);
|
||||
|
||||
snd_soc_dapm_free(&card->dapm);
|
||||
soc_cleanup_card_debugfs(card);
|
||||
snd_card_free(card->snd_card);
|
||||
|
||||
|
|
|
@ -358,9 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||
data->widget =
|
||||
snd_soc_dapm_new_control_unlocked(widget->dapm,
|
||||
&template);
|
||||
kfree(name);
|
||||
if (!data->widget) {
|
||||
ret = -ENOMEM;
|
||||
goto err_name;
|
||||
goto err_data;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -389,11 +390,12 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||
|
||||
data->value = template.on_val;
|
||||
|
||||
data->widget = snd_soc_dapm_new_control(widget->dapm,
|
||||
&template);
|
||||
data->widget = snd_soc_dapm_new_control_unlocked(
|
||||
widget->dapm, &template);
|
||||
kfree(name);
|
||||
if (!data->widget) {
|
||||
ret = -ENOMEM;
|
||||
goto err_name;
|
||||
goto err_data;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
err_name:
|
||||
kfree(name);
|
||||
err_data:
|
||||
kfree(data);
|
||||
return ret;
|
||||
|
@ -418,8 +418,6 @@ err_data:
|
|||
static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
|
||||
{
|
||||
struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
|
||||
if (data->widget)
|
||||
kfree(data->widget->name);
|
||||
kfree(data->wlist);
|
||||
kfree(data);
|
||||
}
|
||||
|
@ -1952,6 +1950,7 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w = file->private_data;
|
||||
struct snd_soc_card *card = w->dapm->card;
|
||||
char *buf;
|
||||
int in, out;
|
||||
ssize_t ret;
|
||||
|
@ -1961,6 +1960,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
|
|||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&card->dapm_mutex);
|
||||
|
||||
/* Supply widgets are not handled by is_connected_{input,output}_ep() */
|
||||
if (w->is_supply) {
|
||||
in = 0;
|
||||
|
@ -2007,6 +2008,8 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
|
|||
p->sink->name);
|
||||
}
|
||||
|
||||
mutex_unlock(&card->dapm_mutex);
|
||||
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
|
||||
|
||||
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);
|
||||
int i, count = 0;
|
||||
|
||||
mutex_lock(&rtd->card->dapm_mutex);
|
||||
|
||||
for (i = 0; i < rtd->num_codecs; i++) {
|
||||
struct snd_soc_codec *codec = rtd->codec_dais[i]->codec;
|
||||
count += dapm_widget_show_codec(codec, buf + count);
|
||||
}
|
||||
|
||||
mutex_unlock(&rtd->card->dapm_mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -3334,16 +3341,10 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
|
||||
prefix = soc_dapm_prefix(dapm);
|
||||
if (prefix) {
|
||||
if (prefix)
|
||||
w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name);
|
||||
if (widget->sname)
|
||||
w->sname = kasprintf(GFP_KERNEL, "%s %s", prefix,
|
||||
widget->sname);
|
||||
} else {
|
||||
else
|
||||
w->name = kasprintf(GFP_KERNEL, "%s", widget->name);
|
||||
if (widget->sname)
|
||||
w->sname = kasprintf(GFP_KERNEL, "%s", widget->sname);
|
||||
}
|
||||
if (w->name == NULL) {
|
||||
kfree(w);
|
||||
return NULL;
|
||||
|
@ -3792,7 +3793,7 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!w->sname || !strstr(w->sname, dai_w->name))
|
||||
if (!w->sname || !strstr(w->sname, dai_w->sname))
|
||||
continue;
|
||||
|
||||
if (dai_w->id == snd_soc_dapm_dai_in) {
|
||||
|
|
|
@ -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_put_strobe, NULL},
|
||||
{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_dapm_put_enum_double, snd_soc_info_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,
|
||||
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;
|
||||
int size;
|
||||
|
||||
if (tlv_size == 0)
|
||||
if (tplg_tlv->count == 0)
|
||||
return 0;
|
||||
|
||||
tplg_tlv = (struct snd_soc_tplg_ctl_tlv *) tplg->pos;
|
||||
tplg->pos += tlv_size;
|
||||
|
||||
tlv = kzalloc(sizeof(*tlv) + tlv_size, GFP_KERNEL);
|
||||
size = ((tplg_tlv->count + (sizeof(unsigned int) - 1)) &
|
||||
~(sizeof(unsigned int) - 1));
|
||||
tlv = kzalloc(sizeof(*tlv) + size, GFP_KERNEL);
|
||||
if (tlv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
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->length = tplg_tlv->size;
|
||||
memcpy(tlv->tlv, tplg_tlv + 1, tplg_tlv->size);
|
||||
tlv->length = size;
|
||||
memcpy(&tlv->tlv[0], tplg_tlv->data, size);
|
||||
kc->tlv.p = (void *)tlv;
|
||||
|
||||
return 0;
|
||||
|
@ -773,7 +772,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
err = soc_tplg_add_kcontrol(tplg, &kc,
|
||||
|
|
|
@ -393,9 +393,9 @@ static int zx_i2s_probe(struct platform_device *pdev)
|
|||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
zx_i2s->mapbase = res->start;
|
||||
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");
|
||||
return -EIO;
|
||||
return PTR_ERR(zx_i2s->reg_base);
|
||||
}
|
||||
|
||||
writel_relaxed(0, zx_i2s->reg_base + ZX_I2S_FIFO_CTRL);
|
||||
|
|
|
@ -322,9 +322,9 @@ static int zx_spdif_probe(struct platform_device *pdev)
|
|||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
zx_spdif->mapbase = res->start;
|
||||
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");
|
||||
return -EIO;
|
||||
return PTR_ERR(zx_spdif->reg_base);
|
||||
}
|
||||
|
||||
zx_spdif_dev_init(zx_spdif->reg_base);
|
||||
|
|
|
@ -341,6 +341,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
|
|||
{ 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
|
||||
*/
|
||||
|
@ -451,6 +465,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|||
.id = USB_ID(0x25c4, 0x0003),
|
||||
.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 */
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue