+/*standard module options for ALSA. This module supports only one
card*/
+int hdmi_card_index = SNDRV_DEFAULT_IDX1; +char *hdmi_card_id = SNDRV_DEFAULT_STR1;
+module_param(hdmi_card_index, int, 0444); +MODULE_PARM_DESC(hdmi_card_index,
"Index value for INTEL Intel HDMI Audio controller.");+module_param(hdmi_card_id, charp, 0444); +MODULE_PARM_DESC(hdmi_card_id,
"ID string for INTEL Intel HDMI Audio controller.");Drivers should expose the standard module options "index" and "id" like others. Also they should be static.
Agree.
+/* hardware capability structure */ +static const struct snd_pcm_hardware snd_intel_hadstream = {
- .info = (SNDRV_PCM_INFO_INTERLEAVED |
 SNDRV_PCM_INFO_DOUBLE |SNDRV_PCM_INFO_PAUSE |SNDRV_PCM_INFO_RESUME |You have to implement corresponding stuff if you mark the driver as RESUME-able.
Yes we have implemented SNDRV_PCM_TRIGGER_PAUSE_RELEASE
SNDRV_PCM_INFO_MMAP|SNDRV_PCM_INFO_MMAP_VALID |SNDRV_PCM_INFO_BATCH |SNDRV_PCM_INFO_SYNC_START),Is sync stuff implemented?
It's not implemented, we will remove it.
- pr_debug("had: snd_intelhad_open called\n");
 - intelhaddata = snd_pcm_substream_chip(substream);
 So... you assign the global variable at this open callback? Any race?
It's not required, since its global variable. We will remove this.
- stream = kzalloc(sizeof(*stream), GFP_KERNEL);
 - if (!stream)
 return -ENOMEM;- stream->stream_status = STREAM_INIT;
 - runtime->private_data = stream;
 - intelhaddata->reg_ops->hdmi_audio_write_register(AUD_HDMI_STATUS,
 0);
- retval = snd_pcm_hw_constraint_integer(runtime,
 SNDRV_PCM_HW_PARAM_PERIODS);stream is leaked when the error returned here.
We will free the stream in error path.
- switch (cmd) {
 - case SNDRV_PCM_TRIGGER_START:
 pr_debug("had: Trigger Start\n");caps = HDMI_AUDIO_UNDERRUN | HDMI_AUDIO_BUFFER_DONE;retval = query_ops->hdmi_audio_set_caps(HAD_SET_ENABLE_AUDIO_INT, &caps);if (retval)return retval;retval = query_ops->hdmi_audio_set_caps(HAD_SET_ENABLE_AUDIO, NULL);if (retval)return retval;Don't you need to reset audio_caps at error?
ENABLE_AUDIO_INT and ENABLE_AUDIO just sets register bits and no impact even if it fails.
- intelhaddata->playback_cnt++;
 - intelhaddata->stream_info.str_id = intelhaddata->playback_cnt;
 Note that the prepare callback might be called multiple times before triggering. This counter doesn't work. If any, it should be counted in the open/close callback.
We will move the counters to _open.
+/*PCM operations structure and the calls back for the same */ +struct snd_pcm_ops snd_intelhad_playback_ops = {
Does it need to be global?
We will make it static.
Any reason to allocate extra two *_ops instead of just put these flat in the structure itself? I mean, struct intelhda { ... struct hdmi_audio_registers_ops reg_ops; struct hdmi_audio_query_set_ops query_ops; ... }
then you don't need to malloc them.
We will declare them as flat structures.
Overall I feel uneasy about the handling of global variables. They should be cleaned up more...
We will clean up the global variables.
Thanks, Sailaja and Ramesh.