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

Commit a644a947 authored by Clemens Ladisch's avatar Clemens Ladisch
Browse files

ALSA: dice: optimize reading of consecutive registers



Instead of reading two consecutive register with two quadlet requests,
use one block read request.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent a7304e3b
Loading
Loading
Loading
Loading
+11 −16
Original line number Diff line number Diff line
@@ -374,8 +374,8 @@ static int dice_open(struct snd_pcm_substream *substream)
	};
	struct dice *dice = substream->private_data;
	struct snd_pcm_runtime *runtime = substream->runtime;
	__be32 clock_sel, number_audio, number_midi;
	unsigned int rate_index, rate;
	__be32 clock_sel, data[2];
	unsigned int rate_index, number_audio, number_midi;
	int err;

	err = dice_try_lock(dice);
@@ -393,30 +393,25 @@ static int dice_open(struct snd_pcm_substream *substream)
		err = -ENXIO;
		goto err_lock;
	}
	rate = dice_rates[rate_index];

	err = snd_fw_transaction(dice->unit, TCODE_READ_QUADLET_REQUEST,
	err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
				 rx_address(dice, RX_NUMBER_AUDIO),
				 &number_audio, 4);
	if (err < 0)
		goto err_lock;
	err = snd_fw_transaction(dice->unit, TCODE_READ_QUADLET_REQUEST,
				 rx_address(dice, RX_NUMBER_MIDI),
				 &number_midi, 4);
				 data, 2 * 4);
	if (err < 0)
		goto err_lock;
	number_audio = be32_to_cpu(data[0]);
	number_midi = be32_to_cpu(data[1]);

	runtime->hw = hardware;

	runtime->hw.rates = snd_pcm_rate_to_rate_bit(rate);
	runtime->hw.rates = snd_pcm_rate_to_rate_bit(dice_rates[rate_index]);
	snd_pcm_limit_hw_rates(runtime);

	runtime->hw.channels_min = be32_to_cpu(number_audio);
	runtime->hw.channels_max = be32_to_cpu(number_audio);
	runtime->hw.channels_min = number_audio;
	runtime->hw.channels_max = number_audio;

	amdtp_out_stream_set_parameters(&dice->stream, rate,
					be32_to_cpu(number_audio),
					be32_to_cpu(number_midi));
	amdtp_out_stream_set_parameters(&dice->stream, dice_rates[rate_index],
					number_audio, number_midi);

	err = snd_pcm_hw_constraint_step(runtime, 0,
					 SNDRV_PCM_HW_PARAM_PERIOD_SIZE,