Lines Matching full:ssi
3 // Renesas R-Car SSIU/SSI support
13 * SSI interrupt status debug message when debugging
61 #define EN (1 << 0) /* SSI Module Enable */
77 #define SSI_NAME "ssi"
101 #define RSND_SSI_NO_BUSIF (1 << 1) /* SSI+DMA without BUSIF */
107 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
110 #define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
113 #define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
123 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
129 if (!(rsnd_flags_has(ssi, RSND_SSI_NO_BUSIF)))
270 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
292 if (ssi->usrcnt > 0) {
293 if (ssi->rate != rate) {
294 dev_err(dev, "SSI parent/child should use same rate\n");
298 if (ssi->chan != chan) {
299 dev_err(dev, "SSI parent/child should use same chan\n");
316 * SSI clock will be output contiguously
320 * for SSI parent
325 ssi->cr_clk = FORCE | rsnd_rdai_width_to_swl(rdai) |
327 ssi->wsr = CONT;
328 ssi->rate = rate;
329 ssi->chan = chan;
346 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
354 if (ssi->usrcnt > 1)
357 ssi->cr_clk = 0;
358 ssi->rate = 0;
359 ssi->chan = 0;
371 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
372 u32 cr_own = ssi->cr_own;
373 u32 cr_mode = ssi->cr_mode;
374 u32 wsr = ssi->wsr;
452 ssi->cr_own = cr_own;
453 ssi->cr_mode = cr_mode;
454 ssi->wsr = wsr;
459 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
461 rsnd_mod_write(mod, SSIWSR, ssi->wsr);
462 rsnd_mod_write(mod, SSICR, ssi->cr_own |
463 ssi->cr_clk |
464 ssi->cr_mode |
465 ssi->cr_en);
469 * SSI mod common functions
475 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
485 ssi->usrcnt++;
505 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
511 if (!ssi->usrcnt) {
520 ssi->usrcnt--;
522 if (!ssi->usrcnt) {
523 ssi->cr_own = 0;
524 ssi->cr_mode = 0;
525 ssi->wsr = 0;
554 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
568 * SSI parent EN is not needed.
573 ssi->cr_en = EN;
575 rsnd_mod_write(mod, SSICR, ssi->cr_own |
576 ssi->cr_clk |
577 ssi->cr_mode |
578 ssi->cr_en);
587 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
596 cr = ssi->cr_own |
597 ssi->cr_clk;
605 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en);
609 /* In multi-SSI mode, stop is performed by setting ssi0129 in
616 * disable SSI,
622 ssi->cr_en = 0;
729 * SSIP (= SSI parent) needs to be special, otherwise,
730 * 2nd SSI might doesn't start. see also rsnd_mod_call()
732 * We can't include parent SSI status on SSI, because we don't know
733 * how many SSI requests parent SSI. Thus, it is localed on "io" now.
760 * SSI PIO
811 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
816 * SSI Multi secondaries
822 * It can't judge ssi parent at this point
827 * SSI might be called again as PIO fallback
837 if (!rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
838 ret = request_irq(ssi->irq,
843 rsnd_flags_set(ssi, RSND_SSI_PROBED);
853 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
856 /* Do nothing if non SSI (= SSI parent, multi SSI) mod */
861 if (rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
862 free_irq(ssi->irq, mod);
864 rsnd_flags_del(ssi, RSND_SSI_PROBED);
871 * SSI PIO functions
877 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
878 u32 *buf = (u32 *)(runtime->dma_area + ssi->byte_pos);
896 byte_pos = ssi->byte_pos + sizeof(*buf);
898 if (byte_pos >= ssi->next_period_byte) {
899 int period_pos = byte_pos / ssi->byte_per_period;
906 ssi->next_period_byte = (period_pos + 1) * ssi->byte_per_period;
911 WRITE_ONCE(ssi->byte_pos, byte_pos);
921 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
924 ssi->byte_pos = 0;
925 ssi->byte_per_period = runtime->period_size *
928 ssi->next_period_byte = ssi->byte_per_period;
938 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
941 *pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos));
969 * SSI Multi secondaries
978 /* SSI probe might be called many times in MUX multi path */
993 * SSI .probe might be called again.
1016 * If not, "rcar_sound.ssi" will be used.
1037 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
1048 seq_printf(m, "chan: %d\n", ssi->chan);
1049 seq_printf(m, "user: %d\n", ssi->usrcnt);
1082 * ssi mod function
1097 /* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */
1168 struct rsnd_ssi *ssi;
1182 ssi = devm_kcalloc(dev, nr, sizeof(*ssi), GFP_KERNEL);
1183 if (!ssi) {
1188 priv->ssi = ssi;
1203 ssi = rsnd_ssi_get(priv, i);
1216 rsnd_flags_set(ssi, RSND_SSI_CLK_PIN_SHARE);
1219 rsnd_flags_set(ssi, RSND_SSI_NO_BUSIF);
1221 ssi->irq = irq_of_parse_and_map(np, 0);
1222 if (!ssi->irq) {
1233 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
1253 struct rsnd_ssi *ssi;
1256 for_each_rsnd_ssi(ssi, priv, i) {
1257 rsnd_mod_quit(rsnd_mod_get(ssi));