Commit ae79394a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull sound fixes from Takashi Iwai:
 "A collection of small fixes that have been gathered before rc1,
  including a few regression fixes for the problem in the previous pull
  request"

* tag 'sound-fix-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: gus: Fix repeated probe for ISA interwave card
  ALSA: gus: Fix repeated probes of snd_gus_create()
  ALSA: vx222: fix null-ptr-deref
  ASoC: rockchip: i2s: Fix concurrency between tx/rx
  ASoC: mt8195: correct the dts parsing logic about DPTX and HDMITX
  ASoC: Intel: boards: Fix CONFIG_SND_SOC_SDW_MOCKUP select
  ASoC: dt-bindings: fsl_rpmsg: Add compatible string for i.MX8ULP
  ALSA: usb-audio: Add registration quirk for JBL Quantum 800
  ASoC: rt5682: fix headset background noise when S3 state
  ASoC: dt-bindings: mt8195: remove dependent headers in the example
  ASoC: mediatek: SND_SOC_MT8195 should depend on ARCH_MEDIATEK
  ASoC: samsung: s3c24xx_simtec: fix spelling mistake "devicec" -> "device"
  ASoC: audio-graph: respawn Platform Support
  ASoC: mediatek: mt8195: add MTK_PMIC_WRAP dependency
parents d6c338a7 25fca8c9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ properties:
      - fsl,imx8mn-rpmsg-audio
      - fsl,imx8mm-rpmsg-audio
      - fsl,imx8mp-rpmsg-audio
      - fsl,imx8ulp-rpmsg-audio

  model:
    $ref: /schemas/types.yaml#/definitions/string
+19 −21
Original line number Diff line number Diff line
@@ -130,36 +130,34 @@ additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/mt8195-clk.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/power/mt8195-power.h>

    afe: mt8195-afe-pcm@10890000 {
        compatible = "mediatek,mt8195-audio";
        reg = <0x10890000 0x10000>;
        interrupts = <GIC_SPI 822 IRQ_TYPE_LEVEL_HIGH 0>;
        mediatek,topckgen = <&topckgen>;
        power-domains = <&spm MT8195_POWER_DOMAIN_AUDIO>;
        power-domains = <&spm 7>; //MT8195_POWER_DOMAIN_AUDIO
        clocks = <&clk26m>,
                 <&topckgen CLK_TOP_APLL1>,
                 <&topckgen CLK_TOP_APLL2>,
                 <&topckgen CLK_TOP_APLL12_DIV0>,
                 <&topckgen CLK_TOP_APLL12_DIV1>,
                 <&topckgen CLK_TOP_APLL12_DIV2>,
                 <&topckgen CLK_TOP_APLL12_DIV3>,
                 <&topckgen CLK_TOP_APLL12_DIV9>,
                 <&topckgen CLK_TOP_A1SYS_HP_SEL>,
                 <&topckgen CLK_TOP_AUD_INTBUS_SEL>,
                 <&topckgen CLK_TOP_AUDIO_H_SEL>,
                 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS_SEL>,
                 <&topckgen CLK_TOP_DPTX_M_SEL>,
                 <&topckgen CLK_TOP_I2SO1_M_SEL>,
                 <&topckgen CLK_TOP_I2SO2_M_SEL>,
                 <&topckgen CLK_TOP_I2SI1_M_SEL>,
                 <&topckgen CLK_TOP_I2SI2_M_SEL>,
                 <&infracfg_ao CLK_INFRA_AO_AUDIO_26M_B>,
                 <&scp_adsp CLK_SCP_ADSP_AUDIODSP>;
                 <&topckgen 163>, //CLK_TOP_APLL1
                 <&topckgen 166>, //CLK_TOP_APLL2
                 <&topckgen 233>, //CLK_TOP_APLL12_DIV0
                 <&topckgen 234>, //CLK_TOP_APLL12_DIV1
                 <&topckgen 235>, //CLK_TOP_APLL12_DIV2
                 <&topckgen 236>, //CLK_TOP_APLL12_DIV3
                 <&topckgen 238>, //CLK_TOP_APLL12_DIV9
                 <&topckgen 100>, //CLK_TOP_A1SYS_HP_SEL
                 <&topckgen 33>, //CLK_TOP_AUD_INTBUS_SEL
                 <&topckgen 34>, //CLK_TOP_AUDIO_H_SEL
                 <&topckgen 107>, //CLK_TOP_AUDIO_LOCAL_BUS_SEL
                 <&topckgen 98>, //CLK_TOP_DPTX_M_SEL
                 <&topckgen 94>, //CLK_TOP_I2SO1_M_SEL
                 <&topckgen 95>, //CLK_TOP_I2SO2_M_SEL
                 <&topckgen 96>, //CLK_TOP_I2SI1_M_SEL
                 <&topckgen 97>, //CLK_TOP_I2SI2_M_SEL
                 <&infracfg_ao 50>, //CLK_INFRA_AO_AUDIO_26M_B
                 <&scp_adsp 0>; //CLK_SCP_ADSP_AUDIODSP
        clock-names = "clk26m",
                      "apll1_ck",
                      "apll2_ck",
+31 −13
Original line number Diff line number Diff line
@@ -87,10 +87,24 @@ static void snd_gus_init_control(struct snd_gus_card *gus)

static int snd_gus_free(struct snd_gus_card *gus)
{
	if (gus->gf1.res_port2) {
	if (gus->gf1.res_port2 == NULL)
		goto __hw_end;
	snd_gf1_stop(gus);
	snd_gus_init_dma_irq(gus, 0);
	}
      __hw_end:
	release_and_free_resource(gus->gf1.res_port1);
	release_and_free_resource(gus->gf1.res_port2);
	if (gus->gf1.irq >= 0)
		free_irq(gus->gf1.irq, (void *) gus);
	if (gus->gf1.dma1 >= 0) {
		disable_dma(gus->gf1.dma1);
		free_dma(gus->gf1.dma1);
	}
	if (!gus->equal_dma && gus->gf1.dma2 >= 0) {
		disable_dma(gus->gf1.dma2);
		free_dma(gus->gf1.dma2);
	}
	kfree(gus);
	return 0;
}

@@ -116,7 +130,7 @@ int snd_gus_create(struct snd_card *card,
	};

	*rgus = NULL;
	gus = devm_kzalloc(card->dev, sizeof(*gus), GFP_KERNEL);
	gus = kzalloc(sizeof(*gus), GFP_KERNEL);
	if (gus == NULL)
		return -ENOMEM;
	spin_lock_init(&gus->reg_lock);
@@ -142,33 +156,35 @@ int snd_gus_create(struct snd_card *card,
	gus->gf1.reg_timerctrl = GUSP(gus, TIMERCNTRL);
	gus->gf1.reg_timerdata = GUSP(gus, TIMERDATA);
	/* allocate resources */
	gus->gf1.res_port1 = devm_request_region(card->dev, port, 16,
						 "GUS GF1 (Adlib/SB)");
	gus->gf1.res_port1 = request_region(port, 16, "GUS GF1 (Adlib/SB)");
	if (!gus->gf1.res_port1) {
		snd_printk(KERN_ERR "gus: can't grab SB port 0x%lx\n", port);
		snd_gus_free(gus);
		return -EBUSY;
	}
	gus->gf1.res_port2 = devm_request_region(card->dev, port + 0x100, 12,
						 "GUS GF1 (Synth)");
	gus->gf1.res_port2 = request_region(port + 0x100, 12, "GUS GF1 (Synth)");
	if (!gus->gf1.res_port2) {
		snd_printk(KERN_ERR "gus: can't grab synth port 0x%lx\n", port + 0x100);
		snd_gus_free(gus);
		return -EBUSY;
	}
	if (irq >= 0 && devm_request_irq(card->dev, irq, snd_gus_interrupt, 0,
					 "GUS GF1", (void *) gus)) {
	if (irq >= 0 && request_irq(irq, snd_gus_interrupt, 0, "GUS GF1", (void *) gus)) {
		snd_printk(KERN_ERR "gus: can't grab irq %d\n", irq);
		snd_gus_free(gus);
		return -EBUSY;
	}
	gus->gf1.irq = irq;
	card->sync_irq = irq;
	if (snd_devm_request_dma(card->dev, dma1, "GUS - 1")) {
	if (request_dma(dma1, "GUS - 1")) {
		snd_printk(KERN_ERR "gus: can't grab DMA1 %d\n", dma1);
		snd_gus_free(gus);
		return -EBUSY;
	}
	gus->gf1.dma1 = dma1;
	if (dma2 >= 0 && dma1 != dma2) {
		if (snd_devm_request_dma(card->dev, dma2, "GUS - 2")) {
		if (request_dma(dma2, "GUS - 2")) {
			snd_printk(KERN_ERR "gus: can't grab DMA2 %d\n", dma2);
			snd_gus_free(gus);
			return -EBUSY;
		}
		gus->gf1.dma2 = dma2;
@@ -193,8 +209,10 @@ int snd_gus_create(struct snd_card *card,
	gus->gf1.volume_ramp = 25;
	gus->gf1.smooth_pan = 1;
	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, gus, &ops);
	if (err < 0)
	if (err < 0) {
		snd_gus_free(gus);
		return err;
	}
	*rgus = gus;
	return 0;
}
+31 −30
Original line number Diff line number Diff line
@@ -618,12 +618,19 @@ static int snd_interwave_card_new(struct device *pdev, int dev,
	return 0;
}

static int snd_interwave_probe(struct snd_card *card, int dev)
static int snd_interwave_probe_gus(struct snd_card *card, int dev,
				   struct snd_gus_card **gusp)
{
	return snd_gus_create(card, port[dev], -irq[dev], dma1[dev], dma2[dev],
			      0, 32, pcm_channels[dev], effect[dev], gusp);
}

static int snd_interwave_probe(struct snd_card *card, int dev,
			       struct snd_gus_card *gus)
{
	int xirq, xdma1, xdma2;
	struct snd_interwave *iwcard = card->private_data;
	struct snd_wss *wss;
	struct snd_gus_card *gus;
#ifdef SNDRV_STB
	struct snd_i2c_bus *i2c_bus;
#endif
@@ -634,14 +641,6 @@ static int snd_interwave_probe(struct snd_card *card, int dev)
	xdma1 = dma1[dev];
	xdma2 = dma2[dev];

	err = snd_gus_create(card,
			     port[dev],
			     -xirq, xdma1, xdma2,
			     0, 32,
			     pcm_channels[dev], effect[dev], &gus);
	if (err < 0)
		return err;

	err = snd_interwave_detect(iwcard, gus, dev
#ifdef SNDRV_STB
				   , &i2c_bus
@@ -757,22 +756,6 @@ static int snd_interwave_probe(struct snd_card *card, int dev)
	return 0;
}

static int snd_interwave_isa_probe1(int dev, struct device *devptr)
{
	struct snd_card *card;
	int err;

	err = snd_interwave_card_new(devptr, dev, &card);
	if (err < 0)
		return err;

	err = snd_interwave_probe(card, dev);
	if (err < 0)
		return err;
	dev_set_drvdata(devptr, card);
	return 0;
}

static int snd_interwave_isa_match(struct device *pdev,
				   unsigned int dev)
{
@@ -788,6 +771,8 @@ static int snd_interwave_isa_match(struct device *pdev,
static int snd_interwave_isa_probe(struct device *pdev,
				   unsigned int dev)
{
	struct snd_card *card;
	struct snd_gus_card *gus;
	int err;
	static const int possible_irqs[] = {5, 11, 12, 9, 7, 15, 3, -1};
	static const int possible_dmas[] = {0, 1, 3, 5, 6, 7, -1};
@@ -814,19 +799,31 @@ static int snd_interwave_isa_probe(struct device *pdev,
		}
	}

	err = snd_interwave_card_new(pdev, dev, &card);
	if (err < 0)
		return err;

	if (port[dev] != SNDRV_AUTO_PORT)
		return snd_interwave_isa_probe1(dev, pdev);
		err = snd_interwave_probe_gus(card, dev, &gus);
	else {
		static const long possible_ports[] = {0x210, 0x220, 0x230, 0x240, 0x250, 0x260};
		int i;
		for (i = 0; i < ARRAY_SIZE(possible_ports); i++) {
			port[dev] = possible_ports[i];
			err = snd_interwave_isa_probe1(dev, pdev);
			err = snd_interwave_probe_gus(card, dev, &gus);
			if (! err)
				return 0;
		}
		return err;
	}
	if (err < 0)
		return err;

	err = snd_interwave_probe(card, dev, gus);
	if (err < 0)
		return err;

	dev_set_drvdata(pdev, card);
	return 0;
}

static struct isa_driver snd_interwave_driver = {
@@ -844,6 +841,7 @@ static int snd_interwave_pnp_detect(struct pnp_card_link *pcard,
{
	static int dev;
	struct snd_card *card;
	struct snd_gus_card *gus;
	int res;

	for ( ; dev < SNDRV_CARDS; dev++) {
@@ -860,7 +858,10 @@ static int snd_interwave_pnp_detect(struct pnp_card_link *pcard,
	res = snd_interwave_pnp(dev, card->private_data, pcard, pid);
	if (res < 0)
		return res;
	res = snd_interwave_probe(card, dev);
	res = snd_interwave_probe_gus(card, dev, &gus);
	if (res < 0)
		return res;
	res = snd_interwave_probe(card, dev, gus);
	if (res < 0)
		return res;
	pnp_set_card_drvdata(pcard, card);
+1 −0
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ static int snd_vx222_create(struct snd_card *card, struct pci_dev *pci,
	}
	chip->irq = pci->irq;
	card->sync_irq = chip->irq;
	*rchip = vx;

	return 0;
}
Loading