[alsa-devel] [v4 05/12] ASoC: Intel: mrfld: add bytes control for modules
Mark Brown
broonie at kernel.org
Wed Aug 13 22:00:12 CEST 2014
On Mon, Aug 04, 2014 at 03:15:56PM +0530, Subhransu S. Prusty wrote:
> From: Vinod Koul <vinod.koul at intel.com>
> This patch add support for various modules like eq etc for mrfld DSP. All these
> modules will be exposed to usermode as bytes controls.
Indeed they are actually exposed by this code.
> +static inline void sst_fill_byte_control(char *param,
> + u8 ipc_msg, u8 block,
> + u8 task_id, u8 pipe_id,
> + u16 len, void *cmd_data)
Let the compiler figure out if this should be inline, this doesn't seem
something that should obviously be inline and isn't in a header.
> + if (len > SST_MAX_BIN_BYTES - sizeof(*byte_data)) {
> + WARN(1, "%s: command length too big (%u)", __func__, len); /* this happens only if code is wrong */
> + len = SST_MAX_BIN_BYTES - sizeof(*byte_data);
> + }
Coding style, 80 columns. Since the only caller can return an error
code you could do that here too.
> +static int sst_fill_and_send_cmd_unlocked(struct sst_data *drv,
> + u8 ipc_msg, u8 block, u8 task_id, u8 pipe_id,
> + void *cmd_data, u16 len)
> +{
> + sst_fill_byte_control(drv->byte_stream, ipc_msg, block, task_id, pipe_id,
> + len, cmd_data);
> + return sst->ops->send_byte_stream(sst->dev,
> + (struct snd_sst_bytes_v2 *)drv->byte_stream);
> +}
There's a lot of casting going on in this code.
> +static int sst_algo_bytes_ctl_info(struct snd_kcontrol *kcontrol,
> + struct snd_ctl_elem_info *uinfo)
> +{
> + struct sst_algo_control *bc = (void *)kcontrol->private_value;
> + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> +
> + uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
> + uinfo->count = bc->max;
> +
> + /* allocate space to cache the algo parameters in the driver */
> + if (bc->params == NULL) {
> + bc->params = devm_kzalloc(component->dev, bc->max, GFP_KERNEL);
> + if (bc->params == NULL)
> + return -ENOMEM;
> + }
> + return 0;
> +}
I wouldn't expect an info call to be allocating anything - why is it
doing that? It's not looking at the alocated data except to see if the
allocation succeeded. What happens if someone manages to do a get or
set without having first done an info and why aren't we doing any
allocation on initialisation?
> + case SST_ALGO_BYPASS:
> + ucontrol->value.integer.value[0] = bc->bypass ? 1 : 0;
> + pr_debug("%s: bypass %d\n", __func__, bc->bypass);
> + break;
Is bypass not a boolean value already, and shouldn't these just end up
with controls called something "Switch" - they look to be just directly
usable switches?
> + default:
> + pr_err("Invalid Input- algo type:%d\n", bc->type);
dev_err().
> + switch (bc->type) {
> + case SST_ALGO_PARAMS:
> + if (bc->params)
> + memcpy(bc->params, ucontrol->value.bytes.data, bc->max);
> + break;
So if bc->params didn't get allocated somehow we just silently drop the
set?
> + /*if pipe is enabled, need to send the algo params from here */
> + if (bc->w && bc->w->power)
> + sst_send_algo_cmd(drv, bc);
sst_send_algo_cmd() should be returning an eror code (it doesn't but the
functions it calls can).
I'm not seeing any code to restore these controls on power up here.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20140813/bbad7ca5/attachment-0001.sig>
More information about the Alsa-devel
mailing list