1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __USBMIXER_H 3 #define __USBMIXER_H 4 5 #include <sound/info.h> 6 7 struct media_mixer_ctl; 8 9 struct usbmix_connector_map { 10 u8 id; 11 u8 delegated_id; 12 u8 control; 13 u8 channel; 14 }; 15 16 struct usb_mixer_interface { 17 struct snd_usb_audio *chip; 18 struct usb_host_interface *hostif; 19 struct list_head list; 20 unsigned int ignore_ctl_error; 21 /* UAC2 status interrupt endpoint; owned by mixer.c */ 22 struct urb *urb; 23 /* array[MAX_ID_ELEMS], indexed by unit id */ 24 struct usb_mixer_elem_list **id_elems; 25 26 /* the usb audio specification version this interface complies to */ 27 int protocol; 28 29 /* optional connector delegation map */ 30 const struct usbmix_connector_map *connector_map; 31 32 /* Sound Blaster remote control stuff */ 33 const struct rc_config *rc_cfg; 34 u32 rc_code; 35 wait_queue_head_t rc_waitq; 36 struct urb *rc_urb; 37 struct usb_ctrlrequest *rc_setup_packet; 38 u8 rc_buffer[6]; 39 struct media_mixer_ctl *media_mixer_ctl; 40 41 bool disconnected; 42 43 void *private_data; 44 void (*private_free)(struct usb_mixer_interface *mixer); 45 void (*private_suspend)(struct usb_mixer_interface *mixer); 46 int (*private_resume)(struct usb_mixer_interface *mixer); 47 }; 48 49 #define MAX_CHANNELS 64 /* max logical channels */ 50 51 enum { 52 USB_MIXER_BOOLEAN, 53 USB_MIXER_INV_BOOLEAN, 54 USB_MIXER_S8, 55 USB_MIXER_U8, 56 USB_MIXER_S16, 57 USB_MIXER_U16, 58 USB_MIXER_S32, 59 USB_MIXER_U32, 60 USB_MIXER_BESPOKEN, /* non-standard type */ 61 }; 62 63 typedef void (*usb_mixer_elem_dump_func_t)(struct snd_info_buffer *buffer, 64 struct usb_mixer_elem_list *list); 65 typedef int (*usb_mixer_elem_resume_func_t)(struct usb_mixer_elem_list *elem); 66 67 struct usb_mixer_elem_list { 68 struct usb_mixer_interface *mixer; 69 struct usb_mixer_elem_list *next_id_elem; /* list of controls with same id */ 70 struct snd_kcontrol *kctl; 71 unsigned int id; 72 bool is_std_info; 73 usb_mixer_elem_dump_func_t dump; 74 usb_mixer_elem_resume_func_t resume; 75 }; 76 77 /* iterate over mixer element list of the given unit id */ 78 #define for_each_mixer_elem(list, mixer, id) \ 79 for ((list) = (mixer)->id_elems[id]; (list); (list) = (list)->next_id_elem) 80 #define mixer_elem_list_to_info(list) \ 81 container_of(list, struct usb_mixer_elem_info, head) 82 83 struct usb_mixer_elem_info { 84 struct usb_mixer_elem_list head; 85 unsigned int control; /* CS or ICN (high byte) */ 86 u64 cmask; /* channel mask bitmap: 0 = master */ 87 unsigned int idx_off; /* Control index offset */ 88 unsigned int ch_readonly; 89 unsigned int master_readonly; 90 int channels; 91 int val_type; 92 int min, max, res; 93 int max_exposed; /* control API exposes the value in 0..max_exposed */ 94 int dBmin, dBmax; 95 int cached; 96 int cache_val[MAX_CHANNELS]; 97 u8 initialized; 98 u8 min_mute; 99 u8 get_cur_broken; 100 void *private_data; 101 }; 102 103 int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif); 104 void snd_usb_mixer_disconnect(struct usb_mixer_interface *mixer); 105 106 void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid); 107 108 int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, 109 int request, int validx, int value_set); 110 111 int snd_usb_mixer_add_list(struct usb_mixer_elem_list *list, 112 struct snd_kcontrol *kctl, 113 bool is_std_info); 114 115 #define snd_usb_mixer_add_control(list, kctl) \ 116 snd_usb_mixer_add_list(list, kctl, true) 117 118 void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list, 119 struct usb_mixer_interface *mixer, 120 int unitid); 121 122 int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag, 123 unsigned int size, unsigned int __user *_tlv); 124 125 int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer); 126 int snd_usb_mixer_resume(struct usb_mixer_interface *mixer); 127 128 int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel, 129 int index, int value); 130 131 int snd_usb_get_cur_mix_value(struct usb_mixer_elem_info *cval, 132 int channel, int index, int *value); 133 134 extern void snd_usb_mixer_elem_free(struct snd_kcontrol *kctl); 135 136 extern const struct snd_kcontrol_new *snd_usb_feature_unit_ctl; 137 138 #endif /* __USBMIXER_H */ 139