mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
ALSA: scarlett2: Add support for reading firmware version
The 84 bytes read during initialisation step 2 were previously ignored. This patch retrieves the firmware version from bytes 8-11, stores it in the scarlett2_data struct, and makes it available through a new control "Firmware Version". Signed-off-by: Geoffrey D. Bennett <g@b4.vu> Link: https://lore.kernel.org/r/e76cd80c3445769e60c95df12c4635fc8abfe5c7.1698342632.git.g@b4.vu Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
f3c42a2da4
commit
701949cc01
@ -406,6 +406,7 @@ struct scarlett2_data {
|
|||||||
__u8 bInterval;
|
__u8 bInterval;
|
||||||
int num_mux_srcs;
|
int num_mux_srcs;
|
||||||
int num_mux_dsts;
|
int num_mux_dsts;
|
||||||
|
u32 firmware_version;
|
||||||
u16 scarlett2_seq;
|
u16 scarlett2_seq;
|
||||||
u8 sync_updated;
|
u8 sync_updated;
|
||||||
u8 vol_updated;
|
u8 vol_updated;
|
||||||
@ -1856,6 +1857,44 @@ static int scarlett2_add_new_ctl(struct usb_mixer_interface *mixer,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*** Firmware Version Control ***/
|
||||||
|
|
||||||
|
static int scarlett2_firmware_version_ctl_get(
|
||||||
|
struct snd_kcontrol *kctl,
|
||||||
|
struct snd_ctl_elem_value *ucontrol)
|
||||||
|
{
|
||||||
|
struct usb_mixer_elem_info *elem = kctl->private_data;
|
||||||
|
struct scarlett2_data *private = elem->head.mixer->private_data;
|
||||||
|
|
||||||
|
ucontrol->value.integer.value[0] = private->firmware_version;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int scarlett2_firmware_version_ctl_info(
|
||||||
|
struct snd_kcontrol *kctl,
|
||||||
|
struct snd_ctl_elem_info *uinfo)
|
||||||
|
{
|
||||||
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||||
|
uinfo->count = 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new scarlett2_firmware_version_ctl = {
|
||||||
|
.iface = SNDRV_CTL_ELEM_IFACE_CARD,
|
||||||
|
.access = SNDRV_CTL_ELEM_ACCESS_READ,
|
||||||
|
.name = "",
|
||||||
|
.info = scarlett2_firmware_version_ctl_info,
|
||||||
|
.get = scarlett2_firmware_version_ctl_get
|
||||||
|
};
|
||||||
|
|
||||||
|
static int scarlett2_add_firmware_version_ctl(
|
||||||
|
struct usb_mixer_interface *mixer)
|
||||||
|
{
|
||||||
|
return scarlett2_add_new_ctl(mixer, &scarlett2_firmware_version_ctl,
|
||||||
|
0, 0, "Firmware Version", NULL);
|
||||||
|
}
|
||||||
/*** Sync Control ***/
|
/*** Sync Control ***/
|
||||||
|
|
||||||
/* Update sync control after receiving notification that the status
|
/* Update sync control after receiving notification that the status
|
||||||
@ -3854,7 +3893,8 @@ static int scarlett2_usb_init(struct usb_mixer_interface *mixer)
|
|||||||
{
|
{
|
||||||
struct usb_device *dev = mixer->chip->dev;
|
struct usb_device *dev = mixer->chip->dev;
|
||||||
struct scarlett2_data *private = mixer->private_data;
|
struct scarlett2_data *private = mixer->private_data;
|
||||||
u8 buf[24];
|
u8 step0_buf[24];
|
||||||
|
u8 step2_buf[84];
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (usb_pipe_type_check(dev, usb_sndctrlpipe(dev, 0)))
|
if (usb_pipe_type_check(dev, usb_sndctrlpipe(dev, 0)))
|
||||||
@ -3862,7 +3902,8 @@ static int scarlett2_usb_init(struct usb_mixer_interface *mixer)
|
|||||||
|
|
||||||
/* step 0 */
|
/* step 0 */
|
||||||
err = scarlett2_usb_rx(dev, private->bInterfaceNumber,
|
err = scarlett2_usb_rx(dev, private->bInterfaceNumber,
|
||||||
SCARLETT2_USB_CMD_INIT, buf, sizeof(buf));
|
SCARLETT2_USB_CMD_INIT,
|
||||||
|
step0_buf, sizeof(step0_buf));
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@ -3874,7 +3915,19 @@ static int scarlett2_usb_init(struct usb_mixer_interface *mixer)
|
|||||||
|
|
||||||
/* step 2 */
|
/* step 2 */
|
||||||
private->scarlett2_seq = 1;
|
private->scarlett2_seq = 1;
|
||||||
return scarlett2_usb(mixer, SCARLETT2_USB_INIT_2, NULL, 0, NULL, 84);
|
err = scarlett2_usb(mixer, SCARLETT2_USB_INIT_2,
|
||||||
|
NULL, 0,
|
||||||
|
step2_buf, sizeof(step2_buf));
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* extract 4-byte firmware version from step2_buf[8] */
|
||||||
|
private->firmware_version = le32_to_cpu(*(__le32 *)(step2_buf + 8));
|
||||||
|
usb_audio_info(mixer->chip,
|
||||||
|
"Firmware version %d\n",
|
||||||
|
private->firmware_version);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read configuration from the interface on start */
|
/* Read configuration from the interface on start */
|
||||||
@ -4192,6 +4245,9 @@ static int snd_scarlett2_controls_create(
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* Add firmware version control */
|
||||||
|
err = scarlett2_add_firmware_version_ctl(mixer);
|
||||||
|
|
||||||
/* Read volume levels and controls from the interface */
|
/* Read volume levels and controls from the interface */
|
||||||
err = scarlett2_read_configs(mixer);
|
err = scarlett2_read_configs(mixer);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user