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.