summaryrefslogtreecommitdiff
path: root/sound/firewire/motu/motu-command-dsp-message-parser.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2021-10-15 11:08:18 +0300
committerTakashi Iwai <tiwai@suse.de>2021-10-15 18:52:09 +0300
commit58b62ab7025912ce1be36e3ba19d49620a0161b6 (patch)
tree744c34aed991e334ecc8fe557b8acda276bd3e52 /sound/firewire/motu/motu-command-dsp-message-parser.c
parent90b28f3bb85c39b11daf29d473ef21a935c70ec5 (diff)
downloadlinux-58b62ab7025912ce1be36e3ba19d49620a0161b6.tar.xz
ALSA: firewire-motu: add ioctl command to read cached hardware meter
This patch adds new ioctl commands for userspace applications to read cached image about hardware meters in register DSP and command DSP models. The content of image differs depending on models. Model-specific parser should be implemented in userspace. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Link: https://lore.kernel.org/r/20211015080826.34847-4-o-takashi@sakamocchi.jp Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire/motu/motu-command-dsp-message-parser.c')
-rw-r--r--sound/firewire/motu/motu-command-dsp-message-parser.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sound/firewire/motu/motu-command-dsp-message-parser.c b/sound/firewire/motu/motu-command-dsp-message-parser.c
index 6716074f8bc1..18689fcfb288 100644
--- a/sound/firewire/motu/motu-command-dsp-message-parser.c
+++ b/sound/firewire/motu/motu-command-dsp-message-parser.c
@@ -23,6 +23,7 @@ enum msg_parser_state {
};
struct msg_parser {
+ spinlock_t lock;
enum msg_parser_state state;
unsigned int interval;
unsigned int message_count;
@@ -39,6 +40,7 @@ int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu)
parser = devm_kzalloc(&motu->card->card_dev, sizeof(*parser), GFP_KERNEL);
if (!parser)
return -ENOMEM;
+ spin_lock_init(&parser->lock);
motu->message_parser = parser;
return 0;
@@ -83,8 +85,11 @@ void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const stru
{
struct msg_parser *parser = motu->message_parser;
unsigned int interval = parser->interval;
+ unsigned long flags;
int i;
+ spin_lock_irqsave(&parser->lock, flags);
+
for (i = 0; i < desc_count; ++i) {
const struct pkt_desc *desc = descs + i;
__be32 *buffer = desc->ctx_payload;
@@ -157,4 +162,17 @@ void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const stru
}
}
}
+
+ spin_unlock_irqrestore(&parser->lock, flags);
+}
+
+void snd_motu_command_dsp_message_parser_copy_meter(struct snd_motu *motu,
+ struct snd_firewire_motu_command_dsp_meter *meter)
+{
+ struct msg_parser *parser = motu->message_parser;
+ unsigned long flags;
+
+ spin_lock_irqsave(&parser->lock, flags);
+ memcpy(meter, &parser->meter, sizeof(*meter));
+ spin_unlock_irqrestore(&parser->lock, flags);
}