Lines Matching full:mod

80 	struct rsnd_mod mod;  member
112 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
114 #define rsnd_ssi_is_multi_secondary(mod, io) \ argument
115 (rsnd_ssi_multi_secondaries(io) & (1 << rsnd_mod_id(mod)))
116 #define rsnd_ssi_is_run_mods(mod, io) \ argument
117 (rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
118 #define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod)) argument
120 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
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()
170 struct rsnd_mod *mod; in rsnd_ssi_multi_secondaries() local
180 mod = rsnd_io_to_mod(io, types[i]); in rsnd_ssi_multi_secondaries()
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()
314 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate); in rsnd_ssi_master_clk_start()
335 rsnd_mod_name(mod), chan, rate); in rsnd_ssi_master_clk_start()
340 static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod, in rsnd_ssi_master_clk_stop() argument
344 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_master_clk_stop()
349 if (!rsnd_ssi_can_output_clk(mod)) in rsnd_ssi_master_clk_stop()
359 rsnd_adg_ssi_clk_stop(mod); in rsnd_ssi_master_clk_stop()
362 static void rsnd_ssi_config_init(struct rsnd_mod *mod, in rsnd_ssi_config_init() argument
369 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_config_init()
375 int id = rsnd_mod_id(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()
462 sys_int_enable = rsnd_mod_read(mod, in rsnd_ssi_config_init()
465 rsnd_mod_write(mod, in rsnd_ssi_config_init()
473 sys_int_enable = rsnd_mod_read(mod, in rsnd_ssi_config_init()
476 rsnd_mod_write(mod, in rsnd_ssi_config_init()
491 static void rsnd_ssi_register_setup(struct rsnd_mod *mod) in rsnd_ssi_register_setup() argument
493 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_register_setup()
495 rsnd_mod_write(mod, SSIWSR, ssi->wsr); in rsnd_ssi_register_setup()
496 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_register_setup()
503 * SSI mod common functions
505 static int rsnd_ssi_init(struct rsnd_mod *mod, in rsnd_ssi_init() argument
509 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_init()
511 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_init()
516 rsnd_mod_power_on(mod); in rsnd_ssi_init()
518 rsnd_ssi_config_init(mod, io); in rsnd_ssi_init()
520 rsnd_ssi_register_setup(mod); in rsnd_ssi_init()
523 rsnd_ssi_status_clear(mod); in rsnd_ssi_init()
528 static int rsnd_ssi_quit(struct rsnd_mod *mod, in rsnd_ssi_quit() argument
532 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_quit()
535 int id = rsnd_mod_id(mod); in rsnd_ssi_quit()
542 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_quit()
546 dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod)); in rsnd_ssi_quit()
550 rsnd_ssi_master_clk_stop(mod, io); in rsnd_ssi_quit()
552 rsnd_mod_power_off(mod); in rsnd_ssi_quit()
571 sys_int_enable = rsnd_mod_read(mod, in rsnd_ssi_quit()
574 rsnd_mod_write(mod, in rsnd_ssi_quit()
582 sys_int_enable = rsnd_mod_read(mod, in rsnd_ssi_quit()
585 rsnd_mod_write(mod, in rsnd_ssi_quit()
597 static int rsnd_ssi_hw_params(struct rsnd_mod *mod, in rsnd_ssi_hw_params() argument
616 static int rsnd_ssi_start(struct rsnd_mod *mod, in rsnd_ssi_start() argument
620 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_start()
622 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_start()
636 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_start()
641 rsnd_mod_write(mod, SSICR, ssi->cr_own | in rsnd_ssi_start()
649 static int rsnd_ssi_stop(struct rsnd_mod *mod, in rsnd_ssi_stop() argument
653 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_stop()
656 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_stop()
659 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_stop()
671 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en); in rsnd_ssi_stop()
672 rsnd_ssi_status_check(mod, DIRQ); in rsnd_ssi_stop()
685 rsnd_mod_write(mod, SSICR, cr); /* disabled all */ in rsnd_ssi_stop()
686 rsnd_ssi_status_check(mod, IIRQ); in rsnd_ssi_stop()
693 static int rsnd_ssi_irq(struct rsnd_mod *mod, in rsnd_ssi_irq() argument
700 int id = rsnd_mod_id(mod); in rsnd_ssi_irq()
708 if (rsnd_ssi_is_parent(mod, io)) in rsnd_ssi_irq()
711 if (!rsnd_ssi_is_run_mods(mod, io)) in rsnd_ssi_irq()
715 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000; in rsnd_ssi_irq()
730 rsnd_mod_write(mod, SSI_INT_ENABLE, val); in rsnd_ssi_irq()
735 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
737 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, in __rsnd_ssi_interrupt() argument
740 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in __rsnd_ssi_interrupt()
742 int is_dma = rsnd_ssi_is_dma_mode(mod); in __rsnd_ssi_interrupt()
746 int id = rsnd_mod_id(mod); in __rsnd_ssi_interrupt()
759 status = rsnd_ssi_status_get(mod); in __rsnd_ssi_interrupt()
763 elapsed = rsnd_ssi_pio_interrupt(mod, io); in __rsnd_ssi_interrupt()
768 rsnd_mod_name(mod), status); in __rsnd_ssi_interrupt()
783 status = rsnd_mod_read(mod, in __rsnd_ssi_interrupt()
790 rsnd_mod_name(mod), status); in __rsnd_ssi_interrupt()
791 rsnd_mod_write(mod, in __rsnd_ssi_interrupt()
801 status = rsnd_mod_read(mod, in __rsnd_ssi_interrupt()
808 rsnd_mod_name(mod), status); in __rsnd_ssi_interrupt()
809 rsnd_mod_write(mod, in __rsnd_ssi_interrupt()
820 rsnd_ssi_status_clear(mod); in __rsnd_ssi_interrupt()
834 struct rsnd_mod *mod = data; in rsnd_ssi_interrupt() local
836 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt); in rsnd_ssi_interrupt()
841 static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod, in rsnd_ssi_get_status() argument
859 * OTOH, using each mod's status is good for MUX case. in rsnd_ssi_get_status()
873 return rsnd_mod_get_status(mod, io, type); in rsnd_ssi_get_status()
879 static void rsnd_ssi_parent_attach(struct rsnd_mod *mod, in rsnd_ssi_parent_attach() argument
883 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in rsnd_ssi_parent_attach()
885 if (!__rsnd_ssi_is_pin_sharing(mod)) in rsnd_ssi_parent_attach()
891 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_parent_attach()
894 switch (rsnd_mod_id(mod)) { in rsnd_ssi_parent_attach()
909 static int rsnd_ssi_pcm_new(struct rsnd_mod *mod, in rsnd_ssi_pcm_new() argument
918 rsnd_ssi_parent_attach(mod, io); in rsnd_ssi_pcm_new()
923 static int rsnd_ssi_common_probe(struct rsnd_mod *mod, in rsnd_ssi_common_probe() argument
928 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_common_probe()
935 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_common_probe()
950 * mod->status. in rsnd_ssi_common_probe()
958 dev_name(dev), mod); in rsnd_ssi_common_probe()
966 static int rsnd_ssi_common_remove(struct rsnd_mod *mod, in rsnd_ssi_common_remove() argument
970 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_common_remove()
973 /* Do nothing if non SSI (= SSI parent, multi SSI) mod */ in rsnd_ssi_common_remove()
974 if (pure_ssi_mod != mod) in rsnd_ssi_common_remove()
979 free_irq(ssi->irq, mod); in rsnd_ssi_common_remove()
990 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod, in rsnd_ssi_pio_interrupt() argument
994 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_interrupt()
1009 rsnd_mod_write(mod, SSITDR, (*buf) << shift); in rsnd_ssi_pio_interrupt()
1011 *buf = (rsnd_mod_read(mod, SSIRDR) >> shift); in rsnd_ssi_pio_interrupt()
1033 static int rsnd_ssi_pio_init(struct rsnd_mod *mod, in rsnd_ssi_pio_init() argument
1038 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_init()
1040 if (!rsnd_ssi_is_parent(mod, io)) { in rsnd_ssi_pio_init()
1048 return rsnd_ssi_init(mod, io, priv); in rsnd_ssi_pio_init()
1051 static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod, in rsnd_ssi_pio_pointer() argument
1055 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_pointer()
1063 static int rsnd_ssi_prepare(struct rsnd_mod *mod, in rsnd_ssi_prepare() argument
1067 return rsnd_ssi_master_clk_start(mod, io); in rsnd_ssi_prepare()
1086 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, in rsnd_ssi_dma_probe() argument
1096 if (rsnd_ssi_is_multi_secondary(mod, io)) in rsnd_ssi_dma_probe()
1099 ret = rsnd_ssi_common_probe(mod, io, priv); in rsnd_ssi_dma_probe()
1104 ret = rsnd_dma_attach(io, mod, &io->dma); in rsnd_ssi_dma_probe()
1109 static int rsnd_ssi_fallback(struct rsnd_mod *mod, in rsnd_ssi_fallback() argument
1122 mod->ops = &rsnd_ssi_pio_ops; in rsnd_ssi_fallback()
1124 dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod)); in rsnd_ssi_fallback()
1130 struct rsnd_mod *mod) in rsnd_ssi_dma_req() argument
1132 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); in rsnd_ssi_dma_req()
1153 mod, name); in rsnd_ssi_dma_req()
1173 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod) in rsnd_ssi_is_dma_mode() argument
1175 return mod->ops == &rsnd_ssi_dma_ops; in rsnd_ssi_is_dma_mode()
1179 * ssi mod function
1181 static void rsnd_ssi_connect(struct rsnd_mod *mod, in rsnd_ssi_connect() argument
1198 rsnd_dai_connect(mod, io, type); in rsnd_ssi_connect()
1213 struct rsnd_mod *mod; in rsnd_parse_connect_ssi() local
1222 mod = rsnd_ssi_mod_get(priv, i); in rsnd_parse_connect_ssi()
1224 rsnd_ssi_connect(mod, &rdai->playback); in rsnd_parse_connect_ssi()
1226 rsnd_ssi_connect(mod, &rdai->capture); in rsnd_parse_connect_ssi()
1241 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod) in __rsnd_ssi_is_pin_sharing() argument
1243 if (!mod) in __rsnd_ssi_is_pin_sharing()
1246 return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE)); in __rsnd_ssi_is_pin_sharing()