Lines Matching refs:mod

80 	struct rsnd_mod mod;
112 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
114 #define rsnd_ssi_is_multi_secondary(mod, io) \
115 (rsnd_ssi_multi_secondaries(io) & (1 << rsnd_mod_id(mod)))
116 #define rsnd_ssi_is_run_mods(mod, io) \
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))
120 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
124 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
125 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
128 if (!rsnd_ssi_is_dma_mode(mod))
139 static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
141 rsnd_mod_write(mod, SSISR, 0);
144 static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
146 return rsnd_mod_read(mod, SSISR);
149 static void rsnd_ssi_status_check(struct rsnd_mod *mod,
152 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
158 status = rsnd_ssi_status_get(mod);
165 dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod));
170 struct rsnd_mod *mod;
180 mod = rsnd_io_to_mod(io, types[i]);
181 if (!mod)
184 mask |= 1 << rsnd_mod_id(mod);
266 static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
272 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
283 if (!rsnd_ssi_can_output_clk(mod))
286 if (rsnd_ssi_is_multi_secondary(mod, io))
314 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
335 rsnd_mod_name(mod), chan, rate);
340 static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
344 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
349 if (!rsnd_ssi_can_output_clk(mod))
359 rsnd_adg_ssi_clk_stop(mod);
362 static void rsnd_ssi_config_init(struct rsnd_mod *mod,
369 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
375 int id = rsnd_mod_id(mod);
413 if (rsnd_ssi_is_parent(mod, io))
446 if (rsnd_ssi_is_dma_mode(mod)) {
462 sys_int_enable = rsnd_mod_read(mod,
465 rsnd_mod_write(mod,
473 sys_int_enable = rsnd_mod_read(mod,
476 rsnd_mod_write(mod,
491 static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
493 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
495 rsnd_mod_write(mod, SSIWSR, ssi->wsr);
496 rsnd_mod_write(mod, SSICR, ssi->cr_own |
503 * SSI mod common functions
505 static int rsnd_ssi_init(struct rsnd_mod *mod,
509 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
512 if (!rsnd_ssi_is_run_mods(mod, io))
515 ret = rsnd_ssi_master_clk_start(mod, io);
521 ret = rsnd_mod_power_on(mod);
525 rsnd_ssi_config_init(mod, io);
527 rsnd_ssi_register_setup(mod);
530 rsnd_ssi_status_clear(mod);
535 static int rsnd_ssi_quit(struct rsnd_mod *mod,
539 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
542 int id = rsnd_mod_id(mod);
549 if (!rsnd_ssi_is_run_mods(mod, io))
553 dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod));
557 rsnd_ssi_master_clk_stop(mod, io);
559 rsnd_mod_power_off(mod);
578 sys_int_enable = rsnd_mod_read(mod,
581 rsnd_mod_write(mod,
589 sys_int_enable = rsnd_mod_read(mod,
592 rsnd_mod_write(mod,
604 static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
623 static int rsnd_ssi_start(struct rsnd_mod *mod,
627 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
629 if (!rsnd_ssi_is_run_mods(mod, io))
643 if (rsnd_ssi_is_parent(mod, io))
648 rsnd_mod_write(mod, SSICR, ssi->cr_own |
656 static int rsnd_ssi_stop(struct rsnd_mod *mod,
660 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
663 if (!rsnd_ssi_is_run_mods(mod, io))
666 if (rsnd_ssi_is_parent(mod, io))
678 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en);
679 rsnd_ssi_status_check(mod, DIRQ);
692 rsnd_mod_write(mod, SSICR, cr); /* disabled all */
693 rsnd_ssi_status_check(mod, IIRQ);
700 static int rsnd_ssi_irq(struct rsnd_mod *mod,
707 int id = rsnd_mod_id(mod);
715 if (rsnd_ssi_is_parent(mod, io))
718 if (!rsnd_ssi_is_run_mods(mod, io))
722 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;
737 rsnd_mod_write(mod, SSI_INT_ENABLE, val);
742 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
744 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
747 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
749 int is_dma = rsnd_ssi_is_dma_mode(mod);
753 int id = rsnd_mod_id(mod);
766 status = rsnd_ssi_status_get(mod);
770 elapsed = rsnd_ssi_pio_interrupt(mod, io);
775 rsnd_mod_name(mod), status);
790 status = rsnd_mod_read(mod,
797 rsnd_mod_name(mod), status);
798 rsnd_mod_write(mod,
807 status = rsnd_mod_read(mod,
814 rsnd_mod_name(mod), status);
815 rsnd_mod_write(mod,
825 rsnd_ssi_status_clear(mod);
839 struct rsnd_mod *mod = data;
841 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
846 static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod,
864 * OTOH, using each mod's status is good for MUX case.
878 return rsnd_mod_get_status(mod, io, type);
884 static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
888 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
890 if (!__rsnd_ssi_is_pin_sharing(mod))
896 if (rsnd_ssi_is_multi_secondary(mod, io))
899 switch (rsnd_mod_id(mod)) {
914 static int rsnd_ssi_pcm_new(struct rsnd_mod *mod,
923 rsnd_ssi_parent_attach(mod, io);
928 static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
933 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
940 if (rsnd_ssi_is_multi_secondary(mod, io))
955 * mod->status.
963 dev_name(dev), mod);
971 static int rsnd_ssi_common_remove(struct rsnd_mod *mod,
975 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
978 /* Do nothing if non SSI (= SSI parent, multi SSI) mod */
979 if (pure_ssi_mod != mod)
984 free_irq(ssi->irq, mod);
995 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
999 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
1014 rsnd_mod_write(mod, SSITDR, (*buf) << shift);
1016 *buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
1038 static int rsnd_ssi_pio_init(struct rsnd_mod *mod,
1043 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
1045 if (!rsnd_ssi_is_parent(mod, io)) {
1053 return rsnd_ssi_init(mod, io, priv);
1056 static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
1060 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
1083 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
1093 if (rsnd_ssi_is_multi_secondary(mod, io))
1096 ret = rsnd_ssi_common_probe(mod, io, priv);
1101 ret = rsnd_dma_attach(io, mod, &io->dma);
1106 static int rsnd_ssi_fallback(struct rsnd_mod *mod,
1119 mod->ops = &rsnd_ssi_pio_ops;
1121 dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod));
1127 struct rsnd_mod *mod)
1129 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
1150 mod, name);
1169 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
1171 return mod->ops == &rsnd_ssi_dma_ops;
1175 * ssi mod function
1177 static void rsnd_ssi_connect(struct rsnd_mod *mod,
1194 rsnd_dai_connect(mod, io, type);
1209 struct rsnd_mod *mod;
1218 mod = rsnd_ssi_mod_get(priv, i);
1220 rsnd_ssi_connect(mod, &rdai->playback);
1222 rsnd_ssi_connect(mod, &rdai->capture);
1237 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
1239 if (!mod)
1242 return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE));