Lines Matching +full:mux +full:- +full:controls
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2018-2019 by Geoffrey D. Bennett <g at b4.vu>
28 * (firmware 1083) using usbmon in July-August 2018.
36 * - input, output, mixer-matrix muxes
37 * - 18x10 mixer-matrix gain stages
38 * - gain/volume controls
39 * - level meters
40 * - line/inst level and pad controls
43 * /--------------\ 18chn 20chn /--------------\
44 * | Hardware in +--+------\ /-------------+--+ ALSA PCM out |
45 * \--------------/ | | | | \--------------/
46 * | | | /-----\ |
49 * | +---------------+ | |
50 * | \ Matrix Mux / | |
51 * | +-----+-----+ | |
57 * | +------------+ | |
63 * | +-----+------+ | |
67 * | +----------/ |
71 * +---------------+ +--—------------+
72 * \ Output Mux / \ Capture Mux /
73 * +---+---+---+ +-----+-----+
77 * /--------------\ | | | /--------------\
78 * | S/PDIF, ADAT |<--/ |10chn \-->| ALSA PCM in |
79 * | Hardware out | | \--------------/
80 * \--------------/ |
82 * +-------------+ Software gain per channel.
83 * | Master Gain |<-- 18i20 only: Switch per channel
84 * +------+------+ to select HW or SW gain control.
87 * /--------------\ |
88 * | Analogue |<------/
90 * \--------------/
114 /* mixer range from -80dB to +6dB in 0.5dB steps */
115 #define SCARLETT2_MIXER_MIN_DB -80
116 #define SCARLETT2_MIXER_BIAS (-SCARLETT2_MIXER_MIN_DB * 2)
119 ((SCARLETT2_MIXER_MAX_DB - SCARLETT2_MIXER_MIN_DB) * 2)
122 * for dB in 0 .. 172: int(8192 * pow(10, ((dB - 160) / 2 / 20)))
154 /* Maximum size of the data in the USB mux assignment message:
165 * - None (no input to mux)
166 * - Analogue I/O
167 * - S/PDIF I/O
168 * - ADAT I/O
169 * - Mixer I/O
170 * - PCM I/O
200 * - id: hardware ID for this port type
201 * - num: number of sources/destinations of this port type
202 * - src_descr: printf format string for mux input selections
203 * - src_num_offset: added to channel number for the fprintf
204 * - dst_descr: printf format string for mixer controls
241 u8 mux[SCARLETT2_MUX_MAX]; member
245 /*** Model-specific data ***/
336 * but are included in the USB mux I/O
405 * but are included in the USB mux I/O
452 /* Vendor-Specific Interface, Endpoint, MaxPacketSize, Interval */
488 /* actual volume of output inc. dim (-18dB) */
576 u16 seq = private->scarlett2_seq++; in scarlett2_fill_request_header()
578 req->cmd = cpu_to_le32(cmd); in scarlett2_fill_request_header()
579 req->size = cpu_to_le16(req_size); in scarlett2_fill_request_header()
580 req->seq = cpu_to_le16(seq); in scarlett2_fill_request_header()
581 req->error = 0; in scarlett2_fill_request_header()
582 req->pad = 0; in scarlett2_fill_request_header()
590 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_usb()
598 err = -ENOMEM; in scarlett2_usb()
604 err = -ENOMEM; in scarlett2_usb()
608 mutex_lock(&private->usb_mutex); in scarlett2_usb()
615 memcpy(req->data, req_data, req_size); in scarlett2_usb()
617 err = snd_usb_ctl_msg(mixer->chip->dev, in scarlett2_usb()
618 usb_sndctrlpipe(mixer->chip->dev, 0), in scarlett2_usb()
628 mixer->chip, in scarlett2_usb()
631 err = -EINVAL; in scarlett2_usb()
637 err = snd_usb_ctl_msg(mixer->chip->dev, in scarlett2_usb()
638 usb_rcvctrlpipe(mixer->chip->dev, 0), in scarlett2_usb()
650 mixer->chip, in scarlett2_usb()
653 err = -EINVAL; in scarlett2_usb()
657 if (resp->cmd != req->cmd || in scarlett2_usb()
658 resp->seq != req->seq || in scarlett2_usb()
659 resp_size != le16_to_cpu(resp->size) || in scarlett2_usb()
660 resp->error || in scarlett2_usb()
661 resp->pad) { in scarlett2_usb()
663 mixer->chip, in scarlett2_usb()
667 le32_to_cpu(req->cmd), le32_to_cpu(resp->cmd), in scarlett2_usb()
668 le16_to_cpu(req->seq), le16_to_cpu(resp->seq), in scarlett2_usb()
669 resp_size, le16_to_cpu(resp->size), in scarlett2_usb()
670 le32_to_cpu(resp->error), in scarlett2_usb()
671 le32_to_cpu(resp->pad)); in scarlett2_usb()
672 err = -EINVAL; in scarlett2_usb()
677 memcpy(resp_data, resp->data, resp_size); in scarlett2_usb()
680 mutex_unlock(&private->usb_mutex); in scarlett2_usb()
703 scarlett2_config_save(private->mixer); in scarlett2_config_save_work()
722 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_usb_set_config()
725 cancel_delayed_work_sync(&private->work); in scarlett2_usb_set_config()
745 schedule_delayed_work(&private->work, msecs_to_jiffies(2000)); in scarlett2_usb_set_config()
788 * (values obtained from private->mix[])
793 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_usb_set_mix()
794 const struct scarlett2_device_info *info = private->info; in scarlett2_usb_set_mix()
803 info->ports[SCARLETT2_PORT_TYPE_MIX].num[SCARLETT2_PORT_OUT]; in scarlett2_usb_set_mix()
809 scarlett2_mixer_values[private->mix[j]] in scarlett2_usb_set_mix()
817 /* Convert a port number index (per info->ports) to a hardware ID */
828 num -= ports[port_type].num[SCARLETT2_PORT_IN]; in scarlett2_mux_src_num_to_id()
835 /* Send USB messages to set mux inputs */
838 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_usb_set_mux()
839 const struct scarlett2_device_info *info = private->info; in scarlett2_usb_set_mux()
840 const struct scarlett2_ports *ports = info->ports; in scarlett2_usb_set_mux()
860 /* mux settings for each rate */ in scarlett2_usb_set_mux()
890 ports, private->mux[j] in scarlett2_usb_set_mux()
894 /* skip private->mux[j] entries not output */ in scarlett2_usb_set_mux()
895 j += ports[port_type].num[SCARLETT2_PORT_OUT] - in scarlett2_usb_set_mux()
950 return -ENOMEM; in scarlett2_add_new_ctl()
956 elem->head.mixer = mixer; in scarlett2_add_new_ctl()
957 elem->control = index; in scarlett2_add_new_ctl()
958 elem->head.id = 0; in scarlett2_add_new_ctl()
959 elem->channels = channels; in scarlett2_add_new_ctl()
960 elem->val_type = USB_MIXER_BESPOKEN; in scarlett2_add_new_ctl()
965 return -ENOMEM; in scarlett2_add_new_ctl()
967 kctl->private_free = snd_usb_mixer_elem_free; in scarlett2_add_new_ctl()
969 strlcpy(kctl->id.name, name, sizeof(kctl->id.name)); in scarlett2_add_new_ctl()
971 err = snd_usb_mixer_add_control(&elem->head, kctl); in scarlett2_add_new_ctl()
981 /*** Analogue Line Out Volume Controls ***/
983 /* Update hardware volume controls after receiving notification that
988 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_update_volumes()
989 const struct scarlett2_ports *ports = private->info->ports; in scarlett2_update_volumes()
995 private->vol_updated = 0; in scarlett2_update_volumes()
1001 private->master_vol = clamp( in scarlett2_update_volumes()
1006 if (private->vol_sw_hw_switch[i]) in scarlett2_update_volumes()
1007 private->vol[i] = private->master_vol; in scarlett2_update_volumes()
1010 for (i = 0; i < private->info->button_count; i++) in scarlett2_update_volumes()
1011 private->buttons[i] = !!volume_status.buttons[i]; in scarlett2_update_volumes()
1019 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_volume_ctl_info()
1021 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in scarlett2_volume_ctl_info()
1022 uinfo->count = elem->channels; in scarlett2_volume_ctl_info()
1023 uinfo->value.integer.min = 0; in scarlett2_volume_ctl_info()
1024 uinfo->value.integer.max = SCARLETT2_VOLUME_BIAS; in scarlett2_volume_ctl_info()
1025 uinfo->value.integer.step = 1; in scarlett2_volume_ctl_info()
1032 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_master_volume_ctl_get()
1033 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_master_volume_ctl_get()
1034 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_master_volume_ctl_get()
1036 mutex_lock(&private->data_mutex); in scarlett2_master_volume_ctl_get()
1037 if (private->vol_updated) in scarlett2_master_volume_ctl_get()
1039 mutex_unlock(&private->data_mutex); in scarlett2_master_volume_ctl_get()
1041 ucontrol->value.integer.value[0] = private->master_vol; in scarlett2_master_volume_ctl_get()
1048 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_volume_ctl_get()
1049 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_volume_ctl_get()
1050 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_volume_ctl_get()
1051 int index = elem->control; in scarlett2_volume_ctl_get()
1053 mutex_lock(&private->data_mutex); in scarlett2_volume_ctl_get()
1054 if (private->vol_updated) in scarlett2_volume_ctl_get()
1056 mutex_unlock(&private->data_mutex); in scarlett2_volume_ctl_get()
1058 ucontrol->value.integer.value[0] = private->vol[index]; in scarlett2_volume_ctl_get()
1065 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_volume_ctl_put()
1066 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_volume_ctl_put()
1067 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_volume_ctl_put()
1068 int index = elem->control; in scarlett2_volume_ctl_put()
1071 mutex_lock(&private->data_mutex); in scarlett2_volume_ctl_put()
1073 oval = private->vol[index]; in scarlett2_volume_ctl_put()
1074 val = ucontrol->value.integer.value[0]; in scarlett2_volume_ctl_put()
1079 private->vol[index] = val; in scarlett2_volume_ctl_put()
1081 index, val - SCARLETT2_VOLUME_BIAS); in scarlett2_volume_ctl_put()
1086 mutex_unlock(&private->data_mutex); in scarlett2_volume_ctl_put()
1091 db_scale_scarlett2_gain, -SCARLETT2_VOLUME_BIAS * 100, 0
1117 /*** HW/SW Volume Switch Controls ***/
1132 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_sw_hw_enum_ctl_get()
1133 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_sw_hw_enum_ctl_get()
1135 ucontrol->value.enumerated.item[0] = in scarlett2_sw_hw_enum_ctl_get()
1136 private->vol_sw_hw_switch[elem->control]; in scarlett2_sw_hw_enum_ctl_get()
1143 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_sw_hw_enum_ctl_put()
1144 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_sw_hw_enum_ctl_put()
1145 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_sw_hw_enum_ctl_put()
1147 int index = elem->control; in scarlett2_sw_hw_enum_ctl_put()
1150 mutex_lock(&private->data_mutex); in scarlett2_sw_hw_enum_ctl_put()
1152 oval = private->vol_sw_hw_switch[index]; in scarlett2_sw_hw_enum_ctl_put()
1153 val = !!ucontrol->value.integer.value[0]; in scarlett2_sw_hw_enum_ctl_put()
1158 private->vol_sw_hw_switch[index] = val; in scarlett2_sw_hw_enum_ctl_put()
1164 private->vol_ctls[index]->vd[0].access &= in scarlett2_sw_hw_enum_ctl_put()
1167 private->vol_ctls[index]->vd[0].access |= in scarlett2_sw_hw_enum_ctl_put()
1171 private->vol[index] = private->master_vol; in scarlett2_sw_hw_enum_ctl_put()
1176 index, private->master_vol - SCARLETT2_VOLUME_BIAS); in scarlett2_sw_hw_enum_ctl_put()
1181 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_INFO, in scarlett2_sw_hw_enum_ctl_put()
1182 &private->vol_ctls[index]->id); in scarlett2_sw_hw_enum_ctl_put()
1191 mutex_unlock(&private->data_mutex); in scarlett2_sw_hw_enum_ctl_put()
1203 /*** Line Level/Instrument Level Switch Controls ***/
1218 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_level_enum_ctl_get()
1219 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_level_enum_ctl_get()
1221 ucontrol->value.enumerated.item[0] = in scarlett2_level_enum_ctl_get()
1222 private->level_switch[elem->control]; in scarlett2_level_enum_ctl_get()
1229 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_level_enum_ctl_put()
1230 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_level_enum_ctl_put()
1231 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_level_enum_ctl_put()
1233 int index = elem->control; in scarlett2_level_enum_ctl_put()
1236 mutex_lock(&private->data_mutex); in scarlett2_level_enum_ctl_put()
1238 oval = private->level_switch[index]; in scarlett2_level_enum_ctl_put()
1239 val = !!ucontrol->value.integer.value[0]; in scarlett2_level_enum_ctl_put()
1244 private->level_switch[index] = val; in scarlett2_level_enum_ctl_put()
1253 mutex_unlock(&private->data_mutex); in scarlett2_level_enum_ctl_put()
1265 /*** Pad Switch Controls ***/
1270 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_pad_ctl_get()
1271 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_pad_ctl_get()
1273 ucontrol->value.enumerated.item[0] = in scarlett2_pad_ctl_get()
1274 private->pad_switch[elem->control]; in scarlett2_pad_ctl_get()
1281 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_pad_ctl_put()
1282 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_pad_ctl_put()
1283 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_pad_ctl_put()
1285 int index = elem->control; in scarlett2_pad_ctl_put()
1288 mutex_lock(&private->data_mutex); in scarlett2_pad_ctl_put()
1290 oval = private->pad_switch[index]; in scarlett2_pad_ctl_put()
1291 val = !!ucontrol->value.integer.value[0]; in scarlett2_pad_ctl_put()
1296 private->pad_switch[index] = val; in scarlett2_pad_ctl_put()
1305 mutex_unlock(&private->data_mutex); in scarlett2_pad_ctl_put()
1317 /*** Mute/Dim Controls ***/
1322 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_button_ctl_get()
1323 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_button_ctl_get()
1324 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_button_ctl_get()
1326 mutex_lock(&private->data_mutex); in scarlett2_button_ctl_get()
1327 if (private->vol_updated) in scarlett2_button_ctl_get()
1329 mutex_unlock(&private->data_mutex); in scarlett2_button_ctl_get()
1331 ucontrol->value.enumerated.item[0] = private->buttons[elem->control]; in scarlett2_button_ctl_get()
1338 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_button_ctl_put()
1339 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_button_ctl_put()
1340 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_button_ctl_put()
1342 int index = elem->control; in scarlett2_button_ctl_put()
1345 mutex_lock(&private->data_mutex); in scarlett2_button_ctl_put()
1347 oval = private->buttons[index]; in scarlett2_button_ctl_put()
1348 val = !!ucontrol->value.integer.value[0]; in scarlett2_button_ctl_put()
1353 private->buttons[index] = val; in scarlett2_button_ctl_put()
1362 mutex_unlock(&private->data_mutex); in scarlett2_button_ctl_put()
1374 /*** Create the analogue output controls ***/
1378 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_add_line_out_ctls()
1379 const struct scarlett2_device_info *info = private->info; in scarlett2_add_line_out_ctls()
1380 const struct scarlett2_ports *ports = info->ports; in scarlett2_add_line_out_ctls()
1387 if (info->line_out_hw_vol) { in scarlett2_add_line_out_ctls()
1391 0, 1, s, &private->master_vol_ctl); in scarlett2_add_line_out_ctls()
1396 /* Add volume controls */ in scarlett2_add_line_out_ctls()
1400 if (info->line_out_descrs[i]) in scarlett2_add_line_out_ctls()
1403 i + 1, info->line_out_descrs[i]); in scarlett2_add_line_out_ctls()
1410 i, 1, s, &private->vol_ctls[i]); in scarlett2_add_line_out_ctls()
1414 /* Make the fader read-only if the SW/HW switch is set to HW */ in scarlett2_add_line_out_ctls()
1415 if (private->vol_sw_hw_switch[i]) in scarlett2_add_line_out_ctls()
1416 private->vol_ctls[i]->vd[0].access &= in scarlett2_add_line_out_ctls()
1420 if (info->line_out_hw_vol) { in scarlett2_add_line_out_ctls()
1432 /* Add HW button controls */ in scarlett2_add_line_out_ctls()
1433 for (i = 0; i < private->info->button_count; i++) { in scarlett2_add_line_out_ctls()
1436 &private->button_ctls[i]); in scarlett2_add_line_out_ctls()
1444 /*** Create the analogue input controls ***/
1448 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_add_line_in_ctls()
1449 const struct scarlett2_device_info *info = private->info; in scarlett2_add_line_in_ctls()
1453 /* Add input level (line/inst) controls */ in scarlett2_add_line_in_ctls()
1454 for (i = 0; i < info->level_input_count; i++) { in scarlett2_add_line_in_ctls()
1462 /* Add input pad controls */ in scarlett2_add_line_in_ctls()
1463 for (i = 0; i < info->pad_input_count; i++) { in scarlett2_add_line_in_ctls()
1474 /*** Mixer Volume Controls ***/
1479 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mixer_ctl_info()
1481 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in scarlett2_mixer_ctl_info()
1482 uinfo->count = elem->channels; in scarlett2_mixer_ctl_info()
1483 uinfo->value.integer.min = 0; in scarlett2_mixer_ctl_info()
1484 uinfo->value.integer.max = SCARLETT2_MIXER_MAX_VALUE; in scarlett2_mixer_ctl_info()
1485 uinfo->value.integer.step = 1; in scarlett2_mixer_ctl_info()
1492 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mixer_ctl_get()
1493 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_mixer_ctl_get()
1495 ucontrol->value.integer.value[0] = private->mix[elem->control]; in scarlett2_mixer_ctl_get()
1502 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mixer_ctl_put()
1503 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_mixer_ctl_put()
1504 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_mixer_ctl_put()
1505 const struct scarlett2_device_info *info = private->info; in scarlett2_mixer_ctl_put()
1506 const struct scarlett2_ports *ports = info->ports; in scarlett2_mixer_ctl_put()
1509 mutex_lock(&private->data_mutex); in scarlett2_mixer_ctl_put()
1511 oval = private->mix[elem->control]; in scarlett2_mixer_ctl_put()
1512 val = ucontrol->value.integer.value[0]; in scarlett2_mixer_ctl_put()
1514 mix_num = elem->control / num_mixer_in; in scarlett2_mixer_ctl_put()
1519 private->mix[elem->control] = val; in scarlett2_mixer_ctl_put()
1525 mutex_unlock(&private->data_mutex); in scarlett2_mixer_ctl_put()
1549 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_add_mixer_ctls()
1550 const struct scarlett2_ports *ports = private->info->ports; in scarlett2_add_mixer_ctls()
1573 /*** Mux Source Selection Controls ***/
1578 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mux_src_enum_ctl_info()
1579 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_mux_src_enum_ctl_info()
1580 const struct scarlett2_ports *ports = private->info->ports; in scarlett2_mux_src_enum_ctl_info()
1581 unsigned int item = uinfo->value.enumerated.item; in scarlett2_mux_src_enum_ctl_info()
1582 int items = private->num_mux_srcs; in scarlett2_mux_src_enum_ctl_info()
1585 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in scarlett2_mux_src_enum_ctl_info()
1586 uinfo->count = elem->channels; in scarlett2_mux_src_enum_ctl_info()
1587 uinfo->value.enumerated.items = items; in scarlett2_mux_src_enum_ctl_info()
1590 item = uinfo->value.enumerated.item = items - 1; in scarlett2_mux_src_enum_ctl_info()
1596 sprintf(uinfo->value.enumerated.name, in scarlett2_mux_src_enum_ctl_info()
1601 item -= ports[port_type].num[SCARLETT2_PORT_IN]; in scarlett2_mux_src_enum_ctl_info()
1604 return -EINVAL; in scarlett2_mux_src_enum_ctl_info()
1610 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mux_src_enum_ctl_get()
1611 struct scarlett2_mixer_data *private = elem->head.mixer->private_data; in scarlett2_mux_src_enum_ctl_get()
1613 ucontrol->value.enumerated.item[0] = private->mux[elem->control]; in scarlett2_mux_src_enum_ctl_get()
1620 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_mux_src_enum_ctl_put()
1621 struct usb_mixer_interface *mixer = elem->head.mixer; in scarlett2_mux_src_enum_ctl_put()
1622 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_mux_src_enum_ctl_put()
1623 int index = elem->control; in scarlett2_mux_src_enum_ctl_put()
1626 mutex_lock(&private->data_mutex); in scarlett2_mux_src_enum_ctl_put()
1628 oval = private->mux[index]; in scarlett2_mux_src_enum_ctl_put()
1629 val = clamp(ucontrol->value.integer.value[0], in scarlett2_mux_src_enum_ctl_put()
1630 0L, private->num_mux_srcs - 1L); in scarlett2_mux_src_enum_ctl_put()
1635 private->mux[index] = val; in scarlett2_mux_src_enum_ctl_put()
1641 mutex_unlock(&private->data_mutex); in scarlett2_mux_src_enum_ctl_put()
1655 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_add_mux_enums()
1656 const struct scarlett2_ports *ports = private->info->ports; in scarlett2_add_mux_enums()
1669 snprintf(s, sizeof(s) - 5, descr, channel + 1); in scarlett2_add_mux_enums()
1683 /*** Meter Controls ***/
1688 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_meter_ctl_info()
1690 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in scarlett2_meter_ctl_info()
1691 uinfo->count = elem->channels; in scarlett2_meter_ctl_info()
1692 uinfo->value.integer.min = 0; in scarlett2_meter_ctl_info()
1693 uinfo->value.integer.max = 4095; in scarlett2_meter_ctl_info()
1694 uinfo->value.integer.step = 1; in scarlett2_meter_ctl_info()
1701 struct usb_mixer_elem_info *elem = kctl->private_data; in scarlett2_meter_ctl_get()
1705 err = scarlett2_usb_get_meter_levels(elem->head.mixer, meter_levels); in scarlett2_meter_ctl_get()
1709 for (i = 0; i < elem->channels; i++) in scarlett2_meter_ctl_get()
1710 ucontrol->value.integer.value[i] = meter_levels[i]; in scarlett2_meter_ctl_get()
1734 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_private_free()
1736 cancel_delayed_work_sync(&private->work); in scarlett2_private_free()
1738 mixer->private_data = NULL; in scarlett2_private_free()
1743 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_private_suspend()
1745 if (cancel_delayed_work_sync(&private->work)) in scarlett2_private_suspend()
1746 scarlett2_config_save(private->mixer); in scarlett2_private_suspend()
1766 static void scarlett2_init_routing(u8 *mux, in scarlett2_init_routing() argument
1776 -1 in scarlett2_init_routing()
1793 i++, output_count--) in scarlett2_init_routing()
1794 mux[output_num++] = input_num++; in scarlett2_init_routing()
1811 i++, input_count--) in scarlett2_init_routing()
1812 mux[output_num++] = input_num++; in scarlett2_init_routing()
1824 return -ENOMEM; in scarlett2_init_private()
1826 mutex_init(&private->usb_mutex); in scarlett2_init_private()
1827 mutex_init(&private->data_mutex); in scarlett2_init_private()
1828 INIT_DELAYED_WORK(&private->work, scarlett2_config_save_work); in scarlett2_init_private()
1829 private->info = info; in scarlett2_init_private()
1830 private->num_mux_srcs = scarlett2_count_mux_srcs(info->ports); in scarlett2_init_private()
1831 private->scarlett2_seq = 0; in scarlett2_init_private()
1832 private->mixer = mixer; in scarlett2_init_private()
1833 mixer->private_data = private; in scarlett2_init_private()
1834 mixer->private_free = scarlett2_private_free; in scarlett2_init_private()
1835 mixer->private_suspend = scarlett2_private_suspend; in scarlett2_init_private()
1838 scarlett2_init_routing(private->mux, info->ports); in scarlett2_init_private()
1844 /* Read line-in config and line-out volume settings on start */
1847 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_read_configs()
1848 const struct scarlett2_device_info *info = private->info; in scarlett2_read_configs()
1849 const struct scarlett2_ports *ports = info->ports; in scarlett2_read_configs()
1857 if (info->level_input_count) { in scarlett2_read_configs()
1861 info->level_input_count, in scarlett2_read_configs()
1865 for (i = 0; i < info->level_input_count; i++) in scarlett2_read_configs()
1866 private->level_switch[i] = level_switches[i]; in scarlett2_read_configs()
1869 if (info->pad_input_count) { in scarlett2_read_configs()
1873 info->pad_input_count, in scarlett2_read_configs()
1877 for (i = 0; i < info->pad_input_count; i++) in scarlett2_read_configs()
1878 private->pad_switch[i] = pad_switches[i]; in scarlett2_read_configs()
1885 private->master_vol = clamp( in scarlett2_read_configs()
1892 private->vol_sw_hw_switch[i] = in scarlett2_read_configs()
1893 info->line_out_hw_vol in scarlett2_read_configs()
1896 volume = private->vol_sw_hw_switch[i] in scarlett2_read_configs()
1901 private->vol[i] = volume; in scarlett2_read_configs()
1904 for (i = 0; i < info->button_count; i++) in scarlett2_read_configs()
1905 private->buttons[i] = !!volume_status.buttons[i]; in scarlett2_read_configs()
1914 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_mixer_interrupt_vol_change()
1915 const struct scarlett2_ports *ports = private->info->ports; in scarlett2_mixer_interrupt_vol_change()
1920 private->vol_updated = 1; in scarlett2_mixer_interrupt_vol_change()
1922 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in scarlett2_mixer_interrupt_vol_change()
1923 &private->master_vol_ctl->id); in scarlett2_mixer_interrupt_vol_change()
1926 if (!private->vol_sw_hw_switch[i]) in scarlett2_mixer_interrupt_vol_change()
1928 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in scarlett2_mixer_interrupt_vol_change()
1929 &private->vol_ctls[i]->id); in scarlett2_mixer_interrupt_vol_change()
1937 struct scarlett2_mixer_data *private = mixer->private_data; in scarlett2_mixer_interrupt_button_change()
1940 private->vol_updated = 1; in scarlett2_mixer_interrupt_button_change()
1942 for (i = 0; i < private->info->button_count; i++) in scarlett2_mixer_interrupt_button_change()
1943 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in scarlett2_mixer_interrupt_button_change()
1944 &private->button_ctls[i]->id); in scarlett2_mixer_interrupt_button_change()
1950 struct usb_mixer_interface *mixer = urb->context; in scarlett2_mixer_interrupt()
1951 int len = urb->actual_length; in scarlett2_mixer_interrupt()
1952 int ustatus = urb->status; in scarlett2_mixer_interrupt()
1959 data = le32_to_cpu(*(__le32 *)urb->transfer_buffer); in scarlett2_mixer_interrupt()
1965 usb_audio_err(mixer->chip, in scarlett2_mixer_interrupt()
1970 if (ustatus != -ENOENT && in scarlett2_mixer_interrupt()
1971 ustatus != -ECONNRESET && in scarlett2_mixer_interrupt()
1972 ustatus != -ESHUTDOWN) { in scarlett2_mixer_interrupt()
1973 urb->dev = mixer->chip->dev; in scarlett2_mixer_interrupt()
1980 struct usb_device *dev = mixer->chip->dev; in scarlett2_mixer_status_create()
1985 if (mixer->urb) { in scarlett2_mixer_status_create()
1986 usb_audio_err(mixer->chip, in scarlett2_mixer_status_create()
1992 return -EINVAL; in scarlett2_mixer_status_create()
1994 mixer->urb = usb_alloc_urb(0, GFP_KERNEL); in scarlett2_mixer_status_create()
1995 if (!mixer->urb) in scarlett2_mixer_status_create()
1996 return -ENOMEM; in scarlett2_mixer_status_create()
2000 return -ENOMEM; in scarlett2_mixer_status_create()
2002 usb_fill_int_urb(mixer->urb, dev, pipe, in scarlett2_mixer_status_create()
2007 return usb_submit_urb(mixer->urb, GFP_KERNEL); in scarlett2_mixer_status_create()
2020 /* Read volume levels and controls from the interface */ in snd_scarlett_gen2_controls_create()
2025 /* Create the analogue output controls */ in snd_scarlett_gen2_controls_create()
2030 /* Create the analogue input controls */ in snd_scarlett_gen2_controls_create()
2035 /* Create the input, output, and mixer mux input selections */ in snd_scarlett_gen2_controls_create()
2040 /* Create the matrix mixer controls */ in snd_scarlett_gen2_controls_create()
2045 /* Create the level meter controls */ in snd_scarlett_gen2_controls_create()
2051 if (info->button_count) { in snd_scarlett_gen2_controls_create()
2062 struct snd_usb_audio *chip = mixer->chip; in snd_scarlett_gen2_init()
2067 if (!mixer->protocol) in snd_scarlett_gen2_init()
2070 switch (chip->usb_id) { in snd_scarlett_gen2_init()
2081 return -EINVAL; in snd_scarlett_gen2_init()
2084 if (!(chip->setup & SCARLETT2_ENABLE)) { in snd_scarlett_gen2_init()
2090 USB_ID_VENDOR(chip->usb_id), in snd_scarlett_gen2_init()
2091 USB_ID_PRODUCT(chip->usb_id)); in snd_scarlett_gen2_init()
2097 USB_ID_PRODUCT(chip->usb_id)); in snd_scarlett_gen2_init()
2101 usb_audio_err(mixer->chip, in snd_scarlett_gen2_init()