• Home
  • Raw
  • Download

Lines Matching +full:multi +full:- +full:word

1 // SPDX-License-Identifier: GPL-2.0
3 // Renesas R-Car SSIU/SSI support
36 #define DWL_MASK (7 << 19) /* Data Word Length mask */
37 #define DWL_8 (0 << 19) /* Data Word Length */
38 #define DWL_16 (1 << 19) /* Data Word Length */
39 #define DWL_18 (2 << 19) /* Data Word Length */
40 #define DWL_20 (3 << 19) /* Data Word Length */
41 #define DWL_22 (4 << 19) /* Data Word Length */
42 #define DWL_24 (5 << 19) /* Data Word Length */
43 #define DWL_32 (6 << 19) /* Data Word Length */
45 #define SWL_32 (3 << 16) /* R/W System Word Length */
103 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
106 #define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
107 #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
244 * system word is 32bit x chan in rsnd_ssi_clk_query()
285 if (ssi->usrcnt > 0) { in rsnd_ssi_master_clk_start()
286 if (ssi->rate != rate) { in rsnd_ssi_master_clk_start()
288 return -EINVAL; in rsnd_ssi_master_clk_start()
297 return -EIO; in rsnd_ssi_master_clk_start()
314 ssi->cr_clk = FORCE | SWL_32 | SCKD | SWSD | CKDV(idx); in rsnd_ssi_master_clk_start()
315 ssi->wsr = CONT; in rsnd_ssi_master_clk_start()
316 ssi->rate = rate; in rsnd_ssi_master_clk_start()
337 if (ssi->usrcnt > 1) in rsnd_ssi_master_clk_stop()
340 ssi->cr_clk = 0; in rsnd_ssi_master_clk_stop()
341 ssi->rate = 0; in rsnd_ssi_master_clk_stop()
352 u32 cr_own = ssi->cr_own; in rsnd_ssi_config_init()
353 u32 cr_mode = ssi->cr_mode; in rsnd_ssi_config_init()
354 u32 wsr = ssi->wsr; in rsnd_ssi_config_init()
360 * always use 32bit system word. in rsnd_ssi_config_init()
365 if (rdai->bit_clk_inv) in rsnd_ssi_config_init()
367 if (rdai->frm_clk_inv ^ is_tdm) in rsnd_ssi_config_init()
369 if (rdai->data_alignment) in rsnd_ssi_config_init()
371 if (rdai->sys_delay) in rsnd_ssi_config_init()
385 switch (snd_pcm_format_width(runtime->format)) { in rsnd_ssi_config_init()
406 wsr = ssi->wsr; in rsnd_ssi_config_init()
412 ssi->cr_own = cr_own; in rsnd_ssi_config_init()
413 ssi->cr_mode = cr_mode; in rsnd_ssi_config_init()
414 ssi->wsr = wsr; in rsnd_ssi_config_init()
421 rsnd_mod_write(mod, SSIWSR, ssi->wsr); in rsnd_ssi_register_setup()
422 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_register_setup()
423 ssi->cr_clk | in rsnd_ssi_register_setup()
424 ssi->cr_mode | in rsnd_ssi_register_setup()
425 ssi->cr_en); in rsnd_ssi_register_setup()
440 ssi->usrcnt++; in rsnd_ssi_init()
464 if (!ssi->usrcnt) { in rsnd_ssi_quit()
467 return -EIO; in rsnd_ssi_quit()
474 ssi->usrcnt--; in rsnd_ssi_quit()
476 if (!ssi->usrcnt) { in rsnd_ssi_quit()
477 ssi->cr_own = 0; in rsnd_ssi_quit()
478 ssi->cr_mode = 0; in rsnd_ssi_quit()
479 ssi->wsr = 0; in rsnd_ssi_quit()
495 * snd_soc_dai_ops::trigger. Thus, ssi->usrcnt is 0 in rsnd_ssi_hw_params()
498 if (ssi->usrcnt) { in rsnd_ssi_hw_params()
502 * it is error if child <-> parent SSI uses in rsnd_ssi_hw_params()
505 if (ssi->chan != chan) in rsnd_ssi_hw_params()
506 return -EIO; in rsnd_ssi_hw_params()
509 ssi->chan = chan; in rsnd_ssi_hw_params()
525 * if Multi channel mode in rsnd_ssi_start()
537 ssi->cr_en = EN; in rsnd_ssi_start()
539 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_start()
540 ssi->cr_clk | in rsnd_ssi_start()
541 ssi->cr_mode | in rsnd_ssi_start()
542 ssi->cr_en); in rsnd_ssi_start()
560 cr = ssi->cr_own | in rsnd_ssi_stop()
561 ssi->cr_clk; in rsnd_ssi_stop()
569 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en); in rsnd_ssi_stop()
573 /* In multi-SSI mode, stop is performed by setting ssi0129 in in rsnd_ssi_stop()
586 ssi->cr_en = 0; in rsnd_ssi_stop()
627 spin_lock(&priv->lock); in __rsnd_ssi_interrupt()
649 spin_unlock(&priv->lock); in __rsnd_ssi_interrupt()
655 snd_pcm_stop_xrun(io->substream); in __rsnd_ssi_interrupt()
724 * SSI Multi slaves in rsnd_ssi_common_probe()
745 * mod->status. in rsnd_ssi_common_probe()
750 ret = request_irq(ssi->irq, in rsnd_ssi_common_probe()
768 /* Do nothing if non SSI (= SSI parent, multi SSI) mod */ in rsnd_ssi_common_remove()
774 free_irq(ssi->irq, mod); in rsnd_ssi_common_remove()
790 u32 *buf = (u32 *)(runtime->dma_area + ssi->byte_pos); in rsnd_ssi_pio_interrupt()
795 if (snd_pcm_format_width(runtime->format) == 24) in rsnd_ssi_pio_interrupt()
808 byte_pos = ssi->byte_pos + sizeof(*buf); in rsnd_ssi_pio_interrupt()
810 if (byte_pos >= ssi->next_period_byte) { in rsnd_ssi_pio_interrupt()
811 int period_pos = byte_pos / ssi->byte_per_period; in rsnd_ssi_pio_interrupt()
813 if (period_pos >= runtime->periods) { in rsnd_ssi_pio_interrupt()
818 ssi->next_period_byte = (period_pos + 1) * ssi->byte_per_period; in rsnd_ssi_pio_interrupt()
823 WRITE_ONCE(ssi->byte_pos, byte_pos); in rsnd_ssi_pio_interrupt()
836 ssi->byte_pos = 0; in rsnd_ssi_pio_init()
837 ssi->byte_per_period = runtime->period_size * in rsnd_ssi_pio_init()
838 runtime->channels * in rsnd_ssi_pio_init()
840 ssi->next_period_byte = ssi->byte_per_period; in rsnd_ssi_pio_init()
853 *pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos)); in rsnd_ssi_pio_pointer()
888 * SSI Multi slaves in rsnd_ssi_dma_probe()
897 /* SSI probe might be called many times in MUX multi path */ in rsnd_ssi_dma_probe()
898 ret = rsnd_dma_attach(io, mod, &io->dma); in rsnd_ssi_dma_probe()
916 mod->ops = &rsnd_ssi_pio_ops; in rsnd_ssi_fallback()
958 return mod->ops == &rsnd_ssi_dma_ops; in rsnd_ssi_is_dma_mode()
978 /* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */ in rsnd_ssi_connect()
1008 rsnd_ssi_connect(mod, &rdai->playback); in rsnd_parse_connect_ssi()
1010 rsnd_ssi_connect(mod, &rdai->capture); in rsnd_parse_connect_ssi()
1036 if (strstr(remote_node->full_name, "hdmi@fead0000")) { in __rsnd_ssi_parse_hdmi_connection()
1043 if (strstr(remote_node->full_name, "hdmi@feae0000")) { in __rsnd_ssi_parse_hdmi_connection()
1061 __rsnd_ssi_parse_hdmi_connection(priv, &rdai->playback, remote_ep); in rsnd_ssi_parse_hdmi_connection()
1062 __rsnd_ssi_parse_hdmi_connection(priv, &rdai->capture, remote_ep); in rsnd_ssi_parse_hdmi_connection()
1095 * 1) start Capture -> SSI0/SSI1 are started. in rsnd_ssi_get_status()
1096 * 2) start Playback -> SSI0 doesn't work, because it is already in rsnd_ssi_get_status()
1102 * IO-0: SRC0 -> CTU1 -+-> MUX -> DVC -> SSIU -> SSI0 in rsnd_ssi_get_status()
1104 * IO-1: SRC1 -> CTU2 -+ in rsnd_ssi_get_status()
1106 * 1) start IO-0 -> start SSI0 in rsnd_ssi_get_status()
1107 * 2) start IO-1 -> SSI0 doesn't need to start, because it is in rsnd_ssi_get_status()
1111 return &io->parent_ssi_status; in rsnd_ssi_get_status()
1129 return -EINVAL; in rsnd_ssi_probe()
1133 ret = -EINVAL; in rsnd_ssi_probe()
1139 ret = -ENOMEM; in rsnd_ssi_probe()
1143 priv->ssi = ssi; in rsnd_ssi_probe()
1144 priv->ssi_nr = nr; in rsnd_ssi_probe()
1163 if (of_get_property(np, "shared-pin", NULL)) in rsnd_ssi_probe()
1166 if (of_get_property(np, "no-busif", NULL)) in rsnd_ssi_probe()
1169 ssi->irq = irq_of_parse_and_map(np, 0); in rsnd_ssi_probe()
1170 if (!ssi->irq) { in rsnd_ssi_probe()
1171 ret = -EINVAL; in rsnd_ssi_probe()
1176 if (of_property_read_bool(np, "pio-transfer")) in rsnd_ssi_probe()