ALSA: scarlett2: Add pbuf field to struct scarlett2_config

scarlett2_usb_set_config() was using size = 0 as a signal to use the
parameter buffer. Replace that with an explicit indication (pbuf = 1),
as the upcoming Vocaster support has a config item written via the
parameter buffer with size = 1 rather than the implicit size of 8.

Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Message-ID: <50a7d85bb04f9a7f13f667c70a706826c8d3ef93.1710264833.git.g@b4.vu>
This commit is contained in:
Geoffrey D. Bennett 2024-03-13 05:05:15 +10:30 committed by Takashi Iwai
parent 4390095126
commit 7d20f7b4f3

View file

@ -436,11 +436,12 @@ enum {
}; };
/* Location, size, and activation command number for the configuration /* Location, size, and activation command number for the configuration
* parameters. Size is in bits and may be 0, 1, 8, or 16. * parameters. Size is in bits and may be 1, 8, or 16.
* *
* A size of 0 indicates that the parameter is a byte-sized * Vocaster and 4th Gen devices have a parameter buffer to set certain
* configuration which is set through the parameter buffer (but still * configuration parameters. When pbuf is set, rather than writing to
* read through the given offset location). * the given offset, the channel and value are written to the
* parameter buffer and the activate command is sent to the device.
* *
* Some Gen 4 configuration parameters are written with 0x02 for a * Some Gen 4 configuration parameters are written with 0x02 for a
* desired value of 0x01, and 0x03 for 0x00. These are indicated with * desired value of 0x01, and 0x03 for 0x00. These are indicated with
@ -452,6 +453,7 @@ struct scarlett2_config {
u16 offset; u16 offset;
u8 size; u8 size;
u8 activate; u8 activate;
u8 pbuf;
u8 mute; u8 mute;
}; };
@ -631,19 +633,21 @@ static const struct scarlett2_config_set scarlett2_config_set_gen4_solo = {
.offset = 0x47, .size = 8, .activate = 4 }, .offset = 0x47, .size = 8, .activate = 4 },
[SCARLETT2_CONFIG_DIRECT_MONITOR] = { [SCARLETT2_CONFIG_DIRECT_MONITOR] = {
.offset = 0x108, .activate = 12 }, .offset = 0x108, .size = 8, .activate = 12, .pbuf = 1 },
[SCARLETT2_CONFIG_PHANTOM_SWITCH] = { [SCARLETT2_CONFIG_PHANTOM_SWITCH] = {
.offset = 0x46, .activate = 9, .mute = 1 }, .offset = 0x46, .size = 8, .activate = 9, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_LEVEL_SWITCH] = { [SCARLETT2_CONFIG_LEVEL_SWITCH] = {
.offset = 0x3d, .activate = 10, .mute = 1 }, .offset = 0x3d, .size = 8, .activate = 10, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_AIR_SWITCH] = { [SCARLETT2_CONFIG_AIR_SWITCH] = {
.offset = 0x3e, .activate = 11 }, .offset = 0x3e, .size = 8, .activate = 11, .pbuf = 1 },
[SCARLETT2_CONFIG_PCM_INPUT_SWITCH] = { [SCARLETT2_CONFIG_PCM_INPUT_SWITCH] = {
.offset = 0x206, .activate = 25 }, .offset = 0x206, .size = 8, .activate = 25, .pbuf = 1 },
[SCARLETT2_CONFIG_DIRECT_MONITOR_GAIN] = { [SCARLETT2_CONFIG_DIRECT_MONITOR_GAIN] = {
.offset = 0x232, .size = 16, .activate = 26 } .offset = 0x232, .size = 16, .activate = 26 }
@ -656,37 +660,39 @@ static const struct scarlett2_config_set scarlett2_config_set_gen4_2i2 = {
.param_buf_addr = 0xfc, .param_buf_addr = 0xfc,
.items = { .items = {
[SCARLETT2_CONFIG_MSD_SWITCH] = { [SCARLETT2_CONFIG_MSD_SWITCH] = {
.offset = 0x49, .size = 8, .activate = 4 }, // 0x41 ?? .offset = 0x49, .size = 8, .activate = 4 },
[SCARLETT2_CONFIG_DIRECT_MONITOR] = { [SCARLETT2_CONFIG_DIRECT_MONITOR] = {
.offset = 0x14a, .activate = 16 }, .offset = 0x14a, .size = 8, .activate = 16, .pbuf = 1 },
[SCARLETT2_CONFIG_AUTOGAIN_SWITCH] = { [SCARLETT2_CONFIG_AUTOGAIN_SWITCH] = {
.offset = 0x135, .activate = 10 }, .offset = 0x135, .size = 8, .activate = 10, .pbuf = 1 },
[SCARLETT2_CONFIG_AUTOGAIN_STATUS] = { [SCARLETT2_CONFIG_AUTOGAIN_STATUS] = {
.offset = 0x137 }, .offset = 0x137, .size = 8 },
[SCARLETT2_CONFIG_PHANTOM_SWITCH] = { [SCARLETT2_CONFIG_PHANTOM_SWITCH] = {
.offset = 0x48, .activate = 11, .mute = 1 }, .offset = 0x48, .size = 8, .activate = 11, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_INPUT_GAIN] = { [SCARLETT2_CONFIG_INPUT_GAIN] = {
.offset = 0x4b, .activate = 12 }, .offset = 0x4b, .size = 8, .activate = 12, .pbuf = 1 },
[SCARLETT2_CONFIG_LEVEL_SWITCH] = { [SCARLETT2_CONFIG_LEVEL_SWITCH] = {
.offset = 0x3c, .activate = 13, .mute = 1 }, .offset = 0x3c, .size = 8, .activate = 13, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_SAFE_SWITCH] = { [SCARLETT2_CONFIG_SAFE_SWITCH] = {
.offset = 0x147, .activate = 14 }, .offset = 0x147, .size = 8, .activate = 14, .pbuf = 1 },
[SCARLETT2_CONFIG_AIR_SWITCH] = { [SCARLETT2_CONFIG_AIR_SWITCH] = {
.offset = 0x3e, .activate = 15 }, .offset = 0x3e, .size = 8, .activate = 15, .pbuf = 1 },
[SCARLETT2_CONFIG_INPUT_SELECT_SWITCH] = { [SCARLETT2_CONFIG_INPUT_SELECT_SWITCH] = {
.offset = 0x14b, .activate = 17 }, .offset = 0x14b, .size = 8, .activate = 17, .pbuf = 1 },
[SCARLETT2_CONFIG_INPUT_LINK_SWITCH] = { [SCARLETT2_CONFIG_INPUT_LINK_SWITCH] = {
.offset = 0x14e, .activate = 18 }, .offset = 0x14e, .size = 8, .activate = 18, .pbuf = 1 },
[SCARLETT2_CONFIG_DIRECT_MONITOR_GAIN] = { [SCARLETT2_CONFIG_DIRECT_MONITOR_GAIN] = {
.offset = 0x2a0, .size = 16, .activate = 36 } .offset = 0x2a0, .size = 16, .activate = 36 }
@ -702,31 +708,33 @@ static const struct scarlett2_config_set scarlett2_config_set_gen4_4i4 = {
.offset = 0x5c, .size = 8, .activate = 4 }, .offset = 0x5c, .size = 8, .activate = 4 },
[SCARLETT2_CONFIG_AUTOGAIN_SWITCH] = { [SCARLETT2_CONFIG_AUTOGAIN_SWITCH] = {
.offset = 0x13e, .activate = 10 }, .offset = 0x13e, .size = 8, .activate = 10, .pbuf = 1 },
[SCARLETT2_CONFIG_AUTOGAIN_STATUS] = { [SCARLETT2_CONFIG_AUTOGAIN_STATUS] = {
.offset = 0x140 }, .offset = 0x140, .size = 8 },
[SCARLETT2_CONFIG_PHANTOM_SWITCH] = { [SCARLETT2_CONFIG_PHANTOM_SWITCH] = {
.offset = 0x5a, .activate = 11, .mute = 1 }, .offset = 0x5a, .size = 8, .activate = 11, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_INPUT_GAIN] = { [SCARLETT2_CONFIG_INPUT_GAIN] = {
.offset = 0x5e, .activate = 12 }, .offset = 0x5e, .size = 8, .activate = 12, .pbuf = 1 },
[SCARLETT2_CONFIG_LEVEL_SWITCH] = { [SCARLETT2_CONFIG_LEVEL_SWITCH] = {
.offset = 0x4e, .activate = 13, .mute = 1 }, .offset = 0x4e, .size = 8, .activate = 13, .pbuf = 1,
.mute = 1 },
[SCARLETT2_CONFIG_SAFE_SWITCH] = { [SCARLETT2_CONFIG_SAFE_SWITCH] = {
.offset = 0x150, .activate = 14 }, .offset = 0x150, .size = 8, .activate = 14, .pbuf = 1 },
[SCARLETT2_CONFIG_AIR_SWITCH] = { [SCARLETT2_CONFIG_AIR_SWITCH] = {
.offset = 0x50, .activate = 15 }, .offset = 0x50, .size = 8, .activate = 15, .pbuf = 1 },
[SCARLETT2_CONFIG_INPUT_SELECT_SWITCH] = { [SCARLETT2_CONFIG_INPUT_SELECT_SWITCH] = {
.offset = 0x153, .activate = 16 }, .offset = 0x153, .size = 8, .activate = 16, .pbuf = 1 },
[SCARLETT2_CONFIG_INPUT_LINK_SWITCH] = { [SCARLETT2_CONFIG_INPUT_LINK_SWITCH] = {
.offset = 0x156, .activate = 17 }, .offset = 0x156, .size = 8, .activate = 17, .pbuf = 1 },
[SCARLETT2_CONFIG_MASTER_VOLUME] = { [SCARLETT2_CONFIG_MASTER_VOLUME] = {
.offset = 0x32, .size = 16 }, .offset = 0x32, .size = 16 },
@ -735,10 +743,10 @@ static const struct scarlett2_config_set scarlett2_config_set_gen4_4i4 = {
.offset = 0x3a, .size = 16 }, .offset = 0x3a, .size = 16 },
[SCARLETT2_CONFIG_POWER_EXT] = { [SCARLETT2_CONFIG_POWER_EXT] = {
.offset = 0x168 }, .offset = 0x168, .size = 8 },
[SCARLETT2_CONFIG_POWER_LOW] = { [SCARLETT2_CONFIG_POWER_LOW] = {
.offset = 0x16d } .offset = 0x16d, .size = 8 }
} }
}; };
@ -2167,11 +2175,8 @@ static int scarlett2_usb_set_config(
if (!config_item->offset) if (!config_item->offset)
return -EFAULT; return -EFAULT;
/* Writes via the parameter buffer are selected with size = 0; /* Write via the parameter buffer? */
* these are only byte-sized values written through a shared if (config_item->pbuf) {
* location, different to the read address
*/
if (!config_item->size) {
if (!config_set->param_buf_addr) if (!config_set->param_buf_addr)
return -EFAULT; return -EFAULT;
@ -2187,7 +2192,7 @@ static int scarlett2_usb_set_config(
if (err < 0) if (err < 0)
return err; return err;
/* Request the interface do the write */ /* Activate the write through the parameter buffer */
return scarlett2_usb_activate_config( return scarlett2_usb_activate_config(
mixer, config_item->activate); mixer, config_item->activate);
} }
@ -2227,7 +2232,7 @@ static int scarlett2_usb_set_config(
value = tmp; value = tmp;
} }
/* Send the configuration parameter data */ /* Write the new value */
err = scarlett2_usb_set_data(mixer, offset, size, value); err = scarlett2_usb_set_data(mixer, offset, size, value);
if (err < 0) if (err < 0)
return err; return err;
@ -2237,7 +2242,9 @@ static int scarlett2_usb_set_config(
if (err < 0) if (err < 0)
return err; return err;
/* Writes via the parameter buffer don't need a separate save step */ /* Interfaces with parameter buffer writes don't need a
* separate save step
*/
if (config_set->param_buf_addr) if (config_set->param_buf_addr)
return 0; return 0;