* [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval
@ 2024-10-04 14:27 Geoffrey D. Bennett
2024-10-04 14:27 ` [PATCH 1/5] ALSA: scarlett2: Fix redeclaration of loop variable Geoffrey D. Bennett
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:27 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
Hi Takashi,
This patch series contains:
- 3 small fixes, I don't think need to be backported.
- Simplification of linked channel handling to match how the firmware
works. This is needed to be able to handle the recently-announced
big 4th Gen models correctly.
- Addition of support for device map retrieval: the Vocaster and
Scarlett 4th Gen series added a new operation allowing the host to
retrieve a base64-encoded zlib-compressed JSON representation of the
device and the location of each control. This patch makes that
available through /proc/asound/cardX/device-map.json.zz.b64
Regards,
Geoffrey.
Geoffrey D. Bennett (5):
ALSA: scarlett2: Fix redeclaration of loop variable
ALSA: scarlett2: Fix mixed declarations and code warning
ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes
ALSA: scarlett2: Simplify linked channel handling
ALSA: scarlett2: Add support for device map retrieval
sound/usb/mixer_scarlett2.c | 220 +++++++++++++++++++++++++++---------
1 file changed, 165 insertions(+), 55 deletions(-)
--
2.45.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/5] ALSA: scarlett2: Fix redeclaration of loop variable
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
@ 2024-10-04 14:27 ` Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 2/5] ALSA: scarlett2: Fix mixed declarations and code warning Geoffrey D. Bennett
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:27 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
Was using both "for (i = 0, ..." and "for (int i = 0, ..." in
scarlett2_update_autogain(). Remove "int" to fix.
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
---
sound/usb/mixer_scarlett2.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sound/usb/mixer_scarlett2.c b/sound/usb/mixer_scarlett2.c
index 1150cf104985..003e91f9e43c 100644
--- a/sound/usb/mixer_scarlett2.c
+++ b/sound/usb/mixer_scarlett2.c
@@ -3409,7 +3409,7 @@ static int scarlett2_update_autogain(struct usb_mixer_interface *mixer)
private->num_autogain_status_texts - 1;
- for (int i = 0; i < SCARLETT2_AG_TARGET_COUNT; i++)
+ for (i = 0; i < SCARLETT2_AG_TARGET_COUNT; i++)
if (scarlett2_has_config_item(private,
scarlett2_ag_target_configs[i])) {
err = scarlett2_usb_get_config(
@@ -3420,7 +3420,7 @@ static int scarlett2_update_autogain(struct usb_mixer_interface *mixer)
}
/* convert from negative dBFS as used by the device */
- for (int i = 0; i < SCARLETT2_AG_TARGET_COUNT; i++)
+ for (i = 0; i < SCARLETT2_AG_TARGET_COUNT; i++)
private->ag_targets[i] = -ag_target_values[i];
return 0;
--
2.45.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/5] ALSA: scarlett2: Fix mixed declarations and code warning
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
2024-10-04 14:27 ` [PATCH 1/5] ALSA: scarlett2: Fix redeclaration of loop variable Geoffrey D. Bennett
@ 2024-10-04 14:28 ` Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 3/5] ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes Geoffrey D. Bennett
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:28 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
In scarlett2_compressor_ctl_put(), move the declaration of param to
the beginning of the function to avoid mixed declarations and code.
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
---
sound/usb/mixer_scarlett2.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sound/usb/mixer_scarlett2.c b/sound/usb/mixer_scarlett2.c
index 003e91f9e43c..aa7c3d74ce8f 100644
--- a/sound/usb/mixer_scarlett2.c
+++ b/sound/usb/mixer_scarlett2.c
@@ -5385,6 +5385,8 @@ static int scarlett2_compressor_ctl_put(
int index = elem->control;
int channel = index / SCARLETT2_COMPRESSOR_PARAM_COUNT;
int param_index = index % SCARLETT2_COMPRESSOR_PARAM_COUNT;
+ const struct compressor_param *param = &compressor_params[param_index];
+
int oval, val, err;
s32 scaled_val;
@@ -5406,8 +5408,6 @@ static int scarlett2_compressor_ctl_put(
private->compressor_values[index] = val;
- const struct compressor_param *param = &compressor_params[param_index];
-
scaled_val = val << param->scale_bits;
/* Send change to the device */
--
2.45.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/5] ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
2024-10-04 14:27 ` [PATCH 1/5] ALSA: scarlett2: Fix redeclaration of loop variable Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 2/5] ALSA: scarlett2: Fix mixed declarations and code warning Geoffrey D. Bennett
@ 2024-10-04 14:28 ` Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 4/5] ALSA: scarlett2: Simplify linked channel handling Geoffrey D. Bennett
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:28 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
When writing to flash, return ENOSPC instead of EINVAL if the requested
write would exceed the size of the flash segment.
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
---
sound/usb/mixer_scarlett2.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/usb/mixer_scarlett2.c b/sound/usb/mixer_scarlett2.c
index aa7c3d74ce8f..844e95cc965e 100644
--- a/sound/usb/mixer_scarlett2.c
+++ b/sound/usb/mixer_scarlett2.c
@@ -9516,7 +9516,7 @@ static long scarlett2_hwdep_write(struct snd_hwdep *hw,
SCARLETT2_FLASH_BLOCK_SIZE;
if (count < 0 || *offset < 0 || *offset + count >= flash_size)
- return -EINVAL;
+ return -ENOSPC;
if (!count)
return 0;
--
2.45.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/5] ALSA: scarlett2: Simplify linked channel handling
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
` (2 preceding siblings ...)
2024-10-04 14:28 ` [PATCH 3/5] ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes Geoffrey D. Bennett
@ 2024-10-04 14:28 ` Geoffrey D. Bennett
2024-10-04 14:29 ` [PATCH 5/5] ALSA: scarlett2: Add support for device map retrieval Geoffrey D. Bennett
2024-10-08 8:12 ` [PATCH 0/5] ALSA: scarlett2: Small fixes + " Takashi Iwai
5 siblings, 0 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:28 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
The current handling of linked channels for the 4th Gen 2i2 and 4i4
models is more complicated than necessary. The firmware has a link
control for each channel, and the channel selection can be any channel
regardless of the channel link status. The driver can therefore be
simplified by having it reflect the controls presented by the
firmware, and complexities related to trying to reflect the channel
link status in the Input Select Capture Enum control are not
necessary.
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
---
sound/usb/mixer_scarlett2.c | 71 ++++++++++++-------------------------
1 file changed, 22 insertions(+), 49 deletions(-)
diff --git a/sound/usb/mixer_scarlett2.c b/sound/usb/mixer_scarlett2.c
index 844e95cc965e..b0eca4785bc6 100644
--- a/sound/usb/mixer_scarlett2.c
+++ b/sound/usb/mixer_scarlett2.c
@@ -11,7 +11,7 @@
* - Clarett 2Pre/4Pre/8Pre USB
* - Clarett+ 2Pre/4Pre/8Pre
*
- * Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu>
+ * Copyright (c) 2018-2024 by Geoffrey D. Bennett <g at b4.vu>
* Copyright (c) 2020-2021 by Vladimir Sadovnikov <sadko4u@gmail.com>
* Copyright (c) 2022 by Christian Colglazier <christian@cacolglazier.com>
*
@@ -1253,7 +1253,7 @@ struct scarlett2_data {
u8 phantom_switch[SCARLETT2_PHANTOM_SWITCH_MAX];
u8 phantom_persistence;
u8 input_select_switch;
- u8 input_link_switch[SCARLETT2_INPUT_GAIN_MAX / 2];
+ u8 input_link_switch[SCARLETT2_INPUT_GAIN_MAX];
u8 gain[SCARLETT2_INPUT_GAIN_MAX];
u8 autogain_switch[SCARLETT2_INPUT_GAIN_MAX];
u8 autogain_status[SCARLETT2_INPUT_GAIN_MAX];
@@ -1284,7 +1284,7 @@ struct scarlett2_data {
struct snd_kcontrol *input_mute_ctls[SCARLETT2_INPUT_MUTE_SWITCH_MAX];
struct snd_kcontrol *phantom_ctls[SCARLETT2_PHANTOM_SWITCH_MAX];
struct snd_kcontrol *input_select_ctl;
- struct snd_kcontrol *input_link_ctls[SCARLETT2_INPUT_GAIN_MAX / 2];
+ struct snd_kcontrol *input_link_ctls[SCARLETT2_INPUT_GAIN_MAX];
struct snd_kcontrol *input_gain_ctls[SCARLETT2_INPUT_GAIN_MAX];
struct snd_kcontrol *autogain_ctls[SCARLETT2_INPUT_GAIN_MAX];
struct snd_kcontrol *autogain_status_ctls[SCARLETT2_INPUT_GAIN_MAX];
@@ -3439,7 +3439,7 @@ static void scarlett2_autogain_update_access(struct usb_mixer_interface *mixer)
scarlett2_set_ctl_access(private->input_select_ctl, val);
if (scarlett2_has_config_item(private,
SCARLETT2_CONFIG_INPUT_LINK_SWITCH))
- for (i = 0; i < info->gain_input_count / 2; i++)
+ for (i = 0; i < info->gain_input_count; i++)
scarlett2_set_ctl_access(private->input_link_ctls[i],
val);
for (i = 0; i < info->gain_input_count; i++)
@@ -3480,7 +3480,7 @@ static void scarlett2_autogain_notify_access(struct usb_mixer_interface *mixer)
&private->input_select_ctl->id);
if (scarlett2_has_config_item(private,
SCARLETT2_CONFIG_INPUT_LINK_SWITCH))
- for (i = 0; i < info->gain_input_count / 2; i++)
+ for (i = 0; i < info->gain_input_count; i++)
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO,
&private->input_link_ctls[i]->id);
for (i = 0; i < info->gain_input_count; i++)
@@ -3825,7 +3825,7 @@ static int scarlett2_update_input_select(struct usb_mixer_interface *mixer)
{
struct scarlett2_data *private = mixer->private_data;
const struct scarlett2_device_info *info = private->info;
- int link_count = info->gain_input_count / 2;
+ int link_count = info->gain_input_count;
int err;
private->input_select_updated = 0;
@@ -3847,10 +3847,6 @@ static int scarlett2_update_input_select(struct usb_mixer_interface *mixer)
if (err < 0)
return err;
- /* simplified because no model yet has link_count > 1 */
- if (private->input_link_switch[0])
- private->input_select_switch = 0;
-
return 0;
}
@@ -3887,9 +3883,9 @@ static int scarlett2_input_select_ctl_put(
struct usb_mixer_elem_info *elem = kctl->private_data;
struct usb_mixer_interface *mixer = elem->head.mixer;
struct scarlett2_data *private = mixer->private_data;
+ const struct scarlett2_device_info *info = private->info;
int oval, val, err;
- int max_val = private->input_link_switch[0] ? 0 : 1;
mutex_lock(&private->data_mutex);
@@ -3907,19 +3903,18 @@ static int scarlett2_input_select_ctl_put(
if (val < 0)
val = 0;
- else if (val > max_val)
- val = max_val;
+ else if (val >= info->gain_input_count)
+ val = info->gain_input_count - 1;
if (oval == val)
goto unlock;
private->input_select_switch = val;
- /* Send switch change to the device if inputs not linked */
- if (!private->input_link_switch[0])
- err = scarlett2_usb_set_config(
- mixer, SCARLETT2_CONFIG_INPUT_SELECT_SWITCH,
- 1, val);
+ /* Send new value to the device */
+ err = scarlett2_usb_set_config(
+ mixer, SCARLETT2_CONFIG_INPUT_SELECT_SWITCH,
+ 0, val);
if (err == 0)
err = 1;
@@ -3936,8 +3931,7 @@ static int scarlett2_input_select_ctl_info(
struct scarlett2_data *private = mixer->private_data;
int inputs = private->info->gain_input_count;
- int i, j;
- int err;
+ int i, err;
char **values = kcalloc(inputs, sizeof(char *), GFP_KERNEL);
if (!values)
@@ -3954,21 +3948,11 @@ static int scarlett2_input_select_ctl_info(
if (err < 0)
goto unlock;
- /* Loop through each input
- * Linked inputs have one value for the pair
- */
- for (i = 0, j = 0; i < inputs; i++) {
- if (private->input_link_switch[i / 2]) {
- values[j++] = kasprintf(
- GFP_KERNEL, "Input %d-%d", i + 1, i + 2);
- i++;
- } else {
- values[j++] = kasprintf(
- GFP_KERNEL, "Input %d", i + 1);
- }
- }
+ /* Loop through each input */
+ for (i = 0; i < inputs; i++)
+ values[i] = kasprintf(GFP_KERNEL, "Input %d", i + 1);
- err = snd_ctl_enum_info(uinfo, 1, j,
+ err = snd_ctl_enum_info(uinfo, 1, i,
(const char * const *)values);
unlock:
@@ -4077,18 +4061,8 @@ static int scarlett2_input_link_ctl_put(
private->input_link_switch[index] = val;
- /* Notify of change in input select options available */
- snd_ctl_notify(mixer->chip->card,
- SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO,
- &private->input_select_ctl->id);
- private->input_select_updated = 1;
-
- /* Send switch change to the device
- * Link for channels 1-2 is at index 1
- * No device yet has more than 2 channels linked
- */
err = scarlett2_usb_set_config(
- mixer, SCARLETT2_CONFIG_INPUT_LINK_SWITCH, index + 1, val);
+ mixer, SCARLETT2_CONFIG_INPUT_LINK_SWITCH, index, val);
if (err == 0)
err = 1;
@@ -6914,10 +6888,9 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
if (scarlett2_has_config_item(private,
SCARLETT2_CONFIG_INPUT_LINK_SWITCH)) {
- for (i = 0; i < info->gain_input_count / 2; i++) {
+ for (i = 0; i < info->gain_input_count; i++) {
scnprintf(s, sizeof(s),
- "Line In %d-%d Link Capture Switch",
- (i * 2) + 1, (i * 2) + 2);
+ "Line In %d Link Capture Switch", i + 1);
err = scarlett2_add_new_ctl(
mixer, &scarlett2_input_link_ctl,
i, 1, s, &private->input_link_ctls[i]);
@@ -8244,7 +8217,7 @@ static void scarlett2_notify_input_select(struct usb_mixer_interface *mixer)
SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO,
&private->input_select_ctl->id);
- for (i = 0; i < info->gain_input_count / 2; i++)
+ for (i = 0; i < info->gain_input_count; i++)
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
&private->input_link_ctls[i]->id);
}
--
2.45.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/5] ALSA: scarlett2: Add support for device map retrieval
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
` (3 preceding siblings ...)
2024-10-04 14:28 ` [PATCH 4/5] ALSA: scarlett2: Simplify linked channel handling Geoffrey D. Bennett
@ 2024-10-04 14:29 ` Geoffrey D. Bennett
2024-10-08 8:12 ` [PATCH 0/5] ALSA: scarlett2: Small fixes + " Takashi Iwai
5 siblings, 0 replies; 7+ messages in thread
From: Geoffrey D. Bennett @ 2024-10-04 14:29 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-sound
Add support for retrieving the device map from Focusrite Scarlett 4th
Gen and Vocaster devices. The device map is a base64-encoded,
zlib-compressed JSON description of the device's capabilities and
configuration.
This patch adds:
- a has_devmap field to the scarlett2_device_info struct
- a /proc/asound/cardX/device-map.json.zz.b64 file when supported
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
---
sound/usb/mixer_scarlett2.c | 139 +++++++++++++++++++++++++++++++++++-
1 file changed, 138 insertions(+), 1 deletion(-)
diff --git a/sound/usb/mixer_scarlett2.c b/sound/usb/mixer_scarlett2.c
index b0eca4785bc6..69fa80b9d5bf 100644
--- a/sound/usb/mixer_scarlett2.c
+++ b/sound/usb/mixer_scarlett2.c
@@ -1079,6 +1079,9 @@ struct scarlett2_device_info {
/* minimum firmware version required */
u16 min_firmware_version;
+ /* has a downloadable device map */
+ u8 has_devmap;
+
/* support for main/alt speaker switching */
u8 has_speaker_switching;
@@ -1773,6 +1776,7 @@ static const struct scarlett2_device_info s18i20_gen3_info = {
static const struct scarlett2_device_info vocaster_one_info = {
.config_set = &scarlett2_config_set_vocaster,
.min_firmware_version = 1769,
+ .has_devmap = 1,
.phantom_count = 1,
.inputs_per_phantom = 1,
@@ -1815,6 +1819,7 @@ static const struct scarlett2_device_info vocaster_one_info = {
static const struct scarlett2_device_info vocaster_two_info = {
.config_set = &scarlett2_config_set_vocaster,
.min_firmware_version = 1769,
+ .has_devmap = 1,
.phantom_count = 2,
.inputs_per_phantom = 1,
@@ -1858,6 +1863,7 @@ static const struct scarlett2_device_info vocaster_two_info = {
static const struct scarlett2_device_info solo_gen4_info = {
.config_set = &scarlett2_config_set_gen4_solo,
.min_firmware_version = 2115,
+ .has_devmap = 1,
.level_input_count = 1,
.air_input_count = 1,
@@ -1912,6 +1918,7 @@ static const struct scarlett2_device_info solo_gen4_info = {
static const struct scarlett2_device_info s2i2_gen4_info = {
.config_set = &scarlett2_config_set_gen4_2i2,
.min_firmware_version = 2115,
+ .has_devmap = 1,
.level_input_count = 2,
.air_input_count = 2,
@@ -1966,6 +1973,7 @@ static const struct scarlett2_device_info s2i2_gen4_info = {
static const struct scarlett2_device_info s4i4_gen4_info = {
.config_set = &scarlett2_config_set_gen4_4i4,
.min_firmware_version = 2089,
+ .has_devmap = 1,
.level_input_count = 2,
.air_input_count = 2,
@@ -2264,6 +2272,8 @@ static int scarlett2_get_port_start_num(
#define SCARLETT2_USB_GET_DATA 0x00800000
#define SCARLETT2_USB_SET_DATA 0x00800001
#define SCARLETT2_USB_DATA_CMD 0x00800002
+#define SCARLETT2_USB_INFO_DEVMAP 0x0080000c
+#define SCARLETT2_USB_GET_DEVMAP 0x0080000d
#define SCARLETT2_USB_CONFIG_SAVE 6
@@ -2277,6 +2287,14 @@ static int scarlett2_get_port_start_num(
#define SCARLETT2_SEGMENT_SETTINGS_NAME "App_Settings"
#define SCARLETT2_SEGMENT_FIRMWARE_NAME "App_Upgrade"
+/* Gen 4 device firmware provides access to a base64-encoded
+ * zlib-compressed JSON description of the device's capabilities and
+ * configuration. This device map is made available in
+ * /proc/asound/cardX/device-map.json.zz.b64
+ */
+#define SCARLETT2_DEVMAP_BLOCK_SIZE 1024
+#define SCARLETT2_DEVMAP_FILENAME "device-map.json.zz.b64"
+
/* proprietary request/response format */
struct scarlett2_usb_packet {
__le32 cmd;
@@ -9562,6 +9580,116 @@ static int scarlett2_hwdep_init(struct usb_mixer_interface *mixer)
return 0;
}
+/*** device-map file ***/
+
+static ssize_t scarlett2_devmap_read(
+ struct snd_info_entry *entry,
+ void *file_private_data,
+ struct file *file,
+ char __user *buf,
+ size_t count,
+ loff_t pos)
+{
+ struct usb_mixer_interface *mixer = entry->private_data;
+ u8 *resp_buf;
+ const size_t block_size = SCARLETT2_DEVMAP_BLOCK_SIZE;
+ size_t copied = 0;
+
+ if (pos >= entry->size)
+ return 0;
+
+ if (pos + count > entry->size)
+ count = entry->size - pos;
+
+ resp_buf = kmalloc(block_size, GFP_KERNEL);
+ if (!resp_buf)
+ return -ENOMEM;
+
+ while (count > 0) {
+ /* SCARLETT2_USB_GET_DEVMAP reads only on block boundaries,
+ * so we need to read a whole block and copy the requested
+ * chunk to userspace.
+ */
+
+ __le32 req;
+ int err;
+
+ /* offset within the block that we're reading */
+ size_t offset = pos % block_size;
+
+ /* read_size is block_size except for the last block */
+ size_t block_start = pos - offset;
+ size_t read_size = min_t(size_t,
+ block_size,
+ entry->size - block_start);
+
+ /* size of the chunk to copy to userspace */
+ size_t copy_size = min_t(size_t, count, read_size - offset);
+
+ /* request the block */
+ req = cpu_to_le32(pos / block_size);
+ err = scarlett2_usb(mixer, SCARLETT2_USB_GET_DEVMAP,
+ &req, sizeof(req), resp_buf, read_size);
+ if (err < 0) {
+ kfree(resp_buf);
+ return copied ? copied : err;
+ }
+
+ if (copy_to_user(buf, resp_buf + offset, copy_size)) {
+ kfree(resp_buf);
+ return -EFAULT;
+ }
+
+ buf += copy_size;
+ pos += copy_size;
+ copied += copy_size;
+ count -= copy_size;
+ }
+
+ kfree(resp_buf);
+ return copied;
+}
+
+static const struct snd_info_entry_ops scarlett2_devmap_ops = {
+ .read = scarlett2_devmap_read,
+};
+
+static int scarlett2_devmap_init(struct usb_mixer_interface *mixer)
+{
+ struct snd_card *card = mixer->chip->card;
+ struct scarlett2_data *private = mixer->private_data;
+ const struct scarlett2_device_info *info = private->info;
+ __le16 config_len_buf[2];
+ int config_len;
+ struct snd_info_entry *entry;
+ int err;
+
+ /* If the device doesn't support the DEVMAP commands, don't
+ * create the /proc/asound/cardX/scarlett.json.zlib entry
+ */
+ if (!info->has_devmap)
+ return 0;
+
+ err = scarlett2_usb(mixer, SCARLETT2_USB_INFO_DEVMAP,
+ NULL, 0, &config_len_buf, sizeof(config_len_buf));
+ if (err < 0)
+ return err;
+
+ config_len = le16_to_cpu(config_len_buf[1]);
+
+ err = snd_card_proc_new(card, SCARLETT2_DEVMAP_FILENAME, &entry);
+ if (err < 0)
+ return err;
+
+ entry->content = SNDRV_INFO_CONTENT_DATA;
+ entry->private_data = mixer;
+ entry->c.ops = &scarlett2_devmap_ops;
+ entry->size = config_len;
+ entry->mode = S_IFREG | 0444;
+
+ return 0;
+}
+
int snd_scarlett2_init(struct usb_mixer_interface *mixer)
{
struct snd_usb_audio *chip = mixer->chip;
@@ -9612,11 +9740,20 @@ int snd_scarlett2_init(struct usb_mixer_interface *mixer)
}
err = scarlett2_hwdep_init(mixer);
- if (err < 0)
+ if (err < 0) {
usb_audio_err(mixer->chip,
"Error creating %s hwdep device: %d",
entry->series_name,
err);
+ return err;
+ }
+
+ err = scarlett2_devmap_init(mixer);
+ if (err < 0)
+ usb_audio_err(mixer->chip,
+ "Error creating %s devmap entry: %d",
+ entry->series_name,
+ err);
return err;
}
--
2.45.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
` (4 preceding siblings ...)
2024-10-04 14:29 ` [PATCH 5/5] ALSA: scarlett2: Add support for device map retrieval Geoffrey D. Bennett
@ 2024-10-08 8:12 ` Takashi Iwai
5 siblings, 0 replies; 7+ messages in thread
From: Takashi Iwai @ 2024-10-08 8:12 UTC (permalink / raw)
To: Geoffrey D. Bennett; +Cc: Takashi Iwai, linux-sound
On Fri, 04 Oct 2024 16:27:22 +0200,
Geoffrey D. Bennett wrote:
>
> Hi Takashi,
>
> This patch series contains:
>
> - 3 small fixes, I don't think need to be backported.
>
> - Simplification of linked channel handling to match how the firmware
> works. This is needed to be able to handle the recently-announced
> big 4th Gen models correctly.
>
> - Addition of support for device map retrieval: the Vocaster and
> Scarlett 4th Gen series added a new operation allowing the host to
> retrieve a base64-encoded zlib-compressed JSON representation of the
> device and the location of each control. This patch makes that
> available through /proc/asound/cardX/device-map.json.zz.b64
>
> Regards,
> Geoffrey.
>
> Geoffrey D. Bennett (5):
> ALSA: scarlett2: Fix redeclaration of loop variable
> ALSA: scarlett2: Fix mixed declarations and code warning
> ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes
> ALSA: scarlett2: Simplify linked channel handling
> ALSA: scarlett2: Add support for device map retrieval
Applied all five patches to for-next branch now. Thanks.
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-10-08 8:11 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-04 14:27 [PATCH 0/5] ALSA: scarlett2: Small fixes + device map retrieval Geoffrey D. Bennett
2024-10-04 14:27 ` [PATCH 1/5] ALSA: scarlett2: Fix redeclaration of loop variable Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 2/5] ALSA: scarlett2: Fix mixed declarations and code warning Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 3/5] ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes Geoffrey D. Bennett
2024-10-04 14:28 ` [PATCH 4/5] ALSA: scarlett2: Simplify linked channel handling Geoffrey D. Bennett
2024-10-04 14:29 ` [PATCH 5/5] ALSA: scarlett2: Add support for device map retrieval Geoffrey D. Bennett
2024-10-08 8:12 ` [PATCH 0/5] ALSA: scarlett2: Small fixes + " Takashi Iwai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox