Hi Mark,
Thanks for the feedback.
Subject: Re: [PATCH v4 1/3] ASoC: sh: Add RZ/G2L SSIF-2 driver
On Fri, Aug 06, 2021 at 11:29:28AM +0100, Biju Das wrote:
+static int rz_ssi_stream_init(struct rz_ssi_priv *ssi,
struct rz_ssi_stream *strm,
struct snd_pcm_substream *substream) {
- struct snd_pcm_runtime *runtime = substream->runtime;
- if (runtime->sample_bits != 16) {
dev_err(ssi->dev, "Unsupported sample width: %d\n",
runtime->sample_bits);
return -EINVAL;
- }
- if (runtime->frame_bits != 32) {
dev_err(ssi->dev, "Unsupported frame width: %d\n",
runtime->sample_bits);
return -EINVAL;
- }
You should be doing *all* this validation at the time things are configured, not during trigger.
OK, Will move sample_bits validation to hw_params.
From core/pcm_native.c,
frame_bits = channels * sample_bits;
since we are validating both channels and sample_bits, there is no need to validate frame_bits.
So I am dropping frame_bits validation on next version.
+static int rz_ssi_start_stop(struct rz_ssi_priv *ssi,
struct rz_ssi_stream *strm,
int start)
+{
- struct snd_pcm_substream *substream = strm->substream;
- u32 ssicr, ssifcr;
- int timeout;
- if (start) {
bool is_play = rz_ssi_stream_is_play(ssi, substream);
...
- } else {
strm->running = 0;
...
- }
- return 0;
+}
This is two functions merged into one with zero shared code, just make them two separate functions and then people don't need to guess if true is start or stop.
OK. Will split this into 2 separate function.
- switch (cmd) {
- case SNDRV_PCM_TRIGGER_START:
/* Soft Reset */
rz_ssi_reg_mask_setl(ssi, SSIFCR, 0, SSIFCR_SSIRST);
rz_ssi_reg_mask_setl(ssi, SSIFCR, SSIFCR_SSIRST, 0);
udelay(5);
spin_lock_irqsave(&ssi->lock, flags);
ret = rz_ssi_stream_init(ssi, strm, substream);
spin_unlock_irqrestore(&ssi->lock, flags);
It's not clear what this lock is intended to accomplish. It's only used in trigger like this and in _stream_is_valid(). In trigger() we're already in atomic context so don't have to worry about simultaneous calls to trigger() while in _stream_is_valid() we're just checking if there's a runtime present but since the lock is taken and held within the function the status could change before we've even returned to the caller. The two uses don't seem joined up with each other and neither seems to do much.
Thanks for pointing out. After re-checking, locking is not needed at this place. It is required only for _stream_is_valid() and _stream_quit().
Cheers, Biju