Re: [PATCH v3 05/11] media: adv748x: add support for HDMI audio

From: Stephen Boyd
Date: Fri Mar 20 2020 - 21:09:43 EST


Quoting Alex Riesen (2020-03-20 09:12:00)
> diff --git a/drivers/media/i2c/adv748x/adv748x-dai.c b/drivers/media/i2c/adv748x/adv748x-dai.c
> new file mode 100644
> index 000000000000..6fce7d000423
> --- /dev/null
> +++ b/drivers/media/i2c/adv748x/adv748x-dai.c
> @@ -0,0 +1,265 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Driver for Analog Devices ADV748X HDMI receiver with AFE
> + * The implementation of DAI.
> + */
> +
> +#include "adv748x.h"
> +
> +#include <linux/clk.h>

Is this include used? Please try to make a clk provider or a clk
consumer and not both unless necessary.

> +#include <linux/clk-provider.h>
> +#include <sound/pcm_params.h>
> +
> +#define state_of(soc_dai) \
> + adv748x_dai_to_state(container_of((soc_dai)->driver, \
> + struct adv748x_dai, \
> + drv))
> +
> +static const char ADV748X_DAI_NAME[] = "adv748x-i2s";
> +
[...]
> + .set_sysclk = adv748x_dai_set_sysclk,
> + .set_fmt = adv748x_dai_set_fmt,
> + .startup = adv748x_dai_startup,
> + .hw_params = adv748x_dai_hw_params,
> + .mute_stream = adv748x_dai_mute_stream,
> + .shutdown = adv748x_dai_shutdown,
> +};
> +
> +static int adv748x_of_xlate_dai_name(struct snd_soc_component *component,
> + struct of_phandle_args *args,
> + const char **dai_name)
> +{
> + if (dai_name)
> + *dai_name = ADV748X_DAI_NAME;
> + return 0;
> +}
> +
> +static const struct snd_soc_component_driver adv748x_codec = {
> + .of_xlate_dai_name = adv748x_of_xlate_dai_name,
> +};
> +
> +int adv748x_dai_init(struct adv748x_dai *dai)
> +{
> + int ret;
> + struct adv748x_state *state = adv748x_dai_to_state(dai);
> +
> + dai->mclk_name = kasprintf(GFP_KERNEL, "%s.%s-i2s-mclk",
> + state->dev->driver->name,
> + dev_name(state->dev));
> + if (!dai->mclk_name) {
> + ret = -ENOMEM;
> + adv_err(state, "No memory for MCLK\n");
> + goto fail;
> + }
> + dai->mclk = clk_register_fixed_rate(state->dev,

Please register with clk_hw_register_fixed_rate() instead.

> + dai->mclk_name,
> + NULL /* parent_name */,
> + 0 /* flags */,
> + 12288000 /* rate */);

Not sure these comments are useful.

> + if (IS_ERR_OR_NULL(dai->mclk)) {
> + ret = PTR_ERR(dai->mclk);
> + adv_err(state, "Failed to register MCLK (%d)\n", ret);
> + goto fail;
> + }
> + ret = of_clk_add_provider(state->dev->of_node, of_clk_src_simple_get,
> + dai->mclk);
> + if (ret < 0) {
> + adv_err(state, "Failed to add MCLK provider (%d)\n", ret);
> + goto unreg_mclk;
> + }
> + dai->drv.name = ADV748X_DAI_NAME;
> + dai->drv.ops = &adv748x_dai_ops;
> + dai->drv.capture = (struct snd_soc_pcm_stream){

Can this be const?

> + .stream_name = "Capture",
> + .channels_min = 8,
> + .channels_max = 8,
> + .rates = SNDRV_PCM_RATE_48000,
> + .formats = SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE,
> + };
> +
> + ret = devm_snd_soc_register_component(state->dev, &adv748x_codec,
> + &dai->drv, 1);
> + if (ret < 0) {
> + adv_err(state, "Failed to register the codec (%d)\n", ret);
> + goto cleanup_mclk;
> + }
> + return 0;
> +
> +cleanup_mclk:
> + of_clk_del_provider(state->dev->of_node);
> +unreg_mclk:
> + clk_unregister_fixed_rate(dai->mclk);
> +fail:
> + return ret;
> +}
> +
> +void adv748x_dai_cleanup(struct adv748x_dai *dai)
> +{
> + struct adv748x_state *state = adv748x_dai_to_state(dai);
> +
> + of_clk_del_provider(state->dev->of_node);
> + clk_unregister_fixed_rate(dai->mclk);
> + kfree(dai->mclk_name);
> +}
> +

Please drop extra newline at end of file.