forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
kernel/sound/soc/sh/rcar/dma.c
....@@ -106,9 +106,9 @@
106106 return 0;
107107 }
108108
109
-static int rsnd_dmaen_nolock_stop(struct rsnd_mod *mod,
110
- struct rsnd_dai_stream *io,
111
- struct rsnd_priv *priv)
109
+static int rsnd_dmaen_cleanup(struct rsnd_mod *mod,
110
+ struct rsnd_dai_stream *io,
111
+ struct rsnd_priv *priv)
112112 {
113113 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
114114 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
....@@ -116,7 +116,7 @@
116116 /*
117117 * DMAEngine release uses mutex lock.
118118 * Thus, it shouldn't be called under spinlock.
119
- * Let's call it under nolock_start
119
+ * Let's call it under prepare
120120 */
121121 if (dmaen->chan)
122122 dma_release_channel(dmaen->chan);
....@@ -126,23 +126,22 @@
126126 return 0;
127127 }
128128
129
-static int rsnd_dmaen_nolock_start(struct rsnd_mod *mod,
130
- struct rsnd_dai_stream *io,
131
- struct rsnd_priv *priv)
129
+static int rsnd_dmaen_prepare(struct rsnd_mod *mod,
130
+ struct rsnd_dai_stream *io,
131
+ struct rsnd_priv *priv)
132132 {
133133 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
134134 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
135135 struct device *dev = rsnd_priv_to_dev(priv);
136136
137
- if (dmaen->chan) {
138
- dev_err(dev, "it already has dma channel\n");
139
- return -EIO;
140
- }
137
+ /* maybe suspended */
138
+ if (dmaen->chan)
139
+ return 0;
141140
142141 /*
143142 * DMAEngine request uses mutex lock.
144143 * Thus, it shouldn't be called under spinlock.
145
- * Let's call it under nolock_start
144
+ * Let's call it under prepare
146145 */
147146 dmaen->chan = rsnd_dmaen_request_channel(io,
148147 dma->mod_from,
....@@ -166,17 +165,43 @@
166165 struct device *dev = rsnd_priv_to_dev(priv);
167166 struct dma_async_tx_descriptor *desc;
168167 struct dma_slave_config cfg = {};
168
+ enum dma_slave_buswidth buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
169169 int is_play = rsnd_io_is_play(io);
170170 int ret;
171
+
172
+ /*
173
+ * in case of monaural data writing or reading through Audio-DMAC
174
+ * data is always in Left Justified format, so both src and dst
175
+ * DMA Bus width need to be set equal to physical data width.
176
+ */
177
+ if (rsnd_runtime_channel_original(io) == 1) {
178
+ struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
179
+ int bits = snd_pcm_format_physical_width(runtime->format);
180
+
181
+ switch (bits) {
182
+ case 8:
183
+ buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE;
184
+ break;
185
+ case 16:
186
+ buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES;
187
+ break;
188
+ case 32:
189
+ buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
190
+ break;
191
+ default:
192
+ dev_err(dev, "invalid format width %d\n", bits);
193
+ return -EINVAL;
194
+ }
195
+ }
171196
172197 cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
173198 cfg.src_addr = dma->src_addr;
174199 cfg.dst_addr = dma->dst_addr;
175
- cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
176
- cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
200
+ cfg.src_addr_width = buswidth;
201
+ cfg.dst_addr_width = buswidth;
177202
178
- dev_dbg(dev, "%s[%d] %pad -> %pad\n",
179
- rsnd_mod_name(mod), rsnd_mod_id(mod),
203
+ dev_dbg(dev, "%s %pad -> %pad\n",
204
+ rsnd_mod_name(mod),
180205 &cfg.src_addr, &cfg.dst_addr);
181206
182207 ret = dmaengine_slave_config(dmaen->chan, &cfg);
....@@ -219,7 +244,7 @@
219244 int i = 0;
220245
221246 for_each_child_of_node(of_node, np) {
222
- if (i == rsnd_mod_id(mod) && (!chan))
247
+ if (i == rsnd_mod_id_raw(mod) && (!chan))
223248 chan = of_dma_request_slave_channel(np, name);
224249 i++;
225250 }
....@@ -290,28 +315,39 @@
290315 }
291316
292317 static struct rsnd_mod_ops rsnd_dmaen_ops = {
293
- .name = "audmac",
294
- .nolock_start = rsnd_dmaen_nolock_start,
295
- .nolock_stop = rsnd_dmaen_nolock_stop,
296
- .start = rsnd_dmaen_start,
297
- .stop = rsnd_dmaen_stop,
298
- .pointer= rsnd_dmaen_pointer,
318
+ .name = "audmac",
319
+ .prepare = rsnd_dmaen_prepare,
320
+ .cleanup = rsnd_dmaen_cleanup,
321
+ .start = rsnd_dmaen_start,
322
+ .stop = rsnd_dmaen_stop,
323
+ .pointer = rsnd_dmaen_pointer,
324
+ .get_status = rsnd_mod_get_status,
299325 };
300326
301327 /*
302328 * Audio DMAC peri peri
303329 */
304330 static const u8 gen2_id_table_ssiu[] = {
305
- 0x00, /* SSI00 */
306
- 0x04, /* SSI10 */
307
- 0x08, /* SSI20 */
308
- 0x0c, /* SSI3 */
309
- 0x0d, /* SSI4 */
310
- 0x0e, /* SSI5 */
311
- 0x0f, /* SSI6 */
312
- 0x10, /* SSI7 */
313
- 0x11, /* SSI8 */
314
- 0x12, /* SSI90 */
331
+ /* SSI00 ~ SSI07 */
332
+ 0x00, 0x01, 0x02, 0x03, 0x39, 0x3a, 0x3b, 0x3c,
333
+ /* SSI10 ~ SSI17 */
334
+ 0x04, 0x05, 0x06, 0x07, 0x3d, 0x3e, 0x3f, 0x40,
335
+ /* SSI20 ~ SSI27 */
336
+ 0x08, 0x09, 0x0a, 0x0b, 0x41, 0x42, 0x43, 0x44,
337
+ /* SSI30 ~ SSI37 */
338
+ 0x0c, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
339
+ /* SSI40 ~ SSI47 */
340
+ 0x0d, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52,
341
+ /* SSI5 */
342
+ 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343
+ /* SSI6 */
344
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345
+ /* SSI7 */
346
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347
+ /* SSI8 */
348
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349
+ /* SSI90 ~ SSI97 */
350
+ 0x12, 0x13, 0x14, 0x15, 0x53, 0x54, 0x55, 0x56,
315351 };
316352 static const u8 gen2_id_table_scu[] = {
317353 0x2d, /* SCU_SRCI0 */
....@@ -334,28 +370,34 @@
334370 struct rsnd_mod *mod)
335371 {
336372 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
373
+ struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
337374 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
338375 struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
339376 const u8 *entry = NULL;
340
- int id = rsnd_mod_id(mod);
377
+ int id = 255;
341378 int size = 0;
342379
343
- if (mod == ssi) {
380
+ if ((mod == ssi) ||
381
+ (mod == ssiu)) {
382
+ int busif = rsnd_mod_id_sub(ssiu);
383
+
344384 entry = gen2_id_table_ssiu;
345385 size = ARRAY_SIZE(gen2_id_table_ssiu);
386
+ id = (rsnd_mod_id(mod) * 8) + busif;
346387 } else if (mod == src) {
347388 entry = gen2_id_table_scu;
348389 size = ARRAY_SIZE(gen2_id_table_scu);
390
+ id = rsnd_mod_id(mod);
349391 } else if (mod == dvc) {
350392 entry = gen2_id_table_cmd;
351393 size = ARRAY_SIZE(gen2_id_table_cmd);
394
+ id = rsnd_mod_id(mod);
352395 }
353396
354397 if ((!entry) || (size <= id)) {
355398 struct device *dev = rsnd_priv_to_dev(rsnd_io_to_priv(io));
356399
357
- dev_err(dev, "unknown connection (%s[%d])\n",
358
- rsnd_mod_name(mod), rsnd_mod_id(mod));
400
+ dev_err(dev, "unknown connection (%s)\n", rsnd_mod_name(mod));
359401
360402 /* use non-prohibited SRS number as error */
361403 return 0x00; /* SSI00 */
....@@ -382,7 +424,7 @@
382424 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
383425 struct device *dev = rsnd_priv_to_dev(priv);
384426
385
- dev_dbg(dev, "w %p : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data);
427
+ dev_dbg(dev, "w 0x%px : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data);
386428
387429 iowrite32(data, rsnd_dmapp_addr(dmac, dma, reg));
388430 }
....@@ -463,10 +505,11 @@
463505 }
464506
465507 static struct rsnd_mod_ops rsnd_dmapp_ops = {
466
- .name = "audmac-pp",
467
- .start = rsnd_dmapp_start,
468
- .stop = rsnd_dmapp_stop,
469
- .quit = rsnd_dmapp_stop,
508
+ .name = "audmac-pp",
509
+ .start = rsnd_dmapp_start,
510
+ .stop = rsnd_dmapp_stop,
511
+ .quit = rsnd_dmapp_stop,
512
+ .get_status = rsnd_mod_get_status,
470513 };
471514
472515 /*
....@@ -491,11 +534,11 @@
491534 #define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
492535 #define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
493536
494
-#define RDMA_SSIU_I_N(addr, i) (addr ##_reg - 0x00441000 + (0x1000 * i))
495
-#define RDMA_SSIU_O_N(addr, i) (addr ##_reg - 0x00441000 + (0x1000 * i))
537
+#define RDMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
538
+#define RDMA_SSIU_O_N(addr, i, j) RDMA_SSIU_I_N(addr, i, j)
496539
497
-#define RDMA_SSIU_I_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
498
-#define RDMA_SSIU_O_P(addr, i) (addr ##_reg - 0x00141000 + (0x1000 * i))
540
+#define RDMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
541
+#define RDMA_SSIU_O_P(addr, i, j) RDMA_SSIU_I_P(addr, i, j)
499542
500543 #define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
501544 #define RDMA_SRC_O_N(addr, i) (addr ##_reg - 0x004fc000 + (0x400 * i))
....@@ -515,12 +558,14 @@
515558 struct device *dev = rsnd_priv_to_dev(priv);
516559 phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI);
517560 phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU);
518
- int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod);
561
+ int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod) ||
562
+ !!(rsnd_io_to_mod_ssiu(io) == mod);
519563 int use_src = !!rsnd_io_to_mod_src(io);
520564 int use_cmd = !!rsnd_io_to_mod_dvc(io) ||
521565 !!rsnd_io_to_mod_mix(io) ||
522566 !!rsnd_io_to_mod_ctu(io);
523567 int id = rsnd_mod_id(mod);
568
+ int busif = rsnd_mod_id_sub(rsnd_io_to_mod_ssiu(io));
524569 struct dma_addr {
525570 dma_addr_t out_addr;
526571 dma_addr_t in_addr;
....@@ -537,24 +582,34 @@
537582 },
538583 /* SSI */
539584 /* Capture */
540
- {{{ RDMA_SSI_O_N(ssi, id), 0 },
541
- { RDMA_SSIU_O_P(ssi, id), 0 },
542
- { RDMA_SSIU_O_P(ssi, id), 0 } },
585
+ {{{ RDMA_SSI_O_N(ssi, id), 0 },
586
+ { RDMA_SSIU_O_P(ssi, id, busif), 0 },
587
+ { RDMA_SSIU_O_P(ssi, id, busif), 0 } },
543588 /* Playback */
544
- {{ 0, RDMA_SSI_I_N(ssi, id) },
545
- { 0, RDMA_SSIU_I_P(ssi, id) },
546
- { 0, RDMA_SSIU_I_P(ssi, id) } }
589
+ {{ 0, RDMA_SSI_I_N(ssi, id) },
590
+ { 0, RDMA_SSIU_I_P(ssi, id, busif) },
591
+ { 0, RDMA_SSIU_I_P(ssi, id, busif) } }
547592 },
548593 /* SSIU */
549594 /* Capture */
550
- {{{ RDMA_SSIU_O_N(ssi, id), 0 },
551
- { RDMA_SSIU_O_P(ssi, id), 0 },
552
- { RDMA_SSIU_O_P(ssi, id), 0 } },
595
+ {{{ RDMA_SSIU_O_N(ssi, id, busif), 0 },
596
+ { RDMA_SSIU_O_P(ssi, id, busif), 0 },
597
+ { RDMA_SSIU_O_P(ssi, id, busif), 0 } },
553598 /* Playback */
554
- {{ 0, RDMA_SSIU_I_N(ssi, id) },
555
- { 0, RDMA_SSIU_I_P(ssi, id) },
556
- { 0, RDMA_SSIU_I_P(ssi, id) } } },
599
+ {{ 0, RDMA_SSIU_I_N(ssi, id, busif) },
600
+ { 0, RDMA_SSIU_I_P(ssi, id, busif) },
601
+ { 0, RDMA_SSIU_I_P(ssi, id, busif) } } },
557602 };
603
+
604
+ /*
605
+ * FIXME
606
+ *
607
+ * We can't support SSI9-4/5/6/7, because its address is
608
+ * out of calculation rule
609
+ */
610
+ if ((id == 9) && (busif >= 4))
611
+ dev_err(dev, "This driver doesn't support SSI%d-%d, so far",
612
+ id, busif);
558613
559614 /* it shouldn't happen */
560615 if (use_cmd && !use_src)
....@@ -594,7 +649,7 @@
594649 struct rsnd_mod **mod_from,
595650 struct rsnd_mod **mod_to)
596651 {
597
- struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
652
+ struct rsnd_mod *ssi;
598653 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
599654 struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io);
600655 struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
....@@ -604,6 +659,28 @@
604659 struct rsnd_priv *priv = rsnd_mod_to_priv(this);
605660 struct device *dev = rsnd_priv_to_dev(priv);
606661 int nr, i, idx;
662
+
663
+ /*
664
+ * It should use "rcar_sound,ssiu" on DT.
665
+ * But, we need to keep compatibility for old version.
666
+ *
667
+ * If it has "rcar_sound.ssiu", it will be used.
668
+ * If not, "rcar_sound.ssi" will be used.
669
+ * see
670
+ * rsnd_ssiu_dma_req()
671
+ * rsnd_ssi_dma_req()
672
+ */
673
+ if (rsnd_ssiu_of_node(priv)) {
674
+ struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
675
+
676
+ /* use SSIU */
677
+ ssi = ssiu;
678
+ if (this == rsnd_io_to_mod_ssi(io))
679
+ this = ssiu;
680
+ } else {
681
+ /* keep compatible, use SSI */
682
+ ssi = rsnd_io_to_mod_ssi(io);
683
+ }
607684
608685 if (!ssi)
609686 return;
....@@ -665,12 +742,10 @@
665742 *mod_to = mod[1];
666743 }
667744
668
- dev_dbg(dev, "module connection (this is %s[%d])\n",
669
- rsnd_mod_name(this), rsnd_mod_id(this));
745
+ dev_dbg(dev, "module connection (this is %s)\n", rsnd_mod_name(this));
670746 for (i = 0; i <= idx; i++) {
671
- dev_dbg(dev, " %s[%d]%s\n",
747
+ dev_dbg(dev, " %s%s\n",
672748 rsnd_mod_name(mod[i] ? mod[i] : &mem),
673
- rsnd_mod_id (mod[i] ? mod[i] : &mem),
674749 (mod[i] == *mod_from) ? " from" :
675750 (mod[i] == *mod_to) ? " to" : "");
676751 }
....@@ -731,16 +806,14 @@
731806 *dma_mod = rsnd_mod_get(dma);
732807
733808 ret = rsnd_mod_init(priv, *dma_mod, ops, NULL,
734
- rsnd_mod_get_status, type, dma_id);
809
+ type, dma_id);
735810 if (ret < 0)
736811 return ret;
737812
738
- dev_dbg(dev, "%s[%d] %s[%d] -> %s[%d]\n",
739
- rsnd_mod_name(*dma_mod), rsnd_mod_id(*dma_mod),
813
+ dev_dbg(dev, "%s %s -> %s\n",
814
+ rsnd_mod_name(*dma_mod),
740815 rsnd_mod_name(mod_from ? mod_from : &mem),
741
- rsnd_mod_id (mod_from ? mod_from : &mem),
742
- rsnd_mod_name(mod_to ? mod_to : &mem),
743
- rsnd_mod_id (mod_to ? mod_to : &mem));
816
+ rsnd_mod_name(mod_to ? mod_to : &mem));
744817
745818 ret = attach(io, dma, mod_from, mod_to);
746819 if (ret < 0)
....@@ -798,5 +871,5 @@
798871 priv->dma = dmac;
799872
800873 /* dummy mem mod for debug */
801
- return rsnd_mod_init(NULL, &mem, &mem_ops, NULL, NULL, 0, 0);
874
+ return rsnd_mod_init(NULL, &mem, &mem_ops, NULL, 0, 0);
802875 }