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
1 changed files with 46 additions and 39 deletions

View File

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