Lines Matching refs:mxs_dma

42 #define dma_is_apbh(mxs_dma)	((mxs_dma)->type == MXS_DMA_APBH)  argument
43 #define apbh_is_old(mxs_dma) ((mxs_dma)->dev_id == IMX23_DMA) argument
112 struct mxs_dma_engine *mxs_dma; member
208 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_reset_chan() local
221 } else if (dma_is_apbh(mxs_dma) && apbh_is_old(mxs_dma)) { in mxs_dma_reset_chan()
223 mxs_dma->base + HW_APBHX_CTRL0 + STMP_OFFSET_REG_SET); in mxs_dma_reset_chan()
227 void __iomem *reg_dbg1 = mxs_dma->base + in mxs_dma_reset_chan()
228 HW_APBX_CHn_DEBUG1(mxs_dma, chan_id); in mxs_dma_reset_chan()
243 dev_err(&mxs_chan->mxs_dma->pdev->dev, in mxs_dma_reset_chan()
248 mxs_dma->base + HW_APBHX_CHANNEL_CTRL + STMP_OFFSET_REG_SET); in mxs_dma_reset_chan()
257 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_enable_chan() local
262 mxs_dma->base + HW_APBHX_CHn_NXTCMDAR(mxs_dma, chan_id)); in mxs_dma_enable_chan()
270 writel(2, mxs_dma->base + HW_APBHX_CHn_SEMA(mxs_dma, chan_id)); in mxs_dma_enable_chan()
272 writel(1, mxs_dma->base + HW_APBHX_CHn_SEMA(mxs_dma, chan_id)); in mxs_dma_enable_chan()
287 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_pause_chan() local
291 if (dma_is_apbh(mxs_dma) && apbh_is_old(mxs_dma)) in mxs_dma_pause_chan()
293 mxs_dma->base + HW_APBHX_CTRL0 + STMP_OFFSET_REG_SET); in mxs_dma_pause_chan()
296 mxs_dma->base + HW_APBHX_CHANNEL_CTRL + STMP_OFFSET_REG_SET); in mxs_dma_pause_chan()
305 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_resume_chan() local
309 if (dma_is_apbh(mxs_dma) && apbh_is_old(mxs_dma)) in mxs_dma_resume_chan()
311 mxs_dma->base + HW_APBHX_CTRL0 + STMP_OFFSET_REG_CLR); in mxs_dma_resume_chan()
314 mxs_dma->base + HW_APBHX_CHANNEL_CTRL + STMP_OFFSET_REG_CLR); in mxs_dma_resume_chan()
333 static int mxs_dma_irq_to_chan(struct mxs_dma_engine *mxs_dma, int irq) in mxs_dma_irq_to_chan() argument
337 for (i = 0; i != mxs_dma->nr_channels; ++i) in mxs_dma_irq_to_chan()
338 if (mxs_dma->mxs_chans[i].chan_irq == irq) in mxs_dma_irq_to_chan()
346 struct mxs_dma_engine *mxs_dma = dev_id; in mxs_dma_int_handler() local
350 int chan = mxs_dma_irq_to_chan(mxs_dma, irq); in mxs_dma_int_handler()
356 completed = readl(mxs_dma->base + HW_APBHX_CTRL1); in mxs_dma_int_handler()
361 mxs_dma->base + HW_APBHX_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_dma_int_handler()
364 err = readl(mxs_dma->base + HW_APBHX_CTRL2); in mxs_dma_int_handler()
376 mxs_dma->base + HW_APBHX_CTRL2 + STMP_OFFSET_REG_CLR); in mxs_dma_int_handler()
387 mxs_chan = &mxs_dma->mxs_chans[chan]; in mxs_dma_int_handler()
390 dev_dbg(mxs_dma->dma_device.dev, in mxs_dma_int_handler()
399 writel(1, mxs_dma->base + in mxs_dma_int_handler()
400 HW_APBHX_CHn_SEMA(mxs_dma, chan)); in mxs_dma_int_handler()
421 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_alloc_chan_resources() local
424 mxs_chan->ccw = dma_zalloc_coherent(mxs_dma->dma_device.dev, in mxs_dma_alloc_chan_resources()
434 0, "mxs-dma", mxs_dma); in mxs_dma_alloc_chan_resources()
439 ret = clk_prepare_enable(mxs_dma->clk); in mxs_dma_alloc_chan_resources()
454 free_irq(mxs_chan->chan_irq, mxs_dma); in mxs_dma_alloc_chan_resources()
456 dma_free_coherent(mxs_dma->dma_device.dev, CCW_BLOCK_SIZE, in mxs_dma_alloc_chan_resources()
465 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_free_chan_resources() local
469 free_irq(mxs_chan->chan_irq, mxs_dma); in mxs_dma_free_chan_resources()
471 dma_free_coherent(mxs_dma->dma_device.dev, CCW_BLOCK_SIZE, in mxs_dma_free_chan_resources()
474 clk_disable_unprepare(mxs_dma->clk); in mxs_dma_free_chan_resources()
505 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_prep_slave_sg() local
517 dev_err(mxs_dma->dma_device.dev, in mxs_dma_prep_slave_sg()
560 dev_err(mxs_dma->dma_device.dev, "maximum bytes for sg entry exceeded: %d > %d\n", in mxs_dma_prep_slave_sg()
603 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_prep_dma_cyclic() local
615 dev_err(mxs_dma->dma_device.dev, in mxs_dma_prep_dma_cyclic()
622 dev_err(mxs_dma->dma_device.dev, in mxs_dma_prep_dma_cyclic()
674 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_tx_status() local
685 bar = readl(mxs_dma->base + in mxs_dma_tx_status()
686 HW_APBHX_CHn_BAR(mxs_dma, chan->chan_id)); in mxs_dma_tx_status()
696 static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma) in mxs_dma_init() argument
700 ret = clk_prepare_enable(mxs_dma->clk); in mxs_dma_init()
704 ret = stmp_reset_block(mxs_dma->base); in mxs_dma_init()
709 if (dma_is_apbh(mxs_dma)) { in mxs_dma_init()
711 mxs_dma->base + HW_APBHX_CTRL0 + STMP_OFFSET_REG_SET); in mxs_dma_init()
713 mxs_dma->base + HW_APBHX_CTRL0 + STMP_OFFSET_REG_SET); in mxs_dma_init()
718 mxs_dma->base + HW_APBHX_CTRL1 + STMP_OFFSET_REG_SET); in mxs_dma_init()
721 clk_disable_unprepare(mxs_dma->clk); in mxs_dma_init()
734 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; in mxs_dma_filter_fn() local
737 if (mxs_dma->dma_device.dev->of_node != param->of_node) in mxs_dma_filter_fn()
743 chan_irq = platform_get_irq(mxs_dma->pdev, param->chan_id); in mxs_dma_filter_fn()
755 struct mxs_dma_engine *mxs_dma = ofdma->of_dma_data; in mxs_dma_xlate() local
756 dma_cap_mask_t mask = mxs_dma->dma_device.cap_mask; in mxs_dma_xlate()
765 if (param.chan_id >= mxs_dma->nr_channels) in mxs_dma_xlate()
777 struct mxs_dma_engine *mxs_dma; in mxs_dma_probe() local
781 mxs_dma = devm_kzalloc(&pdev->dev, sizeof(*mxs_dma), GFP_KERNEL); in mxs_dma_probe()
782 if (!mxs_dma) in mxs_dma_probe()
785 ret = of_property_read_u32(np, "dma-channels", &mxs_dma->nr_channels); in mxs_dma_probe()
798 mxs_dma->type = dma_type->type; in mxs_dma_probe()
799 mxs_dma->dev_id = dma_type->id; in mxs_dma_probe()
802 mxs_dma->base = devm_ioremap_resource(&pdev->dev, iores); in mxs_dma_probe()
803 if (IS_ERR(mxs_dma->base)) in mxs_dma_probe()
804 return PTR_ERR(mxs_dma->base); in mxs_dma_probe()
806 mxs_dma->clk = devm_clk_get(&pdev->dev, NULL); in mxs_dma_probe()
807 if (IS_ERR(mxs_dma->clk)) in mxs_dma_probe()
808 return PTR_ERR(mxs_dma->clk); in mxs_dma_probe()
810 dma_cap_set(DMA_SLAVE, mxs_dma->dma_device.cap_mask); in mxs_dma_probe()
811 dma_cap_set(DMA_CYCLIC, mxs_dma->dma_device.cap_mask); in mxs_dma_probe()
813 INIT_LIST_HEAD(&mxs_dma->dma_device.channels); in mxs_dma_probe()
817 struct mxs_dma_chan *mxs_chan = &mxs_dma->mxs_chans[i]; in mxs_dma_probe()
819 mxs_chan->mxs_dma = mxs_dma; in mxs_dma_probe()
820 mxs_chan->chan.device = &mxs_dma->dma_device; in mxs_dma_probe()
829 &mxs_dma->dma_device.channels); in mxs_dma_probe()
832 ret = mxs_dma_init(mxs_dma); in mxs_dma_probe()
836 mxs_dma->pdev = pdev; in mxs_dma_probe()
837 mxs_dma->dma_device.dev = &pdev->dev; in mxs_dma_probe()
840 mxs_dma->dma_device.dev->dma_parms = &mxs_dma->dma_parms; in mxs_dma_probe()
841 dma_set_max_seg_size(mxs_dma->dma_device.dev, MAX_XFER_BYTES); in mxs_dma_probe()
843 mxs_dma->dma_device.device_alloc_chan_resources = mxs_dma_alloc_chan_resources; in mxs_dma_probe()
844 mxs_dma->dma_device.device_free_chan_resources = mxs_dma_free_chan_resources; in mxs_dma_probe()
845 mxs_dma->dma_device.device_tx_status = mxs_dma_tx_status; in mxs_dma_probe()
846 mxs_dma->dma_device.device_prep_slave_sg = mxs_dma_prep_slave_sg; in mxs_dma_probe()
847 mxs_dma->dma_device.device_prep_dma_cyclic = mxs_dma_prep_dma_cyclic; in mxs_dma_probe()
848 mxs_dma->dma_device.device_pause = mxs_dma_pause_chan; in mxs_dma_probe()
849 mxs_dma->dma_device.device_resume = mxs_dma_resume_chan; in mxs_dma_probe()
850 mxs_dma->dma_device.device_terminate_all = mxs_dma_terminate_all; in mxs_dma_probe()
851 mxs_dma->dma_device.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); in mxs_dma_probe()
852 mxs_dma->dma_device.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); in mxs_dma_probe()
853 mxs_dma->dma_device.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in mxs_dma_probe()
854 mxs_dma->dma_device.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in mxs_dma_probe()
855 mxs_dma->dma_device.device_issue_pending = mxs_dma_enable_chan; in mxs_dma_probe()
857 ret = dma_async_device_register(&mxs_dma->dma_device); in mxs_dma_probe()
859 dev_err(mxs_dma->dma_device.dev, "unable to register\n"); in mxs_dma_probe()
863 ret = of_dma_controller_register(np, mxs_dma_xlate, mxs_dma); in mxs_dma_probe()
865 dev_err(mxs_dma->dma_device.dev, in mxs_dma_probe()
867 dma_async_device_unregister(&mxs_dma->dma_device); in mxs_dma_probe()
870 dev_info(mxs_dma->dma_device.dev, "initialized\n"); in mxs_dma_probe()