@@ -984,21 +984,13 @@ static int snd_usb_axefx3_boot_quirk(struct usb_device *dev)
984984 return 0 ;
985985}
986986
987- static void mbox3_setup_48_24_magic (struct usb_device * dev )
987+ static void mbox3_setup_defaults (struct usb_device * dev )
988988{
989989 /* The Mbox 3 is "little endian" */
990990 /* max volume is: 0x0000. */
991991 /* min volume is: 0x0080 (shown in little endian form) */
992992
993-
994- /* Load 48000Hz rate into buffer */
995- u8 com_buff [4 ] = {0x80 , 0xbb , 0x00 , 0x00 };
996-
997- /* Set 48000Hz sample rate */
998- snd_usb_ctl_msg (dev , usb_sndctrlpipe (dev , 0 ),
999- 0x01 , 0x21 , 0x0100 , 0x0001 , & com_buff , 4 ); //Is this really needed?
1000- snd_usb_ctl_msg (dev , usb_sndctrlpipe (dev , 0 ),
1001- 0x01 , 0x21 , 0x0100 , 0x8101 , & com_buff , 4 );
993+ u8 com_buff [2 ];
1002994
1003995 /* Deactivate Tuner */
1004996 /* on = 0x01*/
@@ -1008,6 +1000,8 @@ static void mbox3_setup_48_24_magic(struct usb_device *dev)
10081000 0x01 , 0x21 , 0x0003 , 0x2001 , & com_buff , 1 );
10091001
10101002 /* Set clock source to Internal (as opposed to S/PDIF) */
1003+ /* Internal = 0x01*/
1004+ /* S/PDIF = 0x02*/
10111005 com_buff [0 ] = 0x01 ;
10121006 snd_usb_ctl_msg (dev , usb_sndctrlpipe (dev , 0 ),
10131007 1 , 0x21 , 0x0100 , 0x8001 , & com_buff , 1 );
@@ -1113,9 +1107,11 @@ static void mbox3_setup_48_24_magic(struct usb_device *dev)
11131107 1 , 0x21 , 0x0107 , 0x4201 , & com_buff , 2 );
11141108
11151109 /* Toggle allowing host control */
1110+ /* Not needed
11161111 com_buff[0] = 0x02;
11171112 snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0),
11181113 3, 0x21, 0x0000, 0x2001, &com_buff, 1);
1114+ */
11191115
11201116 /* Do not dim fx returns */
11211117 com_buff [0 ] = 0x00 ;
@@ -1259,26 +1255,27 @@ static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
12591255 descriptor_size = le16_to_cpu (get_cfg_desc (config )-> wTotalLength );
12601256
12611257 if (descriptor_size != MBOX3_DESCRIPTOR_SIZE ) {
1262- dev_err (& dev -> dev , "Invalid descriptor size=%d.\n" , descriptor_size );
1258+ dev_err (& dev -> dev , "MBOX3: Invalid descriptor size=%d.\n" , descriptor_size );
12631259 return - ENODEV ;
12641260 }
12651261
1266- dev_dbg (& dev -> dev , "device initialised!\n" );
1262+ dev_dbg (& dev -> dev , "MBOX3: device initialised!\n" );
12671263
12681264 err = usb_get_descriptor (dev , USB_DT_DEVICE , 0 ,
12691265 & dev -> descriptor , sizeof (dev -> descriptor ));
12701266 config = dev -> actconfig ;
12711267 if (err < 0 )
1272- dev_dbg (& dev -> dev , "error usb_get_descriptor: %d\n" , err );
1268+ dev_dbg (& dev -> dev , "MBOX3: error usb_get_descriptor: %d\n" , err );
12731269
12741270 err = usb_reset_configuration (dev );
12751271 if (err < 0 )
1276- dev_dbg (& dev -> dev , "error usb_reset_configuration: %d\n" , err );
1277- dev_dbg (& dev -> dev , "mbox3_boot: new boot length = %d\n" ,
1272+ dev_dbg (& dev -> dev , "MBOX3: error usb_reset_configuration: %d\n" , err );
1273+
1274+ dev_dbg (& dev -> dev , "MBOX3: new boot length = %d\n" ,
12781275 le16_to_cpu (get_cfg_desc (config )-> wTotalLength ));
12791276
1280- mbox3_setup_48_24_magic (dev );
1281- dev_info (& dev -> dev , "Digidesign Mbox 3: 24bit 48kHz " );
1277+ mbox3_setup_defaults (dev );
1278+ dev_info (& dev -> dev , "MBOX3: Initialized. " );
12821279
12831280 return 0 ; /* Successful boot */
12841281}
@@ -1734,6 +1731,46 @@ static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
17341731 return 0 ;
17351732}
17361733
1734+ static void mbox3_set_format_quirk (struct snd_usb_substream * subs ,
1735+ const struct audioformat * fmt )
1736+ {
1737+ __le32 buff4 = 0 ;
1738+ u8 buff1 = 0x01 ;
1739+ u32 new_rate = subs -> data_endpoint -> cur_rate ;
1740+ u32 current_rate ;
1741+
1742+ // Get current rate from card and check if changing it is needed
1743+ snd_usb_ctl_msg (subs -> dev , usb_sndctrlpipe (subs -> dev , 0 ),
1744+ 0x01 , 0x21 | USB_DIR_IN , 0x0100 , 0x8101 , & buff4 , 4 );
1745+ current_rate = le32_to_cpu (buff4 );
1746+ dev_dbg (& subs -> dev -> dev ,
1747+ "MBOX3: Current configured sample rate: %d" , current_rate );
1748+ if (current_rate == new_rate ) {
1749+ dev_dbg (& subs -> dev -> dev ,
1750+ "MBOX3: No change needed (current rate:%d == new rate:%d)" ,
1751+ current_rate , new_rate );
1752+ return ;
1753+ }
1754+
1755+ // Set new rate
1756+ dev_info (& subs -> dev -> dev ,
1757+ "MBOX3: Changing sample rate to: %d" , new_rate );
1758+ buff4 = cpu_to_le32 (new_rate );
1759+ snd_usb_ctl_msg (subs -> dev , usb_sndctrlpipe (subs -> dev , 0 ),
1760+ 0x01 , 0x21 , 0x0100 , 0x8101 , & buff4 , 4 );
1761+
1762+ // Set clock source to Internal
1763+ snd_usb_ctl_msg (subs -> dev , usb_sndctrlpipe (subs -> dev , 0 ),
1764+ 0x01 , 0x21 , 0x0100 , 0x8001 , & buff1 , 1 );
1765+
1766+ // Check whether the change was successful
1767+ buff4 = 0 ;
1768+ snd_usb_ctl_msg (subs -> dev , usb_sndctrlpipe (subs -> dev , 0 ),
1769+ 0x01 , 0x21 | USB_DIR_IN , 0x0100 , 0x8101 , & buff4 , 4 );
1770+ if (new_rate != le32_to_cpu (buff4 ))
1771+ dev_warn (& subs -> dev -> dev , "MBOX3: Couldn't set the sample rate" );
1772+ }
1773+
17371774void snd_usb_set_format_quirk (struct snd_usb_substream * subs ,
17381775 const struct audioformat * fmt )
17391776{
@@ -1755,6 +1792,9 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
17551792 case USB_ID (0x08e4 , 0x0163 ): /* Pioneer DJM-850 */
17561793 pioneer_djm_set_format_quirk (subs , 0x0086 );
17571794 break ;
1795+ case USB_ID (0x0dba , 0x5000 ):
1796+ mbox3_set_format_quirk (subs , fmt ); /* Digidesign Mbox 3 */
1797+ break ;
17581798 }
17591799}
17601800
0 commit comments