Lines Matching refs:scontrol
15 static int sof_ipc4_set_get_kcontrol_data(struct snd_sof_control *scontrol, in sof_ipc4_set_get_kcontrol_data() argument
18 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_set_get_kcontrol_data()
19 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_set_get_kcontrol_data()
29 if (swidget->comp_id == scontrol->comp_id) { in sof_ipc4_set_get_kcontrol_data()
36 dev_err(scomp->dev, "Failed to find widget for kcontrol %s\n", scontrol->name); in sof_ipc4_set_get_kcontrol_data()
62 if (!scontrol->old_ipc_control_data) in sof_ipc4_set_get_kcontrol_data()
68 memcpy(scontrol->ipc_control_data, scontrol->old_ipc_control_data, in sof_ipc4_set_get_kcontrol_data()
69 scontrol->max_size); in sof_ipc4_set_get_kcontrol_data()
70 kfree(scontrol->old_ipc_control_data); in sof_ipc4_set_get_kcontrol_data()
71 scontrol->old_ipc_control_data = NULL; in sof_ipc4_set_get_kcontrol_data()
87 struct snd_sof_control *scontrol, bool lock) in sof_ipc4_set_volume_data() argument
89 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_set_volume_data()
99 for (i = 1; i < scontrol->num_channels; i++) { in sof_ipc4_set_volume_data()
110 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_set_volume_data()
127 ret = sof_ipc4_set_get_kcontrol_data(scontrol, true, lock); in sof_ipc4_set_volume_data()
132 scontrol->name); in sof_ipc4_set_volume_data()
143 static bool sof_ipc4_volume_put(struct snd_sof_control *scontrol, in sof_ipc4_volume_put() argument
146 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_volume_put()
147 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_volume_put()
149 unsigned int channels = scontrol->num_channels; in sof_ipc4_volume_put()
159 scontrol->volume_table, scontrol->max + 1); in sof_ipc4_volume_put()
171 if (swidget->comp_id == scontrol->comp_id) { in sof_ipc4_volume_put()
178 dev_err(scomp->dev, "Failed to find widget for kcontrol %s\n", scontrol->name); in sof_ipc4_volume_put()
182 ret = sof_ipc4_set_volume_data(sdev, swidget, scontrol, true); in sof_ipc4_volume_put()
189 static int sof_ipc4_volume_get(struct snd_sof_control *scontrol, in sof_ipc4_volume_get() argument
192 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_volume_get()
193 unsigned int channels = scontrol->num_channels; in sof_ipc4_volume_get()
198 scontrol->volume_table, in sof_ipc4_volume_get()
199 scontrol->max + 1); in sof_ipc4_volume_get()
207 struct snd_sof_control *scontrol, bool lock) in sof_ipc4_set_generic_control_data() argument
209 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_set_generic_control_data()
216 data_size = struct_size(data, chanv, scontrol->num_channels); in sof_ipc4_set_generic_control_data()
222 data->num_elems = scontrol->num_channels; in sof_ipc4_set_generic_control_data()
223 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_set_generic_control_data()
231 ret = sof_ipc4_set_get_kcontrol_data(scontrol, true, lock); in sof_ipc4_set_generic_control_data()
236 scontrol->name); in sof_ipc4_set_generic_control_data()
243 static void sof_ipc4_refresh_generic_control(struct snd_sof_control *scontrol) in sof_ipc4_refresh_generic_control() argument
245 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_refresh_generic_control()
246 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_refresh_generic_control()
253 if (!scontrol->comp_data_dirty) in sof_ipc4_refresh_generic_control()
259 data_size = struct_size(data, chanv, scontrol->num_channels); in sof_ipc4_refresh_generic_control()
265 data->num_elems = scontrol->num_channels; in sof_ipc4_refresh_generic_control()
269 scontrol->comp_data_dirty = false; in sof_ipc4_refresh_generic_control()
270 ret = sof_ipc4_set_get_kcontrol_data(scontrol, false, true); in sof_ipc4_refresh_generic_control()
274 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_refresh_generic_control()
280 scontrol->name); in sof_ipc4_refresh_generic_control()
281 scontrol->comp_data_dirty = true; in sof_ipc4_refresh_generic_control()
287 static bool sof_ipc4_switch_put(struct snd_sof_control *scontrol, in sof_ipc4_switch_put() argument
290 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_switch_put()
291 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_switch_put()
301 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_switch_put()
313 if (swidget->comp_id == scontrol->comp_id) { in sof_ipc4_switch_put()
320 dev_err(scomp->dev, "Failed to find widget for kcontrol %s\n", scontrol->name); in sof_ipc4_switch_put()
324 ret = sof_ipc4_set_generic_control_data(sdev, swidget, scontrol, true); in sof_ipc4_switch_put()
331 static int sof_ipc4_switch_get(struct snd_sof_control *scontrol, in sof_ipc4_switch_get() argument
334 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_switch_get()
337 sof_ipc4_refresh_generic_control(scontrol); in sof_ipc4_switch_get()
340 for (i = 0; i < scontrol->num_channels; i++) in sof_ipc4_switch_get()
346 static bool sof_ipc4_enum_put(struct snd_sof_control *scontrol, in sof_ipc4_enum_put() argument
349 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_enum_put()
350 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_enum_put()
360 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_enum_put()
372 if (swidget->comp_id == scontrol->comp_id) { in sof_ipc4_enum_put()
379 dev_err(scomp->dev, "Failed to find widget for kcontrol %s\n", scontrol->name); in sof_ipc4_enum_put()
383 ret = sof_ipc4_set_generic_control_data(sdev, swidget, scontrol, true); in sof_ipc4_enum_put()
390 static int sof_ipc4_enum_get(struct snd_sof_control *scontrol, in sof_ipc4_enum_get() argument
393 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_enum_get()
396 sof_ipc4_refresh_generic_control(scontrol); in sof_ipc4_enum_get()
399 for (i = 0; i < scontrol->num_channels; i++) in sof_ipc4_enum_get()
406 struct snd_sof_control *scontrol, in sof_ipc4_set_get_bytes_data() argument
409 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_set_get_bytes_data()
423 ret = sof_ipc4_set_get_kcontrol_data(scontrol, set, lock); in sof_ipc4_set_get_bytes_data()
427 scontrol->name); in sof_ipc4_set_get_bytes_data()
435 static int sof_ipc4_bytes_put(struct snd_sof_control *scontrol, in sof_ipc4_bytes_put() argument
438 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_bytes_put()
439 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_bytes_put()
444 if (scontrol->max_size > sizeof(ucontrol->value.bytes.data)) { in sof_ipc4_bytes_put()
447 scontrol->max_size); in sof_ipc4_bytes_put()
452 if (data->size > scontrol->max_size - sizeof(*data)) { in sof_ipc4_bytes_put()
455 data->size, scontrol->max_size - sizeof(*data)); in sof_ipc4_bytes_put()
464 sof_ipc4_set_get_bytes_data(sdev, scontrol, true, true); in sof_ipc4_bytes_put()
469 static int sof_ipc4_bytes_get(struct snd_sof_control *scontrol, in sof_ipc4_bytes_get() argument
472 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_bytes_get()
473 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_bytes_get()
477 if (scontrol->max_size > sizeof(ucontrol->value.bytes.data)) { in sof_ipc4_bytes_get()
479 scontrol->max_size); in sof_ipc4_bytes_get()
483 if (data->size > scontrol->max_size - sizeof(*data)) { in sof_ipc4_bytes_get()
486 data->size, scontrol->max_size - sizeof(*data)); in sof_ipc4_bytes_get()
498 static int sof_ipc4_bytes_ext_put(struct snd_sof_control *scontrol, in sof_ipc4_bytes_ext_put() argument
503 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_bytes_ext_put()
504 struct snd_soc_component *scomp = scontrol->scomp; in sof_ipc4_bytes_ext_put()
527 if (header.length > scontrol->max_size) { in sof_ipc4_bytes_ext_put()
530 header.length, scontrol->max_size); in sof_ipc4_bytes_ext_put()
552 if (abi_hdr.size > scontrol->max_size - sizeof(abi_hdr)) { in sof_ipc4_bytes_ext_put()
555 abi_hdr.size, scontrol->max_size - sizeof(abi_hdr)); in sof_ipc4_bytes_ext_put()
559 if (!scontrol->old_ipc_control_data) { in sof_ipc4_bytes_ext_put()
561 scontrol->old_ipc_control_data = kmemdup(scontrol->ipc_control_data, in sof_ipc4_bytes_ext_put()
562 scontrol->max_size, GFP_KERNEL); in sof_ipc4_bytes_ext_put()
563 if (!scontrol->old_ipc_control_data) in sof_ipc4_bytes_ext_put()
569 memcpy(scontrol->ipc_control_data, scontrol->old_ipc_control_data, in sof_ipc4_bytes_ext_put()
570 scontrol->max_size); in sof_ipc4_bytes_ext_put()
571 kfree(scontrol->old_ipc_control_data); in sof_ipc4_bytes_ext_put()
572 scontrol->old_ipc_control_data = NULL; in sof_ipc4_bytes_ext_put()
576 return sof_ipc4_set_get_bytes_data(sdev, scontrol, true, true); in sof_ipc4_bytes_ext_put()
579 static int _sof_ipc4_bytes_ext_get(struct snd_sof_control *scontrol, in _sof_ipc4_bytes_ext_get() argument
584 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in _sof_ipc4_bytes_ext_get()
585 struct snd_soc_component *scomp = scontrol->scomp; in _sof_ipc4_bytes_ext_get()
602 int ret = sof_ipc4_set_get_bytes_data(sdev, scontrol, false, true); in _sof_ipc4_bytes_ext_get()
611 if (data->size > scontrol->max_size - sizeof(*data)) { in _sof_ipc4_bytes_ext_get()
614 data->size, scontrol->max_size - sizeof(*data)); in _sof_ipc4_bytes_ext_get()
637 static int sof_ipc4_bytes_ext_get(struct snd_sof_control *scontrol, in sof_ipc4_bytes_ext_get() argument
641 return _sof_ipc4_bytes_ext_get(scontrol, binary_data, size, false); in sof_ipc4_bytes_ext_get()
644 static int sof_ipc4_bytes_ext_volatile_get(struct snd_sof_control *scontrol, in sof_ipc4_bytes_ext_volatile_get() argument
648 return _sof_ipc4_bytes_ext_get(scontrol, binary_data, size, true); in sof_ipc4_bytes_ext_volatile_get()
653 struct snd_sof_control *scontrol) in sof_ipc4_volsw_setup() argument
655 if (scontrol->max == 1) in sof_ipc4_volsw_setup()
656 return sof_ipc4_set_generic_control_data(sdev, swidget, scontrol, false); in sof_ipc4_volsw_setup()
658 return sof_ipc4_set_volume_data(sdev, swidget, scontrol, false); in sof_ipc4_volsw_setup()
671 struct snd_sof_control *scontrol; in sof_ipc4_control_update() local
713 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in sof_ipc4_control_update()
714 if (scontrol->comp_id == swidget->comp_id) { in sof_ipc4_control_update()
717 cdata = scontrol->ipc_control_data; in sof_ipc4_control_update()
747 if (channel >= scontrol->num_channels) { in sof_ipc4_control_update()
750 scontrol->name, i); in sof_ipc4_control_update()
756 scontrol->comp_data_dirty = true; in sof_ipc4_control_update()
767 scontrol->comp_data_dirty = true; in sof_ipc4_control_update()
794 struct snd_sof_control *scontrol; in sof_ipc4_widget_kcontrol_setup() local
797 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in sof_ipc4_widget_kcontrol_setup()
798 if (scontrol->comp_id == swidget->comp_id) { in sof_ipc4_widget_kcontrol_setup()
799 switch (scontrol->info_type) { in sof_ipc4_widget_kcontrol_setup()
803 ret = sof_ipc4_volsw_setup(sdev, swidget, scontrol); in sof_ipc4_widget_kcontrol_setup()
806 ret = sof_ipc4_set_get_bytes_data(sdev, scontrol, in sof_ipc4_widget_kcontrol_setup()
812 scontrol, false); in sof_ipc4_widget_kcontrol_setup()
821 scontrol->comp_id, swidget->widget->name); in sof_ipc4_widget_kcontrol_setup()
831 sof_ipc4_set_up_volume_table(struct snd_sof_control *scontrol, int tlv[SOF_TLV_ITEMS], int size) in sof_ipc4_set_up_volume_table() argument
836 scontrol->volume_table = kcalloc(size, sizeof(u32), GFP_KERNEL); in sof_ipc4_set_up_volume_table()
837 if (!scontrol->volume_table) in sof_ipc4_set_up_volume_table()
845 scontrol->volume_table[i] = q31val > SOF_IPC4_VOL_ZERO_DB ? in sof_ipc4_set_up_volume_table()