@@ -406,6 +406,7 @@ struct scarlett2_data {
406
406
__u8 bInterval ;
407
407
int num_mux_srcs ;
408
408
int num_mux_dsts ;
409
+ u32 firmware_version ;
409
410
u16 scarlett2_seq ;
410
411
u8 sync_updated ;
411
412
u8 vol_updated ;
@@ -1856,6 +1857,44 @@ static int scarlett2_add_new_ctl(struct usb_mixer_interface *mixer,
1856
1857
return 0 ;
1857
1858
}
1858
1859
1860
+ /*** Firmware Version Control ***/
1861
+
1862
+ static int scarlett2_firmware_version_ctl_get (
1863
+ struct snd_kcontrol * kctl ,
1864
+ struct snd_ctl_elem_value * ucontrol )
1865
+ {
1866
+ struct usb_mixer_elem_info * elem = kctl -> private_data ;
1867
+ struct scarlett2_data * private = elem -> head .mixer -> private_data ;
1868
+
1869
+ ucontrol -> value .integer .value [0 ] = private -> firmware_version ;
1870
+
1871
+ return 0 ;
1872
+ }
1873
+
1874
+ static int scarlett2_firmware_version_ctl_info (
1875
+ struct snd_kcontrol * kctl ,
1876
+ struct snd_ctl_elem_info * uinfo )
1877
+ {
1878
+ uinfo -> type = SNDRV_CTL_ELEM_TYPE_INTEGER ;
1879
+ uinfo -> count = 1 ;
1880
+
1881
+ return 0 ;
1882
+ }
1883
+
1884
+ static const struct snd_kcontrol_new scarlett2_firmware_version_ctl = {
1885
+ .iface = SNDRV_CTL_ELEM_IFACE_CARD ,
1886
+ .access = SNDRV_CTL_ELEM_ACCESS_READ ,
1887
+ .name = "" ,
1888
+ .info = scarlett2_firmware_version_ctl_info ,
1889
+ .get = scarlett2_firmware_version_ctl_get
1890
+ };
1891
+
1892
+ static int scarlett2_add_firmware_version_ctl (
1893
+ struct usb_mixer_interface * mixer )
1894
+ {
1895
+ return scarlett2_add_new_ctl (mixer , & scarlett2_firmware_version_ctl ,
1896
+ 0 , 0 , "Firmware Version" , NULL );
1897
+ }
1859
1898
/*** Sync Control ***/
1860
1899
1861
1900
/* Update sync control after receiving notification that the status
@@ -3854,15 +3893,17 @@ static int scarlett2_usb_init(struct usb_mixer_interface *mixer)
3854
3893
{
3855
3894
struct usb_device * dev = mixer -> chip -> dev ;
3856
3895
struct scarlett2_data * private = mixer -> private_data ;
3857
- u8 buf [24 ];
3896
+ u8 step0_buf [24 ];
3897
+ u8 step2_buf [84 ];
3858
3898
int err ;
3859
3899
3860
3900
if (usb_pipe_type_check (dev , usb_sndctrlpipe (dev , 0 )))
3861
3901
return - EINVAL ;
3862
3902
3863
3903
/* step 0 */
3864
3904
err = scarlett2_usb_rx (dev , private -> bInterfaceNumber ,
3865
- SCARLETT2_USB_CMD_INIT , buf , sizeof (buf ));
3905
+ SCARLETT2_USB_CMD_INIT ,
3906
+ step0_buf , sizeof (step0_buf ));
3866
3907
if (err < 0 )
3867
3908
return err ;
3868
3909
@@ -3874,7 +3915,19 @@ static int scarlett2_usb_init(struct usb_mixer_interface *mixer)
3874
3915
3875
3916
/* step 2 */
3876
3917
private -> scarlett2_seq = 1 ;
3877
- return scarlett2_usb (mixer , SCARLETT2_USB_INIT_2 , NULL , 0 , NULL , 84 );
3918
+ err = scarlett2_usb (mixer , SCARLETT2_USB_INIT_2 ,
3919
+ NULL , 0 ,
3920
+ step2_buf , sizeof (step2_buf ));
3921
+ if (err < 0 )
3922
+ return err ;
3923
+
3924
+ /* extract 4-byte firmware version from step2_buf[8] */
3925
+ private -> firmware_version = le32_to_cpu (* (__le32 * )(step2_buf + 8 ));
3926
+ usb_audio_info (mixer -> chip ,
3927
+ "Firmware version %d\n" ,
3928
+ private -> firmware_version );
3929
+
3930
+ return 0 ;
3878
3931
}
3879
3932
3880
3933
/* Read configuration from the interface on start */
@@ -4192,6 +4245,9 @@ static int snd_scarlett2_controls_create(
4192
4245
if (err < 0 )
4193
4246
return err ;
4194
4247
4248
+ /* Add firmware version control */
4249
+ err = scarlett2_add_firmware_version_ctl (mixer );
4250
+
4195
4251
/* Read volume levels and controls from the interface */
4196
4252
err = scarlett2_read_configs (mixer );
4197
4253
if (err < 0 )
0 commit comments