On 09/25/15 18:50, Arnaud Pouliquen wrote: > Hello Jyri, > > Yes using or not DRM bridge we should be able to have a common > implementation > > Please find,my answer belows > > BR, > Arnaud > > On 09/25/2015 04:11 PM, Jyri Sarha wrote: >> Despite my earlier comment this implementation and the related HW is >> quite similar in all significant aspects to the patch set posted couple >> of days ago [1] for Beaglebone-Black HDMI audio. >> >> [1] http://permalink.gmane.org/gmane.linux.alsa.devel/144144 > yes i trying to align my dev on it. to match with your development. > Aim for me is to reuse it and adapt it using a DRM bridge interface. > i hope to provide a V2 next week. >> >> I have not yet gotten to bottom of drm-side audio bride part, but I am >> working on it. Bellow is couple of early comments to the ASoC part. >> >> Best regards, >> Jyri >> >> On 09/21/15 16:19, Arnaud Pouliquen wrote: >>> + >>> +static int st_hdmi_dai_probe(struct snd_soc_dai *dai) >>> +{ >>> + struct hdmi_drm_dai_data *priv; >>> + >>> + dev_err(dai->dev, "%s: enter\n", __func__); >>> + priv = devm_kzalloc(dai->dev, sizeof(*priv), GFP_KERNEL); >>> + >>> + priv->bridge = of_drm_find_bridge(dai->dev->of_node); >>> + >>> + dev_err(dai->dev, "%s: bridge %p\n", __func__, priv->bridge); >>> + >>> + snd_soc_dai_set_drvdata(dai, priv); >>> + >> >> The call above overwrites the private data pointer of the drivers that >> registering the codec. This hardly works in general. >> >> A separate platform driver - with this already merged patch [2] - that I >> use with my patch-set solves this issue quite nicely. >> >> [2] http://lists.freedesktop.org/archives/dri-devel/2015-May/083517.html > Yes same dev,(but no crash...?).i need to define sub node. >>> + return 0; >>> +}here are several important callbacks missing here >>> + >>> +static const struct snd_soc_dai_ops hdmi_drm_codec_ops = { >>> + .prepare = hdmi_drm_dai_prepare, >>> + .trigger = hdmi_drm_dai_trigger, >>> +}; >> >> >> At least set_daifmt() and hw_params() callbacks should be defined before >> this could be generally usable. HDMI encoders do not usually support too >> many daifmts, but the driver should be able the check that the selected >> format is supported. But as you said this not complete code yet. > I'm trying to match codec ops with following DRM audio bridge ops, > that is similar to the existing drm_bridge_funcs structure.
I am not yet too familiar with drm way of doing things. My code is trying to follow the way how ALSA does things. I tried to survive with as few callback as possible, but if you think more is needed I can add those if there is a corresponding callback in ALSA. > struct drm_audio_bridge_funcs { > void (*disable)(struct drm_bridge *bridge); There is no such thing in my HDMI codec. However, there is digital_mute callback that is used by alsa before the streams are shut down to avoid undesired pops and clicks. > void (*post_disable)(struct drm_bridge *bridge); Post_disable should map more or less directly to audio_shutdown() in my code. > void (*pre_enable)(struct drm_bridge *bridge); audio_startup() and hw_params() should both be called at pre_enable() phase. > void (*enable)(struct drm_bridge *bridge); ... or one could see hw_params() to map to enable. And there is digital_mute which is toggled by ALSA at this phase. > int (*mode_set)(struct drm_bridge *bridge, > struct hdmi_audio_mode *mode); Actually hw_params() does pretty much the same thing as set_mode(), but it should be called after audio_startup() has been called. > uint8_t *(*mode_get)(struct drm_bridge *bridge); /*return eld*/ > }; For this there is get_eld() in my HDMI codec code. > audio parameters should be part of struct hdmi_audio_mode that contains > audio configurations ( info frame,iec, format, clk...) > > BTW, the HDMI codec is made in such a way that one can get by with only hw_params() and audio_shutdown(). In such an implementation hw_params() sets the HDMI encoder ready for receiving i2s or spdif from CPU DAI and audio_shutdown() disables the audio stream. Best regards, Jyri