Lines Matching refs:ssi

76 		((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));		\
82 #define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0) argument
83 #define rsnd_ssi_clk_from_parent(ssi) ((ssi)->parent) argument
85 #define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id) argument
91 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_use_busif() local
98 if (!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_NO_BUSIF)) in rsnd_ssi_use_busif()
125 static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi, in rsnd_ssi_master_clk_start() argument
155 ret = rsnd_adg_ssi_clk_try_start(&ssi->mod, main_rate); in rsnd_ssi_master_clk_start()
157 ssi->cr_clk = FORCE | SWL_32 | in rsnd_ssi_master_clk_start()
161 rsnd_mod_name(&ssi->mod), in rsnd_ssi_master_clk_start()
162 rsnd_mod_id(&ssi->mod), rate); in rsnd_ssi_master_clk_start()
173 static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi) in rsnd_ssi_master_clk_stop() argument
175 ssi->cr_clk = 0; in rsnd_ssi_master_clk_stop()
176 rsnd_adg_ssi_clk_stop(&ssi->mod); in rsnd_ssi_master_clk_stop()
179 static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, in rsnd_ssi_hw_start() argument
188 if (0 == ssi->usrcnt) { in rsnd_ssi_hw_start()
189 rsnd_mod_hw_start(&ssi->mod); in rsnd_ssi_hw_start()
192 if (rsnd_ssi_clk_from_parent(ssi)) in rsnd_ssi_hw_start()
193 rsnd_ssi_hw_start(ssi->parent, io); in rsnd_ssi_hw_start()
195 rsnd_ssi_master_clk_start(ssi, io); in rsnd_ssi_hw_start()
199 cr_mode = rsnd_ssi_is_dma_mode(&ssi->mod) ? in rsnd_ssi_hw_start()
204 cr = ssi->cr_own | in rsnd_ssi_hw_start()
205 ssi->cr_clk | in rsnd_ssi_hw_start()
209 rsnd_mod_write(&ssi->mod, SSICR, cr); in rsnd_ssi_hw_start()
213 rsnd_mod_write(&ssi->mod, SSIWSR, CONT); in rsnd_ssi_hw_start()
216 rsnd_mod_write(&ssi->mod, SSISR, 0); in rsnd_ssi_hw_start()
218 ssi->usrcnt++; in rsnd_ssi_hw_start()
221 rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); in rsnd_ssi_hw_start()
224 static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi) in rsnd_ssi_hw_stop() argument
226 struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod); in rsnd_ssi_hw_stop()
227 struct rsnd_dai_stream *io = rsnd_mod_to_io(&ssi->mod); in rsnd_ssi_hw_stop()
232 if (0 == ssi->usrcnt) /* stop might be called without start */ in rsnd_ssi_hw_stop()
235 ssi->usrcnt--; in rsnd_ssi_hw_stop()
237 if (0 == ssi->usrcnt) { in rsnd_ssi_hw_stop()
242 cr = ssi->cr_own | in rsnd_ssi_hw_stop()
243 ssi->cr_clk; in rsnd_ssi_hw_stop()
245 rsnd_mod_write(&ssi->mod, SSICR, cr | EN); in rsnd_ssi_hw_stop()
246 rsnd_ssi_status_check(&ssi->mod, DIRQ); in rsnd_ssi_hw_stop()
252 rsnd_mod_write(&ssi->mod, SSICR, cr); /* disabled all */ in rsnd_ssi_hw_stop()
253 rsnd_ssi_status_check(&ssi->mod, IIRQ); in rsnd_ssi_hw_stop()
256 if (rsnd_ssi_clk_from_parent(ssi)) in rsnd_ssi_hw_stop()
257 rsnd_ssi_hw_stop(ssi->parent); in rsnd_ssi_hw_stop()
259 rsnd_ssi_master_clk_stop(ssi); in rsnd_ssi_hw_stop()
262 rsnd_mod_hw_stop(&ssi->mod); in rsnd_ssi_hw_stop()
266 rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); in rsnd_ssi_hw_stop()
275 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_init() local
317 ssi->cr_own = cr; in rsnd_ssi_init()
318 ssi->err = -1; /* ignore 1st error */ in rsnd_ssi_init()
326 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_quit() local
329 if (ssi->err > 0) in rsnd_ssi_quit()
331 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err); in rsnd_ssi_quit()
333 ssi->cr_own = 0; in rsnd_ssi_quit()
334 ssi->err = 0; in rsnd_ssi_quit()
339 static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status) in rsnd_ssi_record_error() argument
343 ssi->err++; in rsnd_ssi_record_error()
346 rsnd_mod_write(&ssi->mod, SSISR, 0); in rsnd_ssi_record_error()
353 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_start() local
358 rsnd_ssi_hw_start(ssi, io); in rsnd_ssi_start()
368 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_stop() local
372 rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR)); in rsnd_ssi_stop()
374 rsnd_ssi_hw_stop(ssi); in rsnd_ssi_stop()
383 struct rsnd_ssi *ssi = data; in rsnd_ssi_interrupt() local
384 struct rsnd_mod *mod = &ssi->mod; in rsnd_ssi_interrupt()
423 if (ssi->err < 1024) in rsnd_ssi_interrupt()
429 rsnd_ssi_record_error(ssi, status); in rsnd_ssi_interrupt()
441 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_pio_probe() local
444 ret = devm_request_irq(dev, ssi->info->irq, in rsnd_ssi_pio_probe()
447 dev_name(dev), ssi); in rsnd_ssi_pio_probe()
464 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_dma_probe() local
466 int dma_id = ssi->info->dma_id; in rsnd_ssi_dma_probe()
469 ret = devm_request_irq(dev, ssi->info->irq, in rsnd_ssi_dma_probe()
472 dev_name(dev), ssi); in rsnd_ssi_dma_probe()
486 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_dma_remove() local
488 int irq = ssi->info->irq; in rsnd_ssi_dma_remove()
493 devm_free_irq(dev, irq, ssi); in rsnd_ssi_dma_remove()
591 return &((struct rsnd_ssi *)(priv->ssi) + id)->mod; in rsnd_ssi_mod_get()
596 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); in rsnd_ssi_is_pin_sharing() local
598 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE); in rsnd_ssi_is_pin_sharing()
601 static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi) in rsnd_ssi_parent_clk_setup() argument
603 if (!rsnd_ssi_is_pin_sharing(&ssi->mod)) in rsnd_ssi_parent_clk_setup()
606 switch (rsnd_mod_id(&ssi->mod)) { in rsnd_ssi_parent_clk_setup()
609 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0)); in rsnd_ssi_parent_clk_setup()
612 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3)); in rsnd_ssi_parent_clk_setup()
615 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7)); in rsnd_ssi_parent_clk_setup()
694 struct rsnd_ssi *ssi; in rsnd_ssi_probe() local
704 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL); in rsnd_ssi_probe()
705 if (!ssi) { in rsnd_ssi_probe()
710 priv->ssi = ssi; in rsnd_ssi_probe()
713 for_each_rsnd_ssi(ssi, priv, i) { in rsnd_ssi_probe()
723 ssi->info = pinfo; in rsnd_ssi_probe()
728 else if (rsnd_ssi_pio_available(ssi)) in rsnd_ssi_probe()
731 ret = rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i); in rsnd_ssi_probe()
735 rsnd_ssi_parent_clk_setup(priv, ssi); in rsnd_ssi_probe()
744 struct rsnd_ssi *ssi; in rsnd_ssi_remove() local
747 for_each_rsnd_ssi(ssi, priv, i) { in rsnd_ssi_remove()
748 rsnd_mod_quit(&ssi->mod); in rsnd_ssi_remove()