forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-09 244b2c5ca8b14627e4a17755e5922221e121c771
kernel/drivers/soundwire/stream.c
....@@ -13,6 +13,7 @@
1313 #include <linux/slab.h>
1414 #include <linux/soundwire/sdw_registers.h>
1515 #include <linux/soundwire/sdw.h>
16
+#include <sound/soc.h>
1617 #include "bus.h"
1718
1819 /*
....@@ -21,41 +22,46 @@
2122 * The rows are arranged as per the array index value programmed
2223 * in register. The index 15 has dummy value 0 in order to fill hole.
2324 */
24
-int rows[SDW_FRAME_ROWS] = {48, 50, 60, 64, 75, 80, 125, 147,
25
+int sdw_rows[SDW_FRAME_ROWS] = {48, 50, 60, 64, 75, 80, 125, 147,
2526 96, 100, 120, 128, 150, 160, 250, 0,
2627 192, 200, 240, 256, 72, 144, 90, 180};
28
+EXPORT_SYMBOL(sdw_rows);
2729
28
-int cols[SDW_FRAME_COLS] = {2, 4, 6, 8, 10, 12, 14, 16};
30
+int sdw_cols[SDW_FRAME_COLS] = {2, 4, 6, 8, 10, 12, 14, 16};
31
+EXPORT_SYMBOL(sdw_cols);
2932
30
-static int sdw_find_col_index(int col)
33
+int sdw_find_col_index(int col)
3134 {
3235 int i;
3336
3437 for (i = 0; i < SDW_FRAME_COLS; i++) {
35
- if (cols[i] == col)
38
+ if (sdw_cols[i] == col)
3639 return i;
3740 }
3841
3942 pr_warn("Requested column not found, selecting lowest column no: 2\n");
4043 return 0;
4144 }
45
+EXPORT_SYMBOL(sdw_find_col_index);
4246
43
-static int sdw_find_row_index(int row)
47
+int sdw_find_row_index(int row)
4448 {
4549 int i;
4650
4751 for (i = 0; i < SDW_FRAME_ROWS; i++) {
48
- if (rows[i] == row)
52
+ if (sdw_rows[i] == row)
4953 return i;
5054 }
5155
5256 pr_warn("Requested row not found, selecting lowest row no: 48\n");
5357 return 0;
5458 }
59
+EXPORT_SYMBOL(sdw_find_row_index);
60
+
5561 static int _sdw_program_slave_port_params(struct sdw_bus *bus,
56
- struct sdw_slave *slave,
57
- struct sdw_transport_params *t_params,
58
- enum sdw_dpn_type type)
62
+ struct sdw_slave *slave,
63
+ struct sdw_transport_params *t_params,
64
+ enum sdw_dpn_type type)
5965 {
6066 u32 addr1, addr2, addr3, addr4;
6167 int ret;
....@@ -76,51 +82,48 @@
7682 /* Program DPN_OffsetCtrl2 registers */
7783 ret = sdw_write(slave, addr1, t_params->offset2);
7884 if (ret < 0) {
79
- dev_err(bus->dev, "DPN_OffsetCtrl2 register write failed");
85
+ dev_err(bus->dev, "DPN_OffsetCtrl2 register write failed\n");
8086 return ret;
8187 }
8288
8389 /* Program DPN_BlockCtrl3 register */
8490 ret = sdw_write(slave, addr2, t_params->blk_pkg_mode);
8591 if (ret < 0) {
86
- dev_err(bus->dev, "DPN_BlockCtrl3 register write failed");
92
+ dev_err(bus->dev, "DPN_BlockCtrl3 register write failed\n");
8793 return ret;
8894 }
8995
9096 /*
9197 * Data ports are FULL, SIMPLE and REDUCED. This function handles
92
- * FULL and REDUCED only and and beyond this point only FULL is
98
+ * FULL and REDUCED only and beyond this point only FULL is
9399 * handled, so bail out if we are not FULL data port type
94100 */
95101 if (type != SDW_DPN_FULL)
96102 return ret;
97103
98104 /* Program DPN_SampleCtrl2 register */
99
- wbuf = (t_params->sample_interval - 1);
100
- wbuf &= SDW_DPN_SAMPLECTRL_HIGH;
101
- wbuf >>= SDW_REG_SHIFT(SDW_DPN_SAMPLECTRL_HIGH);
105
+ wbuf = FIELD_GET(SDW_DPN_SAMPLECTRL_HIGH, t_params->sample_interval - 1);
102106
103107 ret = sdw_write(slave, addr3, wbuf);
104108 if (ret < 0) {
105
- dev_err(bus->dev, "DPN_SampleCtrl2 register write failed");
109
+ dev_err(bus->dev, "DPN_SampleCtrl2 register write failed\n");
106110 return ret;
107111 }
108112
109113 /* Program DPN_HCtrl register */
110
- wbuf = t_params->hstart;
111
- wbuf <<= SDW_REG_SHIFT(SDW_DPN_HCTRL_HSTART);
112
- wbuf |= t_params->hstop;
114
+ wbuf = FIELD_PREP(SDW_DPN_HCTRL_HSTART, t_params->hstart);
115
+ wbuf |= FIELD_PREP(SDW_DPN_HCTRL_HSTOP, t_params->hstop);
113116
114117 ret = sdw_write(slave, addr4, wbuf);
115118 if (ret < 0)
116
- dev_err(bus->dev, "DPN_HCtrl register write failed");
119
+ dev_err(bus->dev, "DPN_HCtrl register write failed\n");
117120
118121 return ret;
119122 }
120123
121124 static int sdw_program_slave_port_params(struct sdw_bus *bus,
122
- struct sdw_slave_runtime *s_rt,
123
- struct sdw_port_runtime *p_rt)
125
+ struct sdw_slave_runtime *s_rt,
126
+ struct sdw_port_runtime *p_rt)
124127 {
125128 struct sdw_transport_params *t_params = &p_rt->transport_params;
126129 struct sdw_port_params *p_params = &p_rt->port_params;
....@@ -131,8 +134,8 @@
131134 u8 wbuf;
132135
133136 dpn_prop = sdw_get_slave_dpn_prop(s_rt->slave,
134
- s_rt->direction,
135
- t_params->port_num);
137
+ s_rt->direction,
138
+ t_params->port_num);
136139 if (!dpn_prop)
137140 return -EINVAL;
138141
....@@ -153,24 +156,26 @@
153156 }
154157
155158 /* Program DPN_PortCtrl register */
156
- wbuf = p_params->data_mode << SDW_REG_SHIFT(SDW_DPN_PORTCTRL_DATAMODE);
157
- wbuf |= p_params->flow_mode;
159
+ wbuf = FIELD_PREP(SDW_DPN_PORTCTRL_DATAMODE, p_params->data_mode);
160
+ wbuf |= FIELD_PREP(SDW_DPN_PORTCTRL_FLOWMODE, p_params->flow_mode);
158161
159162 ret = sdw_update(s_rt->slave, addr1, 0xF, wbuf);
160163 if (ret < 0) {
161164 dev_err(&s_rt->slave->dev,
162
- "DPN_PortCtrl register write failed for port %d",
165
+ "DPN_PortCtrl register write failed for port %d\n",
163166 t_params->port_num);
164167 return ret;
165168 }
166169
167
- /* Program DPN_BlockCtrl1 register */
168
- ret = sdw_write(s_rt->slave, addr2, (p_params->bps - 1));
169
- if (ret < 0) {
170
- dev_err(&s_rt->slave->dev,
171
- "DPN_BlockCtrl1 register write failed for port %d",
172
- t_params->port_num);
173
- return ret;
170
+ if (!dpn_prop->read_only_wordlength) {
171
+ /* Program DPN_BlockCtrl1 register */
172
+ ret = sdw_write(s_rt->slave, addr2, (p_params->bps - 1));
173
+ if (ret < 0) {
174
+ dev_err(&s_rt->slave->dev,
175
+ "DPN_BlockCtrl1 register write failed for port %d\n",
176
+ t_params->port_num);
177
+ return ret;
178
+ }
174179 }
175180
176181 /* Program DPN_SampleCtrl1 register */
....@@ -178,7 +183,7 @@
178183 ret = sdw_write(s_rt->slave, addr3, wbuf);
179184 if (ret < 0) {
180185 dev_err(&s_rt->slave->dev,
181
- "DPN_SampleCtrl1 register write failed for port %d",
186
+ "DPN_SampleCtrl1 register write failed for port %d\n",
182187 t_params->port_num);
183188 return ret;
184189 }
....@@ -187,7 +192,7 @@
187192 ret = sdw_write(s_rt->slave, addr4, t_params->offset1);
188193 if (ret < 0) {
189194 dev_err(&s_rt->slave->dev,
190
- "DPN_OffsetCtrl1 register write failed for port %d",
195
+ "DPN_OffsetCtrl1 register write failed for port %d\n",
191196 t_params->port_num);
192197 return ret;
193198 }
....@@ -197,7 +202,7 @@
197202 ret = sdw_write(s_rt->slave, addr5, t_params->blk_grp_ctrl);
198203 if (ret < 0) {
199204 dev_err(&s_rt->slave->dev,
200
- "DPN_BlockCtrl2 reg write failed for port %d",
205
+ "DPN_BlockCtrl2 reg write failed for port %d\n",
201206 t_params->port_num);
202207 return ret;
203208 }
....@@ -208,7 +213,7 @@
208213 ret = sdw_write(s_rt->slave, addr6, t_params->lane_ctrl);
209214 if (ret < 0) {
210215 dev_err(&s_rt->slave->dev,
211
- "DPN_LaneCtrl register write failed for port %d",
216
+ "DPN_LaneCtrl register write failed for port %d\n",
212217 t_params->port_num);
213218 return ret;
214219 }
....@@ -216,10 +221,10 @@
216221
217222 if (dpn_prop->type != SDW_DPN_SIMPLE) {
218223 ret = _sdw_program_slave_port_params(bus, s_rt->slave,
219
- t_params, dpn_prop->type);
224
+ t_params, dpn_prop->type);
220225 if (ret < 0)
221226 dev_err(&s_rt->slave->dev,
222
- "Transport reg write failed for port: %d",
227
+ "Transport reg write failed for port: %d\n",
223228 t_params->port_num);
224229 }
225230
....@@ -227,13 +232,13 @@
227232 }
228233
229234 static int sdw_program_master_port_params(struct sdw_bus *bus,
230
- struct sdw_port_runtime *p_rt)
235
+ struct sdw_port_runtime *p_rt)
231236 {
232237 int ret;
233238
234239 /*
235240 * we need to set transport and port parameters for the port.
236
- * Transport parameters refers to the smaple interval, offsets and
241
+ * Transport parameters refers to the sample interval, offsets and
237242 * hstart/stop etc of the data. Port parameters refers to word
238243 * length, flow mode etc of the port
239244 */
....@@ -244,8 +249,8 @@
244249 return ret;
245250
246251 return bus->port_ops->dpn_set_port_params(bus,
247
- &p_rt->port_params,
248
- bus->params.next_bank);
252
+ &p_rt->port_params,
253
+ bus->params.next_bank);
249254 }
250255
251256 /**
....@@ -292,8 +297,9 @@
292297 * actual enable/disable is done with a bank switch
293298 */
294299 static int sdw_enable_disable_slave_ports(struct sdw_bus *bus,
295
- struct sdw_slave_runtime *s_rt,
296
- struct sdw_port_runtime *p_rt, bool en)
300
+ struct sdw_slave_runtime *s_rt,
301
+ struct sdw_port_runtime *p_rt,
302
+ bool en)
297303 {
298304 struct sdw_transport_params *t_params = &p_rt->transport_params;
299305 u32 addr;
....@@ -309,25 +315,26 @@
309315 * it is safe to reset this register
310316 */
311317 if (en)
312
- ret = sdw_update(s_rt->slave, addr, 0xFF, p_rt->ch_mask);
318
+ ret = sdw_write(s_rt->slave, addr, p_rt->ch_mask);
313319 else
314
- ret = sdw_update(s_rt->slave, addr, 0xFF, 0x0);
320
+ ret = sdw_write(s_rt->slave, addr, 0x0);
315321
316322 if (ret < 0)
317323 dev_err(&s_rt->slave->dev,
318
- "Slave chn_en reg write failed:%d port:%d",
324
+ "Slave chn_en reg write failed:%d port:%d\n",
319325 ret, t_params->port_num);
320326
321327 return ret;
322328 }
323329
324330 static int sdw_enable_disable_master_ports(struct sdw_master_runtime *m_rt,
325
- struct sdw_port_runtime *p_rt, bool en)
331
+ struct sdw_port_runtime *p_rt,
332
+ bool en)
326333 {
327334 struct sdw_transport_params *t_params = &p_rt->transport_params;
328335 struct sdw_bus *bus = m_rt->bus;
329336 struct sdw_enable_ch enable_ch;
330
- int ret = 0;
337
+ int ret;
331338
332339 enable_ch.port_num = p_rt->num;
333340 enable_ch.ch_mask = p_rt->ch_mask;
....@@ -336,10 +343,11 @@
336343 /* Perform Master port channel(s) enable/disable */
337344 if (bus->port_ops->dpn_port_enable_ch) {
338345 ret = bus->port_ops->dpn_port_enable_ch(bus,
339
- &enable_ch, bus->params.next_bank);
346
+ &enable_ch,
347
+ bus->params.next_bank);
340348 if (ret < 0) {
341349 dev_err(bus->dev,
342
- "Master chn_en write failed:%d port:%d",
350
+ "Master chn_en write failed:%d port:%d\n",
343351 ret, t_params->port_num);
344352 return ret;
345353 }
....@@ -363,14 +371,14 @@
363371 static int sdw_enable_disable_ports(struct sdw_master_runtime *m_rt, bool en)
364372 {
365373 struct sdw_port_runtime *s_port, *m_port;
366
- struct sdw_slave_runtime *s_rt = NULL;
374
+ struct sdw_slave_runtime *s_rt;
367375 int ret = 0;
368376
369377 /* Enable/Disable Slave port(s) */
370378 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
371379 list_for_each_entry(s_port, &s_rt->port_list, port_node) {
372380 ret = sdw_enable_disable_slave_ports(m_rt->bus, s_rt,
373
- s_port, en);
381
+ s_port, en);
374382 if (ret < 0)
375383 return ret;
376384 }
....@@ -387,7 +395,8 @@
387395 }
388396
389397 static int sdw_do_port_prep(struct sdw_slave_runtime *s_rt,
390
- struct sdw_prepare_ch prep_ch, enum sdw_port_prep_ops cmd)
398
+ struct sdw_prepare_ch prep_ch,
399
+ enum sdw_port_prep_ops cmd)
391400 {
392401 const struct sdw_slave_ops *ops = s_rt->slave->ops;
393402 int ret;
....@@ -396,7 +405,8 @@
396405 ret = ops->port_prep(s_rt->slave, &prep_ch, cmd);
397406 if (ret < 0) {
398407 dev_err(&s_rt->slave->dev,
399
- "Slave Port Prep cmd %d failed: %d", cmd, ret);
408
+ "Slave Port Prep cmd %d failed: %d\n",
409
+ cmd, ret);
400410 return ret;
401411 }
402412 }
....@@ -405,13 +415,13 @@
405415 }
406416
407417 static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
408
- struct sdw_slave_runtime *s_rt,
409
- struct sdw_port_runtime *p_rt, bool prep)
418
+ struct sdw_slave_runtime *s_rt,
419
+ struct sdw_port_runtime *p_rt,
420
+ bool prep)
410421 {
411
- struct completion *port_ready = NULL;
422
+ struct completion *port_ready;
412423 struct sdw_dpn_prop *dpn_prop;
413424 struct sdw_prepare_ch prep_ch;
414
- unsigned int time_left;
415425 bool intr = false;
416426 int ret = 0, val;
417427 u32 addr;
....@@ -420,11 +430,11 @@
420430 prep_ch.ch_mask = p_rt->ch_mask;
421431
422432 dpn_prop = sdw_get_slave_dpn_prop(s_rt->slave,
423
- s_rt->direction,
424
- prep_ch.num);
433
+ s_rt->direction,
434
+ prep_ch.num);
425435 if (!dpn_prop) {
426436 dev_err(bus->dev,
427
- "Slave Port:%d properties not found", prep_ch.num);
437
+ "Slave Port:%d properties not found\n", prep_ch.num);
428438 return -EINVAL;
429439 }
430440
....@@ -432,7 +442,8 @@
432442
433443 prep_ch.bank = bus->params.next_bank;
434444
435
- if (dpn_prop->device_interrupts || !dpn_prop->simple_ch_prep_sm)
445
+ if (dpn_prop->imp_def_interrupts || !dpn_prop->simple_ch_prep_sm ||
446
+ bus->params.s_data_mode != SDW_PORT_DATA_MODE_NORMAL)
436447 intr = true;
437448
438449 /*
....@@ -442,7 +453,7 @@
442453 */
443454 if (prep && intr) {
444455 ret = sdw_configure_dpn_intr(s_rt->slave, p_rt->num, prep,
445
- dpn_prop->device_interrupts);
456
+ dpn_prop->imp_def_interrupts);
446457 if (ret < 0)
447458 return ret;
448459 }
....@@ -455,28 +466,27 @@
455466 addr = SDW_DPN_PREPARECTRL(p_rt->num);
456467
457468 if (prep)
458
- ret = sdw_update(s_rt->slave, addr,
459
- 0xFF, p_rt->ch_mask);
469
+ ret = sdw_write(s_rt->slave, addr, p_rt->ch_mask);
460470 else
461
- ret = sdw_update(s_rt->slave, addr, 0xFF, 0x0);
471
+ ret = sdw_write(s_rt->slave, addr, 0x0);
462472
463473 if (ret < 0) {
464474 dev_err(&s_rt->slave->dev,
465
- "Slave prep_ctrl reg write failed");
475
+ "Slave prep_ctrl reg write failed\n");
466476 return ret;
467477 }
468478
469479 /* Wait for completion on port ready */
470480 port_ready = &s_rt->slave->port_ready[prep_ch.num];
471
- time_left = wait_for_completion_timeout(port_ready,
472
- msecs_to_jiffies(dpn_prop->ch_prep_timeout));
481
+ wait_for_completion_timeout(port_ready,
482
+ msecs_to_jiffies(dpn_prop->ch_prep_timeout));
473483
474484 val = sdw_read(s_rt->slave, SDW_DPN_PREPARESTATUS(p_rt->num));
475
- val &= p_rt->ch_mask;
476
- if (!time_left || val) {
485
+ if ((val < 0) || (val & p_rt->ch_mask)) {
486
+ ret = (val < 0) ? val : -ETIMEDOUT;
477487 dev_err(&s_rt->slave->dev,
478
- "Chn prep failed for port:%d", prep_ch.num);
479
- return -ETIMEDOUT;
488
+ "Chn prep failed for port %d: %d\n", prep_ch.num, ret);
489
+ return ret;
480490 }
481491 }
482492
....@@ -486,13 +496,14 @@
486496 /* Disable interrupt after Port de-prepare */
487497 if (!prep && intr)
488498 ret = sdw_configure_dpn_intr(s_rt->slave, p_rt->num, prep,
489
- dpn_prop->device_interrupts);
499
+ dpn_prop->imp_def_interrupts);
490500
491501 return ret;
492502 }
493503
494504 static int sdw_prep_deprep_master_ports(struct sdw_master_runtime *m_rt,
495
- struct sdw_port_runtime *p_rt, bool prep)
505
+ struct sdw_port_runtime *p_rt,
506
+ bool prep)
496507 {
497508 struct sdw_transport_params *t_params = &p_rt->transport_params;
498509 struct sdw_bus *bus = m_rt->bus;
....@@ -509,8 +520,8 @@
509520 if (ops->dpn_port_prep) {
510521 ret = ops->dpn_port_prep(bus, &prep_ch);
511522 if (ret < 0) {
512
- dev_err(bus->dev, "Port prepare failed for port:%d",
513
- t_params->port_num);
523
+ dev_err(bus->dev, "Port prepare failed for port:%d\n",
524
+ t_params->port_num);
514525 return ret;
515526 }
516527 }
....@@ -527,7 +538,7 @@
527538 */
528539 static int sdw_prep_deprep_ports(struct sdw_master_runtime *m_rt, bool prep)
529540 {
530
- struct sdw_slave_runtime *s_rt = NULL;
541
+ struct sdw_slave_runtime *s_rt;
531542 struct sdw_port_runtime *p_rt;
532543 int ret = 0;
533544
....@@ -535,7 +546,7 @@
535546 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
536547 list_for_each_entry(p_rt, &s_rt->port_list, port_node) {
537548 ret = sdw_prep_deprep_slave_ports(m_rt->bus, s_rt,
538
- p_rt, prep);
549
+ p_rt, prep);
539550 if (ret < 0)
540551 return ret;
541552 }
....@@ -577,10 +588,11 @@
577588
578589 if (slave->ops->bus_config) {
579590 ret = slave->ops->bus_config(slave, &bus->params);
580
- if (ret < 0)
581
- dev_err(bus->dev, "Notify Slave: %d failed",
582
- slave->dev_num);
583
- return ret;
591
+ if (ret < 0) {
592
+ dev_err(bus->dev, "Notify Slave: %d failed\n",
593
+ slave->dev_num);
594
+ return ret;
595
+ }
584596 }
585597 }
586598
....@@ -592,23 +604,36 @@
592604 * and Slave(s)
593605 *
594606 * @bus: SDW bus instance
607
+ * @prepare: true if sdw_program_params() is called by _prepare.
595608 */
596
-static int sdw_program_params(struct sdw_bus *bus)
609
+static int sdw_program_params(struct sdw_bus *bus, bool prepare)
597610 {
598
- struct sdw_master_runtime *m_rt = NULL;
611
+ struct sdw_master_runtime *m_rt;
599612 int ret = 0;
600613
601614 list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) {
615
+
616
+ /*
617
+ * this loop walks through all master runtimes for a
618
+ * bus, but the ports can only be configured while
619
+ * explicitly preparing a stream or handling an
620
+ * already-prepared stream otherwise.
621
+ */
622
+ if (!prepare &&
623
+ m_rt->stream->state == SDW_STREAM_CONFIGURED)
624
+ continue;
625
+
602626 ret = sdw_program_port_params(m_rt);
603627 if (ret < 0) {
604628 dev_err(bus->dev,
605
- "Program transport params failed: %d", ret);
629
+ "Program transport params failed: %d\n", ret);
606630 return ret;
607631 }
608632
609633 ret = sdw_notify_config(m_rt);
610634 if (ret < 0) {
611
- dev_err(bus->dev, "Notify bus config failed: %d", ret);
635
+ dev_err(bus->dev,
636
+ "Notify bus config failed: %d\n", ret);
612637 return ret;
613638 }
614639
....@@ -618,7 +643,7 @@
618643
619644 ret = sdw_enable_disable_ports(m_rt, true);
620645 if (ret < 0) {
621
- dev_err(bus->dev, "Enable channel failed: %d", ret);
646
+ dev_err(bus->dev, "Enable channel failed: %d\n", ret);
622647 return ret;
623648 }
624649 }
....@@ -626,17 +651,20 @@
626651 return ret;
627652 }
628653
629
-static int sdw_bank_switch(struct sdw_bus *bus)
654
+static int sdw_bank_switch(struct sdw_bus *bus, int m_rt_count)
630655 {
631656 int col_index, row_index;
657
+ bool multi_link;
632658 struct sdw_msg *wr_msg;
633
- u8 *wbuf = NULL;
634
- int ret = 0;
659
+ u8 *wbuf;
660
+ int ret;
635661 u16 addr;
636662
637663 wr_msg = kzalloc(sizeof(*wr_msg), GFP_KERNEL);
638664 if (!wr_msg)
639665 return -ENOMEM;
666
+
667
+ bus->defer_msg.msg = wr_msg;
640668
641669 wbuf = kzalloc(sizeof(*wbuf), GFP_KERNEL);
642670 if (!wbuf) {
....@@ -655,20 +683,32 @@
655683 addr = SDW_SCP_FRAMECTRL_B0;
656684
657685 sdw_fill_msg(wr_msg, NULL, addr, 1, SDW_BROADCAST_DEV_NUM,
658
- SDW_MSG_FLAG_WRITE, wbuf);
686
+ SDW_MSG_FLAG_WRITE, wbuf);
659687 wr_msg->ssp_sync = true;
660688
661
- ret = sdw_transfer(bus, wr_msg);
689
+ /*
690
+ * Set the multi_link flag only when both the hardware supports
691
+ * and hardware-based sync is required
692
+ */
693
+ multi_link = bus->multi_link && (m_rt_count >= bus->hw_sync_min_links);
694
+
695
+ if (multi_link)
696
+ ret = sdw_transfer_defer(bus, wr_msg, &bus->defer_msg);
697
+ else
698
+ ret = sdw_transfer(bus, wr_msg);
699
+
662700 if (ret < 0) {
663
- dev_err(bus->dev, "Slave frame_ctrl reg write failed");
701
+ dev_err(bus->dev, "Slave frame_ctrl reg write failed\n");
664702 goto error;
665703 }
666704
667
- kfree(wr_msg);
668
- kfree(wbuf);
669
- bus->defer_msg.msg = NULL;
670
- bus->params.curr_bank = !bus->params.curr_bank;
671
- bus->params.next_bank = !bus->params.next_bank;
705
+ if (!multi_link) {
706
+ kfree(wr_msg);
707
+ kfree(wbuf);
708
+ bus->defer_msg.msg = NULL;
709
+ bus->params.curr_bank = !bus->params.curr_bank;
710
+ bus->params.next_bank = !bus->params.next_bank;
711
+ }
672712
673713 return 0;
674714
....@@ -676,40 +716,146 @@
676716 kfree(wbuf);
677717 error_1:
678718 kfree(wr_msg);
719
+ bus->defer_msg.msg = NULL;
679720 return ret;
721
+}
722
+
723
+/**
724
+ * sdw_ml_sync_bank_switch: Multilink register bank switch
725
+ *
726
+ * @bus: SDW bus instance
727
+ *
728
+ * Caller function should free the buffers on error
729
+ */
730
+static int sdw_ml_sync_bank_switch(struct sdw_bus *bus)
731
+{
732
+ unsigned long time_left;
733
+
734
+ if (!bus->multi_link)
735
+ return 0;
736
+
737
+ /* Wait for completion of transfer */
738
+ time_left = wait_for_completion_timeout(&bus->defer_msg.complete,
739
+ bus->bank_switch_timeout);
740
+
741
+ if (!time_left) {
742
+ dev_err(bus->dev, "Controller Timed out on bank switch\n");
743
+ return -ETIMEDOUT;
744
+ }
745
+
746
+ bus->params.curr_bank = !bus->params.curr_bank;
747
+ bus->params.next_bank = !bus->params.next_bank;
748
+
749
+ if (bus->defer_msg.msg) {
750
+ kfree(bus->defer_msg.msg->buf);
751
+ kfree(bus->defer_msg.msg);
752
+ }
753
+
754
+ return 0;
680755 }
681756
682757 static int do_bank_switch(struct sdw_stream_runtime *stream)
683758 {
684
- struct sdw_master_runtime *m_rt = stream->m_rt;
759
+ struct sdw_master_runtime *m_rt;
685760 const struct sdw_master_ops *ops;
686
- struct sdw_bus *bus = m_rt->bus;
761
+ struct sdw_bus *bus;
762
+ bool multi_link = false;
763
+ int m_rt_count;
687764 int ret = 0;
688765
689
- ops = bus->ops;
766
+ m_rt_count = stream->m_rt_count;
690767
691
- /* Pre-bank switch */
692
- if (ops->pre_bank_switch) {
693
- ret = ops->pre_bank_switch(bus);
768
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
769
+ bus = m_rt->bus;
770
+ ops = bus->ops;
771
+
772
+ if (bus->multi_link && m_rt_count >= bus->hw_sync_min_links) {
773
+ multi_link = true;
774
+ mutex_lock(&bus->msg_lock);
775
+ }
776
+
777
+ /* Pre-bank switch */
778
+ if (ops->pre_bank_switch) {
779
+ ret = ops->pre_bank_switch(bus);
780
+ if (ret < 0) {
781
+ dev_err(bus->dev,
782
+ "Pre bank switch op failed: %d\n", ret);
783
+ goto msg_unlock;
784
+ }
785
+ }
786
+
787
+ /*
788
+ * Perform Bank switch operation.
789
+ * For multi link cases, the actual bank switch is
790
+ * synchronized across all Masters and happens later as a
791
+ * part of post_bank_switch ops.
792
+ */
793
+ ret = sdw_bank_switch(bus, m_rt_count);
694794 if (ret < 0) {
695
- dev_err(bus->dev, "Pre bank switch op failed: %d", ret);
696
- return ret;
795
+ dev_err(bus->dev, "Bank switch failed: %d\n", ret);
796
+ goto error;
697797 }
698798 }
699799
700
- /* Bank switch */
701
- ret = sdw_bank_switch(bus);
702
- if (ret < 0) {
703
- dev_err(bus->dev, "Bank switch failed: %d", ret);
704
- return ret;
705
- }
800
+ /*
801
+ * For multi link cases, it is expected that the bank switch is
802
+ * triggered by the post_bank_switch for the first Master in the list
803
+ * and for the other Masters the post_bank_switch() should return doing
804
+ * nothing.
805
+ */
806
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
807
+ bus = m_rt->bus;
808
+ ops = bus->ops;
706809
707
- /* Post-bank switch */
708
- if (ops->post_bank_switch) {
709
- ret = ops->post_bank_switch(bus);
810
+ /* Post-bank switch */
811
+ if (ops->post_bank_switch) {
812
+ ret = ops->post_bank_switch(bus);
813
+ if (ret < 0) {
814
+ dev_err(bus->dev,
815
+ "Post bank switch op failed: %d\n",
816
+ ret);
817
+ goto error;
818
+ }
819
+ } else if (multi_link) {
820
+ dev_err(bus->dev,
821
+ "Post bank switch ops not implemented\n");
822
+ goto error;
823
+ }
824
+
825
+ /* Set the bank switch timeout to default, if not set */
826
+ if (!bus->bank_switch_timeout)
827
+ bus->bank_switch_timeout = DEFAULT_BANK_SWITCH_TIMEOUT;
828
+
829
+ /* Check if bank switch was successful */
830
+ ret = sdw_ml_sync_bank_switch(bus);
710831 if (ret < 0) {
711832 dev_err(bus->dev,
712
- "Post bank switch op failed: %d", ret);
833
+ "multi link bank switch failed: %d\n", ret);
834
+ goto error;
835
+ }
836
+
837
+ if (multi_link)
838
+ mutex_unlock(&bus->msg_lock);
839
+ }
840
+
841
+ return ret;
842
+
843
+error:
844
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
845
+ bus = m_rt->bus;
846
+ if (bus->defer_msg.msg) {
847
+ kfree(bus->defer_msg.msg->buf);
848
+ kfree(bus->defer_msg.msg);
849
+ }
850
+ }
851
+
852
+msg_unlock:
853
+
854
+ if (multi_link) {
855
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
856
+ bus = m_rt->bus;
857
+ if (mutex_is_locked(&bus->msg_lock))
858
+ mutex_unlock(&bus->msg_lock);
713859 }
714860 }
715861
....@@ -738,7 +884,7 @@
738884 * sdw_alloc_stream should be called only once per stream. Typically
739885 * invoked from ALSA/ASoC machine/platform driver.
740886 */
741
-struct sdw_stream_runtime *sdw_alloc_stream(char *stream_name)
887
+struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name)
742888 {
743889 struct sdw_stream_runtime *stream;
744890
....@@ -747,11 +893,28 @@
747893 return NULL;
748894
749895 stream->name = stream_name;
896
+ INIT_LIST_HEAD(&stream->master_list);
750897 stream->state = SDW_STREAM_ALLOCATED;
898
+ stream->m_rt_count = 0;
751899
752900 return stream;
753901 }
754902 EXPORT_SYMBOL(sdw_alloc_stream);
903
+
904
+static struct sdw_master_runtime
905
+*sdw_find_master_rt(struct sdw_bus *bus,
906
+ struct sdw_stream_runtime *stream)
907
+{
908
+ struct sdw_master_runtime *m_rt;
909
+
910
+ /* Retrieve Bus handle if already available */
911
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
912
+ if (m_rt->bus == bus)
913
+ return m_rt;
914
+ }
915
+
916
+ return NULL;
917
+}
755918
756919 /**
757920 * sdw_alloc_master_rt() - Allocates and initialize Master runtime handle
....@@ -764,17 +927,16 @@
764927 */
765928 static struct sdw_master_runtime
766929 *sdw_alloc_master_rt(struct sdw_bus *bus,
767
- struct sdw_stream_config *stream_config,
768
- struct sdw_stream_runtime *stream)
930
+ struct sdw_stream_config *stream_config,
931
+ struct sdw_stream_runtime *stream)
769932 {
770933 struct sdw_master_runtime *m_rt;
771
-
772
- m_rt = stream->m_rt;
773934
774935 /*
775936 * check if Master is already allocated (as a result of Slave adding
776937 * it first), if so skip allocation and go to configure
777938 */
939
+ m_rt = sdw_find_master_rt(bus, stream);
778940 if (m_rt)
779941 goto stream_config;
780942
....@@ -785,7 +947,7 @@
785947 /* Initialization of Master runtime handle */
786948 INIT_LIST_HEAD(&m_rt->port_list);
787949 INIT_LIST_HEAD(&m_rt->slave_rt_list);
788
- stream->m_rt = m_rt;
950
+ list_add_tail(&m_rt->stream_node, &stream->master_list);
789951
790952 list_add_tail(&m_rt->bus_node, &bus->m_rt_list);
791953
....@@ -809,10 +971,10 @@
809971 */
810972 static struct sdw_slave_runtime
811973 *sdw_alloc_slave_rt(struct sdw_slave *slave,
812
- struct sdw_stream_config *stream_config,
813
- struct sdw_stream_runtime *stream)
974
+ struct sdw_stream_config *stream_config,
975
+ struct sdw_stream_runtime *stream)
814976 {
815
- struct sdw_slave_runtime *s_rt = NULL;
977
+ struct sdw_slave_runtime *s_rt;
816978
817979 s_rt = kzalloc(sizeof(*s_rt), GFP_KERNEL);
818980 if (!s_rt)
....@@ -827,33 +989,34 @@
827989 }
828990
829991 static void sdw_master_port_release(struct sdw_bus *bus,
830
- struct sdw_master_runtime *m_rt)
992
+ struct sdw_master_runtime *m_rt)
831993 {
832994 struct sdw_port_runtime *p_rt, *_p_rt;
833995
834
- list_for_each_entry_safe(p_rt, _p_rt,
835
- &m_rt->port_list, port_node) {
996
+ list_for_each_entry_safe(p_rt, _p_rt, &m_rt->port_list, port_node) {
836997 list_del(&p_rt->port_node);
837998 kfree(p_rt);
838999 }
8391000 }
8401001
8411002 static void sdw_slave_port_release(struct sdw_bus *bus,
842
- struct sdw_slave *slave,
843
- struct sdw_stream_runtime *stream)
1003
+ struct sdw_slave *slave,
1004
+ struct sdw_stream_runtime *stream)
8441005 {
8451006 struct sdw_port_runtime *p_rt, *_p_rt;
846
- struct sdw_master_runtime *m_rt = stream->m_rt;
1007
+ struct sdw_master_runtime *m_rt;
8471008 struct sdw_slave_runtime *s_rt;
8481009
849
- list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
850
- if (s_rt->slave != slave)
851
- continue;
1010
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1011
+ list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) {
1012
+ if (s_rt->slave != slave)
1013
+ continue;
8521014
853
- list_for_each_entry_safe(p_rt, _p_rt,
854
- &s_rt->port_list, port_node) {
855
- list_del(&p_rt->port_node);
856
- kfree(p_rt);
1015
+ list_for_each_entry_safe(p_rt, _p_rt,
1016
+ &s_rt->port_list, port_node) {
1017
+ list_del(&p_rt->port_node);
1018
+ kfree(p_rt);
1019
+ }
8571020 }
8581021 }
8591022 }
....@@ -867,19 +1030,20 @@
8671030 * This function is to be called with bus_lock held.
8681031 */
8691032 static void sdw_release_slave_stream(struct sdw_slave *slave,
870
- struct sdw_stream_runtime *stream)
1033
+ struct sdw_stream_runtime *stream)
8711034 {
8721035 struct sdw_slave_runtime *s_rt, *_s_rt;
873
- struct sdw_master_runtime *m_rt = stream->m_rt;
1036
+ struct sdw_master_runtime *m_rt;
8741037
875
- /* Retrieve Slave runtime handle */
876
- list_for_each_entry_safe(s_rt, _s_rt,
877
- &m_rt->slave_rt_list, m_rt_node) {
878
-
879
- if (s_rt->slave == slave) {
880
- list_del(&s_rt->m_rt_node);
881
- kfree(s_rt);
882
- return;
1038
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1039
+ /* Retrieve Slave runtime handle */
1040
+ list_for_each_entry_safe(s_rt, _s_rt,
1041
+ &m_rt->slave_rt_list, m_rt_node) {
1042
+ if (s_rt->slave == slave) {
1043
+ list_del(&s_rt->m_rt_node);
1044
+ kfree(s_rt);
1045
+ return;
1046
+ }
8831047 }
8841048 }
8851049 }
....@@ -887,6 +1051,7 @@
8871051 /**
8881052 * sdw_release_master_stream() - Free Master runtime handle
8891053 *
1054
+ * @m_rt: Master runtime node
8901055 * @stream: Stream runtime handle.
8911056 *
8921057 * This function is to be called with bus_lock held
....@@ -894,9 +1059,9 @@
8941059 * handle. If this is called first then sdw_release_slave_stream() will have
8951060 * no effect as Slave(s) runtime handle would already be freed up.
8961061 */
897
-static void sdw_release_master_stream(struct sdw_stream_runtime *stream)
1062
+static void sdw_release_master_stream(struct sdw_master_runtime *m_rt,
1063
+ struct sdw_stream_runtime *stream)
8981064 {
899
- struct sdw_master_runtime *m_rt = stream->m_rt;
9001065 struct sdw_slave_runtime *s_rt, *_s_rt;
9011066
9021067 list_for_each_entry_safe(s_rt, _s_rt, &m_rt->slave_rt_list, m_rt_node) {
....@@ -904,7 +1069,9 @@
9041069 sdw_release_slave_stream(s_rt->slave, stream);
9051070 }
9061071
1072
+ list_del(&m_rt->stream_node);
9071073 list_del(&m_rt->bus_node);
1074
+ kfree(m_rt);
9081075 }
9091076
9101077 /**
....@@ -916,15 +1083,24 @@
9161083 * This removes and frees port_rt and master_rt from a stream
9171084 */
9181085 int sdw_stream_remove_master(struct sdw_bus *bus,
919
- struct sdw_stream_runtime *stream)
1086
+ struct sdw_stream_runtime *stream)
9201087 {
1088
+ struct sdw_master_runtime *m_rt, *_m_rt;
1089
+
9211090 mutex_lock(&bus->bus_lock);
9221091
923
- sdw_release_master_stream(stream);
924
- sdw_master_port_release(bus, stream->m_rt);
925
- stream->state = SDW_STREAM_RELEASED;
926
- kfree(stream->m_rt);
927
- stream->m_rt = NULL;
1092
+ list_for_each_entry_safe(m_rt, _m_rt,
1093
+ &stream->master_list, stream_node) {
1094
+ if (m_rt->bus != bus)
1095
+ continue;
1096
+
1097
+ sdw_master_port_release(bus, m_rt);
1098
+ sdw_release_master_stream(m_rt, stream);
1099
+ stream->m_rt_count--;
1100
+ }
1101
+
1102
+ if (list_empty(&stream->master_list))
1103
+ stream->state = SDW_STREAM_RELEASED;
9281104
9291105 mutex_unlock(&bus->bus_lock);
9301106
....@@ -941,7 +1117,7 @@
9411117 * This removes and frees port_rt and slave_rt from a stream
9421118 */
9431119 int sdw_stream_remove_slave(struct sdw_slave *slave,
944
- struct sdw_stream_runtime *stream)
1120
+ struct sdw_stream_runtime *stream)
9451121 {
9461122 mutex_lock(&slave->bus->bus_lock);
9471123
....@@ -965,8 +1141,9 @@
9651141 * This function is to be called with bus_lock held.
9661142 */
9671143 static int sdw_config_stream(struct device *dev,
968
- struct sdw_stream_runtime *stream,
969
- struct sdw_stream_config *stream_config, bool is_slave)
1144
+ struct sdw_stream_runtime *stream,
1145
+ struct sdw_stream_config *stream_config,
1146
+ bool is_slave)
9701147 {
9711148 /*
9721149 * Update the stream rate, channel and bps based on data
....@@ -977,14 +1154,14 @@
9771154 * comparison and allow the value to be set and stored in stream
9781155 */
9791156 if (stream->params.rate &&
980
- stream->params.rate != stream_config->frame_rate) {
981
- dev_err(dev, "rate not matching, stream:%s", stream->name);
1157
+ stream->params.rate != stream_config->frame_rate) {
1158
+ dev_err(dev, "rate not matching, stream:%s\n", stream->name);
9821159 return -EINVAL;
9831160 }
9841161
9851162 if (stream->params.bps &&
986
- stream->params.bps != stream_config->bps) {
987
- dev_err(dev, "bps not matching, stream:%s", stream->name);
1163
+ stream->params.bps != stream_config->bps) {
1164
+ dev_err(dev, "bps not matching, stream:%s\n", stream->name);
9881165 return -EINVAL;
9891166 }
9901167
....@@ -1000,20 +1177,21 @@
10001177 }
10011178
10021179 static int sdw_is_valid_port_range(struct device *dev,
1003
- struct sdw_port_runtime *p_rt)
1180
+ struct sdw_port_runtime *p_rt)
10041181 {
10051182 if (!SDW_VALID_PORT_RANGE(p_rt->num)) {
10061183 dev_err(dev,
1007
- "SoundWire: Invalid port number :%d", p_rt->num);
1184
+ "SoundWire: Invalid port number :%d\n", p_rt->num);
10081185 return -EINVAL;
10091186 }
10101187
10111188 return 0;
10121189 }
10131190
1014
-static struct sdw_port_runtime *sdw_port_alloc(struct device *dev,
1015
- struct sdw_port_config *port_config,
1016
- int port_index)
1191
+static struct sdw_port_runtime
1192
+*sdw_port_alloc(struct device *dev,
1193
+ struct sdw_port_config *port_config,
1194
+ int port_index)
10171195 {
10181196 struct sdw_port_runtime *p_rt;
10191197
....@@ -1028,9 +1206,9 @@
10281206 }
10291207
10301208 static int sdw_master_port_config(struct sdw_bus *bus,
1031
- struct sdw_master_runtime *m_rt,
1032
- struct sdw_port_config *port_config,
1033
- unsigned int num_ports)
1209
+ struct sdw_master_runtime *m_rt,
1210
+ struct sdw_port_config *port_config,
1211
+ unsigned int num_ports)
10341212 {
10351213 struct sdw_port_runtime *p_rt;
10361214 int i;
....@@ -1053,9 +1231,9 @@
10531231 }
10541232
10551233 static int sdw_slave_port_config(struct sdw_slave *slave,
1056
- struct sdw_slave_runtime *s_rt,
1057
- struct sdw_port_config *port_config,
1058
- unsigned int num_config)
1234
+ struct sdw_slave_runtime *s_rt,
1235
+ struct sdw_port_config *port_config,
1236
+ unsigned int num_config)
10591237 {
10601238 struct sdw_port_runtime *p_rt;
10611239 int i, ret;
....@@ -1097,21 +1275,33 @@
10971275 * @stream: SoundWire stream
10981276 */
10991277 int sdw_stream_add_master(struct sdw_bus *bus,
1100
- struct sdw_stream_config *stream_config,
1101
- struct sdw_port_config *port_config,
1102
- unsigned int num_ports,
1103
- struct sdw_stream_runtime *stream)
1278
+ struct sdw_stream_config *stream_config,
1279
+ struct sdw_port_config *port_config,
1280
+ unsigned int num_ports,
1281
+ struct sdw_stream_runtime *stream)
11041282 {
1105
- struct sdw_master_runtime *m_rt = NULL;
1283
+ struct sdw_master_runtime *m_rt;
11061284 int ret;
11071285
11081286 mutex_lock(&bus->bus_lock);
11091287
1288
+ /*
1289
+ * For multi link streams, add the second master only if
1290
+ * the bus supports it.
1291
+ * Check if bus->multi_link is set
1292
+ */
1293
+ if (!bus->multi_link && stream->m_rt_count > 0) {
1294
+ dev_err(bus->dev,
1295
+ "Multilink not supported, link %d\n", bus->link_id);
1296
+ ret = -EINVAL;
1297
+ goto unlock;
1298
+ }
1299
+
11101300 m_rt = sdw_alloc_master_rt(bus, stream_config, stream);
11111301 if (!m_rt) {
11121302 dev_err(bus->dev,
1113
- "Master runtime config failed for stream:%s",
1114
- stream->name);
1303
+ "Master runtime config failed for stream:%s\n",
1304
+ stream->name);
11151305 ret = -ENOMEM;
11161306 goto unlock;
11171307 }
....@@ -1124,10 +1314,12 @@
11241314 if (ret)
11251315 goto stream_error;
11261316
1317
+ stream->m_rt_count++;
1318
+
11271319 goto unlock;
11281320
11291321 stream_error:
1130
- sdw_release_master_stream(stream);
1322
+ sdw_release_master_stream(m_rt, stream);
11311323 unlock:
11321324 mutex_unlock(&bus->bus_lock);
11331325 return ret;
....@@ -1148,10 +1340,10 @@
11481340 *
11491341 */
11501342 int sdw_stream_add_slave(struct sdw_slave *slave,
1151
- struct sdw_stream_config *stream_config,
1152
- struct sdw_port_config *port_config,
1153
- unsigned int num_ports,
1154
- struct sdw_stream_runtime *stream)
1343
+ struct sdw_stream_config *stream_config,
1344
+ struct sdw_port_config *port_config,
1345
+ unsigned int num_ports,
1346
+ struct sdw_stream_runtime *stream)
11551347 {
11561348 struct sdw_slave_runtime *s_rt;
11571349 struct sdw_master_runtime *m_rt;
....@@ -1166,8 +1358,8 @@
11661358 m_rt = sdw_alloc_master_rt(slave->bus, stream_config, stream);
11671359 if (!m_rt) {
11681360 dev_err(&slave->dev,
1169
- "alloc master runtime failed for stream:%s",
1170
- stream->name);
1361
+ "alloc master runtime failed for stream:%s\n",
1362
+ stream->name);
11711363 ret = -ENOMEM;
11721364 goto error;
11731365 }
....@@ -1175,8 +1367,8 @@
11751367 s_rt = sdw_alloc_slave_rt(slave, stream_config, stream);
11761368 if (!s_rt) {
11771369 dev_err(&slave->dev,
1178
- "Slave runtime config failed for stream:%s",
1179
- stream->name);
1370
+ "Slave runtime config failed for stream:%s\n",
1371
+ stream->name);
11801372 ret = -ENOMEM;
11811373 goto stream_error;
11821374 }
....@@ -1213,7 +1405,7 @@
12131405 * we hit error so cleanup the stream, release all Slave(s) and
12141406 * Master runtime
12151407 */
1216
- sdw_release_master_stream(stream);
1408
+ sdw_release_master_stream(m_rt, stream);
12171409 error:
12181410 mutex_unlock(&slave->bus->bus_lock);
12191411 return ret;
....@@ -1228,8 +1420,8 @@
12281420 * @port_num: Port number
12291421 */
12301422 struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,
1231
- enum sdw_data_direction direction,
1232
- unsigned int port_num)
1423
+ enum sdw_data_direction direction,
1424
+ unsigned int port_num)
12331425 {
12341426 struct sdw_dpn_prop *dpn_prop;
12351427 u8 num_ports;
....@@ -1251,47 +1443,119 @@
12511443 return NULL;
12521444 }
12531445
1254
-static int _sdw_prepare_stream(struct sdw_stream_runtime *stream)
1446
+/**
1447
+ * sdw_acquire_bus_lock: Acquire bus lock for all Master runtime(s)
1448
+ *
1449
+ * @stream: SoundWire stream
1450
+ *
1451
+ * Acquire bus_lock for each of the master runtime(m_rt) part of this
1452
+ * stream to reconfigure the bus.
1453
+ * NOTE: This function is called from SoundWire stream ops and is
1454
+ * expected that a global lock is held before acquiring bus_lock.
1455
+ */
1456
+static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream)
12551457 {
1256
- struct sdw_master_runtime *m_rt = stream->m_rt;
1257
- struct sdw_bus *bus = m_rt->bus;
1258
- struct sdw_master_prop *prop = NULL;
1458
+ struct sdw_master_runtime *m_rt;
1459
+ struct sdw_bus *bus = NULL;
1460
+
1461
+ /* Iterate for all Master(s) in Master list */
1462
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1463
+ bus = m_rt->bus;
1464
+
1465
+ mutex_lock(&bus->bus_lock);
1466
+ }
1467
+}
1468
+
1469
+/**
1470
+ * sdw_release_bus_lock: Release bus lock for all Master runtime(s)
1471
+ *
1472
+ * @stream: SoundWire stream
1473
+ *
1474
+ * Release the previously held bus_lock after reconfiguring the bus.
1475
+ * NOTE: This function is called from SoundWire stream ops and is
1476
+ * expected that a global lock is held before releasing bus_lock.
1477
+ */
1478
+static void sdw_release_bus_lock(struct sdw_stream_runtime *stream)
1479
+{
1480
+ struct sdw_master_runtime *m_rt = NULL;
1481
+ struct sdw_bus *bus = NULL;
1482
+
1483
+ /* Iterate for all Master(s) in Master list */
1484
+ list_for_each_entry_reverse(m_rt, &stream->master_list, stream_node) {
1485
+ bus = m_rt->bus;
1486
+ mutex_unlock(&bus->bus_lock);
1487
+ }
1488
+}
1489
+
1490
+static int _sdw_prepare_stream(struct sdw_stream_runtime *stream,
1491
+ bool update_params)
1492
+{
1493
+ struct sdw_master_runtime *m_rt;
1494
+ struct sdw_bus *bus = NULL;
1495
+ struct sdw_master_prop *prop;
12591496 struct sdw_bus_params params;
12601497 int ret;
12611498
1262
- prop = &bus->prop;
1263
- memcpy(&params, &bus->params, sizeof(params));
1499
+ /* Prepare Master(s) and Slave(s) port(s) associated with stream */
1500
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1501
+ bus = m_rt->bus;
1502
+ prop = &bus->prop;
1503
+ memcpy(&params, &bus->params, sizeof(params));
12641504
1265
- /* TODO: Support Asynchronous mode */
1266
- if ((prop->max_freq % stream->params.rate) != 0) {
1267
- dev_err(bus->dev, "Async mode not supported");
1268
- return -EINVAL;
1505
+ /* TODO: Support Asynchronous mode */
1506
+ if ((prop->max_clk_freq % stream->params.rate) != 0) {
1507
+ dev_err(bus->dev, "Async mode not supported\n");
1508
+ return -EINVAL;
1509
+ }
1510
+
1511
+ if (!update_params)
1512
+ goto program_params;
1513
+
1514
+ /* Increment cumulative bus bandwidth */
1515
+ /* TODO: Update this during Device-Device support */
1516
+ bus->params.bandwidth += m_rt->stream->params.rate *
1517
+ m_rt->ch_count * m_rt->stream->params.bps;
1518
+
1519
+ /* Compute params */
1520
+ if (bus->compute_params) {
1521
+ ret = bus->compute_params(bus);
1522
+ if (ret < 0) {
1523
+ dev_err(bus->dev, "Compute params failed: %d",
1524
+ ret);
1525
+ return ret;
1526
+ }
1527
+ }
1528
+
1529
+program_params:
1530
+ /* Program params */
1531
+ ret = sdw_program_params(bus, true);
1532
+ if (ret < 0) {
1533
+ dev_err(bus->dev, "Program params failed: %d\n", ret);
1534
+ goto restore_params;
1535
+ }
12691536 }
12701537
1271
- /* Increment cumulative bus bandwidth */
1272
- /* TODO: Update this during Device-Device support */
1273
- bus->params.bandwidth += m_rt->stream->params.rate *
1274
- m_rt->ch_count * m_rt->stream->params.bps;
1275
-
1276
- /* Program params */
1277
- ret = sdw_program_params(bus);
1278
- if (ret < 0) {
1279
- dev_err(bus->dev, "Program params failed: %d", ret);
1280
- goto restore_params;
1538
+ if (!bus) {
1539
+ pr_err("Configuration error in %s\n", __func__);
1540
+ return -EINVAL;
12811541 }
12821542
12831543 ret = do_bank_switch(stream);
12841544 if (ret < 0) {
1285
- dev_err(bus->dev, "Bank switch failed: %d", ret);
1545
+ dev_err(bus->dev, "Bank switch failed: %d\n", ret);
12861546 goto restore_params;
12871547 }
12881548
1289
- /* Prepare port(s) on the new clock configuration */
1290
- ret = sdw_prep_deprep_ports(m_rt, true);
1291
- if (ret < 0) {
1292
- dev_err(bus->dev, "Prepare port(s) failed ret = %d",
1549
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1550
+ bus = m_rt->bus;
1551
+
1552
+ /* Prepare port(s) on the new clock configuration */
1553
+ ret = sdw_prep_deprep_ports(m_rt, true);
1554
+ if (ret < 0) {
1555
+ dev_err(bus->dev, "Prepare port(s) failed ret = %d\n",
12931556 ret);
1294
- return ret;
1557
+ return ret;
1558
+ }
12951559 }
12961560
12971561 stream->state = SDW_STREAM_PREPARED;
....@@ -1312,47 +1576,81 @@
13121576 */
13131577 int sdw_prepare_stream(struct sdw_stream_runtime *stream)
13141578 {
1315
- int ret = 0;
1579
+ bool update_params = true;
1580
+ int ret;
13161581
13171582 if (!stream) {
1318
- pr_err("SoundWire: Handle not found for stream");
1583
+ pr_err("SoundWire: Handle not found for stream\n");
13191584 return -EINVAL;
13201585 }
13211586
1322
- mutex_lock(&stream->m_rt->bus->bus_lock);
1587
+ sdw_acquire_bus_lock(stream);
13231588
1324
- ret = _sdw_prepare_stream(stream);
1325
- if (ret < 0)
1326
- pr_err("Prepare for stream:%s failed: %d", stream->name, ret);
1589
+ if (stream->state == SDW_STREAM_PREPARED) {
1590
+ ret = 0;
1591
+ goto state_err;
1592
+ }
13271593
1328
- mutex_unlock(&stream->m_rt->bus->bus_lock);
1594
+ if (stream->state != SDW_STREAM_CONFIGURED &&
1595
+ stream->state != SDW_STREAM_DEPREPARED &&
1596
+ stream->state != SDW_STREAM_DISABLED) {
1597
+ pr_err("%s: %s: inconsistent state state %d\n",
1598
+ __func__, stream->name, stream->state);
1599
+ ret = -EINVAL;
1600
+ goto state_err;
1601
+ }
1602
+
1603
+ /*
1604
+ * when the stream is DISABLED, this means sdw_prepare_stream()
1605
+ * is called as a result of an underflow or a resume operation.
1606
+ * In this case, the bus parameters shall not be recomputed, but
1607
+ * still need to be re-applied
1608
+ */
1609
+ if (stream->state == SDW_STREAM_DISABLED)
1610
+ update_params = false;
1611
+
1612
+ ret = _sdw_prepare_stream(stream, update_params);
1613
+
1614
+state_err:
1615
+ sdw_release_bus_lock(stream);
13291616 return ret;
13301617 }
13311618 EXPORT_SYMBOL(sdw_prepare_stream);
13321619
13331620 static int _sdw_enable_stream(struct sdw_stream_runtime *stream)
13341621 {
1335
- struct sdw_master_runtime *m_rt = stream->m_rt;
1336
- struct sdw_bus *bus = m_rt->bus;
1622
+ struct sdw_master_runtime *m_rt;
1623
+ struct sdw_bus *bus = NULL;
13371624 int ret;
13381625
1339
- /* Program params */
1340
- ret = sdw_program_params(bus);
1341
- if (ret < 0) {
1342
- dev_err(bus->dev, "Program params failed: %d", ret);
1343
- return ret;
1626
+ /* Enable Master(s) and Slave(s) port(s) associated with stream */
1627
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1628
+ bus = m_rt->bus;
1629
+
1630
+ /* Program params */
1631
+ ret = sdw_program_params(bus, false);
1632
+ if (ret < 0) {
1633
+ dev_err(bus->dev, "Program params failed: %d\n", ret);
1634
+ return ret;
1635
+ }
1636
+
1637
+ /* Enable port(s) */
1638
+ ret = sdw_enable_disable_ports(m_rt, true);
1639
+ if (ret < 0) {
1640
+ dev_err(bus->dev,
1641
+ "Enable port(s) failed ret: %d\n", ret);
1642
+ return ret;
1643
+ }
13441644 }
13451645
1346
- /* Enable port(s) */
1347
- ret = sdw_enable_disable_ports(m_rt, true);
1348
- if (ret < 0) {
1349
- dev_err(bus->dev, "Enable port(s) failed ret: %d", ret);
1350
- return ret;
1646
+ if (!bus) {
1647
+ pr_err("Configuration error in %s\n", __func__);
1648
+ return -EINVAL;
13511649 }
13521650
13531651 ret = do_bank_switch(stream);
13541652 if (ret < 0) {
1355
- dev_err(bus->dev, "Bank switch failed: %d", ret);
1653
+ dev_err(bus->dev, "Bank switch failed: %d\n", ret);
13561654 return ret;
13571655 }
13581656
....@@ -1369,47 +1667,78 @@
13691667 */
13701668 int sdw_enable_stream(struct sdw_stream_runtime *stream)
13711669 {
1372
- int ret = 0;
1670
+ int ret;
13731671
13741672 if (!stream) {
1375
- pr_err("SoundWire: Handle not found for stream");
1673
+ pr_err("SoundWire: Handle not found for stream\n");
13761674 return -EINVAL;
13771675 }
13781676
1379
- mutex_lock(&stream->m_rt->bus->bus_lock);
1677
+ sdw_acquire_bus_lock(stream);
1678
+
1679
+ if (stream->state != SDW_STREAM_PREPARED &&
1680
+ stream->state != SDW_STREAM_DISABLED) {
1681
+ pr_err("%s: %s: inconsistent state state %d\n",
1682
+ __func__, stream->name, stream->state);
1683
+ ret = -EINVAL;
1684
+ goto state_err;
1685
+ }
13801686
13811687 ret = _sdw_enable_stream(stream);
1382
- if (ret < 0)
1383
- pr_err("Enable for stream:%s failed: %d", stream->name, ret);
13841688
1385
- mutex_unlock(&stream->m_rt->bus->bus_lock);
1689
+state_err:
1690
+ sdw_release_bus_lock(stream);
13861691 return ret;
13871692 }
13881693 EXPORT_SYMBOL(sdw_enable_stream);
13891694
13901695 static int _sdw_disable_stream(struct sdw_stream_runtime *stream)
13911696 {
1392
- struct sdw_master_runtime *m_rt = stream->m_rt;
1393
- struct sdw_bus *bus = m_rt->bus;
1697
+ struct sdw_master_runtime *m_rt;
13941698 int ret;
13951699
1396
- /* Disable port(s) */
1397
- ret = sdw_enable_disable_ports(m_rt, false);
1398
- if (ret < 0) {
1399
- dev_err(bus->dev, "Disable port(s) failed: %d", ret);
1400
- return ret;
1401
- }
1700
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1701
+ struct sdw_bus *bus = m_rt->bus;
14021702
1703
+ /* Disable port(s) */
1704
+ ret = sdw_enable_disable_ports(m_rt, false);
1705
+ if (ret < 0) {
1706
+ dev_err(bus->dev, "Disable port(s) failed: %d\n", ret);
1707
+ return ret;
1708
+ }
1709
+ }
14031710 stream->state = SDW_STREAM_DISABLED;
14041711
1405
- /* Program params */
1406
- ret = sdw_program_params(bus);
1712
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1713
+ struct sdw_bus *bus = m_rt->bus;
1714
+
1715
+ /* Program params */
1716
+ ret = sdw_program_params(bus, false);
1717
+ if (ret < 0) {
1718
+ dev_err(bus->dev, "Program params failed: %d\n", ret);
1719
+ return ret;
1720
+ }
1721
+ }
1722
+
1723
+ ret = do_bank_switch(stream);
14071724 if (ret < 0) {
1408
- dev_err(bus->dev, "Program params failed: %d", ret);
1725
+ pr_err("Bank switch failed: %d\n", ret);
14091726 return ret;
14101727 }
14111728
1412
- return do_bank_switch(stream);
1729
+ /* make sure alternate bank (previous current) is also disabled */
1730
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1731
+ struct sdw_bus *bus = m_rt->bus;
1732
+
1733
+ /* Disable port(s) */
1734
+ ret = sdw_enable_disable_ports(m_rt, false);
1735
+ if (ret < 0) {
1736
+ dev_err(bus->dev, "Disable port(s) failed: %d\n", ret);
1737
+ return ret;
1738
+ }
1739
+ }
1740
+
1741
+ return 0;
14131742 }
14141743
14151744 /**
....@@ -1421,50 +1750,69 @@
14211750 */
14221751 int sdw_disable_stream(struct sdw_stream_runtime *stream)
14231752 {
1424
- int ret = 0;
1753
+ int ret;
14251754
14261755 if (!stream) {
1427
- pr_err("SoundWire: Handle not found for stream");
1756
+ pr_err("SoundWire: Handle not found for stream\n");
14281757 return -EINVAL;
14291758 }
14301759
1431
- mutex_lock(&stream->m_rt->bus->bus_lock);
1760
+ sdw_acquire_bus_lock(stream);
1761
+
1762
+ if (stream->state != SDW_STREAM_ENABLED) {
1763
+ pr_err("%s: %s: inconsistent state state %d\n",
1764
+ __func__, stream->name, stream->state);
1765
+ ret = -EINVAL;
1766
+ goto state_err;
1767
+ }
14321768
14331769 ret = _sdw_disable_stream(stream);
1434
- if (ret < 0)
1435
- pr_err("Disable for stream:%s failed: %d", stream->name, ret);
14361770
1437
- mutex_unlock(&stream->m_rt->bus->bus_lock);
1771
+state_err:
1772
+ sdw_release_bus_lock(stream);
14381773 return ret;
14391774 }
14401775 EXPORT_SYMBOL(sdw_disable_stream);
14411776
14421777 static int _sdw_deprepare_stream(struct sdw_stream_runtime *stream)
14431778 {
1444
- struct sdw_master_runtime *m_rt = stream->m_rt;
1445
- struct sdw_bus *bus = m_rt->bus;
1779
+ struct sdw_master_runtime *m_rt;
1780
+ struct sdw_bus *bus;
14461781 int ret = 0;
14471782
1448
- /* De-prepare port(s) */
1449
- ret = sdw_prep_deprep_ports(m_rt, false);
1450
- if (ret < 0) {
1451
- dev_err(bus->dev, "De-prepare port(s) failed: %d", ret);
1452
- return ret;
1783
+ list_for_each_entry(m_rt, &stream->master_list, stream_node) {
1784
+ bus = m_rt->bus;
1785
+ /* De-prepare port(s) */
1786
+ ret = sdw_prep_deprep_ports(m_rt, false);
1787
+ if (ret < 0) {
1788
+ dev_err(bus->dev,
1789
+ "De-prepare port(s) failed: %d\n", ret);
1790
+ return ret;
1791
+ }
1792
+
1793
+ /* TODO: Update this during Device-Device support */
1794
+ bus->params.bandwidth -= m_rt->stream->params.rate *
1795
+ m_rt->ch_count * m_rt->stream->params.bps;
1796
+
1797
+ /* Compute params */
1798
+ if (bus->compute_params) {
1799
+ ret = bus->compute_params(bus);
1800
+ if (ret < 0) {
1801
+ dev_err(bus->dev, "Compute params failed: %d",
1802
+ ret);
1803
+ return ret;
1804
+ }
1805
+ }
1806
+
1807
+ /* Program params */
1808
+ ret = sdw_program_params(bus, false);
1809
+ if (ret < 0) {
1810
+ dev_err(bus->dev, "Program params failed: %d\n", ret);
1811
+ return ret;
1812
+ }
14531813 }
14541814
14551815 stream->state = SDW_STREAM_DEPREPARED;
1456
-
1457
- /* TODO: Update this during Device-Device support */
1458
- bus->params.bandwidth -= m_rt->stream->params.rate *
1459
- m_rt->ch_count * m_rt->stream->params.bps;
1460
-
1461
- /* Program params */
1462
- ret = sdw_program_params(bus);
1463
- if (ret < 0) {
1464
- dev_err(bus->dev, "Program params failed: %d", ret);
1465
- return ret;
1466
- }
1467
-
14681816 return do_bank_switch(stream);
14691817 }
14701818
....@@ -1477,20 +1825,124 @@
14771825 */
14781826 int sdw_deprepare_stream(struct sdw_stream_runtime *stream)
14791827 {
1480
- int ret = 0;
1828
+ int ret;
14811829
14821830 if (!stream) {
1483
- pr_err("SoundWire: Handle not found for stream");
1831
+ pr_err("SoundWire: Handle not found for stream\n");
14841832 return -EINVAL;
14851833 }
14861834
1487
- mutex_lock(&stream->m_rt->bus->bus_lock);
1835
+ sdw_acquire_bus_lock(stream);
1836
+
1837
+ if (stream->state != SDW_STREAM_PREPARED &&
1838
+ stream->state != SDW_STREAM_DISABLED) {
1839
+ pr_err("%s: %s: inconsistent state state %d\n",
1840
+ __func__, stream->name, stream->state);
1841
+ ret = -EINVAL;
1842
+ goto state_err;
1843
+ }
14881844
14891845 ret = _sdw_deprepare_stream(stream);
1490
- if (ret < 0)
1491
- pr_err("De-prepare for stream:%d failed: %d", ret, ret);
14921846
1493
- mutex_unlock(&stream->m_rt->bus->bus_lock);
1847
+state_err:
1848
+ sdw_release_bus_lock(stream);
14941849 return ret;
14951850 }
14961851 EXPORT_SYMBOL(sdw_deprepare_stream);
1852
+
1853
+static int set_stream(struct snd_pcm_substream *substream,
1854
+ struct sdw_stream_runtime *sdw_stream)
1855
+{
1856
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
1857
+ struct snd_soc_dai *dai;
1858
+ int ret = 0;
1859
+ int i;
1860
+
1861
+ /* Set stream pointer on all DAIs */
1862
+ for_each_rtd_dais(rtd, i, dai) {
1863
+ ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
1864
+ if (ret < 0) {
1865
+ dev_err(rtd->dev, "failed to set stream pointer on dai %s", dai->name);
1866
+ break;
1867
+ }
1868
+ }
1869
+
1870
+ return ret;
1871
+}
1872
+
1873
+/**
1874
+ * sdw_startup_stream() - Startup SoundWire stream
1875
+ *
1876
+ * @sdw_substream: Soundwire stream
1877
+ *
1878
+ * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1879
+ */
1880
+int sdw_startup_stream(void *sdw_substream)
1881
+{
1882
+ struct snd_pcm_substream *substream = sdw_substream;
1883
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
1884
+ struct sdw_stream_runtime *sdw_stream;
1885
+ char *name;
1886
+ int ret;
1887
+
1888
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1889
+ name = kasprintf(GFP_KERNEL, "%s-Playback", substream->name);
1890
+ else
1891
+ name = kasprintf(GFP_KERNEL, "%s-Capture", substream->name);
1892
+
1893
+ if (!name)
1894
+ return -ENOMEM;
1895
+
1896
+ sdw_stream = sdw_alloc_stream(name);
1897
+ if (!sdw_stream) {
1898
+ dev_err(rtd->dev, "alloc stream failed for substream DAI %s", substream->name);
1899
+ ret = -ENOMEM;
1900
+ goto error;
1901
+ }
1902
+
1903
+ ret = set_stream(substream, sdw_stream);
1904
+ if (ret < 0)
1905
+ goto release_stream;
1906
+ return 0;
1907
+
1908
+release_stream:
1909
+ sdw_release_stream(sdw_stream);
1910
+ set_stream(substream, NULL);
1911
+error:
1912
+ kfree(name);
1913
+ return ret;
1914
+}
1915
+EXPORT_SYMBOL(sdw_startup_stream);
1916
+
1917
+/**
1918
+ * sdw_shutdown_stream() - Shutdown SoundWire stream
1919
+ *
1920
+ * @sdw_substream: Soundwire stream
1921
+ *
1922
+ * Documentation/driver-api/soundwire/stream.rst explains this API in detail
1923
+ */
1924
+void sdw_shutdown_stream(void *sdw_substream)
1925
+{
1926
+ struct snd_pcm_substream *substream = sdw_substream;
1927
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
1928
+ struct sdw_stream_runtime *sdw_stream;
1929
+ struct snd_soc_dai *dai;
1930
+
1931
+ /* Find stream from first CPU DAI */
1932
+ dai = asoc_rtd_to_cpu(rtd, 0);
1933
+
1934
+ sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
1935
+
1936
+ if (IS_ERR(sdw_stream)) {
1937
+ dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
1938
+ return;
1939
+ }
1940
+
1941
+ /* release memory */
1942
+ kfree(sdw_stream->name);
1943
+ sdw_release_stream(sdw_stream);
1944
+
1945
+ /* clear DAI data */
1946
+ set_stream(substream, NULL);
1947
+}
1948
+EXPORT_SYMBOL(sdw_shutdown_stream);