Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 861391d3 authored by Andy Owen's avatar Andy Owen Committed by Takashi Iwai
Browse files

ALSA: ca0106: Create a nice spot for mapping channels to dacs.



This is to allow a future patch to have card specific mappings between
dacs, which is required since the Sound Blaster 5.1vx seems to have a
different mapping to what was previously used.

Signed-off-by: default avatarAndy Owen <andy-alsa@ultra-premium.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 9bfd9413
Loading
Loading
Loading
Loading
+29 −11
Original line number Diff line number Diff line
@@ -493,16 +493,18 @@ static void snd_ca0106_pcm_free_substream(struct snd_pcm_runtime *runtime)
}

static const int spi_dacd_reg[] = {
	[PCM_FRONT_CHANNEL]	= SPI_DACD4_REG,
	[PCM_REAR_CHANNEL]	= SPI_DACD0_REG,
	[PCM_CENTER_LFE_CHANNEL]= SPI_DACD2_REG,
	[PCM_UNKNOWN_CHANNEL]	= SPI_DACD1_REG,
	SPI_DACD0_REG,
	SPI_DACD1_REG,
	SPI_DACD2_REG,
	0,
	SPI_DACD4_REG,
};
static const int spi_dacd_bit[] = {
	[PCM_FRONT_CHANNEL]	= SPI_DACD4_BIT,
	[PCM_REAR_CHANNEL]	= SPI_DACD0_BIT,
	[PCM_CENTER_LFE_CHANNEL]= SPI_DACD2_BIT,
	[PCM_UNKNOWN_CHANNEL]	= SPI_DACD1_BIT,
	SPI_DACD0_BIT,
	SPI_DACD1_BIT,
	SPI_DACD2_BIT,
	0,
	SPI_DACD4_BIT,
};

static void restore_spdif_bits(struct snd_ca0106 *chip, int idx)
@@ -514,18 +516,34 @@ static void restore_spdif_bits(struct snd_ca0106 *chip, int idx)
	}
}

static int snd_ca0106_channel_dac(struct snd_ca0106_details *details,
				  int channel_id)
{
	switch (channel_id) {
	case PCM_FRONT_CHANNEL:		return 4;
	case PCM_REAR_CHANNEL:		return 0;
	case PCM_CENTER_LFE_CHANNEL:	return 2;
	case PCM_UNKNOWN_CHANNEL:	return 1;
	}
	snd_printk(KERN_DEBUG "ca0106: unknown channel_id %d\n", channel_id);
	return 0;
}

static int snd_ca0106_pcm_power_dac(struct snd_ca0106 *chip, int channel_id,
				    int power)
{
	if (chip->details->spi_dac) {
		const int reg = spi_dacd_reg[channel_id];
		const int dac = snd_ca0106_channel_dac(chip->details,
						       channel_id);
		const int reg = spi_dacd_reg[dac];
		const int bit = spi_dacd_bit[dac];

		if (power)
			/* Power up */
			chip->spi_dac_reg[reg] &= ~spi_dacd_bit[channel_id];
			chip->spi_dac_reg[reg] &= ~bit;
		else
			/* Power down */
			chip->spi_dac_reg[reg] |= spi_dacd_bit[channel_id];
			chip->spi_dac_reg[reg] |= bit;
		return snd_ca0106_spi_write(chip, chip->spi_dac_reg[reg]);
	}
	return 0;