Lines Matching defs:dmux

63 	struct bam_dmux *dmux;
92 struct bam_dmux *dmux;
96 static void bam_dmux_pc_vote(struct bam_dmux *dmux, bool enable)
98 reinit_completion(&dmux->pc_ack_completion);
99 qcom_smem_state_update_bits(dmux->pc, dmux->pc_mask,
100 enable ? dmux->pc_mask : 0);
103 static void bam_dmux_pc_ack(struct bam_dmux *dmux)
105 qcom_smem_state_update_bits(dmux->pc_ack, dmux->pc_ack_mask,
106 dmux->pc_ack_state ? 0 : dmux->pc_ack_mask);
107 dmux->pc_ack_state = !dmux->pc_ack_state;
113 struct device *dev = skb_dma->dmux->dev;
128 dma_unmap_single(skb_dma->dmux->dev, skb_dma->addr, skb_dma->skb->len, dir);
132 static void bam_dmux_tx_wake_queues(struct bam_dmux *dmux)
136 dev_dbg(dmux->dev, "wake queues\n");
139 struct net_device *netdev = dmux->netdevs[i];
146 static void bam_dmux_tx_stop_queues(struct bam_dmux *dmux)
150 dev_dbg(dmux->dev, "stop queues\n");
153 struct net_device *netdev = dmux->netdevs[i];
162 struct bam_dmux *dmux = skb_dma->dmux;
165 pm_runtime_mark_last_busy(dmux->dev);
166 pm_runtime_put_autosuspend(dmux->dev);
171 spin_lock_irqsave(&dmux->tx_lock, flags);
173 if (skb_dma == &dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB])
174 bam_dmux_tx_wake_queues(dmux);
175 spin_unlock_irqrestore(&dmux->tx_lock, flags);
189 struct bam_dmux *dmux = skb_dma->dmux;
192 desc = dmaengine_prep_slave_single(dmux->tx, skb_dma->addr,
196 dev_err(dmux->dev, "Failed to prepare TX DMA buffer\n");
207 bam_dmux_tx_queue(struct bam_dmux *dmux, struct sk_buff *skb)
212 spin_lock_irqsave(&dmux->tx_lock, flags);
214 skb_dma = &dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB];
216 bam_dmux_tx_stop_queues(dmux);
217 spin_unlock_irqrestore(&dmux->tx_lock, flags);
222 dmux->tx_next_skb++;
223 if (dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB].skb)
224 bam_dmux_tx_stop_queues(dmux);
226 spin_unlock_irqrestore(&dmux->tx_lock, flags);
232 struct bam_dmux *dmux = bndev->dmux;
247 skb_dma = bam_dmux_tx_queue(dmux, skb);
253 ret = pm_runtime_get_sync(dmux->dev);
267 dma_async_issue_pending(dmux->tx);
338 struct bam_dmux *dmux = bndev->dmux;
342 skb_dma = bam_dmux_tx_queue(dmux, skb);
346 active = pm_runtime_get(dmux->dev);
359 if (!atomic_long_fetch_or(BIT(skb_dma - dmux->tx_skbs),
360 &dmux->tx_deferred_skb))
361 queue_pm_work(&dmux->tx_wakeup_work);
368 dma_async_issue_pending(dmux->tx);
379 struct bam_dmux *dmux = container_of(work, struct bam_dmux, tx_wakeup_work);
383 ret = pm_runtime_resume_and_get(dmux->dev);
385 dev_err(dmux->dev, "Failed to resume: %d\n", ret);
389 pending = atomic_long_xchg(&dmux->tx_deferred_skb, 0);
393 dev_dbg(dmux->dev, "pending skbs after wakeup: %#lx\n", pending);
395 bam_dmux_skb_dma_submit_tx(&dmux->tx_skbs[i]);
397 dma_async_issue_pending(dmux->tx);
400 pm_runtime_mark_last_busy(dmux->dev);
401 pm_runtime_put_autosuspend(dmux->dev);
435 struct bam_dmux *dmux = container_of(work, struct bam_dmux, register_netdev_work);
440 for_each_set_bit(ch, dmux->remote_channels, BAM_DMUX_NUM_CH) {
441 if (dmux->netdevs[ch])
449 SET_NETDEV_DEV(netdev, dmux->dev);
453 bndev->dmux = dmux;
458 dev_err(dmux->dev, "Failed to register netdev for channel %u: %d\n",
464 dmux->netdevs[ch] = netdev;
472 struct bam_dmux *dmux = skb_dma->dmux;
475 desc = dmaengine_prep_slave_single(dmux->rx, skb_dma->addr,
479 dev_err(dmux->dev, "Failed to prepare RX DMA buffer\n");
504 struct bam_dmux *dmux = skb_dma->dmux;
507 struct net_device *netdev = dmux->netdevs[hdr->ch];
510 dev_warn(dmux->dev, "Data for inactive channel %u\n", hdr->ch);
515 dev_err(dmux->dev, "Data larger than buffer? (%u > %u)\n",
542 static void bam_dmux_cmd_open(struct bam_dmux *dmux, struct bam_dmux_hdr *hdr)
544 struct net_device *netdev = dmux->netdevs[hdr->ch];
546 dev_dbg(dmux->dev, "open channel: %u\n", hdr->ch);
548 if (__test_and_set_bit(hdr->ch, dmux->remote_channels)) {
549 dev_warn(dmux->dev, "Channel already open: %u\n", hdr->ch);
557 schedule_work(&dmux->register_netdev_work);
561 static void bam_dmux_cmd_close(struct bam_dmux *dmux, struct bam_dmux_hdr *hdr)
563 struct net_device *netdev = dmux->netdevs[hdr->ch];
565 dev_dbg(dmux->dev, "close channel: %u\n", hdr->ch);
567 if (!__test_and_clear_bit(hdr->ch, dmux->remote_channels)) {
568 dev_err(dmux->dev, "Channel not open: %u\n", hdr->ch);
579 struct bam_dmux *dmux = skb_dma->dmux;
586 dev_err(dmux->dev, "Invalid magic in header: %#x\n", hdr->magic);
591 dev_dbg(dmux->dev, "Unsupported channel: %u\n", hdr->ch);
600 bam_dmux_cmd_open(dmux, hdr);
603 bam_dmux_cmd_close(dmux, hdr);
606 dev_err(dmux->dev, "Unsupported command %u on channel %u\n",
613 dma_async_issue_pending(dmux->rx);
616 static bool bam_dmux_power_on(struct bam_dmux *dmux)
618 struct device *dev = dmux->dev;
625 dmux->rx = dma_request_chan(dev, "rx");
626 if (IS_ERR(dmux->rx)) {
627 dev_err(dev, "Failed to request RX DMA channel: %pe\n", dmux->rx);
628 dmux->rx = NULL;
631 dmaengine_slave_config(dmux->rx, &dma_rx_conf);
634 if (!bam_dmux_skb_dma_queue_rx(&dmux->rx_skbs[i], GFP_KERNEL))
637 dma_async_issue_pending(dmux->rx);
659 static void bam_dmux_power_off(struct bam_dmux *dmux)
661 if (dmux->tx) {
662 dmaengine_terminate_sync(dmux->tx);
663 dma_release_channel(dmux->tx);
664 dmux->tx = NULL;
667 if (dmux->rx) {
668 dmaengine_terminate_sync(dmux->rx);
669 dma_release_channel(dmux->rx);
670 dmux->rx = NULL;
673 bam_dmux_free_skbs(dmux->rx_skbs, DMA_FROM_DEVICE);
678 struct bam_dmux *dmux = data;
679 bool new_state = !dmux->pc_state;
681 dev_dbg(dmux->dev, "pc: %u\n", new_state);
684 if (bam_dmux_power_on(dmux))
685 bam_dmux_pc_ack(dmux);
687 bam_dmux_power_off(dmux);
689 bam_dmux_power_off(dmux);
690 bam_dmux_pc_ack(dmux);
693 dmux->pc_state = new_state;
694 wake_up_all(&dmux->pc_wait);
701 struct bam_dmux *dmux = data;
703 dev_dbg(dmux->dev, "pc ack\n");
704 complete_all(&dmux->pc_ack_completion);
711 struct bam_dmux *dmux = dev_get_drvdata(dev);
714 bam_dmux_pc_vote(dmux, false);
721 struct bam_dmux *dmux = dev_get_drvdata(dev);
726 if (!wait_for_completion_timeout(&dmux->pc_ack_completion,
731 bam_dmux_pc_vote(dmux, true);
734 if (!wait_for_completion_timeout(&dmux->pc_ack_completion,
736 bam_dmux_pc_vote(dmux, false);
741 if (!wait_event_timeout(dmux->pc_wait, dmux->pc_state,
743 bam_dmux_pc_vote(dmux, false);
748 if (!dmux->rx) {
749 bam_dmux_pc_vote(dmux, false);
754 if (dmux->tx)
757 dmux->tx = dma_request_chan(dev, "tx");
758 if (IS_ERR(dmux->tx)) {
759 dev_err(dev, "Failed to request TX DMA channel: %pe\n", dmux->tx);
760 dmux->tx = NULL;
771 struct bam_dmux *dmux;
775 dmux = devm_kzalloc(dev, sizeof(*dmux), GFP_KERNEL);
776 if (!dmux)
779 dmux->dev = dev;
780 platform_set_drvdata(pdev, dmux);
782 dmux->pc_irq = platform_get_irq_byname(pdev, "pc");
783 if (dmux->pc_irq < 0)
784 return dmux->pc_irq;
790 dmux->pc = devm_qcom_smem_state_get(dev, "pc", &bit);
791 if (IS_ERR(dmux->pc))
792 return dev_err_probe(dev, PTR_ERR(dmux->pc),
794 dmux->pc_mask = BIT(bit);
796 dmux->pc_ack = devm_qcom_smem_state_get(dev, "pc-ack", &bit);
797 if (IS_ERR(dmux->pc_ack))
798 return dev_err_probe(dev, PTR_ERR(dmux->pc_ack),
800 dmux->pc_ack_mask = BIT(bit);
802 init_waitqueue_head(&dmux->pc_wait);
803 init_completion(&dmux->pc_ack_completion);
804 complete_all(&dmux->pc_ack_completion);
806 spin_lock_init(&dmux->tx_lock);
807 INIT_WORK(&dmux->tx_wakeup_work, bam_dmux_tx_wakeup_work);
808 INIT_WORK(&dmux->register_netdev_work, bam_dmux_register_netdev_work);
811 dmux->rx_skbs[i].dmux = dmux;
812 dmux->tx_skbs[i].dmux = dmux;
824 IRQF_ONESHOT, NULL, dmux);
828 ret = devm_request_threaded_irq(dev, dmux->pc_irq, NULL, bam_dmux_pc_irq,
829 IRQF_ONESHOT, NULL, dmux);
833 ret = irq_get_irqchip_state(dmux->pc_irq, IRQCHIP_STATE_LINE_LEVEL,
834 &dmux->pc_state);
839 if (dmux->pc_state) {
840 if (bam_dmux_power_on(dmux))
841 bam_dmux_pc_ack(dmux);
843 bam_dmux_power_off(dmux);
851 struct bam_dmux *dmux = platform_get_drvdata(pdev);
852 struct device *dev = dmux->dev;
857 cancel_work_sync(&dmux->register_netdev_work);
860 if (dmux->netdevs[i])
861 unregister_netdevice_queue(dmux->netdevs[i], &list);
864 cancel_work_sync(&dmux->tx_wakeup_work);
873 if (!wait_event_timeout(dmux->pc_wait, !dmux->rx, BAM_DMUX_REMOTE_TIMEOUT))
877 disable_irq(dmux->pc_irq);
878 bam_dmux_power_off(dmux);
879 bam_dmux_free_skbs(dmux->tx_skbs, DMA_TO_DEVICE);
889 { .compatible = "qcom,bam-dmux" },
898 .name = "bam-dmux",