ALSA: emu10k1: roll up loops in DSP setup code for Audigy
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Wed, 10 May 2023 17:39:05 +0000 (19:39 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 12 May 2023 07:16:40 +0000 (09:16 +0200)
There is no apparent reason for the massive code duplication.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230510173917.3073107-3-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emufx.c

index 6442028..eb40159 100644 (file)
@@ -1552,14 +1552,8 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
        gpr++;
 
        /* Master volume (will be renamed later) */
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS));
-       A_OP(icode, &ptr, iMAC0, A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS));
+       for (z = 0; z < 8; z++)
+               A_OP(icode, &ptr, iMAC0, A_GPR(playback+z+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+z+SND_EMU10K1_PLAYBACK_CHANNELS));
        snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);
        gpr += 2;
 
@@ -1646,102 +1640,14 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
                        dev_dbg(emu->card->dev, "emufx.c: gpr=0x%x, tmp=0x%x\n",
                               gpr, tmp);
                        */
-                       /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */
-                       /* A_P16VIN(0) is delayed by one sample,
-                        * so all other A_P16VIN channels will need to also be delayed
-                        */
-                       /* Left ADC in. 1 of 2 */
                        snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_P16VIN(0x0), A_FXBUS2(0) );
-                       /* Right ADC in 1 of 2 */
-                       gpr_map[gpr++] = 0x00000000;
-                       /* Delaying by one sample: instead of copying the input
-                        * value A_P16VIN to output A_FXBUS2 as in the first channel,
-                        * we use an auxiliary register, delaying the value by one
-                        * sample
-                        */
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(2) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x1), A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(4) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x2), A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(6) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x3), A_C_00000000, A_C_00000000);
-                       /* For 96kHz mode */
-                       /* Left ADC in. 2 of 2 */
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0x8) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x4), A_C_00000000, A_C_00000000);
-                       /* Right ADC in 2 of 2 */
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xa) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x5), A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xc) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x6), A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xe) );
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x7), A_C_00000000, A_C_00000000);
-                       /* Pavel Hofman - we still have voices, A_FXBUS2s, and
-                        * A_P16VINs available -
-                        * let's add 8 more capture channels - total of 16
-                        */
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x10));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x8),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x12));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x9),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x14));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xa),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x16));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xb),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x18));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xc),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x1a));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xd),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x1c));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xe),
-                            A_C_00000000, A_C_00000000);
-                       gpr_map[gpr++] = 0x00000000;
-                       snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
-                                                                 bit_shifter16,
-                                                                 A_GPR(gpr - 1),
-                                                                 A_FXBUS2(0x1e));
-                       A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xf),
-                            A_C_00000000, A_C_00000000);
+                       /* A_P16VIN(0) is delayed by one sample, so all other A_P16VIN channels
+                        * will need to also be delayed; we use an auxiliary register for that. */
+                       for (z = 1; z < 0x10; z++) {
+                               snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr), A_FXBUS2(z * 2) );
+                               A_OP(icode, &ptr, iACC3, A_GPR(gpr), A_P16VIN(z), A_C_00000000, A_C_00000000);
+                               gpr_map[gpr++] = 0x00000000;
+                       }
                }
 
 #if 0