// SPDX-License-Identifier: GPL-2.0+ #include #include "ipq-avm.h" /** * \brief: * print tdm-interface registers * * txt: NULL -> use printk */ void tdm_if_print_status(const char *prefix, char *txt, unsigned int txt_size) { if (is_IPQ5018()) tdm_if_lpass_print_status(prefix, txt, txt_size); else tdm_if_adss_print_status(prefix, txt, txt_size); } EXPORT_SYMBOL(tdm_if_print_status); /** * \brief: * initialize tdm-interface * \param[in] slots only 8 tested * \param[in] rxdelay 1: serial Data Delay for receiver (1 clock) * \param[in] txdelay 1: serial Data Delay for transmitter (1 clock) * \param[in] master * * \retval 0: ok */ int tdm_if_config_init(unsigned int slots, unsigned int rxdelay, unsigned int txdelay, unsigned int master) { if (is_IPQ5018()) return tdm_if_lpass_config_init(slots, rxdelay, txdelay, 16, master); return tdm_if_adss_config_init(slots, rxdelay, txdelay, master); } EXPORT_SYMBOL(tdm_if_config_init); /** * \brief: * disable tdm-interface */ void tdm_if_config_exit(void) { if (is_IPQ5018()) tdm_if_lpass_config_exit(); else tdm_if_adss_config_exit(); } EXPORT_SYMBOL(tdm_if_config_exit); /** * \brief: * initialize dma-interface (adss) * \param[in] refhandle: see callback * \param[in] TxData: callback for data to send * \param[in] RxData: callback for data receive * \param[in] cpu: bind on cpu * \param[in] only_rxirq: use shared interrupt for rx and tx * \param[in] slots: * \param[in] fs_per_dma: count of framesyncs for one dma-buffer (4 ms == 32) * \param[in] desc_num: count of descriptors (>2: prevent irq-lost by long-locks) * * \note: * maybe exist more than 2 descriptors but only ping-pong-dma-buffer (small latency!) * bufsize of dma-buffer for callback: fs_per_dma * slot * sizeof(short) * return of callbacks: > 0: bytes to shrink dma-size for the following decriptor * * \retval 0: ok */ int tdm_if_dma_init(void *refhandle, int (*TxData)(void *refhandle, void *buf), int (*RxData)(void *refhandle, void *buf), unsigned int cpu, unsigned int only_rxirq, unsigned int slots, unsigned int fs_per_dma, unsigned int desc_num ) { if (is_IPQ5018()) return tdm_if_lpass_dma_init(refhandle, TxData, RxData, cpu, only_rxirq, slots, fs_per_dma); return tdm_if_adss_dma_init(refhandle, TxData, RxData, cpu, only_rxirq, slots, fs_per_dma, desc_num); } EXPORT_SYMBOL(tdm_if_dma_init); /** * \brief: * start dma */ void tdm_if_dma_start(void) { if (is_IPQ5018()) tdm_if_lpass_dma_start(); else tdm_if_adss_dma_start(); } EXPORT_SYMBOL(tdm_if_dma_start); /** * \brief: * stop dma */ void tdm_if_dma_stop(void) { if (is_IPQ5018()) tdm_if_lpass_dma_stop(); else tdm_if_adss_dma_stop(); } EXPORT_SYMBOL(tdm_if_dma_stop); /** * \brief: * deinitialize dma-interface */ void tdm_if_dma_exit(void) { if (is_IPQ5018()) tdm_if_lpass_dma_exit(); else tdm_if_adss_dma_exit(); } EXPORT_SYMBOL(tdm_if_dma_exit); /** * \brief: * get count of interrupts * \param[out] rx_irqcnt * \param[out] tx_irqcnt */ void tdm_if_dma_irqcnt(unsigned long *rx_irqcnt, unsigned long *tx_irqcnt) { if (is_IPQ5018()) tdm_if_lpass_dma_irqcnt(rx_irqcnt, tx_irqcnt); else tdm_if_adss_dma_irqcnt(rx_irqcnt, tx_irqcnt); } EXPORT_SYMBOL(tdm_if_dma_irqcnt); /** * \brief: * reset count of interrupts */ void tdm_if_dma_irqcnt_reset(void) { if (is_IPQ5018()) tdm_if_lpass_dma_irqcnt_reset(); else tdm_if_adss_dma_irqcnt_reset(); } EXPORT_SYMBOL(tdm_if_dma_irqcnt_reset);