Skip to content

Commit

Permalink
ALSA: firewire-motu: add ioctl command to read cached parameters in r…
Browse files Browse the repository at this point in the history
…egister DSP model

This patch adds new ioctl command for userspace applications to read
cached parameters of register DSP.

The structured data includes model-dependent parameters. Userspace
application should be carefully programmed so that what parameter is
common and specific.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20211015080826.34847-10-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Sakamoto authored and Takashi Iwai committed Oct 15, 2021
1 parent 7d843c4 commit ca15a09
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/uapi/sound/firewire.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ union snd_firewire_event {
#define SNDRV_FIREWIRE_IOCTL_TASCAM_STATE _IOR('H', 0xfb, struct snd_firewire_tascam_state)
#define SNDRV_FIREWIRE_IOCTL_MOTU_REGISTER_DSP_METER _IOR('H', 0xfc, struct snd_firewire_motu_register_dsp_meter)
#define SNDRV_FIREWIRE_IOCTL_MOTU_COMMAND_DSP_METER _IOR('H', 0xfd, struct snd_firewire_motu_command_dsp_meter)
#define SNDRV_FIREWIRE_IOCTL_MOTU_REGISTER_DSP_PARAMETER _IOR('H', 0xfe, struct snd_firewire_motu_register_dsp_parameter)

#define SNDRV_FIREWIRE_TYPE_DICE 1
#define SNDRV_FIREWIRE_TYPE_FIREWORKS 2
Expand Down
21 changes: 21 additions & 0 deletions sound/firewire/motu/motu-hwdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,27 @@ static int hwdep_ioctl(struct snd_hwdep *hwdep, struct file *file,

return 0;
}
case SNDRV_FIREWIRE_IOCTL_MOTU_REGISTER_DSP_PARAMETER:
{
struct snd_firewire_motu_register_dsp_parameter *param;
int err;

if (!(motu->spec->flags & SND_MOTU_SPEC_REGISTER_DSP))
return -ENXIO;

param = kzalloc(sizeof(*param), GFP_KERNEL);
if (!param)
return -ENOMEM;

snd_motu_register_dsp_message_parser_copy_parameter(motu, param);

err = copy_to_user((void __user *)arg, param, sizeof(*param));
kfree(param);
if (err)
return -EFAULT;

return 0;
}
default:
return -ENOIOCTLCMD;
}
Expand Down
11 changes: 11 additions & 0 deletions sound/firewire/motu/motu-register-dsp-message-parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,3 +299,14 @@ void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu,
memcpy(meter, &parser->meter, sizeof(*meter));
spin_unlock_irqrestore(&parser->lock, flags);
}

void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu,
struct snd_firewire_motu_register_dsp_parameter *param)
{
struct msg_parser *parser = motu->message_parser;
unsigned long flags;

spin_lock_irqsave(&parser->lock, flags);
memcpy(param, &parser->param, sizeof(*param));
spin_unlock_irqrestore(&parser->lock, flags);
}
3 changes: 2 additions & 1 deletion sound/firewire/motu/motu.h
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,8 @@ void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const str
unsigned int desc_count, unsigned int data_block_quadlets);
void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu,
struct snd_firewire_motu_register_dsp_meter *meter);

void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu,
struct snd_firewire_motu_register_dsp_parameter *params);

int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu);
int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc sfc);
Expand Down

0 comments on commit ca15a09

Please sign in to comment.