[alsa-devel] [PATCH 2/2] ASoC: zx: Add zx296702 SPDIF support

Mark Brown broonie at kernel.org
Fri May 1 12:55:03 CEST 2015


On Thu, Apr 30, 2015 at 12:07:30PM +0800, Jun Nie wrote:
> Add zx296702 SPDIF support

This is adding a new device with DT bindings but there is no bindings
document.  All new DT bindings must be documented.

> --- /dev/null
> +++ b/include/sound/zx_hdmi_audio.h
> @@ -0,0 +1,7 @@
> +#ifndef __ZX_HDMI_AUDIO_H__
> +#define __ZX_HDMI_AUDIO_H__
> +
> +int zx_hdmi_audio_cfg(int audio_codec, int audio_way,
> +		      u32 sample_rate, u32 sample_len);
> +void zx_hdmi_audio_en(int on);
> +#endif /* __ZX_HDMI_AUDIO_H__ */

So this isn't a S/PDIF controller but rather a HDMI controller and from
the looks of it one with yet another custom interface between the video
part and the audio part.  As I keep saying I'd really like to see more
code sharing between the various controllers doing this.  Please take a
look at some of the other controllers and see what can be shared, and
also at this:

 http://thread.gmane.org/gmane.comp.video.dri.devel/126588

series from Russell King.

> +config ZX296702_SPDIF
> +        bool "ZX296702 spdif"
> +	select ZX_PCM_DMA
> +        help
> +	  Say Y or M if you want to add support for codecs attached to the
> +	  zx296702 spdif interface

The indentation above looks inconsistent - probably a mix of tabs and
spaces.

> +static struct snd_dmaengine_dai_dma_data zx_spdif_pcm_stereo_out = {
> +	.addr_width	= DMA_SLAVE_BUSWIDTH_4_BYTES,
> +	.chan_name	= "tx",
> +	.maxburst	= 8,
> +};

The DMA driver said it needed custom channel names but this looks like
the standard "tx" for transmit?

> +static int zx_spdif_dai_probe(struct snd_soc_dai *dai)
> +{
> +	struct zx_spdif_info *zx_spdif = dev_get_drvdata(dai->dev);
> +
> +	snd_soc_dai_set_drvdata(dai, zx_spdif);
> +	zx_spdif_pcm_stereo_out.addr = zx_spdif->mapbase + ZX_DATA;
> +	snd_soc_dai_init_dma_data(dai, &zx_spdif_pcm_stereo_out, NULL);
> +	return 0;
> +}

This appears to be modifying a global variable rather than some driver
data, please don't do that - store anything discovered per device at
runtime in the driver datta.

> +static void zx_spdif_chanstats(void __iomem *base, unsigned int rate)
> +{
> +	u32 cstas1;
> +
> +	switch (rate) {
> +	case 22050:

> +	default:
> +		return;
> +	}

This should handle and report errrors, not ignore them.

> +		return -EINVAL;
> +	}
> +	if (2 == params_channels(params))
> +		val |= ZX_CTRL_DOUBLE_TRACK;
> +	else
> +		val |= ZX_CTRL_LEFT_TRACK;
> +	writel_relaxed(val, zx_spdif->reg_base + ZX_CTRL);

Missing blank line between this and the above block and please reverse
the arguments for the == - it's the more normal kernel coding style.

> +#if defined(CONFIG_ZX_HDMI_SND_SPDIF)
> +	sample_len = params_physical_width(params);
> +	zx_hdmi_audio_cfg(1, 0, params_rate(params), sample_len);
> +#endif

But this is the S/PDIF dirver...  in any case, this looks like something
that depends on the hardware rather than something that should be a
compile time option.  We should be able to boot the same kernel on many
systems.

> +	val = readl_relaxed(base + ZX_CTRL);
> +	val &= ~(ZX_CTRL_ENB_MASK | ZX_CTRL_TX_MASK);
> +	val |= on ? (ZX_CTRL_TX_OPEN | ZX_CTRL_ENB)
> +		: (ZX_CTRL_TX_CLOSE | ZX_CTRL_DNB);
> +	writel_relaxed(val, base + ZX_CTRL);

Please don't use the ternery operator like this, it does nothing for
legibility.

> +	if (clk_prepare_enable(zx_spdif->dai_clk))
> +		return -EIO;

Don't discard return values, pass them back.  You should probably also
be managing this clock at runtime to save power.

> +					 &zx_spdif_dai, 1);
> +	if (ret) {
> +		dev_err(&pdev->dev, "Register DAI failed\n");

Print error codes as well.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20150501/953e1c3e/attachment.sig>


More information about the Alsa-devel mailing list