Lines Matching refs:pl08x

359 static void pl08x_write_lli(struct pl08x_driver_data *pl08x,  in pl08x_write_lli()  argument
362 if (pl08x->vd->pl080s) in pl08x_write_lli()
363 dev_vdbg(&pl08x->adev->dev, in pl08x_write_lli()
370 dev_vdbg(&pl08x->adev->dev, in pl08x_write_lli()
381 if (pl08x->vd->pl080s) in pl08x_write_lli()
396 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_start_next_txd() local
410 pl08x_write_lli(pl08x, phychan, &txd->llis_va[0], txd->ccfg); in pl08x_start_next_txd()
414 while (readl(pl08x->base + PL080_EN_CHAN) & (1 << phychan->id)) in pl08x_start_next_txd()
471 static void pl08x_terminate_phy_chan(struct pl08x_driver_data *pl08x, in pl08x_terminate_phy_chan() argument
481 writel(1 << ch->id, pl08x->base + PL080_ERR_CLEAR); in pl08x_terminate_phy_chan()
482 writel(1 << ch->id, pl08x->base + PL080_TC_CLEAR); in pl08x_terminate_phy_chan()
528 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_getbytes_chan() local
550 if (pl08x->vd->pl080s) in pl08x_getbytes_chan()
563 llis_max_words = pl08x->lli_words * MAX_NUM_TSFR_LLIS; in pl08x_getbytes_chan()
575 for (; llis_va < llis_va_limit; llis_va += pl08x->lli_words) { in pl08x_getbytes_chan()
576 if (pl08x->vd->pl080s) in pl08x_getbytes_chan()
601 pl08x_get_phy_channel(struct pl08x_driver_data *pl08x, in pl08x_get_phy_channel() argument
608 for (i = 0; i < pl08x->vd->channels; i++) { in pl08x_get_phy_channel()
609 ch = &pl08x->phy_chans[i]; in pl08x_get_phy_channel()
622 if (i == pl08x->vd->channels) { in pl08x_get_phy_channel()
631 static inline void pl08x_put_phy_channel(struct pl08x_driver_data *pl08x, in pl08x_put_phy_channel() argument
644 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_alloc_and_start() local
647 ch = pl08x_get_phy_channel(pl08x, plchan); in pl08x_phy_alloc_and_start()
649 dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); in pl08x_phy_alloc_and_start()
654 dev_dbg(&pl08x->adev->dev, "allocated physical channel %d for xfer on %s\n", in pl08x_phy_alloc_and_start()
665 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_reassign_start() local
667 dev_dbg(&pl08x->adev->dev, "reassigned physical channel %d for xfer on %s\n", in pl08x_phy_reassign_start()
687 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_phy_free() local
694 list_for_each_entry(p, &pl08x->memcpy.channels, vc.chan.device_node) in pl08x_phy_free()
701 list_for_each_entry(p, &pl08x->slave.channels, vc.chan.device_node) in pl08x_phy_free()
709 pl08x_terminate_phy_chan(pl08x, plchan->phychan); in pl08x_phy_free()
730 pl08x_put_phy_channel(pl08x, plchan->phychan); in pl08x_phy_free()
843 static void pl08x_fill_lli_for_desc(struct pl08x_driver_data *pl08x, in pl08x_fill_lli_for_desc() argument
847 u32 offset = num_llis * pl08x->lli_words; in pl08x_fill_lli_for_desc()
854 offset += pl08x->lli_words; in pl08x_fill_lli_for_desc()
861 if (pl08x->vd->pl080s) in pl08x_fill_lli_for_desc()
874 static inline void prep_byte_width_lli(struct pl08x_driver_data *pl08x, in prep_byte_width_lli() argument
879 pl08x_fill_lli_for_desc(pl08x, bd, num_llis, len, *cctl, len); in prep_byte_width_lli()
884 static void pl08x_dump_lli(struct pl08x_driver_data *pl08x, in pl08x_dump_lli() argument
889 if (pl08x->vd->pl080s) { in pl08x_dump_lli()
890 dev_vdbg(&pl08x->adev->dev, in pl08x_dump_lli()
894 dev_vdbg(&pl08x->adev->dev, in pl08x_dump_lli()
900 llis_va += pl08x->lli_words; in pl08x_dump_lli()
903 dev_vdbg(&pl08x->adev->dev, in pl08x_dump_lli()
907 dev_vdbg(&pl08x->adev->dev, in pl08x_dump_lli()
912 llis_va += pl08x->lli_words; in pl08x_dump_lli()
917 static inline void pl08x_dump_lli(struct pl08x_driver_data *pl08x, in pl08x_dump_lli() argument
926 static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x, in pl08x_fill_llis_for_desc() argument
937 txd->llis_va = dma_pool_alloc(pl08x->pool, GFP_NOWAIT, &txd->llis_bus); in pl08x_fill_llis_for_desc()
939 dev_err(&pl08x->adev->dev, "%s no memory for llis\n", __func__); in pl08x_fill_llis_for_desc()
944 bd.lli_bus = (pl08x->lli_buses & PL08X_AHB2) ? PL080_LLI_LM_AHB2 : 0; in pl08x_fill_llis_for_desc()
969 dev_vdbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
978 dev_vdbg(&pl08x->adev->dev, "mbus=%s sbus=%s\n", in pl08x_fill_llis_for_desc()
1008 dev_err(&pl08x->adev->dev, "%s sg len can't be zero", in pl08x_fill_llis_for_desc()
1015 dev_err(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1024 pl08x_fill_lli_for_desc(pl08x, &bd, num_llis++, in pl08x_fill_llis_for_desc()
1044 dev_vdbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1047 prep_byte_width_lli(pl08x, &bd, &cctl, early_bytes, in pl08x_fill_llis_for_desc()
1057 dev_dbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1069 pl08x->vd->max_transfer_size; in pl08x_fill_llis_for_desc()
1070 dev_vdbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1097 dev_vdbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1104 pl08x_fill_lli_for_desc(pl08x, &bd, num_llis++, in pl08x_fill_llis_for_desc()
1113 dev_vdbg(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1116 prep_byte_width_lli(pl08x, &bd, &cctl, in pl08x_fill_llis_for_desc()
1122 dev_err(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1129 dev_err(&pl08x->adev->dev, in pl08x_fill_llis_for_desc()
1137 last_lli = llis_va + (num_llis - 1) * pl08x->lli_words; in pl08x_fill_llis_for_desc()
1149 pl08x_dump_lli(pl08x, llis_va, num_llis); in pl08x_fill_llis_for_desc()
1154 static void pl08x_free_txd(struct pl08x_driver_data *pl08x, in pl08x_free_txd() argument
1160 dma_pool_free(pl08x->pool, txd->llis_va, txd->llis_bus); in pl08x_free_txd()
1182 static void pl08x_free_txd_list(struct pl08x_driver_data *pl08x, in pl08x_free_txd_list() argument
1425 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_memcpy() local
1432 dev_err(&pl08x->adev->dev, in pl08x_prep_dma_memcpy()
1439 pl08x_free_txd(pl08x, txd); in pl08x_prep_dma_memcpy()
1440 dev_err(&pl08x->adev->dev, "%s no memory for pl080 sg\n", in pl08x_prep_dma_memcpy()
1452 txd->cctl = pl08x->pd->memcpy_channel.cctl_memcpy & in pl08x_prep_dma_memcpy()
1458 if (pl08x->vd->dualmaster) in pl08x_prep_dma_memcpy()
1459 txd->cctl |= pl08x_select_bus(pl08x->mem_buses, in pl08x_prep_dma_memcpy()
1460 pl08x->mem_buses); in pl08x_prep_dma_memcpy()
1464 pl08x_free_txd(pl08x, txd); in pl08x_prep_dma_memcpy()
1477 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_init_txd() local
1486 dev_err(&pl08x->adev->dev, "%s no txd\n", __func__); in pl08x_init_txd()
1500 src_buses = pl08x->mem_buses; in pl08x_init_txd()
1508 dst_buses = pl08x->mem_buses; in pl08x_init_txd()
1510 pl08x_free_txd(pl08x, txd); in pl08x_init_txd()
1511 dev_err(&pl08x->adev->dev, in pl08x_init_txd()
1518 pl08x_free_txd(pl08x, txd); in pl08x_init_txd()
1519 dev_err(&pl08x->adev->dev, in pl08x_init_txd()
1537 pl08x_free_txd(pl08x, txd); in pl08x_init_txd()
1538 dev_dbg(&pl08x->adev->dev, in pl08x_init_txd()
1544 dev_dbg(&pl08x->adev->dev, "allocated DMA request signal %d for xfer on %s\n", in pl08x_init_txd()
1588 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_slave_sg() local
1594 dev_dbg(&pl08x->adev->dev, "%s prepare transaction of %d bytes from %s\n", in pl08x_prep_slave_sg()
1607 pl08x_free_txd(pl08x, txd); in pl08x_prep_slave_sg()
1608 dev_err(&pl08x->adev->dev, "%s no mem for pl080 sg\n", in pl08x_prep_slave_sg()
1617 pl08x_free_txd(pl08x, txd); in pl08x_prep_slave_sg()
1630 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_prep_dma_cyclic() local
1635 dev_dbg(&pl08x->adev->dev, in pl08x_prep_dma_cyclic()
1652 pl08x_free_txd(pl08x, txd); in pl08x_prep_dma_cyclic()
1660 pl08x_free_txd(pl08x, txd); in pl08x_prep_dma_cyclic()
1671 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_config() local
1681 if (config->device_fc && pl08x->vd->pl080s) { in pl08x_config()
1682 dev_err(&pl08x->adev->dev, in pl08x_config()
1696 struct pl08x_driver_data *pl08x = plchan->host; in pl08x_terminate_all() local
1720 pl08x_free_txd_list(pl08x, plchan); in pl08x_terminate_all()
1798 static void pl08x_ensure_on(struct pl08x_driver_data *pl08x) in pl08x_ensure_on() argument
1801 if (pl08x->vd->nomadik) in pl08x_ensure_on()
1803 writel(PL080_CONFIG_ENABLE, pl08x->base + PL080_CONFIG); in pl08x_ensure_on()
1808 struct pl08x_driver_data *pl08x = dev; in pl08x_irq() local
1812 err = readl(pl08x->base + PL080_ERR_STATUS); in pl08x_irq()
1814 dev_err(&pl08x->adev->dev, "%s error interrupt, register value 0x%08x\n", in pl08x_irq()
1816 writel(err, pl08x->base + PL080_ERR_CLEAR); in pl08x_irq()
1818 tc = readl(pl08x->base + PL080_TC_STATUS); in pl08x_irq()
1820 writel(tc, pl08x->base + PL080_TC_CLEAR); in pl08x_irq()
1825 for (i = 0; i < pl08x->vd->channels; i++) { in pl08x_irq()
1828 struct pl08x_phy_chan *phychan = &pl08x->phy_chans[i]; in pl08x_irq()
1833 dev_err(&pl08x->adev->dev, in pl08x_irq()
1883 static int pl08x_dma_init_virtual_channels(struct pl08x_driver_data *pl08x, in pl08x_dma_init_virtual_channels() argument
1899 dev_err(&pl08x->adev->dev, in pl08x_dma_init_virtual_channels()
1904 chan->host = pl08x; in pl08x_dma_init_virtual_channels()
1909 chan->cd = &pl08x->pd->slave_channels[i]; in pl08x_dma_init_virtual_channels()
1912 chan->cd = &pl08x->pd->memcpy_channel; in pl08x_dma_init_virtual_channels()
1919 dev_dbg(&pl08x->adev->dev, in pl08x_dma_init_virtual_channels()
1926 dev_info(&pl08x->adev->dev, "initialized %d virtual %s channels\n", in pl08x_dma_init_virtual_channels()
1963 struct pl08x_driver_data *pl08x = s->private; in pl08x_debugfs_show() local
1972 for (i = 0; i < pl08x->vd->channels; i++) { in pl08x_debugfs_show()
1975 ch = &pl08x->phy_chans[i]; in pl08x_debugfs_show()
1991 list_for_each_entry(chan, &pl08x->memcpy.channels, vc.chan.device_node) { in pl08x_debugfs_show()
1999 list_for_each_entry(chan, &pl08x->slave.channels, vc.chan.device_node) { in pl08x_debugfs_show()
2019 static void init_pl08x_debugfs(struct pl08x_driver_data *pl08x) in init_pl08x_debugfs() argument
2022 (void) debugfs_create_file(dev_name(&pl08x->adev->dev), in init_pl08x_debugfs()
2023 S_IFREG | S_IRUGO, NULL, pl08x, in init_pl08x_debugfs()
2028 static inline void init_pl08x_debugfs(struct pl08x_driver_data *pl08x) in init_pl08x_debugfs() argument
2035 struct pl08x_driver_data *pl08x; in pl08x_probe() local
2051 pl08x = kzalloc(sizeof(*pl08x), GFP_KERNEL); in pl08x_probe()
2052 if (!pl08x) { in pl08x_probe()
2058 dma_cap_set(DMA_MEMCPY, pl08x->memcpy.cap_mask); in pl08x_probe()
2059 pl08x->memcpy.dev = &adev->dev; in pl08x_probe()
2060 pl08x->memcpy.device_free_chan_resources = pl08x_free_chan_resources; in pl08x_probe()
2061 pl08x->memcpy.device_prep_dma_memcpy = pl08x_prep_dma_memcpy; in pl08x_probe()
2062 pl08x->memcpy.device_prep_dma_interrupt = pl08x_prep_dma_interrupt; in pl08x_probe()
2063 pl08x->memcpy.device_tx_status = pl08x_dma_tx_status; in pl08x_probe()
2064 pl08x->memcpy.device_issue_pending = pl08x_issue_pending; in pl08x_probe()
2065 pl08x->memcpy.device_config = pl08x_config; in pl08x_probe()
2066 pl08x->memcpy.device_pause = pl08x_pause; in pl08x_probe()
2067 pl08x->memcpy.device_resume = pl08x_resume; in pl08x_probe()
2068 pl08x->memcpy.device_terminate_all = pl08x_terminate_all; in pl08x_probe()
2069 pl08x->memcpy.src_addr_widths = PL80X_DMA_BUSWIDTHS; in pl08x_probe()
2070 pl08x->memcpy.dst_addr_widths = PL80X_DMA_BUSWIDTHS; in pl08x_probe()
2071 pl08x->memcpy.directions = BIT(DMA_MEM_TO_MEM); in pl08x_probe()
2072 pl08x->memcpy.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; in pl08x_probe()
2075 dma_cap_set(DMA_SLAVE, pl08x->slave.cap_mask); in pl08x_probe()
2076 dma_cap_set(DMA_CYCLIC, pl08x->slave.cap_mask); in pl08x_probe()
2077 pl08x->slave.dev = &adev->dev; in pl08x_probe()
2078 pl08x->slave.device_free_chan_resources = pl08x_free_chan_resources; in pl08x_probe()
2079 pl08x->slave.device_prep_dma_interrupt = pl08x_prep_dma_interrupt; in pl08x_probe()
2080 pl08x->slave.device_tx_status = pl08x_dma_tx_status; in pl08x_probe()
2081 pl08x->slave.device_issue_pending = pl08x_issue_pending; in pl08x_probe()
2082 pl08x->slave.device_prep_slave_sg = pl08x_prep_slave_sg; in pl08x_probe()
2083 pl08x->slave.device_prep_dma_cyclic = pl08x_prep_dma_cyclic; in pl08x_probe()
2084 pl08x->slave.device_config = pl08x_config; in pl08x_probe()
2085 pl08x->slave.device_pause = pl08x_pause; in pl08x_probe()
2086 pl08x->slave.device_resume = pl08x_resume; in pl08x_probe()
2087 pl08x->slave.device_terminate_all = pl08x_terminate_all; in pl08x_probe()
2088 pl08x->slave.src_addr_widths = PL80X_DMA_BUSWIDTHS; in pl08x_probe()
2089 pl08x->slave.dst_addr_widths = PL80X_DMA_BUSWIDTHS; in pl08x_probe()
2090 pl08x->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in pl08x_probe()
2091 pl08x->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; in pl08x_probe()
2094 pl08x->pd = dev_get_platdata(&adev->dev); in pl08x_probe()
2095 if (!pl08x->pd) { in pl08x_probe()
2102 pl08x->adev = adev; in pl08x_probe()
2103 pl08x->vd = vd; in pl08x_probe()
2106 pl08x->lli_buses = PL08X_AHB1; in pl08x_probe()
2107 pl08x->mem_buses = PL08X_AHB1; in pl08x_probe()
2108 if (pl08x->vd->dualmaster) { in pl08x_probe()
2109 pl08x->lli_buses = pl08x->pd->lli_buses; in pl08x_probe()
2110 pl08x->mem_buses = pl08x->pd->mem_buses; in pl08x_probe()
2114 pl08x->lli_words = PL080S_LLI_WORDS; in pl08x_probe()
2116 pl08x->lli_words = PL080_LLI_WORDS; in pl08x_probe()
2117 tsfr_size = MAX_NUM_TSFR_LLIS * pl08x->lli_words * sizeof(u32); in pl08x_probe()
2120 pl08x->pool = dma_pool_create(DRIVER_NAME, &pl08x->adev->dev, in pl08x_probe()
2122 if (!pl08x->pool) { in pl08x_probe()
2127 pl08x->base = ioremap(adev->res.start, resource_size(&adev->res)); in pl08x_probe()
2128 if (!pl08x->base) { in pl08x_probe()
2134 pl08x_ensure_on(pl08x); in pl08x_probe()
2137 writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR); in pl08x_probe()
2138 writel(0x000000FF, pl08x->base + PL080_TC_CLEAR); in pl08x_probe()
2140 ret = request_irq(adev->irq[0], pl08x_irq, 0, DRIVER_NAME, pl08x); in pl08x_probe()
2148 pl08x->phy_chans = kzalloc((vd->channels * sizeof(*pl08x->phy_chans)), in pl08x_probe()
2150 if (!pl08x->phy_chans) { in pl08x_probe()
2159 struct pl08x_phy_chan *ch = &pl08x->phy_chans[i]; in pl08x_probe()
2162 ch->base = pl08x->base + PL080_Cx_BASE(i); in pl08x_probe()
2186 ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->memcpy, in pl08x_probe()
2187 pl08x->vd->channels, false); in pl08x_probe()
2189 dev_warn(&pl08x->adev->dev, in pl08x_probe()
2196 ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->slave, in pl08x_probe()
2197 pl08x->pd->num_slave_channels, true); in pl08x_probe()
2199 dev_warn(&pl08x->adev->dev, in pl08x_probe()
2205 ret = dma_async_device_register(&pl08x->memcpy); in pl08x_probe()
2207 dev_warn(&pl08x->adev->dev, in pl08x_probe()
2213 ret = dma_async_device_register(&pl08x->slave); in pl08x_probe()
2215 dev_warn(&pl08x->adev->dev, in pl08x_probe()
2221 amba_set_drvdata(adev, pl08x); in pl08x_probe()
2222 init_pl08x_debugfs(pl08x); in pl08x_probe()
2223 dev_info(&pl08x->adev->dev, "DMA: PL%03x%s rev%u at 0x%08llx irq %d\n", in pl08x_probe()
2224 amba_part(adev), pl08x->vd->pl080s ? "s" : "", amba_rev(adev), in pl08x_probe()
2230 dma_async_device_unregister(&pl08x->memcpy); in pl08x_probe()
2232 pl08x_free_virtual_channels(&pl08x->slave); in pl08x_probe()
2234 pl08x_free_virtual_channels(&pl08x->memcpy); in pl08x_probe()
2236 kfree(pl08x->phy_chans); in pl08x_probe()
2238 free_irq(adev->irq[0], pl08x); in pl08x_probe()
2240 iounmap(pl08x->base); in pl08x_probe()
2242 dma_pool_destroy(pl08x->pool); in pl08x_probe()
2245 kfree(pl08x); in pl08x_probe()