Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/sdca/sdca_asoc.c
51347 views
1
// SPDX-License-Identifier: GPL-2.0
2
// Copyright (C) 2025 Cirrus Logic, Inc. and
3
// Cirrus Logic International Semiconductor Ltd.
4
5
/*
6
* The MIPI SDCA specification is available for public downloads at
7
* https://www.mipi.org/mipi-sdca-v1-0-download
8
*/
9
10
#include <linux/bits.h>
11
#include <linux/bitmap.h>
12
#include <linux/build_bug.h>
13
#include <linux/delay.h>
14
#include <linux/dev_printk.h>
15
#include <linux/device.h>
16
#include <linux/minmax.h>
17
#include <linux/module.h>
18
#include <linux/overflow.h>
19
#include <linux/pm_runtime.h>
20
#include <linux/regmap.h>
21
#include <linux/soundwire/sdw_registers.h>
22
#include <linux/string_helpers.h>
23
#include <linux/types.h>
24
#include <sound/control.h>
25
#include <sound/pcm.h>
26
#include <sound/pcm_params.h>
27
#include <sound/sdca.h>
28
#include <sound/sdca_asoc.h>
29
#include <sound/sdca_function.h>
30
#include <sound/soc.h>
31
#include <sound/soc-component.h>
32
#include <sound/soc-dai.h>
33
#include <sound/soc-dapm.h>
34
#include <sound/tlv.h>
35
36
static bool exported_control(struct sdca_entity *entity, struct sdca_control *control)
37
{
38
switch (SDCA_CTL_TYPE(entity->type, control->sel)) {
39
case SDCA_CTL_TYPE_S(GE, DETECTED_MODE):
40
return true;
41
default:
42
break;
43
}
44
45
return control->layers & (SDCA_ACCESS_LAYER_USER |
46
SDCA_ACCESS_LAYER_APPLICATION);
47
}
48
49
static bool readonly_control(struct sdca_control *control)
50
{
51
return control->has_fixed || control->mode == SDCA_ACCESS_MODE_RO;
52
}
53
54
/**
55
* sdca_asoc_count_component - count the various component parts
56
* @dev: Pointer to the device against which allocations will be done.
57
* @function: Pointer to the Function information.
58
* @num_widgets: Output integer pointer, will be filled with the
59
* required number of DAPM widgets for the Function.
60
* @num_routes: Output integer pointer, will be filled with the
61
* required number of DAPM routes for the Function.
62
* @num_controls: Output integer pointer, will be filled with the
63
* required number of ALSA controls for the Function.
64
* @num_dais: Output integer pointer, will be filled with the
65
* required number of ASoC DAIs for the Function.
66
*
67
* This function counts various things within the SDCA Function such
68
* that the calling driver can allocate appropriate space before
69
* calling the appropriate population functions.
70
*
71
* Return: Returns zero on success, and a negative error code on failure.
72
*/
73
int sdca_asoc_count_component(struct device *dev, struct sdca_function_data *function,
74
int *num_widgets, int *num_routes, int *num_controls,
75
int *num_dais)
76
{
77
int i, j;
78
79
*num_widgets = function->num_entities - 1;
80
*num_routes = 0;
81
*num_controls = 0;
82
*num_dais = 0;
83
84
for (i = 0; i < function->num_entities - 1; i++) {
85
struct sdca_entity *entity = &function->entities[i];
86
87
/* Add supply/DAI widget connections */
88
switch (entity->type) {
89
case SDCA_ENTITY_TYPE_IT:
90
case SDCA_ENTITY_TYPE_OT:
91
*num_routes += !!entity->iot.clock;
92
*num_routes += !!entity->iot.is_dataport;
93
*num_controls += !entity->iot.is_dataport;
94
*num_dais += !!entity->iot.is_dataport;
95
break;
96
case SDCA_ENTITY_TYPE_PDE:
97
*num_routes += entity->pde.num_managed;
98
break;
99
default:
100
break;
101
}
102
103
if (entity->group)
104
(*num_routes)++;
105
106
/* Add primary entity connections from DisCo */
107
*num_routes += entity->num_sources;
108
109
for (j = 0; j < entity->num_controls; j++) {
110
if (exported_control(entity, &entity->controls[j]))
111
(*num_controls)++;
112
}
113
}
114
115
return 0;
116
}
117
EXPORT_SYMBOL_NS(sdca_asoc_count_component, "SND_SOC_SDCA");
118
119
static int ge_put_enum_double(struct snd_kcontrol *kcontrol,
120
struct snd_ctl_elem_value *ucontrol)
121
{
122
struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
123
struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
124
struct device *dev = component->dev;
125
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
126
unsigned int *item = ucontrol->value.enumerated.item;
127
unsigned int reg = e->reg;
128
int ret;
129
130
reg &= ~SDW_SDCA_CTL_CSEL(0x3F);
131
reg |= SDW_SDCA_CTL_CSEL(SDCA_CTL_GE_DETECTED_MODE);
132
133
ret = pm_runtime_resume_and_get(dev);
134
if (ret < 0) {
135
dev_err(dev, "failed to resume writing %s: %d\n",
136
kcontrol->id.name, ret);
137
return ret;
138
}
139
140
ret = snd_soc_component_read(component, reg);
141
pm_runtime_put(dev);
142
if (ret < 0)
143
return ret;
144
else if (ret <= SDCA_DETECTED_MODE_DETECTION_IN_PROGRESS)
145
return -EBUSY;
146
147
ret = snd_soc_enum_item_to_val(e, item[0]);
148
if (ret <= SDCA_DETECTED_MODE_DETECTION_IN_PROGRESS)
149
return -EINVAL;
150
151
return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
152
}
153
154
static int entity_early_parse_ge(struct device *dev,
155
struct sdca_function_data *function,
156
struct sdca_entity *entity)
157
{
158
struct sdca_control_range *range;
159
struct sdca_control *control;
160
struct snd_kcontrol_new *kctl;
161
struct soc_enum *soc_enum;
162
const char *control_name;
163
unsigned int *values;
164
const char **texts;
165
int i;
166
167
control = sdca_selector_find_control(dev, entity, SDCA_CTL_GE_SELECTED_MODE);
168
if (!control)
169
return -EINVAL;
170
171
if (control->layers != SDCA_ACCESS_LAYER_CLASS)
172
dev_warn(dev, "%s: unexpected access layer: %x\n",
173
entity->label, control->layers);
174
175
range = sdca_control_find_range(dev, entity, control, SDCA_SELECTED_MODE_NCOLS, 0);
176
if (!range)
177
return -EINVAL;
178
179
control_name = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
180
entity->label, control->label);
181
if (!control_name)
182
return -ENOMEM;
183
184
kctl = devm_kzalloc(dev, sizeof(*kctl), GFP_KERNEL);
185
if (!kctl)
186
return -ENOMEM;
187
188
soc_enum = devm_kzalloc(dev, sizeof(*soc_enum), GFP_KERNEL);
189
if (!soc_enum)
190
return -ENOMEM;
191
192
texts = devm_kcalloc(dev, range->rows + 3, sizeof(*texts), GFP_KERNEL);
193
if (!texts)
194
return -ENOMEM;
195
196
values = devm_kcalloc(dev, range->rows + 3, sizeof(*values), GFP_KERNEL);
197
if (!values)
198
return -ENOMEM;
199
200
texts[0] = "Jack Unplugged";
201
texts[1] = "Jack Unknown";
202
texts[2] = "Detection in Progress";
203
values[0] = SDCA_DETECTED_MODE_JACK_UNPLUGGED;
204
values[1] = SDCA_DETECTED_MODE_JACK_UNKNOWN;
205
values[2] = SDCA_DETECTED_MODE_DETECTION_IN_PROGRESS;
206
for (i = 0; i < range->rows; i++) {
207
enum sdca_terminal_type type;
208
209
type = sdca_range(range, SDCA_SELECTED_MODE_TERM_TYPE, i);
210
211
values[i + 3] = sdca_range(range, SDCA_SELECTED_MODE_INDEX, i);
212
texts[i + 3] = sdca_find_terminal_name(type);
213
if (!texts[i + 3]) {
214
dev_err(dev, "%s: unrecognised terminal type: %#x\n",
215
entity->label, type);
216
return -EINVAL;
217
}
218
}
219
220
soc_enum->reg = SDW_SDCA_CTL(function->desc->adr, entity->id, control->sel, 0);
221
soc_enum->items = range->rows + 3;
222
soc_enum->mask = roundup_pow_of_two(soc_enum->items) - 1;
223
soc_enum->texts = texts;
224
soc_enum->values = values;
225
226
kctl->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
227
kctl->name = control_name;
228
kctl->info = snd_soc_info_enum_double;
229
kctl->get = snd_soc_dapm_get_enum_double;
230
kctl->put = ge_put_enum_double;
231
kctl->private_value = (unsigned long)soc_enum;
232
233
entity->ge.kctl = kctl;
234
235
return 0;
236
}
237
238
static void add_route(struct snd_soc_dapm_route **route, const char *sink,
239
const char *control, const char *source)
240
{
241
(*route)->sink = sink;
242
(*route)->control = control;
243
(*route)->source = source;
244
(*route)++;
245
}
246
247
static int entity_parse_simple(struct device *dev,
248
struct sdca_function_data *function,
249
struct sdca_entity *entity,
250
struct snd_soc_dapm_widget **widget,
251
struct snd_soc_dapm_route **route,
252
enum snd_soc_dapm_type id)
253
{
254
int i;
255
256
(*widget)->id = id;
257
(*widget)++;
258
259
for (i = 0; i < entity->num_sources; i++)
260
add_route(route, entity->label, NULL, entity->sources[i]->label);
261
262
return 0;
263
}
264
265
static int entity_parse_it(struct device *dev,
266
struct sdca_function_data *function,
267
struct sdca_entity *entity,
268
struct snd_soc_dapm_widget **widget,
269
struct snd_soc_dapm_route **route)
270
{
271
int i;
272
273
if (entity->iot.is_dataport) {
274
const char *aif_name = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
275
entity->label, "Playback");
276
if (!aif_name)
277
return -ENOMEM;
278
279
(*widget)->id = snd_soc_dapm_aif_in;
280
281
add_route(route, entity->label, NULL, aif_name);
282
} else {
283
(*widget)->id = snd_soc_dapm_mic;
284
}
285
286
if (entity->iot.clock)
287
add_route(route, entity->label, NULL, entity->iot.clock->label);
288
289
for (i = 0; i < entity->num_sources; i++)
290
add_route(route, entity->label, NULL, entity->sources[i]->label);
291
292
(*widget)++;
293
294
return 0;
295
}
296
297
static int entity_parse_ot(struct device *dev,
298
struct sdca_function_data *function,
299
struct sdca_entity *entity,
300
struct snd_soc_dapm_widget **widget,
301
struct snd_soc_dapm_route **route)
302
{
303
int i;
304
305
if (entity->iot.is_dataport) {
306
const char *aif_name = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
307
entity->label, "Capture");
308
if (!aif_name)
309
return -ENOMEM;
310
311
(*widget)->id = snd_soc_dapm_aif_out;
312
313
add_route(route, aif_name, NULL, entity->label);
314
} else {
315
(*widget)->id = snd_soc_dapm_spk;
316
}
317
318
if (entity->iot.clock)
319
add_route(route, entity->label, NULL, entity->iot.clock->label);
320
321
for (i = 0; i < entity->num_sources; i++)
322
add_route(route, entity->label, NULL, entity->sources[i]->label);
323
324
(*widget)++;
325
326
return 0;
327
}
328
329
static int entity_pde_event(struct snd_soc_dapm_widget *widget,
330
struct snd_kcontrol *kctl, int event)
331
{
332
struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
333
struct sdca_entity *entity = widget->priv;
334
static const int polls = 100;
335
unsigned int reg, val;
336
int from, to, i;
337
int poll_us;
338
int ret;
339
340
if (!component)
341
return -EIO;
342
343
switch (event) {
344
case SND_SOC_DAPM_POST_PMD:
345
from = widget->on_val;
346
to = widget->off_val;
347
break;
348
case SND_SOC_DAPM_POST_PMU:
349
from = widget->off_val;
350
to = widget->on_val;
351
break;
352
default:
353
return 0;
354
}
355
356
for (i = 0; i < entity->pde.num_max_delay; i++) {
357
struct sdca_pde_delay *delay = &entity->pde.max_delay[i];
358
359
if (delay->from_ps == from && delay->to_ps == to) {
360
poll_us = delay->us / polls;
361
break;
362
}
363
}
364
365
reg = SDW_SDCA_CTL(SDW_SDCA_CTL_FUNC(widget->reg),
366
SDW_SDCA_CTL_ENT(widget->reg),
367
SDCA_CTL_PDE_ACTUAL_PS, 0);
368
369
for (i = 0; i < polls; i++) {
370
if (i)
371
fsleep(poll_us);
372
373
ret = regmap_read(component->regmap, reg, &val);
374
if (ret)
375
return ret;
376
else if (val == to)
377
return 0;
378
}
379
380
dev_err(component->dev, "%s: power transition failed: %x\n",
381
entity->label, val);
382
return -ETIMEDOUT;
383
}
384
385
static int entity_parse_pde(struct device *dev,
386
struct sdca_function_data *function,
387
struct sdca_entity *entity,
388
struct snd_soc_dapm_widget **widget,
389
struct snd_soc_dapm_route **route)
390
{
391
unsigned int target = (1 << SDCA_PDE_PS0) | (1 << SDCA_PDE_PS3);
392
struct sdca_control_range *range;
393
struct sdca_control *control;
394
unsigned int mask = 0;
395
int i;
396
397
control = sdca_selector_find_control(dev, entity, SDCA_CTL_PDE_REQUESTED_PS);
398
if (!control)
399
return -EINVAL;
400
401
/* Power should only be controlled by the driver */
402
if (control->layers != SDCA_ACCESS_LAYER_CLASS)
403
dev_warn(dev, "%s: unexpected access layer: %x\n",
404
entity->label, control->layers);
405
406
range = sdca_control_find_range(dev, entity, control, SDCA_REQUESTED_PS_NCOLS, 0);
407
if (!range)
408
return -EINVAL;
409
410
for (i = 0; i < range->rows; i++)
411
mask |= 1 << sdca_range(range, SDCA_REQUESTED_PS_STATE, i);
412
413
if ((mask & target) != target) {
414
dev_err(dev, "%s: power control missing states\n", entity->label);
415
return -EINVAL;
416
}
417
418
(*widget)->id = snd_soc_dapm_supply;
419
(*widget)->reg = SDW_SDCA_CTL(function->desc->adr, entity->id, control->sel, 0);
420
(*widget)->mask = GENMASK(control->nbits - 1, 0);
421
(*widget)->on_val = SDCA_PDE_PS0;
422
(*widget)->off_val = SDCA_PDE_PS3;
423
(*widget)->event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD;
424
(*widget)->event = entity_pde_event;
425
(*widget)->priv = entity;
426
(*widget)++;
427
428
for (i = 0; i < entity->pde.num_managed; i++)
429
add_route(route, entity->pde.managed[i]->label, NULL, entity->label);
430
431
for (i = 0; i < entity->num_sources; i++)
432
add_route(route, entity->label, NULL, entity->sources[i]->label);
433
434
return 0;
435
}
436
437
/* Device selector units are controlled through a group entity */
438
static int entity_parse_su_device(struct device *dev,
439
struct sdca_function_data *function,
440
struct sdca_entity *entity,
441
struct snd_soc_dapm_widget **widget,
442
struct snd_soc_dapm_route **route)
443
{
444
struct sdca_control_range *range;
445
int num_routes = 0;
446
int i, j;
447
448
if (!entity->group) {
449
dev_err(dev, "%s: device selector unit missing group\n", entity->label);
450
return -EINVAL;
451
}
452
453
range = sdca_selector_find_range(dev, entity->group, SDCA_CTL_GE_SELECTED_MODE,
454
SDCA_SELECTED_MODE_NCOLS, 0);
455
if (!range)
456
return -EINVAL;
457
458
(*widget)->id = snd_soc_dapm_mux;
459
(*widget)->kcontrol_news = entity->group->ge.kctl;
460
(*widget)->num_kcontrols = 1;
461
(*widget)++;
462
463
for (i = 0; i < entity->group->ge.num_modes; i++) {
464
struct sdca_ge_mode *mode = &entity->group->ge.modes[i];
465
466
for (j = 0; j < mode->num_controls; j++) {
467
struct sdca_ge_control *affected = &mode->controls[j];
468
int term;
469
470
if (affected->id != entity->id ||
471
affected->sel != SDCA_CTL_SU_SELECTOR ||
472
!affected->val)
473
continue;
474
475
if (affected->val - 1 >= entity->num_sources) {
476
dev_err(dev, "%s: bad control value: %#x\n",
477
entity->label, affected->val);
478
return -EINVAL;
479
}
480
481
if (++num_routes > entity->num_sources) {
482
dev_err(dev, "%s: too many input routes\n", entity->label);
483
return -EINVAL;
484
}
485
486
term = sdca_range_search(range, SDCA_SELECTED_MODE_INDEX,
487
mode->val, SDCA_SELECTED_MODE_TERM_TYPE);
488
if (!term) {
489
dev_err(dev, "%s: mode not found: %#x\n",
490
entity->label, mode->val);
491
return -EINVAL;
492
}
493
494
add_route(route, entity->label, sdca_find_terminal_name(term),
495
entity->sources[affected->val - 1]->label);
496
}
497
}
498
499
return 0;
500
}
501
502
/* Class selector units will be exported as an ALSA control */
503
static int entity_parse_su_class(struct device *dev,
504
struct sdca_function_data *function,
505
struct sdca_entity *entity,
506
struct sdca_control *control,
507
struct snd_soc_dapm_widget **widget,
508
struct snd_soc_dapm_route **route)
509
{
510
struct snd_kcontrol_new *kctl;
511
struct soc_enum *soc_enum;
512
const char **texts;
513
int i;
514
515
kctl = devm_kzalloc(dev, sizeof(*kctl), GFP_KERNEL);
516
if (!kctl)
517
return -ENOMEM;
518
519
soc_enum = devm_kzalloc(dev, sizeof(*soc_enum), GFP_KERNEL);
520
if (!soc_enum)
521
return -ENOMEM;
522
523
texts = devm_kcalloc(dev, entity->num_sources + 1, sizeof(*texts), GFP_KERNEL);
524
if (!texts)
525
return -ENOMEM;
526
527
texts[0] = "No Signal";
528
for (i = 0; i < entity->num_sources; i++)
529
texts[i + 1] = entity->sources[i]->label;
530
531
soc_enum->reg = SDW_SDCA_CTL(function->desc->adr, entity->id, control->sel, 0);
532
soc_enum->items = entity->num_sources + 1;
533
soc_enum->mask = roundup_pow_of_two(soc_enum->items) - 1;
534
soc_enum->texts = texts;
535
536
kctl->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
537
kctl->name = "Route";
538
kctl->info = snd_soc_info_enum_double;
539
kctl->get = snd_soc_dapm_get_enum_double;
540
kctl->put = snd_soc_dapm_put_enum_double;
541
kctl->private_value = (unsigned long)soc_enum;
542
543
(*widget)->id = snd_soc_dapm_mux;
544
(*widget)->kcontrol_news = kctl;
545
(*widget)->num_kcontrols = 1;
546
(*widget)++;
547
548
for (i = 0; i < entity->num_sources; i++)
549
add_route(route, entity->label, texts[i + 1], entity->sources[i]->label);
550
551
return 0;
552
}
553
554
static int entity_parse_su(struct device *dev,
555
struct sdca_function_data *function,
556
struct sdca_entity *entity,
557
struct snd_soc_dapm_widget **widget,
558
struct snd_soc_dapm_route **route)
559
{
560
struct sdca_control *control;
561
562
if (!entity->num_sources) {
563
dev_err(dev, "%s: selector with no inputs\n", entity->label);
564
return -EINVAL;
565
}
566
567
control = sdca_selector_find_control(dev, entity, SDCA_CTL_SU_SELECTOR);
568
if (!control)
569
return -EINVAL;
570
571
if (control->layers == SDCA_ACCESS_LAYER_DEVICE)
572
return entity_parse_su_device(dev, function, entity, widget, route);
573
574
if (control->layers != SDCA_ACCESS_LAYER_CLASS)
575
dev_warn(dev, "%s: unexpected access layer: %x\n",
576
entity->label, control->layers);
577
578
return entity_parse_su_class(dev, function, entity, control, widget, route);
579
}
580
581
static int entity_parse_mu(struct device *dev,
582
struct sdca_function_data *function,
583
struct sdca_entity *entity,
584
struct snd_soc_dapm_widget **widget,
585
struct snd_soc_dapm_route **route)
586
{
587
struct sdca_control *control;
588
struct snd_kcontrol_new *kctl;
589
int i;
590
591
if (!entity->num_sources) {
592
dev_err(dev, "%s: selector 1 or more inputs\n", entity->label);
593
return -EINVAL;
594
}
595
596
control = sdca_selector_find_control(dev, entity, SDCA_CTL_MU_MIXER);
597
if (!control)
598
return -EINVAL;
599
600
/* MU control should be through DAPM */
601
if (control->layers != SDCA_ACCESS_LAYER_CLASS)
602
dev_warn(dev, "%s: unexpected access layer: %x\n",
603
entity->label, control->layers);
604
605
kctl = devm_kcalloc(dev, entity->num_sources, sizeof(*kctl), GFP_KERNEL);
606
if (!kctl)
607
return -ENOMEM;
608
609
for (i = 0; i < entity->num_sources; i++) {
610
const char *control_name;
611
struct soc_mixer_control *mc;
612
613
control_name = devm_kasprintf(dev, GFP_KERNEL, "%s %d",
614
control->label, i + 1);
615
if (!control_name)
616
return -ENOMEM;
617
618
mc = devm_kzalloc(dev, sizeof(*mc), GFP_KERNEL);
619
if (!mc)
620
return -ENOMEM;
621
622
mc->reg = SND_SOC_NOPM;
623
mc->rreg = SND_SOC_NOPM;
624
mc->invert = 1; // Ensure default is connected
625
mc->min = 0;
626
mc->max = 1;
627
628
kctl[i].name = control_name;
629
kctl[i].private_value = (unsigned long)mc;
630
kctl[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
631
kctl[i].info = snd_soc_info_volsw;
632
kctl[i].get = snd_soc_dapm_get_volsw;
633
kctl[i].put = snd_soc_dapm_put_volsw;
634
}
635
636
(*widget)->id = snd_soc_dapm_mixer;
637
(*widget)->kcontrol_news = kctl;
638
(*widget)->num_kcontrols = entity->num_sources;
639
(*widget)++;
640
641
for (i = 0; i < entity->num_sources; i++)
642
add_route(route, entity->label, kctl[i].name, entity->sources[i]->label);
643
644
return 0;
645
}
646
647
static int entity_cs_event(struct snd_soc_dapm_widget *widget,
648
struct snd_kcontrol *kctl, int event)
649
{
650
struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
651
struct sdca_entity *entity = widget->priv;
652
653
if (!component)
654
return -EIO;
655
656
if (entity->cs.max_delay)
657
fsleep(entity->cs.max_delay);
658
659
return 0;
660
}
661
662
static int entity_parse_cs(struct device *dev,
663
struct sdca_function_data *function,
664
struct sdca_entity *entity,
665
struct snd_soc_dapm_widget **widget,
666
struct snd_soc_dapm_route **route)
667
{
668
int i;
669
670
(*widget)->id = snd_soc_dapm_supply;
671
(*widget)->subseq = 1; /* Ensure these run after PDEs */
672
(*widget)->event_flags = SND_SOC_DAPM_POST_PMU;
673
(*widget)->event = entity_cs_event;
674
(*widget)->priv = entity;
675
(*widget)++;
676
677
for (i = 0; i < entity->num_sources; i++)
678
add_route(route, entity->label, NULL, entity->sources[i]->label);
679
680
return 0;
681
}
682
683
/**
684
* sdca_asoc_populate_dapm - fill in arrays of DAPM widgets and routes
685
* @dev: Pointer to the device against which allocations will be done.
686
* @function: Pointer to the Function information.
687
* @widget: Array of DAPM widgets to be populated.
688
* @route: Array of DAPM routes to be populated.
689
*
690
* This function populates arrays of DAPM widgets and routes from the
691
* DisCo information for a particular SDCA Function. Typically,
692
* snd_soc_asoc_count_component will be used to allocate appropriately
693
* sized arrays before calling this function.
694
*
695
* Return: Returns zero on success, and a negative error code on failure.
696
*/
697
int sdca_asoc_populate_dapm(struct device *dev, struct sdca_function_data *function,
698
struct snd_soc_dapm_widget *widget,
699
struct snd_soc_dapm_route *route)
700
{
701
int ret;
702
int i;
703
704
for (i = 0; i < function->num_entities - 1; i++) {
705
struct sdca_entity *entity = &function->entities[i];
706
707
/*
708
* Some entities need to add controls "early" as they are
709
* referenced by other entities.
710
*/
711
switch (entity->type) {
712
case SDCA_ENTITY_TYPE_GE:
713
ret = entity_early_parse_ge(dev, function, entity);
714
if (ret)
715
return ret;
716
break;
717
default:
718
break;
719
}
720
}
721
722
for (i = 0; i < function->num_entities - 1; i++) {
723
struct sdca_entity *entity = &function->entities[i];
724
725
widget->name = entity->label;
726
widget->reg = SND_SOC_NOPM;
727
728
switch (entity->type) {
729
case SDCA_ENTITY_TYPE_IT:
730
ret = entity_parse_it(dev, function, entity, &widget, &route);
731
break;
732
case SDCA_ENTITY_TYPE_OT:
733
ret = entity_parse_ot(dev, function, entity, &widget, &route);
734
break;
735
case SDCA_ENTITY_TYPE_PDE:
736
ret = entity_parse_pde(dev, function, entity, &widget, &route);
737
break;
738
case SDCA_ENTITY_TYPE_SU:
739
ret = entity_parse_su(dev, function, entity, &widget, &route);
740
break;
741
case SDCA_ENTITY_TYPE_MU:
742
ret = entity_parse_mu(dev, function, entity, &widget, &route);
743
break;
744
case SDCA_ENTITY_TYPE_CS:
745
ret = entity_parse_cs(dev, function, entity, &widget, &route);
746
break;
747
case SDCA_ENTITY_TYPE_CX:
748
/*
749
* FIXME: For now we will just treat these as a supply,
750
* meaning all options are enabled.
751
*/
752
dev_warn(dev, "%s: clock selectors not fully supported yet\n",
753
entity->label);
754
ret = entity_parse_simple(dev, function, entity, &widget,
755
&route, snd_soc_dapm_supply);
756
break;
757
case SDCA_ENTITY_TYPE_TG:
758
ret = entity_parse_simple(dev, function, entity, &widget,
759
&route, snd_soc_dapm_siggen);
760
break;
761
case SDCA_ENTITY_TYPE_GE:
762
ret = entity_parse_simple(dev, function, entity, &widget,
763
&route, snd_soc_dapm_supply);
764
break;
765
default:
766
ret = entity_parse_simple(dev, function, entity, &widget,
767
&route, snd_soc_dapm_pga);
768
break;
769
}
770
if (ret)
771
return ret;
772
773
if (entity->group)
774
add_route(&route, entity->label, NULL, entity->group->label);
775
}
776
777
return 0;
778
}
779
EXPORT_SYMBOL_NS(sdca_asoc_populate_dapm, "SND_SOC_SDCA");
780
781
static int control_limit_kctl(struct device *dev,
782
struct sdca_entity *entity,
783
struct sdca_control *control,
784
struct snd_kcontrol_new *kctl)
785
{
786
struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value;
787
struct sdca_control_range *range;
788
int min, max, step;
789
unsigned int *tlv;
790
791
if (control->type != SDCA_CTL_DATATYPE_Q7P8DB)
792
return 0;
793
794
/*
795
* FIXME: For now only handle the simple case of a single linear range
796
*/
797
range = sdca_control_find_range(dev, entity, control, SDCA_VOLUME_LINEAR_NCOLS, 1);
798
if (!range)
799
return -EINVAL;
800
801
min = sdca_range(range, SDCA_VOLUME_LINEAR_MIN, 0);
802
max = sdca_range(range, SDCA_VOLUME_LINEAR_MAX, 0);
803
step = sdca_range(range, SDCA_VOLUME_LINEAR_STEP, 0);
804
805
min = sign_extend32(min, control->nbits - 1);
806
max = sign_extend32(max, control->nbits - 1);
807
808
tlv = devm_kcalloc(dev, 4, sizeof(*tlv), GFP_KERNEL);
809
if (!tlv)
810
return -ENOMEM;
811
812
tlv[0] = SNDRV_CTL_TLVT_DB_MINMAX;
813
tlv[1] = 2 * sizeof(*tlv);
814
tlv[2] = (min * 100) >> 8;
815
tlv[3] = (max * 100) >> 8;
816
817
step = (step * 100) >> 8;
818
819
mc->min = ((int)tlv[2] / step);
820
mc->max = ((int)tlv[3] / step);
821
mc->shift = step;
822
mc->sign_bit = 15;
823
mc->sdca_q78 = 1;
824
825
kctl->tlv.p = tlv;
826
kctl->access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
827
828
return 0;
829
}
830
831
static int volatile_get_volsw(struct snd_kcontrol *kcontrol,
832
struct snd_ctl_elem_value *ucontrol)
833
{
834
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
835
struct device *dev = component->dev;
836
int ret;
837
838
ret = pm_runtime_resume_and_get(dev);
839
if (ret < 0) {
840
dev_err(dev, "failed to resume reading %s: %d\n",
841
kcontrol->id.name, ret);
842
return ret;
843
}
844
845
ret = snd_soc_get_volsw(kcontrol, ucontrol);
846
847
pm_runtime_put(dev);
848
849
return ret;
850
}
851
852
static int volatile_put_volsw(struct snd_kcontrol *kcontrol,
853
struct snd_ctl_elem_value *ucontrol)
854
{
855
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
856
struct device *dev = component->dev;
857
int ret;
858
859
ret = pm_runtime_resume_and_get(dev);
860
if (ret < 0) {
861
dev_err(dev, "failed to resume writing %s: %d\n",
862
kcontrol->id.name, ret);
863
return ret;
864
}
865
866
ret = snd_soc_put_volsw(kcontrol, ucontrol);
867
868
pm_runtime_put(dev);
869
870
return ret;
871
}
872
873
static int populate_control(struct device *dev,
874
struct sdca_function_data *function,
875
struct sdca_entity *entity,
876
struct sdca_control *control,
877
struct snd_kcontrol_new **kctl)
878
{
879
const char *control_suffix = "";
880
const char *control_name;
881
struct soc_mixer_control *mc;
882
int index = 0;
883
int ret;
884
int cn;
885
886
if (!exported_control(entity, control))
887
return 0;
888
889
if (control->type == SDCA_CTL_DATATYPE_ONEBIT)
890
control_suffix = " Switch";
891
892
control_name = devm_kasprintf(dev, GFP_KERNEL, "%s %s%s", entity->label,
893
control->label, control_suffix);
894
if (!control_name)
895
return -ENOMEM;
896
897
mc = devm_kzalloc(dev, sizeof(*mc), GFP_KERNEL);
898
if (!mc)
899
return -ENOMEM;
900
901
for_each_set_bit(cn, (unsigned long *)&control->cn_list,
902
BITS_PER_TYPE(control->cn_list)) {
903
switch (index++) {
904
case 0:
905
mc->reg = SDW_SDCA_CTL(function->desc->adr, entity->id,
906
control->sel, cn);
907
mc->rreg = mc->reg;
908
break;
909
case 1:
910
mc->rreg = SDW_SDCA_CTL(function->desc->adr, entity->id,
911
control->sel, cn);
912
break;
913
default:
914
dev_err(dev, "%s: %s: only mono/stereo controls supported\n",
915
entity->label, control->label);
916
return -EINVAL;
917
}
918
}
919
920
mc->min = 0;
921
mc->max = clamp((0x1ull << control->nbits) - 1, 0, type_max(mc->max));
922
923
if (SDCA_CTL_TYPE(entity->type, control->sel) == SDCA_CTL_TYPE_S(FU, MUTE))
924
mc->invert = true;
925
926
(*kctl)->name = control_name;
927
(*kctl)->private_value = (unsigned long)mc;
928
(*kctl)->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
929
(*kctl)->info = snd_soc_info_volsw;
930
if (control->is_volatile) {
931
(*kctl)->get = volatile_get_volsw;
932
(*kctl)->put = volatile_put_volsw;
933
} else {
934
(*kctl)->get = snd_soc_get_volsw;
935
(*kctl)->put = snd_soc_put_volsw;
936
}
937
938
if (readonly_control(control))
939
(*kctl)->access = SNDRV_CTL_ELEM_ACCESS_READ;
940
else
941
(*kctl)->access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
942
943
ret = control_limit_kctl(dev, entity, control, *kctl);
944
if (ret)
945
return ret;
946
947
(*kctl)++;
948
949
return 0;
950
}
951
952
static int populate_pin_switch(struct device *dev,
953
struct sdca_entity *entity,
954
struct snd_kcontrol_new **kctl)
955
{
956
const char *control_name;
957
958
control_name = devm_kasprintf(dev, GFP_KERNEL, "%s Switch", entity->label);
959
if (!control_name)
960
return -ENOMEM;
961
962
(*kctl)->name = control_name;
963
(*kctl)->private_value = (unsigned long)entity->label;
964
(*kctl)->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
965
(*kctl)->info = snd_soc_dapm_info_pin_switch;
966
(*kctl)->get = snd_soc_dapm_get_component_pin_switch;
967
(*kctl)->put = snd_soc_dapm_put_component_pin_switch;
968
(*kctl)++;
969
970
return 0;
971
}
972
973
/**
974
* sdca_asoc_populate_controls - fill in an array of ALSA controls for a Function
975
* @dev: Pointer to the device against which allocations will be done.
976
* @function: Pointer to the Function information.
977
* @kctl: Array of ALSA controls to be populated.
978
*
979
* This function populates an array of ALSA controls from the DisCo
980
* information for a particular SDCA Function. Typically,
981
* snd_soc_asoc_count_component will be used to allocate an
982
* appropriately sized array before calling this function.
983
*
984
* Return: Returns zero on success, and a negative error code on failure.
985
*/
986
int sdca_asoc_populate_controls(struct device *dev,
987
struct sdca_function_data *function,
988
struct snd_kcontrol_new *kctl)
989
{
990
int i, j;
991
int ret;
992
993
for (i = 0; i < function->num_entities; i++) {
994
struct sdca_entity *entity = &function->entities[i];
995
996
switch (entity->type) {
997
case SDCA_ENTITY_TYPE_IT:
998
case SDCA_ENTITY_TYPE_OT:
999
if (!entity->iot.is_dataport) {
1000
ret = populate_pin_switch(dev, entity, &kctl);
1001
if (ret)
1002
return ret;
1003
}
1004
break;
1005
default:
1006
break;
1007
}
1008
1009
for (j = 0; j < entity->num_controls; j++) {
1010
ret = populate_control(dev, function, entity,
1011
&entity->controls[j], &kctl);
1012
if (ret)
1013
return ret;
1014
}
1015
}
1016
1017
return 0;
1018
}
1019
EXPORT_SYMBOL_NS(sdca_asoc_populate_controls, "SND_SOC_SDCA");
1020
1021
static unsigned int rate_find_mask(unsigned int rate)
1022
{
1023
switch (rate) {
1024
case 0:
1025
return SNDRV_PCM_RATE_8000_768000;
1026
case 5512:
1027
return SNDRV_PCM_RATE_5512;
1028
case 8000:
1029
return SNDRV_PCM_RATE_8000;
1030
case 11025:
1031
return SNDRV_PCM_RATE_11025;
1032
case 16000:
1033
return SNDRV_PCM_RATE_16000;
1034
case 22050:
1035
return SNDRV_PCM_RATE_22050;
1036
case 32000:
1037
return SNDRV_PCM_RATE_32000;
1038
case 44100:
1039
return SNDRV_PCM_RATE_44100;
1040
case 48000:
1041
return SNDRV_PCM_RATE_48000;
1042
case 64000:
1043
return SNDRV_PCM_RATE_64000;
1044
case 88200:
1045
return SNDRV_PCM_RATE_88200;
1046
case 96000:
1047
return SNDRV_PCM_RATE_96000;
1048
case 176400:
1049
return SNDRV_PCM_RATE_176400;
1050
case 192000:
1051
return SNDRV_PCM_RATE_192000;
1052
case 352800:
1053
return SNDRV_PCM_RATE_352800;
1054
case 384000:
1055
return SNDRV_PCM_RATE_384000;
1056
case 705600:
1057
return SNDRV_PCM_RATE_705600;
1058
case 768000:
1059
return SNDRV_PCM_RATE_768000;
1060
case 12000:
1061
return SNDRV_PCM_RATE_12000;
1062
case 24000:
1063
return SNDRV_PCM_RATE_24000;
1064
case 128000:
1065
return SNDRV_PCM_RATE_128000;
1066
default:
1067
return 0;
1068
}
1069
}
1070
1071
static u64 width_find_mask(unsigned int bits)
1072
{
1073
switch (bits) {
1074
case 0:
1075
return SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |
1076
SNDRV_PCM_FMTBIT_S20_LE | SNDRV_PCM_FMTBIT_S24_LE |
1077
SNDRV_PCM_FMTBIT_S32_LE;
1078
case 8:
1079
return SNDRV_PCM_FMTBIT_S8;
1080
case 16:
1081
return SNDRV_PCM_FMTBIT_S16_LE;
1082
case 20:
1083
return SNDRV_PCM_FMTBIT_S20_LE;
1084
case 24:
1085
return SNDRV_PCM_FMTBIT_S24_LE;
1086
case 32:
1087
return SNDRV_PCM_FMTBIT_S32_LE;
1088
default:
1089
return 0;
1090
}
1091
}
1092
1093
static int populate_rate_format(struct device *dev,
1094
struct sdca_function_data *function,
1095
struct sdca_entity *entity,
1096
struct snd_soc_pcm_stream *stream)
1097
{
1098
struct sdca_control_range *range;
1099
unsigned int sample_rate, sample_width;
1100
unsigned int clock_rates = 0;
1101
unsigned int rates = 0;
1102
u64 formats = 0;
1103
int sel, i;
1104
1105
switch (entity->type) {
1106
case SDCA_ENTITY_TYPE_IT:
1107
sel = SDCA_CTL_IT_USAGE;
1108
break;
1109
case SDCA_ENTITY_TYPE_OT:
1110
sel = SDCA_CTL_OT_USAGE;
1111
break;
1112
default:
1113
dev_err(dev, "%s: entity type has no usage control\n",
1114
entity->label);
1115
return -EINVAL;
1116
}
1117
1118
if (entity->iot.clock) {
1119
range = sdca_selector_find_range(dev, entity->iot.clock,
1120
SDCA_CTL_CS_SAMPLERATEINDEX,
1121
SDCA_SAMPLERATEINDEX_NCOLS, 0);
1122
if (!range)
1123
return -EINVAL;
1124
1125
for (i = 0; i < range->rows; i++) {
1126
sample_rate = sdca_range(range, SDCA_SAMPLERATEINDEX_RATE, i);
1127
clock_rates |= rate_find_mask(sample_rate);
1128
}
1129
} else {
1130
clock_rates = UINT_MAX;
1131
}
1132
1133
range = sdca_selector_find_range(dev, entity, sel, SDCA_USAGE_NCOLS, 0);
1134
if (!range)
1135
return -EINVAL;
1136
1137
for (i = 0; i < range->rows; i++) {
1138
sample_rate = sdca_range(range, SDCA_USAGE_SAMPLE_RATE, i);
1139
sample_rate = rate_find_mask(sample_rate);
1140
1141
if (sample_rate & clock_rates) {
1142
rates |= sample_rate;
1143
1144
sample_width = sdca_range(range, SDCA_USAGE_SAMPLE_WIDTH, i);
1145
formats |= width_find_mask(sample_width);
1146
}
1147
}
1148
1149
stream->formats = formats;
1150
stream->rates = rates;
1151
1152
return 0;
1153
}
1154
1155
/**
1156
* sdca_asoc_populate_dais - fill in an array of DAI drivers for a Function
1157
* @dev: Pointer to the device against which allocations will be done.
1158
* @function: Pointer to the Function information.
1159
* @dais: Array of DAI drivers to be populated.
1160
* @ops: DAI ops to be attached to each of the created DAI drivers.
1161
*
1162
* This function populates an array of ASoC DAI drivers from the DisCo
1163
* information for a particular SDCA Function. Typically,
1164
* snd_soc_asoc_count_component will be used to allocate an
1165
* appropriately sized array before calling this function.
1166
*
1167
* Return: Returns zero on success, and a negative error code on failure.
1168
*/
1169
int sdca_asoc_populate_dais(struct device *dev, struct sdca_function_data *function,
1170
struct snd_soc_dai_driver *dais,
1171
const struct snd_soc_dai_ops *ops)
1172
{
1173
int i, j;
1174
int ret;
1175
1176
for (i = 0, j = 0; i < function->num_entities - 1; i++) {
1177
struct sdca_entity *entity = &function->entities[i];
1178
struct snd_soc_pcm_stream *stream;
1179
const char *stream_suffix;
1180
1181
switch (entity->type) {
1182
case SDCA_ENTITY_TYPE_IT:
1183
stream = &dais[j].playback;
1184
stream_suffix = "Playback";
1185
break;
1186
case SDCA_ENTITY_TYPE_OT:
1187
stream = &dais[j].capture;
1188
stream_suffix = "Capture";
1189
break;
1190
default:
1191
continue;
1192
}
1193
1194
/* Can't check earlier as only terminals have an iot member. */
1195
if (!entity->iot.is_dataport)
1196
continue;
1197
1198
stream->stream_name = devm_kasprintf(dev, GFP_KERNEL, "%s %s",
1199
entity->label, stream_suffix);
1200
if (!stream->stream_name)
1201
return -ENOMEM;
1202
/* Channels will be further limited by constraints */
1203
stream->channels_min = 1;
1204
stream->channels_max = SDCA_MAX_CHANNEL_COUNT;
1205
1206
ret = populate_rate_format(dev, function, entity, stream);
1207
if (ret)
1208
return ret;
1209
1210
dais[j].id = i;
1211
dais[j].name = entity->label;
1212
dais[j].ops = ops;
1213
j++;
1214
}
1215
1216
return 0;
1217
}
1218
EXPORT_SYMBOL_NS(sdca_asoc_populate_dais, "SND_SOC_SDCA");
1219
1220
/**
1221
* sdca_asoc_populate_component - fill in a component driver for a Function
1222
* @dev: Pointer to the device against which allocations will be done.
1223
* @function: Pointer to the Function information.
1224
* @component_drv: Pointer to the component driver to be populated.
1225
* @dai_drv: Pointer to the DAI driver array to be allocated and populated.
1226
* @num_dai_drv: Pointer to integer that will be populated with the number of
1227
* DAI drivers.
1228
* @ops: DAI ops pointer that will be used for each DAI driver.
1229
*
1230
* This function populates a snd_soc_component_driver structure based
1231
* on the DisCo information for a particular SDCA Function. It does
1232
* all allocation internally.
1233
*
1234
* Return: Returns zero on success, and a negative error code on failure.
1235
*/
1236
int sdca_asoc_populate_component(struct device *dev,
1237
struct sdca_function_data *function,
1238
struct snd_soc_component_driver *component_drv,
1239
struct snd_soc_dai_driver **dai_drv, int *num_dai_drv,
1240
const struct snd_soc_dai_ops *ops)
1241
{
1242
struct snd_soc_dapm_widget *widgets;
1243
struct snd_soc_dapm_route *routes;
1244
struct snd_kcontrol_new *controls;
1245
struct snd_soc_dai_driver *dais;
1246
int num_widgets, num_routes, num_controls, num_dais;
1247
int ret;
1248
1249
ret = sdca_asoc_count_component(dev, function, &num_widgets, &num_routes,
1250
&num_controls, &num_dais);
1251
if (ret)
1252
return ret;
1253
1254
widgets = devm_kcalloc(dev, num_widgets, sizeof(*widgets), GFP_KERNEL);
1255
if (!widgets)
1256
return -ENOMEM;
1257
1258
routes = devm_kcalloc(dev, num_routes, sizeof(*routes), GFP_KERNEL);
1259
if (!routes)
1260
return -ENOMEM;
1261
1262
controls = devm_kcalloc(dev, num_controls, sizeof(*controls), GFP_KERNEL);
1263
if (!controls)
1264
return -ENOMEM;
1265
1266
dais = devm_kcalloc(dev, num_dais, sizeof(*dais), GFP_KERNEL);
1267
if (!dais)
1268
return -ENOMEM;
1269
1270
ret = sdca_asoc_populate_dapm(dev, function, widgets, routes);
1271
if (ret)
1272
return ret;
1273
1274
ret = sdca_asoc_populate_controls(dev, function, controls);
1275
if (ret)
1276
return ret;
1277
1278
ret = sdca_asoc_populate_dais(dev, function, dais, ops);
1279
if (ret)
1280
return ret;
1281
1282
component_drv->dapm_widgets = widgets;
1283
component_drv->num_dapm_widgets = num_widgets;
1284
component_drv->dapm_routes = routes;
1285
component_drv->num_dapm_routes = num_routes;
1286
component_drv->controls = controls;
1287
component_drv->num_controls = num_controls;
1288
1289
*dai_drv = dais;
1290
*num_dai_drv = num_dais;
1291
1292
return 0;
1293
}
1294
EXPORT_SYMBOL_NS(sdca_asoc_populate_component, "SND_SOC_SDCA");
1295
1296
/**
1297
* sdca_asoc_set_constraints - constrain channels available on a DAI
1298
* @dev: Pointer to the device, used for error messages.
1299
* @regmap: Pointer to the Function register map.
1300
* @function: Pointer to the Function information.
1301
* @substream: Pointer to the PCM substream.
1302
* @dai: Pointer to the ASoC DAI.
1303
*
1304
* Typically called from startup().
1305
*
1306
* Return: Returns zero on success, and a negative error code on failure.
1307
*/
1308
int sdca_asoc_set_constraints(struct device *dev, struct regmap *regmap,
1309
struct sdca_function_data *function,
1310
struct snd_pcm_substream *substream,
1311
struct snd_soc_dai *dai)
1312
{
1313
static const unsigned int channel_list[] = {
1314
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
1315
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
1316
};
1317
struct sdca_entity *entity = &function->entities[dai->id];
1318
struct snd_pcm_hw_constraint_list *constraint;
1319
struct sdca_control_range *range;
1320
struct sdca_control *control;
1321
unsigned int channel_mask = 0;
1322
int i, ret;
1323
1324
static_assert(ARRAY_SIZE(channel_list) == SDCA_MAX_CHANNEL_COUNT);
1325
static_assert(sizeof(channel_mask) * BITS_PER_BYTE >= SDCA_MAX_CHANNEL_COUNT);
1326
1327
if (entity->type != SDCA_ENTITY_TYPE_IT)
1328
return 0;
1329
1330
control = sdca_selector_find_control(dev, entity, SDCA_CTL_IT_CLUSTERINDEX);
1331
if (!control)
1332
return -EINVAL;
1333
1334
range = sdca_control_find_range(dev, entity, control, SDCA_CLUSTER_NCOLS, 0);
1335
if (!range)
1336
return -EINVAL;
1337
1338
for (i = 0; i < range->rows; i++) {
1339
int clusterid = sdca_range(range, SDCA_CLUSTER_CLUSTERID, i);
1340
struct sdca_cluster *cluster;
1341
1342
cluster = sdca_id_find_cluster(dev, function, clusterid);
1343
if (!cluster)
1344
return -ENODEV;
1345
1346
channel_mask |= (1 << (cluster->num_channels - 1));
1347
}
1348
1349
dev_dbg(dev, "%s: set channel constraint mask: %#x\n",
1350
entity->label, channel_mask);
1351
1352
constraint = kzalloc(sizeof(*constraint), GFP_KERNEL);
1353
if (!constraint)
1354
return -ENOMEM;
1355
1356
constraint->count = ARRAY_SIZE(channel_list);
1357
constraint->list = channel_list;
1358
constraint->mask = channel_mask;
1359
1360
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
1361
SNDRV_PCM_HW_PARAM_CHANNELS,
1362
constraint);
1363
if (ret) {
1364
dev_err(dev, "%s: failed to add constraint: %d\n", entity->label, ret);
1365
kfree(constraint);
1366
return ret;
1367
}
1368
1369
dai->priv = constraint;
1370
1371
return 0;
1372
}
1373
EXPORT_SYMBOL_NS(sdca_asoc_set_constraints, "SND_SOC_SDCA");
1374
1375
/**
1376
* sdca_asoc_free_constraints - free constraint allocations
1377
* @substream: Pointer to the PCM substream.
1378
* @dai: Pointer to the ASoC DAI.
1379
*
1380
* Typically called from shutdown().
1381
*/
1382
void sdca_asoc_free_constraints(struct snd_pcm_substream *substream,
1383
struct snd_soc_dai *dai)
1384
{
1385
struct snd_pcm_hw_constraint_list *constraint = dai->priv;
1386
1387
kfree(constraint);
1388
}
1389
EXPORT_SYMBOL_NS(sdca_asoc_free_constraints, "SND_SOC_SDCA");
1390
1391
/**
1392
* sdca_asoc_get_port - return SoundWire port for a DAI
1393
* @dev: Pointer to the device, used for error messages.
1394
* @regmap: Pointer to the Function register map.
1395
* @function: Pointer to the Function information.
1396
* @dai: Pointer to the ASoC DAI.
1397
*
1398
* Typically called from hw_params().
1399
*
1400
* Return: Returns a positive port number on success, and a negative error
1401
* code on failure.
1402
*/
1403
int sdca_asoc_get_port(struct device *dev, struct regmap *regmap,
1404
struct sdca_function_data *function,
1405
struct snd_soc_dai *dai)
1406
{
1407
struct sdca_entity *entity = &function->entities[dai->id];
1408
struct sdca_control_range *range;
1409
unsigned int reg, val;
1410
int sel = -EINVAL;
1411
int i, ret;
1412
1413
switch (entity->type) {
1414
case SDCA_ENTITY_TYPE_IT:
1415
sel = SDCA_CTL_IT_DATAPORT_SELECTOR;
1416
break;
1417
case SDCA_ENTITY_TYPE_OT:
1418
sel = SDCA_CTL_OT_DATAPORT_SELECTOR;
1419
break;
1420
default:
1421
break;
1422
}
1423
1424
if (sel < 0 || !entity->iot.is_dataport) {
1425
dev_err(dev, "%s: port number only available for dataports\n",
1426
entity->label);
1427
return -EINVAL;
1428
}
1429
1430
range = sdca_selector_find_range(dev, entity, sel, SDCA_DATAPORT_SELECTOR_NCOLS,
1431
SDCA_DATAPORT_SELECTOR_NROWS);
1432
if (!range)
1433
return -EINVAL;
1434
1435
reg = SDW_SDCA_CTL(function->desc->adr, entity->id, sel, 0);
1436
1437
ret = regmap_read(regmap, reg, &val);
1438
if (ret) {
1439
dev_err(dev, "%s: failed to read dataport selector: %d\n",
1440
entity->label, ret);
1441
return ret;
1442
}
1443
1444
for (i = 0; i < range->rows; i++) {
1445
static const u8 port_mask = 0xF;
1446
1447
sel = sdca_range(range, val & port_mask, i);
1448
1449
/*
1450
* FIXME: Currently only a single dataport is supported, so
1451
* return the first one found, technically up to 4 dataports
1452
* could be linked, but this is not yet supported.
1453
*/
1454
if (sel != 0xFF)
1455
return sel;
1456
1457
val >>= hweight8(port_mask);
1458
}
1459
1460
dev_err(dev, "%s: no dataport found\n", entity->label);
1461
return -ENODEV;
1462
}
1463
EXPORT_SYMBOL_NS(sdca_asoc_get_port, "SND_SOC_SDCA");
1464
1465
static int set_cluster(struct device *dev, struct regmap *regmap,
1466
struct sdca_function_data *function,
1467
struct sdca_entity *entity, unsigned int channels)
1468
{
1469
int sel = SDCA_CTL_IT_CLUSTERINDEX;
1470
struct sdca_control_range *range;
1471
int i, ret;
1472
1473
range = sdca_selector_find_range(dev, entity, sel, SDCA_CLUSTER_NCOLS, 0);
1474
if (!range)
1475
return -EINVAL;
1476
1477
for (i = 0; i < range->rows; i++) {
1478
int cluster_id = sdca_range(range, SDCA_CLUSTER_CLUSTERID, i);
1479
struct sdca_cluster *cluster;
1480
1481
cluster = sdca_id_find_cluster(dev, function, cluster_id);
1482
if (!cluster)
1483
return -ENODEV;
1484
1485
if (cluster->num_channels == channels) {
1486
int index = sdca_range(range, SDCA_CLUSTER_BYTEINDEX, i);
1487
unsigned int reg = SDW_SDCA_CTL(function->desc->adr,
1488
entity->id, sel, 0);
1489
1490
ret = regmap_update_bits(regmap, reg, 0xFF, index);
1491
if (ret) {
1492
dev_err(dev, "%s: failed to write cluster index: %d\n",
1493
entity->label, ret);
1494
return ret;
1495
}
1496
1497
dev_dbg(dev, "%s: set cluster to %d (%d channels)\n",
1498
entity->label, index, channels);
1499
1500
return 0;
1501
}
1502
}
1503
1504
dev_err(dev, "%s: no cluster for %d channels\n", entity->label, channels);
1505
return -EINVAL;
1506
}
1507
1508
static int set_clock(struct device *dev, struct regmap *regmap,
1509
struct sdca_function_data *function,
1510
struct sdca_entity *entity, int target_rate)
1511
{
1512
int sel = SDCA_CTL_CS_SAMPLERATEINDEX;
1513
struct sdca_control_range *range;
1514
int i, ret;
1515
1516
range = sdca_selector_find_range(dev, entity, sel, SDCA_SAMPLERATEINDEX_NCOLS, 0);
1517
if (!range)
1518
return -EINVAL;
1519
1520
for (i = 0; i < range->rows; i++) {
1521
unsigned int rate = sdca_range(range, SDCA_SAMPLERATEINDEX_RATE, i);
1522
1523
if (rate == target_rate) {
1524
unsigned int index = sdca_range(range,
1525
SDCA_SAMPLERATEINDEX_INDEX,
1526
i);
1527
unsigned int reg = SDW_SDCA_CTL(function->desc->adr,
1528
entity->id, sel, 0);
1529
1530
ret = regmap_update_bits(regmap, reg, 0xFF, index);
1531
if (ret) {
1532
dev_err(dev, "%s: failed to write clock rate: %d\n",
1533
entity->label, ret);
1534
return ret;
1535
}
1536
1537
dev_dbg(dev, "%s: set clock rate to %d (%dHz)\n",
1538
entity->label, index, rate);
1539
1540
return 0;
1541
}
1542
}
1543
1544
dev_err(dev, "%s: no clock rate for %dHz\n", entity->label, target_rate);
1545
return -EINVAL;
1546
}
1547
1548
static int set_usage(struct device *dev, struct regmap *regmap,
1549
struct sdca_function_data *function,
1550
struct sdca_entity *entity, int sel,
1551
int target_rate, int target_width)
1552
{
1553
struct sdca_control_range *range;
1554
int i, ret;
1555
1556
range = sdca_selector_find_range(dev, entity, sel, SDCA_USAGE_NCOLS, 0);
1557
if (!range)
1558
return -EINVAL;
1559
1560
for (i = 0; i < range->rows; i++) {
1561
unsigned int rate = sdca_range(range, SDCA_USAGE_SAMPLE_RATE, i);
1562
unsigned int width = sdca_range(range, SDCA_USAGE_SAMPLE_WIDTH, i);
1563
1564
if ((!rate || rate == target_rate) && (!width || width == target_width)) {
1565
unsigned int usage = sdca_range(range, SDCA_USAGE_NUMBER, i);
1566
unsigned int reg = SDW_SDCA_CTL(function->desc->adr,
1567
entity->id, sel, 0);
1568
1569
ret = regmap_update_bits(regmap, reg, 0xFF, usage);
1570
if (ret) {
1571
dev_err(dev, "%s: failed to write usage: %d\n",
1572
entity->label, ret);
1573
return ret;
1574
}
1575
1576
dev_dbg(dev, "%s: set usage to %#x (%dHz, %d bits)\n",
1577
entity->label, usage, target_rate, target_width);
1578
1579
return 0;
1580
}
1581
}
1582
1583
dev_err(dev, "%s: no usage for %dHz, %dbits\n",
1584
entity->label, target_rate, target_width);
1585
return -EINVAL;
1586
}
1587
1588
/**
1589
* sdca_asoc_hw_params - set SDCA channels, sample rate and bit depth
1590
* @dev: Pointer to the device, used for error messages.
1591
* @regmap: Pointer to the Function register map.
1592
* @function: Pointer to the Function information.
1593
* @substream: Pointer to the PCM substream.
1594
* @params: Pointer to the hardware parameters.
1595
* @dai: Pointer to the ASoC DAI.
1596
*
1597
* Typically called from hw_params().
1598
*
1599
* Return: Returns zero on success, and a negative error code on failure.
1600
*/
1601
int sdca_asoc_hw_params(struct device *dev, struct regmap *regmap,
1602
struct sdca_function_data *function,
1603
struct snd_pcm_substream *substream,
1604
struct snd_pcm_hw_params *params,
1605
struct snd_soc_dai *dai)
1606
{
1607
struct sdca_entity *entity = &function->entities[dai->id];
1608
int channels = params_channels(params);
1609
int width = params_width(params);
1610
int rate = params_rate(params);
1611
int usage_sel;
1612
int ret;
1613
1614
switch (entity->type) {
1615
case SDCA_ENTITY_TYPE_IT:
1616
ret = set_cluster(dev, regmap, function, entity, channels);
1617
if (ret)
1618
return ret;
1619
1620
usage_sel = SDCA_CTL_IT_USAGE;
1621
break;
1622
case SDCA_ENTITY_TYPE_OT:
1623
usage_sel = SDCA_CTL_OT_USAGE;
1624
break;
1625
default:
1626
dev_err(dev, "%s: hw_params on non-terminal entity\n", entity->label);
1627
return -EINVAL;
1628
}
1629
1630
if (entity->iot.clock) {
1631
ret = set_clock(dev, regmap, function, entity->iot.clock, rate);
1632
if (ret)
1633
return ret;
1634
}
1635
1636
ret = set_usage(dev, regmap, function, entity, usage_sel, rate, width);
1637
if (ret)
1638
return ret;
1639
1640
return 0;
1641
}
1642
EXPORT_SYMBOL_NS(sdca_asoc_hw_params, "SND_SOC_SDCA");
1643
1644