Lines Matching full:mod

82 	struct rsnd_mod mod;  member
114 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
116 #define rsnd_ssi_is_multi_secondary(mod, io) \ argument
117 (rsnd_ssi_multi_secondaries(io) & (1 << rsnd_mod_id(mod)))
118 #define rsnd_ssi_is_run_mods(mod, io) \ argument
119 (rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
120 #define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod)) argument
124 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io); in rsnd_ssi_use_busif() local
125 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_use_busif()
128 if (!rsnd_ssi_is_dma_mode(mod)) in rsnd_ssi_use_busif()
139 static void rsnd_ssi_status_clear(struct rsnd_mod *mod) in rsnd_ssi_status_clear() argument
141 rsnd_mod_write(mod, SSISR, 0); in rsnd_ssi_status_clear()
144 static u32 rsnd_ssi_status_get(struct rsnd_mod *mod) in rsnd_ssi_status_get() argument
146 return rsnd_mod_read(mod, SSISR); in rsnd_ssi_status_get()
149 static void rsnd_ssi_status_check(struct rsnd_mod *mod, in rsnd_ssi_status_check() argument
152 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in rsnd_ssi_status_check()
158 status = rsnd_ssi_status_get(mod); in rsnd_ssi_status_check()
165 dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod)); in rsnd_ssi_status_check()
179 struct rsnd_mod *mod = rsnd_io_to_mod(io, types[i]); in rsnd_ssi_multi_secondaries() local
181 if (!mod) in rsnd_ssi_multi_secondaries()
184 mask |= 1 << rsnd_mod_id(mod); in rsnd_ssi_multi_secondaries()
266 static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod, in rsnd_ssi_master_clk_start() argument
272 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_master_clk_start()
283 if (!rsnd_ssi_can_output_clk(mod)) in rsnd_ssi_master_clk_start()
286 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_master_clk_start()
313 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate); in rsnd_ssi_master_clk_start()
334 rsnd_mod_name(mod), chan, rate); in rsnd_ssi_master_clk_start()
344 static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod, in rsnd_ssi_master_clk_stop() argument
348 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_master_clk_stop()
353 if (!rsnd_ssi_can_output_clk(mod)) in rsnd_ssi_master_clk_stop()
363 rsnd_adg_ssi_clk_stop(mod); in rsnd_ssi_master_clk_stop()
366 static void rsnd_ssi_config_init(struct rsnd_mod *mod, in rsnd_ssi_config_init() argument
373 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_config_init()
413 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_config_init()
446 if (rsnd_ssi_is_dma_mode(mod)) { in rsnd_ssi_config_init()
459 static void rsnd_ssi_register_setup(struct rsnd_mod *mod) in rsnd_ssi_register_setup() argument
461 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_register_setup()
463 rsnd_mod_write(mod, SSIWSR, ssi->wsr); in rsnd_ssi_register_setup()
464 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_register_setup()
471 * SSI mod common functions
473 static int rsnd_ssi_init(struct rsnd_mod *mod, in rsnd_ssi_init() argument
477 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_init()
480 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_init()
483 ret = rsnd_ssi_master_clk_start(mod, io); in rsnd_ssi_init()
489 ret = rsnd_mod_power_on(mod); in rsnd_ssi_init()
493 rsnd_ssi_config_init(mod, io); in rsnd_ssi_init()
495 rsnd_ssi_register_setup(mod); in rsnd_ssi_init()
498 rsnd_ssi_status_clear(mod); in rsnd_ssi_init()
503 static int rsnd_ssi_quit(struct rsnd_mod *mod, in rsnd_ssi_quit() argument
507 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_quit()
510 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_quit()
514 dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod)); in rsnd_ssi_quit()
518 rsnd_ssi_master_clk_stop(mod, io); in rsnd_ssi_quit()
520 rsnd_mod_power_off(mod); in rsnd_ssi_quit()
533 static int rsnd_ssi_hw_params(struct rsnd_mod *mod, in rsnd_ssi_hw_params() argument
552 static int rsnd_ssi_start(struct rsnd_mod *mod, in rsnd_ssi_start() argument
556 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_start()
558 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_start()
572 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_start()
577 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_start()
585 static int rsnd_ssi_stop(struct rsnd_mod *mod, in rsnd_ssi_stop() argument
589 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_stop()
592 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_stop()
595 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_stop()
607 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en); in rsnd_ssi_stop()
608 rsnd_ssi_status_check(mod, DIRQ); in rsnd_ssi_stop()
621 rsnd_mod_write(mod, SSICR, cr); /* disabled all */ in rsnd_ssi_stop()
622 rsnd_ssi_status_check(mod, IIRQ); in rsnd_ssi_stop()
629 static int rsnd_ssi_irq(struct rsnd_mod *mod, in rsnd_ssi_irq() argument
636 int id = rsnd_mod_id(mod); in rsnd_ssi_irq()
644 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_irq()
647 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_irq()
651 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000; in rsnd_ssi_irq()
666 rsnd_mod_write(mod, SSI_INT_ENABLE, val); in rsnd_ssi_irq()
671 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
673 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, in __rsnd_ssi_interrupt() argument
676 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in __rsnd_ssi_interrupt()
678 int is_dma = rsnd_ssi_is_dma_mode(mod); in __rsnd_ssi_interrupt()
689 status = rsnd_ssi_status_get(mod); in __rsnd_ssi_interrupt()
693 elapsed = rsnd_ssi_pio_interrupt(mod, io); in __rsnd_ssi_interrupt()
698 rsnd_mod_name(mod), status); in __rsnd_ssi_interrupt()
703 stop |= rsnd_ssiu_busif_err_status_clear(mod); in __rsnd_ssi_interrupt()
705 rsnd_ssi_status_clear(mod); in __rsnd_ssi_interrupt()
719 struct rsnd_mod *mod = data; in rsnd_ssi_interrupt() local
721 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt); in rsnd_ssi_interrupt()
726 static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod, in rsnd_ssi_get_status() argument
744 * OTOH, using each mod's status is good for MUX case. in rsnd_ssi_get_status()
758 return rsnd_mod_get_status(mod, io, type); in rsnd_ssi_get_status()
764 static void rsnd_ssi_parent_attach(struct rsnd_mod *mod, in rsnd_ssi_parent_attach() argument
768 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in rsnd_ssi_parent_attach()
770 if (!__rsnd_ssi_is_pin_sharing(mod)) in rsnd_ssi_parent_attach()
776 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_parent_attach()
779 switch (rsnd_mod_id(mod)) { in rsnd_ssi_parent_attach()
794 static int rsnd_ssi_pcm_new(struct rsnd_mod *mod, in rsnd_ssi_pcm_new() argument
803 rsnd_ssi_parent_attach(mod, io); in rsnd_ssi_pcm_new()
808 static int rsnd_ssi_common_probe(struct rsnd_mod *mod, in rsnd_ssi_common_probe() argument
813 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_common_probe()
820 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_common_probe()
835 * mod->status. in rsnd_ssi_common_probe()
843 dev_name(dev), mod); in rsnd_ssi_common_probe()
851 static int rsnd_ssi_common_remove(struct rsnd_mod *mod, in rsnd_ssi_common_remove() argument
855 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_common_remove()
858 /* Do nothing if non SSI (= SSI parent, multi SSI) mod */ in rsnd_ssi_common_remove()
859 if (pure_ssi_mod != mod) in rsnd_ssi_common_remove()
864 free_irq(ssi->irq, mod); in rsnd_ssi_common_remove()
875 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod, in rsnd_ssi_pio_interrupt() argument
879 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_interrupt()
894 rsnd_mod_write(mod, SSITDR, (*buf) << shift); in rsnd_ssi_pio_interrupt()
896 *buf = (rsnd_mod_read(mod, SSIRDR) >> shift); in rsnd_ssi_pio_interrupt()
918 static int rsnd_ssi_pio_init(struct rsnd_mod *mod, in rsnd_ssi_pio_init() argument
923 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_init()
925 if (!rsnd_ssi_is_parent(mod, io)) { in rsnd_ssi_pio_init()
933 return rsnd_ssi_init(mod, io, priv); in rsnd_ssi_pio_init()
936 static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod, in rsnd_ssi_pio_pointer() argument
940 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_pointer()
963 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, in rsnd_ssi_dma_probe() argument
973 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_dma_probe()
976 ret = rsnd_ssi_common_probe(mod, io, priv); in rsnd_ssi_dma_probe()
981 ret = rsnd_dma_attach(io, mod, &io->dma); in rsnd_ssi_dma_probe()
986 static int rsnd_ssi_fallback(struct rsnd_mod *mod, in rsnd_ssi_fallback() argument
999 mod->ops = &rsnd_ssi_pio_ops; in rsnd_ssi_fallback()
1001 dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod)); in rsnd_ssi_fallback()
1007 struct rsnd_mod *mod) in rsnd_ssi_dma_req() argument
1009 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in rsnd_ssi_dma_req()
1030 SSI_NAME, mod, name); in rsnd_ssi_dma_req()
1036 struct rsnd_mod *mod) in rsnd_ssi_debug_info() argument
1039 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_debug_info()
1045 seq_printf(m, "pin share: %d\n", __rsnd_ssi_is_pin_sharing(mod)); in rsnd_ssi_debug_info()
1046 seq_printf(m, "can out clk: %d\n", rsnd_ssi_can_output_clk(mod)); in rsnd_ssi_debug_info()
1047 seq_printf(m, "multi secondary: %d\n", rsnd_ssi_is_multi_secondary(mod, io)); in rsnd_ssi_debug_info()
1053 rsnd_debugfs_mod_reg_show(m, mod, RSND_BASE_SSI, in rsnd_ssi_debug_info()
1054 rsnd_mod_id(mod) * 0x40, 0x40); in rsnd_ssi_debug_info()
1078 int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod) in rsnd_ssi_is_dma_mode() argument
1080 return mod->ops == &rsnd_ssi_dma_ops; in rsnd_ssi_is_dma_mode()
1084 * ssi mod function
1086 static void rsnd_ssi_connect(struct rsnd_mod *mod, in rsnd_ssi_connect() argument
1103 rsnd_dai_connect(mod, io, type); in rsnd_ssi_connect()
1127 struct rsnd_mod *mod; in rsnd_parse_connect_ssi() local
1135 mod = rsnd_ssi_mod_get(priv, i); in rsnd_parse_connect_ssi()
1138 rsnd_ssi_connect(mod, &rdai->playback); in rsnd_parse_connect_ssi()
1140 rsnd_ssi_connect(mod, &rdai->capture); in rsnd_parse_connect_ssi()
1155 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod) in __rsnd_ssi_is_pin_sharing() argument
1157 if (!mod) in __rsnd_ssi_is_pin_sharing()
1160 return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE)); in __rsnd_ssi_is_pin_sharing()