Lines Matching refs:omap_port
45 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_wakein() local
46 return gpio_get_value(omap_port->wake_gpio); in ssi_wakein()
52 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_debug_remove_port() local
54 debugfs_remove_recursive(omap_port->dir); in ssi_debug_remove_port()
60 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_debug_port_show() local
66 pm_runtime_get_sync(omap_port->pdev); in ssi_debug_port_show()
67 if (omap_port->wake_irq > 0) in ssi_debug_port_show()
76 base = omap_port->sst_base; in ssi_debug_port_show()
96 for (ch = 0; ch < omap_port->channels; ch++) { in ssi_debug_port_show()
101 base = omap_port->ssr_base; in ssi_debug_port_show()
123 for (ch = 0; ch < omap_port->channels; ch++) { in ssi_debug_port_show()
127 pm_runtime_put_sync(omap_port->pdev); in ssi_debug_port_show()
147 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_div_get() local
149 pm_runtime_get_sync(omap_port->pdev); in ssi_div_get()
150 *val = readl(omap_port->sst_base + SSI_SST_DIVISOR_REG); in ssi_div_get()
151 pm_runtime_put_sync(omap_port->pdev); in ssi_div_get()
159 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_div_set() local
164 pm_runtime_get_sync(omap_port->pdev); in ssi_div_set()
165 writel(val, omap_port->sst_base + SSI_SST_DIVISOR_REG); in ssi_div_set()
166 omap_port->sst.divisor = val; in ssi_div_set()
167 pm_runtime_put_sync(omap_port->pdev); in ssi_div_set()
174 static int __init ssi_debug_add_port(struct omap_ssi_port *omap_port, in ssi_debug_add_port() argument
177 struct hsi_port *port = to_hsi_port(omap_port->dev); in ssi_debug_add_port()
179 dir = debugfs_create_dir(dev_name(omap_port->dev), dir); in ssi_debug_add_port()
182 omap_port->dir = dir; in ssi_debug_add_port()
215 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_start_dma() local
239 s_addr = omap_port->ssr_dma + in ssi_start_dma()
256 d_addr = omap_port->sst_dma + in ssi_start_dma()
263 pm_runtime_get_sync(omap_port->pdev); in ssi_start_dma()
286 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_start_pio() local
291 pm_runtime_get_sync(omap_port->pdev); in ssi_start_pio()
295 pm_runtime_get_sync(omap_port->pdev); in ssi_start_pio()
303 pm_runtime_put_sync(omap_port->pdev); in ssi_start_pio()
331 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_async_break() local
337 pm_runtime_get_sync(omap_port->pdev); in ssi_async_break()
339 if (omap_port->sst.mode != SSI_MODE_FRAME) { in ssi_async_break()
343 writel(1, omap_port->sst_base + SSI_SST_BREAK_REG); in ssi_async_break()
347 if (omap_port->ssr.mode != SSI_MODE_FRAME) { in ssi_async_break()
351 spin_lock_bh(&omap_port->lock); in ssi_async_break()
357 list_add_tail(&msg->link, &omap_port->brkqueue); in ssi_async_break()
358 spin_unlock_bh(&omap_port->lock); in ssi_async_break()
361 pm_runtime_put_sync(omap_port->pdev); in ssi_async_break()
369 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_async() local
382 BUG_ON(msg->channel >= omap_port->sst.channels); in ssi_async()
383 queue = &omap_port->txqueue[msg->channel]; in ssi_async()
385 BUG_ON(msg->channel >= omap_port->ssr.channels); in ssi_async()
386 queue = &omap_port->rxqueue[msg->channel]; in ssi_async()
389 spin_lock_bh(&omap_port->lock); in ssi_async()
396 spin_unlock_bh(&omap_port->lock); in ssi_async()
442 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_setup() local
445 void __iomem *sst = omap_port->sst_base; in ssi_setup()
446 void __iomem *ssr = omap_port->ssr_base; in ssi_setup()
451 pm_runtime_get_sync(omap_port->pdev); in ssi_setup()
452 spin_lock_bh(&omap_port->lock); in ssi_setup()
478 if ((omap_port->ssr.mode == SSI_MODE_FRAME) && in ssi_setup()
480 ssi_flush_queue(&omap_port->brkqueue, cl); in ssi_setup()
482 omap_port->channels = max(cl->rx_cfg.num_hw_channels, in ssi_setup()
486 omap_port->sst.divisor = div; in ssi_setup()
487 omap_port->sst.frame_size = 31; in ssi_setup()
488 omap_port->sst.channels = cl->tx_cfg.num_hw_channels; in ssi_setup()
489 omap_port->sst.arb_mode = cl->tx_cfg.arb_mode; in ssi_setup()
490 omap_port->sst.mode = cl->tx_cfg.mode; in ssi_setup()
492 omap_port->ssr.frame_size = 31; in ssi_setup()
493 omap_port->ssr.timeout = 0; in ssi_setup()
494 omap_port->ssr.channels = cl->rx_cfg.num_hw_channels; in ssi_setup()
495 omap_port->ssr.mode = cl->rx_cfg.mode; in ssi_setup()
497 spin_unlock_bh(&omap_port->lock); in ssi_setup()
498 pm_runtime_put_sync(omap_port->pdev); in ssi_setup()
506 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_flush() local
510 void __iomem *sst = omap_port->sst_base; in ssi_flush()
511 void __iomem *ssr = omap_port->ssr_base; in ssi_flush()
515 pm_runtime_get_sync(omap_port->pdev); in ssi_flush()
516 spin_lock_bh(&omap_port->lock); in ssi_flush()
524 pm_runtime_put_sync(omap_port->pdev); in ssi_flush()
545 for (i = 0; i < omap_port->channels; i++) { in ssi_flush()
547 if (!list_empty(&omap_port->txqueue[i])) in ssi_flush()
548 pm_runtime_put_sync(omap_port->pdev); in ssi_flush()
549 ssi_flush_queue(&omap_port->txqueue[i], NULL); in ssi_flush()
550 ssi_flush_queue(&omap_port->rxqueue[i], NULL); in ssi_flush()
552 ssi_flush_queue(&omap_port->brkqueue, NULL); in ssi_flush()
553 spin_unlock_bh(&omap_port->lock); in ssi_flush()
554 pm_runtime_put_sync(omap_port->pdev); in ssi_flush()
562 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_start_tx() local
566 dev_dbg(&port->device, "Wake out high %d\n", omap_port->wk_refcount); in ssi_start_tx()
568 spin_lock_bh(&omap_port->wk_lock); in ssi_start_tx()
569 if (omap_port->wk_refcount++) { in ssi_start_tx()
570 spin_unlock_bh(&omap_port->wk_lock); in ssi_start_tx()
573 pm_runtime_get_sync(omap_port->pdev); /* Grab clocks */ in ssi_start_tx()
575 spin_unlock_bh(&omap_port->wk_lock); in ssi_start_tx()
583 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_stop_tx() local
587 dev_dbg(&port->device, "Wake out low %d\n", omap_port->wk_refcount); in ssi_stop_tx()
589 spin_lock_bh(&omap_port->wk_lock); in ssi_stop_tx()
590 BUG_ON(!omap_port->wk_refcount); in ssi_stop_tx()
591 if (--omap_port->wk_refcount) { in ssi_stop_tx()
592 spin_unlock_bh(&omap_port->wk_lock); in ssi_stop_tx()
596 pm_runtime_put_sync(omap_port->pdev); /* Release clocks */ in ssi_stop_tx()
597 spin_unlock_bh(&omap_port->wk_lock); in ssi_stop_tx()
602 static void ssi_transfer(struct omap_ssi_port *omap_port, in ssi_transfer() argument
608 spin_lock_bh(&omap_port->lock); in ssi_transfer()
616 spin_unlock_bh(&omap_port->lock); in ssi_transfer()
618 spin_lock_bh(&omap_port->lock); in ssi_transfer()
621 spin_unlock_bh(&omap_port->lock); in ssi_transfer()
627 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_cleanup_queues() local
637 ssi_flush_queue(&omap_port->brkqueue, cl); in ssi_cleanup_queues()
638 if (list_empty(&omap_port->brkqueue)) in ssi_cleanup_queues()
641 for (i = 0; i < omap_port->channels; i++) { in ssi_cleanup_queues()
642 if (list_empty(&omap_port->txqueue[i])) in ssi_cleanup_queues()
644 msg = list_first_entry(&omap_port->txqueue[i], struct hsi_msg, in ssi_cleanup_queues()
650 pm_runtime_put_sync(omap_port->pdev); in ssi_cleanup_queues()
652 ssi_flush_queue(&omap_port->txqueue[i], cl); in ssi_cleanup_queues()
654 for (i = 0; i < omap_port->channels; i++) { in ssi_cleanup_queues()
655 if (list_empty(&omap_port->rxqueue[i])) in ssi_cleanup_queues()
657 msg = list_first_entry(&omap_port->rxqueue[i], struct hsi_msg, in ssi_cleanup_queues()
663 ssi_flush_queue(&omap_port->rxqueue[i], cl); in ssi_cleanup_queues()
665 if (!list_empty(&omap_port->rxqueue[i])) in ssi_cleanup_queues()
669 tmp = readl(omap_port->sst_base + SSI_SST_BUFSTATE_REG); in ssi_cleanup_queues()
671 writel_relaxed(tmp, omap_port->sst_base + SSI_SST_BUFSTATE_REG); in ssi_cleanup_queues()
673 tmp = readl(omap_port->ssr_base + SSI_SSR_BUFSTATE_REG); in ssi_cleanup_queues()
675 writel_relaxed(tmp, omap_port->ssr_base + SSI_SSR_BUFSTATE_REG); in ssi_cleanup_queues()
688 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_cleanup_gdd() local
705 pm_runtime_put_sync(omap_port->pdev); in ssi_cleanup_gdd()
714 static int ssi_set_port_mode(struct omap_ssi_port *omap_port, u32 mode) in ssi_set_port_mode() argument
716 writel(mode, omap_port->sst_base + SSI_SST_MODE_REG); in ssi_set_port_mode()
717 writel(mode, omap_port->ssr_base + SSI_SSR_MODE_REG); in ssi_set_port_mode()
719 mode = readl(omap_port->ssr_base + SSI_SSR_MODE_REG); in ssi_set_port_mode()
727 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_release() local
730 spin_lock_bh(&omap_port->lock); in ssi_release()
731 pm_runtime_get_sync(omap_port->pdev); in ssi_release()
736 pm_runtime_put_sync(omap_port->pdev); in ssi_release()
743 if (omap_port->wkin_cken) { in ssi_release()
744 pm_runtime_put_sync(omap_port->pdev); in ssi_release()
745 omap_port->wkin_cken = 0; in ssi_release()
747 pm_runtime_get_sync(omap_port->pdev); in ssi_release()
749 ssi_set_port_mode(omap_port, SSI_MODE_SLEEP); in ssi_release()
750 omap_port->sst.mode = SSI_MODE_SLEEP; in ssi_release()
751 omap_port->ssr.mode = SSI_MODE_SLEEP; in ssi_release()
752 pm_runtime_put_sync(omap_port->pdev); in ssi_release()
753 WARN_ON(omap_port->wk_refcount != 0); in ssi_release()
755 spin_unlock_bh(&omap_port->lock); in ssi_release()
764 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_error() local
774 err = readl(omap_port->ssr_base + SSI_SSR_ERROR_REG); in ssi_error()
795 spin_lock(&omap_port->lock); in ssi_error()
800 writel_relaxed(err, omap_port->ssr_base + SSI_SSR_ERRORACK_REG); in ssi_error()
804 for (i = 0; i < omap_port->channels; i++) { in ssi_error()
805 if (list_empty(&omap_port->rxqueue[i])) in ssi_error()
807 msg = list_first_entry(&omap_port->rxqueue[i], struct hsi_msg, in ssi_error()
811 spin_unlock(&omap_port->lock); in ssi_error()
814 ssi_transfer(omap_port, &omap_port->rxqueue[i]); in ssi_error()
815 spin_lock(&omap_port->lock); in ssi_error()
817 spin_unlock(&omap_port->lock); in ssi_error()
822 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_break_complete() local
831 spin_lock(&omap_port->lock); in ssi_break_complete()
835 writel_relaxed(0, omap_port->ssr_base + SSI_SSR_BREAK_REG); in ssi_break_complete()
838 spin_unlock(&omap_port->lock); in ssi_break_complete()
840 list_for_each_entry_safe(msg, tmp, &omap_port->brkqueue, link) { in ssi_break_complete()
842 spin_lock(&omap_port->lock); in ssi_break_complete()
844 spin_unlock(&omap_port->lock); in ssi_break_complete()
854 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_pio_complete() local
860 spin_lock(&omap_port->lock); in ssi_pio_complete()
873 writel(*buf, omap_port->sst_base + in ssi_pio_complete()
876 *buf = readl(omap_port->ssr_base + in ssi_pio_complete()
892 spin_unlock(&omap_port->lock); in ssi_pio_complete()
902 pm_runtime_put_sync(omap_port->pdev); in ssi_pio_complete()
908 spin_unlock(&omap_port->lock); in ssi_pio_complete()
910 ssi_transfer(omap_port, queue); in ssi_pio_complete()
917 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_pio_tasklet() local
923 pm_runtime_get_sync(omap_port->pdev); in ssi_pio_tasklet()
927 for (ch = 0; ch < omap_port->channels; ch++) { in ssi_pio_tasklet()
929 ssi_pio_complete(port, &omap_port->txqueue[ch]); in ssi_pio_tasklet()
931 ssi_pio_complete(port, &omap_port->rxqueue[ch]); in ssi_pio_tasklet()
940 pm_runtime_put_sync(omap_port->pdev); in ssi_pio_tasklet()
943 tasklet_hi_schedule(&omap_port->pio_tasklet); in ssi_pio_tasklet()
945 enable_irq(omap_port->irq); in ssi_pio_tasklet()
950 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_pio_isr() local
952 tasklet_hi_schedule(&omap_port->pio_tasklet); in ssi_pio_isr()
962 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_wake_tasklet() local
973 spin_lock(&omap_port->lock); in ssi_wake_tasklet()
974 if (!omap_port->wkin_cken) { in ssi_wake_tasklet()
975 omap_port->wkin_cken = 1; in ssi_wake_tasklet()
976 pm_runtime_get_sync(omap_port->pdev); in ssi_wake_tasklet()
978 spin_unlock(&omap_port->lock); in ssi_wake_tasklet()
980 if (omap_port->wktest) { /* FIXME: HACK ! To be removed */ in ssi_wake_tasklet()
987 if (omap_port->wktest) { /* FIXME: HACK ! To be removed */ in ssi_wake_tasklet()
992 spin_lock(&omap_port->lock); in ssi_wake_tasklet()
993 if (omap_port->wkin_cken) { in ssi_wake_tasklet()
994 pm_runtime_put_sync(omap_port->pdev); in ssi_wake_tasklet()
995 omap_port->wkin_cken = 0; in ssi_wake_tasklet()
997 spin_unlock(&omap_port->lock); in ssi_wake_tasklet()
1003 struct omap_ssi_port *omap_port = hsi_port_drvdata(ssi_port); in ssi_wake_isr() local
1005 tasklet_hi_schedule(&omap_port->wake_tasklet); in ssi_wake_isr()
1013 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_port_irq() local
1021 omap_port->irq = err; in ssi_port_irq()
1022 tasklet_init(&omap_port->pio_tasklet, ssi_pio_tasklet, in ssi_port_irq()
1024 err = devm_request_irq(&port->device, omap_port->irq, ssi_pio_isr, in ssi_port_irq()
1028 omap_port->irq, err); in ssi_port_irq()
1035 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_wake_irq() local
1039 if (omap_port->wake_gpio == -1) { in ssi_wake_irq()
1040 omap_port->wake_irq = -1; in ssi_wake_irq()
1044 cawake_irq = gpio_to_irq(omap_port->wake_gpio); in ssi_wake_irq()
1046 omap_port->wake_irq = cawake_irq; in ssi_wake_irq()
1047 tasklet_init(&omap_port->wake_tasklet, ssi_wake_tasklet, in ssi_wake_irq()
1063 static void __init ssi_queues_init(struct omap_ssi_port *omap_port) in ssi_queues_init() argument
1068 INIT_LIST_HEAD(&omap_port->txqueue[ch]); in ssi_queues_init()
1069 INIT_LIST_HEAD(&omap_port->rxqueue[ch]); in ssi_queues_init()
1071 INIT_LIST_HEAD(&omap_port->brkqueue); in ssi_queues_init()
1111 struct omap_ssi_port *omap_port; in ssi_port_probe() local
1167 omap_port = devm_kzalloc(&port->device, sizeof(*omap_port), GFP_KERNEL); in ssi_port_probe()
1168 if (!omap_port) { in ssi_port_probe()
1172 omap_port->wake_gpio = cawake_gpio; in ssi_port_probe()
1173 omap_port->pdev = &pd->dev; in ssi_port_probe()
1174 omap_port->port_id = port_id; in ssi_port_probe()
1183 hsi_port_set_drvdata(port, omap_port); in ssi_port_probe()
1184 omap_ssi->port[port_id] = omap_port; in ssi_port_probe()
1188 err = ssi_port_get_iomem(pd, "tx", &omap_port->sst_base, in ssi_port_probe()
1189 &omap_port->sst_dma); in ssi_port_probe()
1192 err = ssi_port_get_iomem(pd, "rx", &omap_port->ssr_base, in ssi_port_probe()
1193 &omap_port->ssr_dma); in ssi_port_probe()
1204 ssi_queues_init(omap_port); in ssi_port_probe()
1205 spin_lock_init(&omap_port->lock); in ssi_port_probe()
1206 spin_lock_init(&omap_port->wk_lock); in ssi_port_probe()
1207 omap_port->dev = &port->device; in ssi_port_probe()
1209 pm_runtime_irq_safe(omap_port->pdev); in ssi_port_probe()
1210 pm_runtime_enable(omap_port->pdev); in ssi_port_probe()
1213 err = ssi_debug_add_port(omap_port, omap_ssi->dir); in ssi_port_probe()
1215 pm_runtime_disable(omap_port->pdev); in ssi_port_probe()
1234 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in ssi_port_remove() local
1244 tasklet_kill(&omap_port->wake_tasklet); in ssi_port_remove()
1245 tasklet_kill(&omap_port->pio_tasklet); in ssi_port_remove()
1254 omap_ssi->port[omap_port->port_id] = NULL; in ssi_port_remove()
1263 static int ssi_save_port_ctx(struct omap_ssi_port *omap_port) in ssi_save_port_ctx() argument
1265 struct hsi_port *port = to_hsi_port(omap_port->dev); in ssi_save_port_ctx()
1269 omap_port->sys_mpu_enable = readl(omap_ssi->sys + in ssi_save_port_ctx()
1275 static int ssi_restore_port_ctx(struct omap_ssi_port *omap_port) in ssi_restore_port_ctx() argument
1277 struct hsi_port *port = to_hsi_port(omap_port->dev); in ssi_restore_port_ctx()
1282 writel_relaxed(omap_port->sys_mpu_enable, in ssi_restore_port_ctx()
1286 base = omap_port->sst_base; in ssi_restore_port_ctx()
1287 writel_relaxed(omap_port->sst.frame_size, base + SSI_SST_FRAMESIZE_REG); in ssi_restore_port_ctx()
1288 writel_relaxed(omap_port->sst.channels, base + SSI_SST_CHANNELS_REG); in ssi_restore_port_ctx()
1289 writel_relaxed(omap_port->sst.arb_mode, base + SSI_SST_ARBMODE_REG); in ssi_restore_port_ctx()
1292 base = omap_port->ssr_base; in ssi_restore_port_ctx()
1293 writel_relaxed(omap_port->ssr.frame_size, base + SSI_SSR_FRAMESIZE_REG); in ssi_restore_port_ctx()
1294 writel_relaxed(omap_port->ssr.channels, base + SSI_SSR_CHANNELS_REG); in ssi_restore_port_ctx()
1295 writel_relaxed(omap_port->ssr.timeout, base + SSI_SSR_TIMEOUT_REG); in ssi_restore_port_ctx()
1300 static int ssi_restore_port_mode(struct omap_ssi_port *omap_port) in ssi_restore_port_mode() argument
1304 writel_relaxed(omap_port->sst.mode, in ssi_restore_port_mode()
1305 omap_port->sst_base + SSI_SST_MODE_REG); in ssi_restore_port_mode()
1306 writel_relaxed(omap_port->ssr.mode, in ssi_restore_port_mode()
1307 omap_port->ssr_base + SSI_SSR_MODE_REG); in ssi_restore_port_mode()
1309 mode = readl(omap_port->ssr_base + SSI_SSR_MODE_REG); in ssi_restore_port_mode()
1314 static int ssi_restore_divisor(struct omap_ssi_port *omap_port) in ssi_restore_divisor() argument
1316 writel_relaxed(omap_port->sst.divisor, in ssi_restore_divisor()
1317 omap_port->sst_base + SSI_SST_DIVISOR_REG); in ssi_restore_divisor()
1325 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in omap_ssi_port_runtime_suspend() local
1331 ssi_set_port_mode(omap_port, SSI_MODE_SLEEP); in omap_ssi_port_runtime_suspend()
1333 omap_port->loss_count = in omap_ssi_port_runtime_suspend()
1335 ssi_save_port_ctx(omap_port); in omap_ssi_port_runtime_suspend()
1343 struct omap_ssi_port *omap_port = hsi_port_drvdata(port); in omap_ssi_port_runtime_resume() local
1349 if ((omap_ssi->get_loss) && (omap_port->loss_count == in omap_ssi_port_runtime_resume()
1353 ssi_restore_port_ctx(omap_port); in omap_ssi_port_runtime_resume()
1356 ssi_restore_divisor(omap_port); in omap_ssi_port_runtime_resume()
1357 ssi_restore_port_mode(omap_port); in omap_ssi_port_runtime_resume()