mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-18 18:43:59 +08:00
[ALSA] oxygen: make all DMA channels configurable
Allow the card models to specify whether each of the hardware DMA channels is used. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
84aa6b7ba7
commit
e85e09250a
@ -256,6 +256,11 @@ static const struct oxygen_model model_generic = {
|
|||||||
.update_dac_volume = update_ak4396_volume,
|
.update_dac_volume = update_ak4396_volume,
|
||||||
.update_dac_mute = update_ak4396_mute,
|
.update_dac_mute = update_ak4396_mute,
|
||||||
.dac_tlv = ak4396_db_scale,
|
.dac_tlv = ak4396_db_scale,
|
||||||
|
.used_channels = OXYGEN_CHANNEL_A |
|
||||||
|
OXYGEN_CHANNEL_C |
|
||||||
|
OXYGEN_CHANNEL_SPDIF |
|
||||||
|
OXYGEN_CHANNEL_MULTICH |
|
||||||
|
OXYGEN_CHANNEL_AC97,
|
||||||
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
||||||
};
|
};
|
||||||
static const struct oxygen_model model_meridian = {
|
static const struct oxygen_model model_meridian = {
|
||||||
@ -270,7 +275,11 @@ static const struct oxygen_model model_meridian = {
|
|||||||
.update_dac_volume = update_ak4396_volume,
|
.update_dac_volume = update_ak4396_volume,
|
||||||
.update_dac_mute = update_ak4396_mute,
|
.update_dac_mute = update_ak4396_mute,
|
||||||
.dac_tlv = ak4396_db_scale,
|
.dac_tlv = ak4396_db_scale,
|
||||||
.record_from_dma_b = 1,
|
.used_channels = OXYGEN_CHANNEL_B |
|
||||||
|
OXYGEN_CHANNEL_C |
|
||||||
|
OXYGEN_CHANNEL_SPDIF |
|
||||||
|
OXYGEN_CHANNEL_MULTICH |
|
||||||
|
OXYGEN_CHANNEL_AC97,
|
||||||
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ struct oxygen_model {
|
|||||||
void (*update_dac_volume)(struct oxygen *chip);
|
void (*update_dac_volume)(struct oxygen *chip);
|
||||||
void (*update_dac_mute)(struct oxygen *chip);
|
void (*update_dac_mute)(struct oxygen *chip);
|
||||||
const unsigned int *dac_tlv;
|
const unsigned int *dac_tlv;
|
||||||
u8 record_from_dma_b;
|
u8 used_channels;
|
||||||
u8 cd_in_from_video_in;
|
u8 cd_in_from_video_in;
|
||||||
u8 dac_minimum_volume;
|
u8 dac_minimum_volume;
|
||||||
u8 function_flags;
|
u8 function_flags;
|
||||||
|
@ -681,15 +681,22 @@ static void oxygen_pcm_free(struct snd_pcm *pcm)
|
|||||||
int __devinit oxygen_pcm_init(struct oxygen *chip)
|
int __devinit oxygen_pcm_init(struct oxygen *chip)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
int outs, ins;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = snd_pcm_new(chip->card, "Analog", 0, 1, 1, &pcm);
|
outs = 1; /* OXYGEN_CHANNEL_MULTICH is always used */
|
||||||
|
ins = !!(chip->model->used_channels & (OXYGEN_CHANNEL_A |
|
||||||
|
OXYGEN_CHANNEL_B));
|
||||||
|
err = snd_pcm_new(chip->card, "Analog", 0, outs, ins, &pcm);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &oxygen_multich_ops);
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &oxygen_multich_ops);
|
||||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
if (chip->model->used_channels & OXYGEN_CHANNEL_A)
|
||||||
chip->model->record_from_dma_b ?
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||||
&oxygen_rec_b_ops : &oxygen_rec_a_ops);
|
&oxygen_rec_a_ops);
|
||||||
|
else if (chip->model->used_channels & OXYGEN_CHANNEL_B)
|
||||||
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||||
|
&oxygen_rec_b_ops);
|
||||||
pcm->private_data = chip;
|
pcm->private_data = chip;
|
||||||
pcm->private_free = oxygen_pcm_free;
|
pcm->private_free = oxygen_pcm_free;
|
||||||
strcpy(pcm->name, "Analog");
|
strcpy(pcm->name, "Analog");
|
||||||
@ -697,32 +704,51 @@ int __devinit oxygen_pcm_init(struct oxygen *chip)
|
|||||||
SNDRV_DMA_TYPE_DEV,
|
SNDRV_DMA_TYPE_DEV,
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
512 * 1024, 2048 * 1024);
|
512 * 1024, 2048 * 1024);
|
||||||
snd_pcm_lib_preallocate_pages(pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream,
|
if (ins)
|
||||||
SNDRV_DMA_TYPE_DEV,
|
snd_pcm_lib_preallocate_pages(pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream,
|
||||||
snd_dma_pci_data(chip->pci),
|
SNDRV_DMA_TYPE_DEV,
|
||||||
128 * 1024, 256 * 1024);
|
|
||||||
|
|
||||||
err = snd_pcm_new(chip->card, "Digital", 1, 1, 1, &pcm);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &oxygen_spdif_ops);
|
|
||||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &oxygen_rec_c_ops);
|
|
||||||
pcm->private_data = chip;
|
|
||||||
pcm->private_free = oxygen_pcm_free;
|
|
||||||
strcpy(pcm->name, "Digital");
|
|
||||||
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
128 * 1024, 256 * 1024);
|
128 * 1024, 256 * 1024);
|
||||||
|
|
||||||
if (chip->has_ac97_1) {
|
outs = !!(chip->model->used_channels & OXYGEN_CHANNEL_SPDIF);
|
||||||
err = snd_pcm_new(chip->card, "AC97", 2, 1, 0, &pcm);
|
ins = !!(chip->model->used_channels & OXYGEN_CHANNEL_C);
|
||||||
|
if (outs | ins) {
|
||||||
|
err = snd_pcm_new(chip->card, "Digital", 1, outs, ins, &pcm);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
if (outs)
|
||||||
&oxygen_ac97_ops);
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
&oxygen_spdif_ops);
|
||||||
|
if (ins)
|
||||||
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||||
|
&oxygen_rec_c_ops);
|
||||||
pcm->private_data = chip;
|
pcm->private_data = chip;
|
||||||
pcm->private_free = oxygen_pcm_free;
|
pcm->private_free = oxygen_pcm_free;
|
||||||
strcpy(pcm->name, "Front Panel");
|
strcpy(pcm->name, "Digital");
|
||||||
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||||
|
snd_dma_pci_data(chip->pci),
|
||||||
|
128 * 1024, 256 * 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
outs = chip->has_ac97_1 &&
|
||||||
|
(chip->model->used_channels & OXYGEN_CHANNEL_AC97);
|
||||||
|
ins = (chip->model->used_channels & (OXYGEN_CHANNEL_A |
|
||||||
|
OXYGEN_CHANNEL_B))
|
||||||
|
== (OXYGEN_CHANNEL_A | OXYGEN_CHANNEL_B);
|
||||||
|
if (outs | ins) {
|
||||||
|
err = snd_pcm_new(chip->card, ins ? "Analog2" : "AC97",
|
||||||
|
2, outs, ins, &pcm);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
if (outs)
|
||||||
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
|
&oxygen_ac97_ops);
|
||||||
|
if (ins)
|
||||||
|
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
||||||
|
&oxygen_rec_b_ops);
|
||||||
|
pcm->private_data = chip;
|
||||||
|
pcm->private_free = oxygen_pcm_free;
|
||||||
|
strcpy(pcm->name, ins ? "Analog 2" : "Front Panel");
|
||||||
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||||
snd_dma_pci_data(chip->pci),
|
snd_dma_pci_data(chip->pci),
|
||||||
128 * 1024, 256 * 1024);
|
128 * 1024, 256 * 1024);
|
||||||
|
@ -224,7 +224,10 @@ static const struct oxygen_model model_xonar = {
|
|||||||
.update_dac_volume = update_pcm1796_volume,
|
.update_dac_volume = update_pcm1796_volume,
|
||||||
.update_dac_mute = update_pcm1796_mute,
|
.update_dac_mute = update_pcm1796_mute,
|
||||||
.dac_tlv = pcm1796_db_scale,
|
.dac_tlv = pcm1796_db_scale,
|
||||||
.record_from_dma_b = 1,
|
.used_channels = OXYGEN_CHANNEL_B |
|
||||||
|
OXYGEN_CHANNEL_C |
|
||||||
|
OXYGEN_CHANNEL_SPDIF |
|
||||||
|
OXYGEN_CHANNEL_MULTICH,
|
||||||
.cd_in_from_video_in = 1,
|
.cd_in_from_video_in = 1,
|
||||||
.dac_minimum_volume = 15,
|
.dac_minimum_volume = 15,
|
||||||
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
.function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
||||||
|
Loading…
Reference in New Issue
Block a user