ALSA: firewire-motu: add ioctl command to read cached parameters in register DSP...
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 15 Oct 2021 08:08:24 +0000 (17:08 +0900)
committerTakashi Iwai <tiwai@suse.de>
Fri, 15 Oct 2021 15:52:15 +0000 (17:52 +0200)
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>
include/uapi/sound/firewire.h
sound/firewire/motu/motu-hwdep.c
sound/firewire/motu/motu-register-dsp-message-parser.c
sound/firewire/motu/motu.h

index 6366127..d526916 100644 (file)
@@ -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
index 7be576f..699136b 100644 (file)
@@ -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;
        }
index d94ca48..ed9fd0c 100644 (file)
@@ -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);
+}
index 4f70036..fa0b3ab 100644 (file)
@@ -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);