本文整理汇总了C++中dma_free_coherent函数的典型用法代码示例。如果您正苦于以下问题:C++ dma_free_coherent函数的具体用法?C++ dma_free_coherent怎么用?C++ dma_free_coherent使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dma_free_coherent函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: create_cq
static int create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
struct c4iw_dev_ucontext *uctx)
{
struct fw_ri_res_wr *res_wr;
struct fw_ri_res *res;
int wr_len;
int user = (uctx != &rdev->uctx);
struct c4iw_wr_wait wr_wait;
int ret;
struct sk_buff *skb;
cq->cqid = c4iw_get_cqid(rdev, uctx);
if (!cq->cqid) {
ret = -ENOMEM;
goto err1;
}
if (!user) {
cq->sw_queue = kzalloc(cq->memsize, GFP_KERNEL);
if (!cq->sw_queue) {
ret = -ENOMEM;
goto err2;
}
}
cq->queue = dma_alloc_coherent(&rdev->lldi.pdev->dev, cq->memsize,
&cq->dma_addr, GFP_KERNEL);
if (!cq->queue) {
ret = -ENOMEM;
goto err3;
}
pci_unmap_addr_set(cq, mapping, cq->dma_addr);
memset(cq->queue, 0, cq->memsize);
/* build fw_ri_res_wr */
wr_len = sizeof *res_wr + sizeof *res;
skb = alloc_skb(wr_len, GFP_KERNEL);
if (!skb) {
ret = -ENOMEM;
goto err4;
}
set_wr_txq(skb, CPL_PRIORITY_CONTROL, 0);
res_wr = (struct fw_ri_res_wr *)__skb_put(skb, wr_len);
memset(res_wr, 0, wr_len);
res_wr->op_nres = cpu_to_be32(
FW_WR_OP(FW_RI_RES_WR) |
V_FW_RI_RES_WR_NRES(1) |
FW_WR_COMPL(1));
res_wr->len16_pkd = cpu_to_be32(DIV_ROUND_UP(wr_len, 16));
res_wr->cookie = (unsigned long) &wr_wait;
res = res_wr->res;
res->u.cq.restype = FW_RI_RES_TYPE_CQ;
res->u.cq.op = FW_RI_RES_OP_WRITE;
res->u.cq.iqid = cpu_to_be32(cq->cqid);
res->u.cq.iqandst_to_iqandstindex = cpu_to_be32(
V_FW_RI_RES_WR_IQANUS(0) |
V_FW_RI_RES_WR_IQANUD(1) |
F_FW_RI_RES_WR_IQANDST |
V_FW_RI_RES_WR_IQANDSTINDEX(*rdev->lldi.rxq_ids));
res->u.cq.iqdroprss_to_iqesize = cpu_to_be16(
F_FW_RI_RES_WR_IQDROPRSS |
V_FW_RI_RES_WR_IQPCIECH(2) |
V_FW_RI_RES_WR_IQINTCNTTHRESH(0) |
F_FW_RI_RES_WR_IQO |
V_FW_RI_RES_WR_IQESIZE(1));
res->u.cq.iqsize = cpu_to_be16(cq->size);
res->u.cq.iqaddr = cpu_to_be64(cq->dma_addr);
c4iw_init_wr_wait(&wr_wait);
ret = c4iw_ofld_send(rdev, skb);
if (ret)
goto err4;
PDBG("%s wait_event wr_wait %p\n", __func__, &wr_wait);
ret = c4iw_wait_for_reply(rdev, &wr_wait, 0, 0, __func__);
if (ret)
goto err4;
cq->gen = 1;
cq->gts = rdev->lldi.gts_reg;
cq->rdev = rdev;
if (user) {
cq->ugts = (u64)pci_resource_start(rdev->lldi.pdev, 2) +
(cq->cqid << rdev->cqshift);
cq->ugts &= PAGE_MASK;
}
return 0;
err4:
dma_free_coherent(&rdev->lldi.pdev->dev, cq->memsize, cq->queue,
pci_unmap_addr(cq, mapping));
err3:
kfree(cq->sw_queue);
err2:
c4iw_put_cqid(rdev, cq->cqid, uctx);
err1:
return ret;
}
开发者ID:3null,项目名称:fastsocket,代码行数:98,代码来源:cq.c
示例2: srp_indirect_data
static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
struct srp_indirect_buf *id,
enum dma_data_direction dir, srp_rdma_t rdma_io,
int dma_map, int ext_desc)
{
struct iu_entry *iue = NULL;
struct srp_direct_buf *md = NULL;
struct scatterlist dummy, *sg = NULL;
dma_addr_t token = 0;
int err = 0;
int nmd, nsg = 0, len;
if (dma_map || ext_desc) {
iue = (struct iu_entry *) sc->SCp.ptr;
sg = scsi_sglist(sc);
dprintk("%p %u %u %d %d\n",
iue, scsi_bufflen(sc), id->len,
cmd->data_in_desc_cnt, cmd->data_out_desc_cnt);
}
nmd = id->table_desc.len / sizeof(struct srp_direct_buf);
if ((dir == DMA_FROM_DEVICE && nmd == cmd->data_in_desc_cnt) ||
(dir == DMA_TO_DEVICE && nmd == cmd->data_out_desc_cnt)) {
md = &id->desc_list[0];
goto rdma;
}
if (ext_desc && dma_map) {
md = dma_alloc_coherent(iue->target->dev, id->table_desc.len,
&token, GFP_KERNEL);
if (!md) {
eprintk("Can't get dma memory %u\n", id->table_desc.len);
return -ENOMEM;
}
sg_init_one(&dummy, md, id->table_desc.len);
sg_dma_address(&dummy) = token;
sg_dma_len(&dummy) = id->table_desc.len;
err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE,
id->table_desc.len);
if (err) {
eprintk("Error copying indirect table %d\n", err);
goto free_mem;
}
} else {
eprintk("This command uses external indirect buffer\n");
return -EINVAL;
}
rdma:
if (dma_map) {
nsg = dma_map_sg(iue->target->dev, sg, scsi_sg_count(sc),
DMA_BIDIRECTIONAL);
if (!nsg) {
eprintk("fail to map %p %d\n", iue, scsi_sg_count(sc));
err = -EIO;
goto free_mem;
}
len = min(scsi_bufflen(sc), id->len);
} else
len = id->len;
err = rdma_io(sc, sg, nsg, md, nmd, dir, len);
if (dma_map)
dma_unmap_sg(iue->target->dev, sg, nsg, DMA_BIDIRECTIONAL);
free_mem:
if (token && dma_map)
dma_free_coherent(iue->target->dev, id->table_desc.len, md, token);
return err;
}
开发者ID:KroMignon,项目名称:linux-emcraft,代码行数:75,代码来源:libsrp.c
示例3: ipa_uc_mhi_init_engine
int ipa_uc_mhi_init_engine(struct ipa_mhi_msi_info *msi, u32 mmio_addr,
u32 host_ctrl_addr, u32 host_data_addr, u32 first_ch_idx,
u32 first_evt_idx)
{
int res;
struct ipa_mem_buffer mem;
struct IpaHwMhiInitCmdData_t *init_cmd_data;
struct IpaHwMhiMsiCmdData_t *msi_cmd;
if (!ipa_uc_mhi_ctx) {
IPAERR("Not initialized\n");
return -EFAULT;
}
ipa_inc_client_enable_clks();
res = ipa_uc_update_hw_flags(0);
if (res) {
IPAERR("ipa_uc_update_hw_flags failed %d\n", res);
goto disable_clks;
}
mem.size = sizeof(*init_cmd_data);
mem.base = dma_alloc_coherent(ipa_ctx->pdev, mem.size, &mem.phys_base,
GFP_KERNEL);
if (!mem.base) {
IPAERR("fail to alloc DMA buff of size %d\n", mem.size);
res = -ENOMEM;
goto disable_clks;
}
memset(mem.base, 0, mem.size);
init_cmd_data = (struct IpaHwMhiInitCmdData_t *)mem.base;
init_cmd_data->msiAddress = msi->addr_low;
init_cmd_data->mmioBaseAddress = mmio_addr;
init_cmd_data->deviceMhiCtrlBaseAddress = host_ctrl_addr;
init_cmd_data->deviceMhiDataBaseAddress = host_data_addr;
init_cmd_data->firstChannelIndex = first_ch_idx;
init_cmd_data->firstEventRingIndex = first_evt_idx;
res = ipa_uc_send_cmd((u32)mem.phys_base, IPA_CPU_2_HW_CMD_MHI_INIT, 0,
false, HZ);
if (res) {
IPAERR("ipa_uc_send_cmd failed %d\n", res);
dma_free_coherent(ipa_ctx->pdev, mem.size, mem.base,
mem.phys_base);
goto disable_clks;
}
dma_free_coherent(ipa_ctx->pdev, mem.size, mem.base, mem.phys_base);
mem.size = sizeof(*msi_cmd);
mem.base = dma_alloc_coherent(ipa_ctx->pdev, mem.size, &mem.phys_base,
GFP_KERNEL);
if (!mem.base) {
IPAERR("fail to alloc DMA buff of size %d\n", mem.size);
res = -ENOMEM;
goto disable_clks;
}
msi_cmd = (struct IpaHwMhiMsiCmdData_t *)mem.base;
msi_cmd->msiAddress_hi = msi->addr_hi;
msi_cmd->msiAddress_low = msi->addr_low;
msi_cmd->msiData = msi->data;
msi_cmd->msiMask = msi->mask;
res = ipa_uc_send_cmd((u32)mem.phys_base,
IPA_CPU_2_HW_CMD_MHI_UPDATE_MSI, 0, false, HZ);
if (res) {
IPAERR("ipa_uc_send_cmd failed %d\n", res);
dma_free_coherent(ipa_ctx->pdev, mem.size, mem.base,
mem.phys_base);
goto disable_clks;
}
dma_free_coherent(ipa_ctx->pdev, mem.size, mem.base, mem.phys_base);
res = 0;
disable_clks:
ipa_dec_client_disable_clks();
return res;
}
开发者ID:Menpiko,项目名称:SnaPKernel-N6P,代码行数:81,代码来源:ipa_uc_mhi.c
示例4: stmp_appuart_dma_init
/* Allocate and initialize rx and tx DMA chains */
static inline int stmp_appuart_dma_init(struct stmp_appuart_port *s)
{
int err = 0;
struct stmp3xxx_dma_descriptor *t = &s->tx_desc;
#ifndef RX_CHAIN
struct stmp3xxx_dma_descriptor *r = &s->rx_desc;
#else
int i;
#endif
err = stmp3xxx_dma_request(s->dma_rx, s->dev, s->dev->bus_id);
if (err)
goto out;
err = stmp3xxx_dma_request(s->dma_tx, s->dev, s->dev->bus_id);
if (err)
goto out1;
#ifndef RX_CHAIN
err = stmp3xxx_dma_allocate_command(s->dma_rx, r);
if (err)
goto out2;
#endif
err = stmp3xxx_dma_allocate_command(s->dma_tx, t);
if (err)
goto out3;
t->virtual_buf_ptr = dma_alloc_coherent(s->dev,
TX_BUFFER_SIZE,
&t->command->buf_ptr,
GFP_DMA);
if (!t->virtual_buf_ptr)
goto out4;
#ifdef DEBUG
memset(t->virtual_buf_ptr, 0x4B, TX_BUFFER_SIZE);
#endif
#ifndef RX_CHAIN
r->virtual_buf_ptr = dma_alloc_coherent(s->dev,
RX_BUFFER_SIZE,
&r->command->buf_ptr,
GFP_DMA);
if (!r->virtual_buf_ptr)
goto out5;
#ifdef DEBUG
memset(r->virtual_buf_ptr, 0x4C, RX_BUFFER_SIZE);
#endif
#else
stmp3xxx_dma_make_chain(s->dma_rx, &s->rx_chain, s->rxd, RX_CHAIN);
for (i = 0; i < RX_CHAIN; i++) {
struct stmp3xxx_dma_descriptor *r = s->rxd + i;
r->command->cmd =
BF_APBX_CHn_CMD_XFER_COUNT(RX_BUFFER_SIZE) |
BF_APBX_CHn_CMD_CMDWORDS(1) |
BM_APBX_CHn_CMD_WAIT4ENDCMD |
BM_APBX_CHn_CMD_SEMAPHORE |
BM_APBX_CHn_CMD_IRQONCMPLT |
BM_APBX_CHn_CMD_CHAIN |
BF_APBX_CHn_CMD_COMMAND(
BV_APBX_CHn_CMD_COMMAND__DMA_WRITE);
r->virtual_buf_ptr = dma_alloc_coherent(s->dev,
RX_BUFFER_SIZE,
&r->command->buf_ptr,
GFP_DMA);
r->command->pio_words[0] = /* BM_UARTAPP_CTRL0_RUN | */
BF_UARTAPP_CTRL0_XFER_COUNT(RX_BUFFER_SIZE)|
BM_UARTAPP_CTRL0_RXTO_ENABLE |
BF_UARTAPP_CTRL0_RXTIMEOUT(3);
}
#endif
return 0;
/*
* would be necessary on other error paths
dma_free_coherent( s->dev, RX_BUFFER_SIZE, r->virtual_buf_ptr,
r->command->buf_ptr);
*/
out5:
dma_free_coherent(s->dev, TX_BUFFER_SIZE, t->virtual_buf_ptr,
t->command->buf_ptr);
out4:
stmp3xxx_dma_free_command(s->dma_tx, t);
out3:
#ifndef RX_CHAIN
stmp3xxx_dma_free_command(s->dma_rx, r);
#endif
out2:
stmp3xxx_dma_release(s->dma_tx);
out1:
stmp3xxx_dma_release(s->dma_rx);
out:
WARN_ON(err);
return err;
}
开发者ID:traveller42,项目名称:linux-2.6.28.mx233-falconwing,代码行数:95,代码来源:stmp-app.c
示例5: mace_open
static int mace_open(struct net_device *dev)
{
struct mace_data *mp = netdev_priv(dev);
volatile struct mace *mb = mp->mace;
/* reset the chip */
mace_reset(dev);
if (request_irq(dev->irq, mace_interrupt, 0, dev->name, dev)) {
printk(KERN_ERR "%s: can't get irq %d\n", dev->name, dev->irq);
return -EAGAIN;
}
if (request_irq(mp->dma_intr, mace_dma_intr, 0, dev->name, dev)) {
printk(KERN_ERR "%s: can't get irq %d\n", dev->name, mp->dma_intr);
free_irq(dev->irq, dev);
return -EAGAIN;
}
/* Allocate the DMA ring buffers */
mp->tx_ring = dma_alloc_coherent(mp->device,
N_TX_RING * MACE_BUFF_SIZE,
&mp->tx_ring_phys, GFP_KERNEL);
if (mp->tx_ring == NULL) {
printk(KERN_ERR "%s: unable to allocate DMA tx buffers\n", dev->name);
goto out1;
}
mp->rx_ring = dma_alloc_coherent(mp->device,
N_RX_RING * MACE_BUFF_SIZE,
&mp->rx_ring_phys, GFP_KERNEL);
if (mp->rx_ring == NULL) {
printk(KERN_ERR "%s: unable to allocate DMA rx buffers\n", dev->name);
goto out2;
}
mace_dma_off(dev);
/* Not sure what these do */
psc_write_word(PSC_ENETWR_CTL, 0x9000);
psc_write_word(PSC_ENETRD_CTL, 0x9000);
psc_write_word(PSC_ENETWR_CTL, 0x0400);
psc_write_word(PSC_ENETRD_CTL, 0x0400);
mace_rxdma_reset(dev);
mace_txdma_reset(dev);
/* turn it on! */
mb->maccc = ENXMT | ENRCV;
/* enable all interrupts except receive interrupts */
mb->imr = RCVINT;
return 0;
out2:
dma_free_coherent(mp->device, N_TX_RING * MACE_BUFF_SIZE,
mp->tx_ring, mp->tx_ring_phys);
out1:
free_irq(dev->irq, dev);
free_irq(mp->dma_intr, dev);
return -ENOMEM;
}
开发者ID:AdrianHuang,项目名称:linux-3.8.13,代码行数:62,代码来源:macmace.c
示例6: vdmafb_probe
//.........这里部分代码省略.........
fbdev = devm_kzalloc(&pdev->dev, sizeof(*fbdev), GFP_KERNEL);
if (!fbdev)
return -ENOMEM;
platform_set_drvdata(pdev, fbdev);
fbdev->info.fbops = &vdmafb_ops;
fbdev->info.device = &pdev->dev;
fbdev->info.par = fbdev;
fbdev->dma_template = devm_kzalloc(&pdev->dev,
sizeof(struct dma_interleaved_template) +
sizeof(struct data_chunk), GFP_KERNEL);
if (!fbdev->dma_template)
return -ENOMEM;
vdmafb_init_var(fbdev, pdev);
vdmafb_init_fix(fbdev);
/* Request I/O resource */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "I/O resource request failed\n");
return -ENXIO;
}
res->flags &= ~IORESOURCE_CACHEABLE;
fbdev->regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(fbdev->regs))
return PTR_ERR(fbdev->regs);
/* Allocate framebuffer memory */
fbsize = fbdev->info.fix.smem_len;
fbdev->fb_virt = dma_alloc_coherent(&pdev->dev, PAGE_ALIGN(fbsize),
&fbdev->fb_phys, GFP_KERNEL);
if (!fbdev->fb_virt) {
dev_err(&pdev->dev,
"Frame buffer memory allocation failed\n");
return -ENOMEM;
}
fbdev->info.fix.smem_start = fbdev->fb_phys;
fbdev->info.screen_base = fbdev->fb_virt;
fbdev->info.pseudo_palette = fbdev->pseudo_palette;
pr_debug("%s virt=%p phys=%x size=%d\n", __func__,
fbdev->fb_virt, fbdev->fb_phys, fbsize);
/* Clear framebuffer */
memset_io(fbdev->fb_virt, 0, fbsize);
fbdev->dma = dma_request_slave_channel(&pdev->dev, "video");
if (IS_ERR_OR_NULL(fbdev->dma)) {
dev_err(&pdev->dev, "Failed to allocate DMA channel (%d).\n", ret);
if (fbdev->dma)
ret = PTR_ERR(fbdev->dma);
else
ret = -EPROBE_DEFER;
goto err_dma_free;
}
/* Setup and enable the framebuffer */
vdmafb_setupfb(fbdev);
ret = fb_alloc_cmap(&fbdev->info.cmap, 256, 0);
if (ret) {
dev_err(&pdev->dev, "fb_alloc_cmap failed\n");
}
/* Register framebuffer */
ret = register_framebuffer(&fbdev->info);
if (ret) {
dev_err(&pdev->dev, "Framebuffer registration failed\n");
goto err_channel_free;
}
/* Register backlight */
memset(&props, 0, sizeof(struct backlight_properties));
props.type = BACKLIGHT_RAW;
props.max_brightness = 1023;
bl = backlight_device_register("backlight", &pdev->dev, fbdev,
&vdmafb_bl_ops, &props);
if (IS_ERR(bl)) {
dev_err(&pdev->dev, "error %ld on backlight register\n",
PTR_ERR(bl));
} else {
fbdev->backlight = bl;
bl->props.power = FB_BLANK_UNBLANK;
bl->props.fb_blank = FB_BLANK_UNBLANK;
bl->props.brightness = vdmafb_bl_get_brightness(bl);
}
return 0;
err_channel_free:
dma_release_channel(fbdev->dma);
err_dma_free:
dma_free_coherent(&pdev->dev, PAGE_ALIGN(fbsize), fbdev->fb_virt,
fbdev->fb_phys);
return ret;
}
开发者ID:topic-embedded-products,项目名称:kernel-module-vdmafb,代码行数:101,代码来源:vdmafb.c
示例7: pci_endpoint_test_copy
static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
{
bool ret = false;
void *src_addr;
void *dst_addr;
dma_addr_t src_phys_addr;
dma_addr_t dst_phys_addr;
struct pci_dev *pdev = test->pdev;
struct device *dev = &pdev->dev;
void *orig_src_addr;
dma_addr_t orig_src_phys_addr;
void *orig_dst_addr;
dma_addr_t orig_dst_phys_addr;
size_t offset;
size_t alignment = test->alignment;
u32 src_crc32;
u32 dst_crc32;
orig_src_addr = dma_alloc_coherent(dev, size + alignment,
&orig_src_phys_addr, GFP_KERNEL);
if (!orig_src_addr) {
dev_err(dev, "failed to allocate source buffer\n");
ret = false;
goto err;
}
if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) {
src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment);
offset = src_phys_addr - orig_src_phys_addr;
src_addr = orig_src_addr + offset;
} else {
src_phys_addr = orig_src_phys_addr;
src_addr = orig_src_addr;
}
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
lower_32_bits(src_phys_addr));
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
upper_32_bits(src_phys_addr));
get_random_bytes(src_addr, size);
src_crc32 = crc32_le(~0, src_addr, size);
orig_dst_addr = dma_alloc_coherent(dev, size + alignment,
&orig_dst_phys_addr, GFP_KERNEL);
if (!orig_dst_addr) {
dev_err(dev, "failed to allocate destination address\n");
ret = false;
goto err_orig_src_addr;
}
if (alignment && !IS_ALIGNED(orig_dst_phys_addr, alignment)) {
dst_phys_addr = PTR_ALIGN(orig_dst_phys_addr, alignment);
offset = dst_phys_addr - orig_dst_phys_addr;
dst_addr = orig_dst_addr + offset;
} else {
dst_phys_addr = orig_dst_phys_addr;
dst_addr = orig_dst_addr;
}
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
lower_32_bits(dst_phys_addr));
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
upper_32_bits(dst_phys_addr));
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE,
size);
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
1 << MSI_NUMBER_SHIFT | COMMAND_COPY);
wait_for_completion(&test->irq_raised);
dst_crc32 = crc32_le(~0, dst_addr, size);
if (dst_crc32 == src_crc32)
ret = true;
dma_free_coherent(dev, size + alignment, orig_dst_addr,
orig_dst_phys_addr);
err_orig_src_addr:
dma_free_coherent(dev, size + alignment, orig_src_addr,
orig_src_phys_addr);
err:
return ret;
}
开发者ID:mkrufky,项目名称:linux,代码行数:88,代码来源:pci_endpoint_test.c
示例8: xfifo_dma_write
ssize_t xfifo_dma_write(struct file *filp, const char __user *buf, size_t count,
loff_t *f_pos)
{
struct xfifo_dma_dev *dev = filp->private_data;
size_t transfer_size;
int retval = 0;
if (mutex_lock_interruptible(&dev->mutex)) {
return -EINTR;
}
dev->writes++;
transfer_size = count;
if (count > dev->fifo_depth) {
transfer_size = dev->fifo_depth;
}
/* Allocate a DMA buffer for the transfer */
dev->buffer_v_addr = dma_alloc_coherent(&dev->pdev->dev, transfer_size,
&dev->buffer_d_addr, GFP_KERNEL);
if (!dev->buffer_v_addr) {
dev_err(&dev->pdev->dev,
"coherent DMA buffer allocation failed\n");
retval = -ENOMEM;
goto fail_buffer;
}
PDEBUG("dma buffer alloc - d @0x%0x v @0x%0x\n",
(u32)dev->buffer_d_addr, (u32)dev->buffer_v_addr);
if (request_dma(dev->dma_channel, MODULE_NAME)) {
dev_err(&dev->pdev->dev,
"unable to alloc DMA channel %d\n",
dev->dma_channel);
retval = -EBUSY;
goto fail_client_data;
}
dev->busy = 1;
dev->count = transfer_size;
set_dma_mode(dev->dma_channel, DMA_MODE_WRITE);
set_dma_addr(dev->dma_channel, dev->buffer_d_addr);
set_dma_count(dev->dma_channel, transfer_size);
set_pl330_client_data(dev->dma_channel, dev->client_data);
set_pl330_done_callback(dev->dma_channel,
xfifo_dma_done_callback, dev);
set_pl330_fault_callback(dev->dma_channel,
xfifo_dma_fault_callback, dev);
set_pl330_incr_dev_addr(dev->dma_channel, 0);
/* Load our DMA buffer with the user data */
copy_from_user(dev->buffer_v_addr, buf, transfer_size);
xfifo_dma_reset_fifo();
/* Kick off the DMA */
enable_dma(dev->dma_channel);
mutex_unlock(&dev->mutex);
wait_event_interruptible(xfifo_dma_wait, dev->busy == 0);
/* Deallocate the DMA buffer and free the channel */
free_dma(dev->dma_channel);
dma_free_coherent(&dev->pdev->dev, dev->count, dev->buffer_v_addr,
dev->buffer_d_addr);
PDEBUG("dma write %d bytes\n", transfer_size);
return transfer_size;
fail_client_data:
dma_free_coherent(&dev->pdev->dev, transfer_size, dev->buffer_v_addr,
dev->buffer_d_addr);
fail_buffer:
mutex_unlock(&dev->mutex);
return retval;
}
开发者ID:jorgemarsal,项目名称:SocMiner,代码行数:81,代码来源:xfifo_dma.c
示例9: __videobuf_mmap_mapper
static int __videobuf_mmap_mapper(struct videobuf_queue *q,
struct vm_area_struct *vma)
{
struct videobuf_dma_contig_memory *mem;
struct videobuf_mapping *map;
unsigned int first;
int retval;
unsigned long size, offset = vma->vm_pgoff << PAGE_SHIFT;
dev_dbg(q->dev, "%s\n", __func__);
if (!(vma->vm_flags & VM_WRITE) || !(vma->vm_flags & VM_SHARED))
return -EINVAL;
/* look for first buffer to map */
for (first = 0; first < VIDEO_MAX_FRAME; first++) {
if (!q->bufs[first])
continue;
if (V4L2_MEMORY_MMAP != q->bufs[first]->memory)
continue;
if (q->bufs[first]->boff == offset)
break;
}
if (VIDEO_MAX_FRAME == first) {
dev_dbg(q->dev, "invalid user space offset [offset=0x%lx]\n",
offset);
return -EINVAL;
}
/* create mapping + update buffer list */
map = kzalloc(sizeof(struct videobuf_mapping), GFP_KERNEL);
if (!map)
return -ENOMEM;
q->bufs[first]->map = map;
map->start = vma->vm_start;
map->end = vma->vm_end;
map->q = q;
q->bufs[first]->baddr = vma->vm_start;
mem = q->bufs[first]->priv;
BUG_ON(!mem);
MAGIC_CHECK(mem->magic, MAGIC_DC_MEM);
mem->size = PAGE_ALIGN(q->bufs[first]->bsize);
mem->vaddr = dma_alloc_coherent(q->dev, mem->size,
&mem->dma_handle, GFP_KERNEL);
if (!mem->vaddr) {
dev_err(q->dev, "dma_alloc_coherent size %ld failed\n",
mem->size);
goto error;
}
dev_dbg(q->dev, "dma_alloc_coherent data is at addr %p (size %ld)\n",
mem->vaddr, mem->size);
/* Try to remap memory */
size = vma->vm_end - vma->vm_start;
size = (size < mem->size) ? size : mem->size;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
retval = remap_pfn_range(vma, vma->vm_start,
mem->dma_handle >> PAGE_SHIFT,
size, vma->vm_page_prot);
if (retval) {
dev_err(q->dev, "mmap: remap failed with error %d. ", retval);
dma_free_coherent(q->dev, mem->size,
mem->vaddr, mem->dma_handle);
goto error;
}
vma->vm_ops = &videobuf_vm_ops;
vma->vm_flags |= VM_DONTEXPAND;
vma->vm_private_data = map;
dev_dbg(q->dev, "mmap %p: q=%p %08lx-%08lx (%lx) pgoff %08lx buf %d\n",
map, q, vma->vm_start, vma->vm_end,
(long int) q->bufs[first]->bsize,
vma->vm_pgoff, first);
videobuf_vm_open(vma);
return 0;
error:
kfree(map);
return -ENOMEM;
}
开发者ID:liuyang201666,项目名称:linux-akae,代码行数:89,代码来源:videobuf-dma-contig.c
示例10: sproc_probe
/* Handle probe of a modem device */
static int sproc_probe(struct platform_device *pdev)
{
struct ste_modem_device *mdev =
container_of(pdev, struct ste_modem_device, pdev);
struct sproc *sproc;
struct rproc *rproc;
int err;
dev_dbg(&mdev->pdev.dev, "probe ste-modem\n");
if (!mdev->ops.setup || !mdev->ops.kick || !mdev->ops.kick_subscribe ||
!mdev->ops.power) {
dev_err(&mdev->pdev.dev, "invalid mdev ops\n");
return -EINVAL;
}
rproc = rproc_alloc(&mdev->pdev.dev, mdev->pdev.name, &sproc_ops,
SPROC_MODEM_FIRMWARE, sizeof(*sproc));
if (!rproc)
return -ENOMEM;
sproc = rproc->priv;
sproc->mdev = mdev;
sproc->rproc = rproc;
mdev->drv_data = sproc;
/* Provide callback functions to modem device */
sproc->mdev->ops.setup(sproc->mdev, &sproc_dev_cb);
/* Set the STE-modem specific firmware handler */
rproc->fw_ops = &sproc_fw_ops;
/*
* STE-modem requires the firmware to be located
* at the start of the shared memory region. So we need to
* reserve space for firmware at the start.
*/
sproc->fw_addr = dma_alloc_coherent(rproc->dev.parent, SPROC_FW_SIZE,
&sproc->fw_dma_addr,
GFP_KERNEL);
if (!sproc->fw_addr) {
sproc_err(sproc, "Cannot allocate memory for fw\n");
err = -ENOMEM;
goto free_rproc;
}
/* Register as a remoteproc device */
err = rproc_add(rproc);
if (err)
goto free_mem;
return 0;
free_mem:
dma_free_coherent(rproc->dev.parent, SPROC_FW_SIZE,
sproc->fw_addr, sproc->fw_dma_addr);
free_rproc:
/* Reset device data upon error */
mdev->drv_data = NULL;
rproc_put(rproc);
return err;
}
开发者ID:3null,项目名称:linux,代码行数:63,代码来源:ste_modem_rproc.c
示例11: init_tdm
static int init_tdm(struct tdm_priv *priv)
{
u8 *buf;
int i;
int buf_size;
dma_addr_t physaddr = 0;
int ret = 0;
struct tdm_adapter *adap;
if (!priv) {
pr_err("%s: Invalid handle\n", __func__);
return -EINVAL;
}
adap = priv->adap;
/*
Allocate memory for Rx/Tx buffer according to active time slots
BufferSize = NUM_OF_TDM_BUF * NUM_SAMPLES_PER_FRAME * slot_width *
num_ch
*/
/*Allocating Rx Buffer*/
buf_size = TDM_BUF_SIZE(adap->adapt_cfg.num_ch,
adap->adapt_cfg.slot_width,
adap->adapt_cfg.num_frames);
buf = dma_alloc_coherent(priv->device, buf_size, &physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_ip;
}
priv->dma_input_paddr = physaddr;
priv->dma_input_vaddr = buf;
priv->tdm_input_data = ALIGN_ADDRESS(buf, ALIGNED_8_BYTES);
/*Allocating Tx Buffer*/
buf = dma_alloc_coherent(priv->device, buf_size, &physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_op;
}
priv->dma_output_paddr = physaddr;
priv->dma_output_vaddr = buf;
priv->tdm_output_data = ALIGN_ADDRESS(buf, ALIGNED_8_BYTES);
/* allocate memory for TCD buffer discriptors */
buf = dma_alloc_coherent(priv->device, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE,
&physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_rx;
}
memset(buf, 0, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE);
priv->dma_rx_tcd_paddr = physaddr;
priv->dma_rx_tcd_vaddr = buf;
for (i = 0; i < NUM_OF_TDM_BUF; i++) {
priv->dma_rx_tcd[i] = ALIGN_ADDRESS(buf, ALIGNED_32_BYTES);
buf += TCD_BUFFER_SIZE;
}
buf = dma_alloc_coherent(priv->device, 3 * TCD_BUFFER_SIZE, &physaddr,
GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_tx;
}
memset(buf, 0, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE);
priv->dma_tx_tcd_paddr = physaddr;
priv->dma_tx_tcd_vaddr = buf;
for (i = 0; i < NUM_OF_TDM_BUF; i++) {
priv->dma_tx_tcd[i] = ALIGN_ADDRESS(buf, ALIGNED_32_BYTES);
buf += TCD_BUFFER_SIZE;
}
priv->phase_rx = 0;
priv->phase_tx = 0;
return 0;
err_alloc_tx:
dma_free_coherent(priv->device, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE,
priv->dma_rx_tcd_vaddr, priv->dma_rx_tcd_paddr);
err_alloc_rx:
dma_free_coherent(priv->device, buf_size, priv->dma_output_vaddr,
priv->dma_output_paddr);
err_alloc_op:
dma_free_coherent(priv->device, buf_size, priv->dma_input_vaddr,
priv->dma_input_paddr);
err_alloc_ip:
return ret;
}
开发者ID:sonoble,项目名称:linux-3.8.13,代码行数:90,代码来源:tdm_fsl.c
示例12: init_tdm
static int init_tdm(struct tdm_priv *priv)
{
u8 *buf;
int i;
int buf_size;
dma_addr_t physaddr = 0;
int ret = 0;
/*
Allocate memory for Rx/Tx buffer according to active time slots
BufferSize = NUM_OF_TDM_BUF*NUM_OF_FRAMES*Active_CH
*/
buf_size = TDM_BUF_SIZE(priv->cfg.num_ch, priv->cfg.ch_width,
priv->cfg.num_frames);
buf = dma_alloc_coherent(priv->device, buf_size, &physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_ip;
}
priv->dma_input_paddr = physaddr;
priv->dma_input_vaddr = buf;
priv->tdm_input_data = ALIGN_ADDRESS(buf, ALIGNED_8_BYTES);
buf = dma_alloc_coherent(priv->device, buf_size, &physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_op;
}
priv->dma_output_paddr = physaddr;
priv->dma_output_vaddr = buf;
priv->tdm_output_data = ALIGN_ADDRESS(buf, ALIGNED_8_BYTES);
/* allocate memory for TCD buffer discriptors */
buf = dma_alloc_coherent(priv->device, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE,
&physaddr, GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_rx;
}
memset(buf, 0, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE);
priv->dma_rx_tcd_paddr = physaddr;
priv->dma_rx_tcd_vaddr = buf;
for (i = 0; i < NUM_OF_TDM_BUF; i++) {
priv->dma_rx_tcd[i] = ALIGN_ADDRESS(buf, ALIGNED_32_BYTES);
buf += TCD_BUFFER_SIZE;
}
buf = dma_alloc_coherent(priv->device, 3 * TCD_BUFFER_SIZE, &physaddr,
GFP_KERNEL);
if (!buf) {
ret = -ENOMEM;
goto err_alloc_tx;
}
memset(buf, 0, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE);
priv->dma_tx_tcd_paddr = physaddr;
priv->dma_tx_tcd_vaddr = buf;
for (i = 0; i < NUM_OF_TDM_BUF; i++) {
priv->dma_tx_tcd[i] = ALIGN_ADDRESS(buf, ALIGNED_32_BYTES);
buf += TCD_BUFFER_SIZE;
}
priv->phase_rx = 0;
priv->phase_tx = 0;
return 0;
err_alloc_tx:
dma_free_coherent(priv->device, NUM_OF_TDM_BUF * TCD_BUFFER_SIZE,
priv->dma_rx_tcd_vaddr, priv->dma_rx_tcd_paddr);
err_alloc_rx:
dma_free_coherent(priv->device, buf_size, priv->dma_output_vaddr,
priv->dma_output_paddr);
err_alloc_op:
dma_free_coherent(priv->device, buf_size, priv->dma_input_vaddr,
priv->dma_input_paddr);
err_alloc_ip:
return ret;
}
开发者ID:DavionKnight,项目名称:H18CE-1604C,代码行数:78,代码来源:tdm_fsl_starlite.c
示例13: device_init_rings
static bool device_init_rings(struct vnt_private *pDevice)
{
void *vir_pool;
/*allocate all RD/TD rings a single pool*/
vir_pool = dma_zalloc_coherent(&pDevice->pcid->dev,
pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
&pDevice->pool_dma, GFP_ATOMIC);
if (vir_pool == NULL) {
dev_err(&pDevice->pcid->dev, "allocate desc dma memory failed\n");
return false;
}
pDevice->aRD0Ring = vir_pool;
pDevice->aRD1Ring = vir_pool +
pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
pDevice->rd0_pool_dma = pDevice->pool_dma;
pDevice->rd1_pool_dma = pDevice->rd0_pool_dma +
pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc);
pDevice->tx0_bufs = dma_zalloc_coherent(&pDevice->pcid->dev,
pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ +
pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ +
CB_BEACON_BUF_SIZE +
CB_MAX_BUF_SIZE,
&pDevice->tx_bufs_dma0,
GFP_ATOMIC);
if (pDevice->tx0_bufs == NULL) {
dev_err(&pDevice->pcid->dev, "allocate buf dma memory failed\n");
dma_free_coherent(&pDevice->pcid->dev,
pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc) +
pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc) +
pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc) +
pDevice->sOpts.nTxDescs[1] * sizeof(STxDesc),
vir_pool, pDevice->pool_dma
);
return false;
}
pDevice->td0_pool_dma = pDevice->rd1_pool_dma +
pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
pDevice->td1_pool_dma = pDevice->td0_pool_dma +
pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
/* vir_pool: pvoid type */
pDevice->apTD0Rings = vir_pool
+ pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
+ pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc);
pDevice->apTD1Rings = vir_pool
+ pDevice->sOpts.nRxDescs0 * sizeof(SRxDesc)
+ pDevice->sOpts.nRxDescs1 * sizeof(SRxDesc)
+ pDevice->sOpts.nTxDescs[0] * sizeof(STxDesc);
pDevice->tx1_bufs = pDevice->tx0_bufs +
pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
pDevice->tx_beacon_bufs = pDevice->tx1_bufs +
pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
pDevice->pbyTmpBuff = pDevice->tx_beacon_bufs +
CB_BEACON_BUF_SIZE;
pDevice->tx_bufs_dma1 = pDevice->tx_bufs_dma0 +
pDevice->sOpts.nTxDescs[0] * PKT_BUF_SZ;
pDevice->tx_beacon_dma = pDevice->tx_bufs_dma1 +
pDevice->sOpts.nTxDescs[1] * PKT_BUF_SZ;
return true;
}
开发者ID:lovejavaee,项目名称:linux-2,代码行数:77,代码来源:device_main.c
示例14: prp_enc_setup
//.........这里部分代码省略.........
csi_id = mipi_csi2_get_bind_csi(mipi_csi2_info);
if (cam->ipu == ipu_get_soc(ipu_id)
&& cam->csi == csi_id) {
enc.csi_prp_enc_mem.mipi_en = true;
enc.csi_prp_enc_mem.mipi_vc =
mipi_csi2_get_virtual_channel(mipi_csi2_info);
enc.csi_prp_enc_mem.mipi_id =
mipi_csi2_get_datatype(mipi_csi2_info);
mipi_csi2_pixelclk_enable(mipi_csi2_info);
} else {
enc.csi_prp_enc_mem.mipi_en = false;
enc.csi_prp_enc_mem.mipi_vc = 0;
enc.csi_prp_enc_mem.mipi_id = 0;
}
} else {
enc.csi_prp_enc_mem.mipi_en = false;
enc.csi_prp_enc_mem.mipi_vc = 0;
enc.csi_prp_enc_mem.mipi_id = 0;
}
}
#endif
err = ipu_init_channel(cam->ipu, CSI_PRP_ENC_MEM, &enc);
if (err != 0) {
printk(KERN_ERR "ipu_init_channel %d\n", err);
return err;
}
grotation = cam->rotation;
if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
if (cam->rot_enc_bufs_vaddr[0]) {
dma_free_coherent(0, cam->rot_enc_buf_size[0],
cam->rot_enc_bufs_vaddr[0],
cam->rot_enc_bufs[0]);
}
if (cam->rot_enc_bufs_vaddr[1]) {
dma_free_coherent(0, cam->rot_enc_buf_size[1],
cam->rot_enc_bufs_vaddr[1],
cam->rot_enc_bufs[1]);
}
cam->rot_enc_buf_size[0] =
PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);
cam->rot_enc_bufs_vaddr[0] =
(void *)dma_alloc_coherent(0, cam->rot_enc_buf_size[0],
&cam->rot_enc_bufs[0],
GFP_DMA | GFP_KERNEL);
if (!cam->rot_enc_bufs_vaddr[0]) {
printk(KERN_ERR "alloc enc_bufs0\n");
return -ENOMEM;
}
cam->rot_enc_buf_size[1] =
PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);
cam->rot_enc_bufs_vaddr[1] =
(void *)dma_alloc_coherent(0, cam->rot_enc_buf_size[1],
&cam->rot_enc_bufs[1],
GFP_DMA | GFP_KERNEL);
if (!cam->rot_enc_bufs_vaddr[1]) {
dma_free_coherent(0, cam->rot_enc_buf_size[0],
cam->rot_enc_bufs_vaddr[0],
cam->rot_enc_bufs[0]);
cam->rot_enc_bufs_vaddr[0] = NULL;
cam->rot_enc_bufs[0] = 0;
printk(KERN_ERR "alloc enc_bufs1\n");
return -ENOMEM;
开发者ID:Trimblejena,项目名称:HurricaneBSP-linux-fslc-imx-3.14-1.1.x,代码行数:67,代码来源:ipu_prp_enc.c
示例15: dma_free
static void dma_free(struct mbo *mbo, u32 size)
{
struct device *dev = mbo->ifp->driver_dev;
dma_free_coherent(dev, size, mbo->virt_address, mbo->bus_address);
}
开发者ID:krzk,项目名称:linux,代码行数:6,代码来源:dim2.c
示例16: sunxi_free_one_event_buffer
/**
* sunxi_free_one_event_buffer - Frees one event buffer
* @otgc: Pointer to our controller context structure
* @evt: Pointer to event buffer to be freed
*/
static void sunxi_free_one_event_buffer(struct sunxi_otgc *otgc,
struct sunxi_otgc_event_buffer *evt)
{
dma_free_coherent(otgc->dev, evt->length, evt->buf, evt->dma);
kfree(evt);
}
开发者ID:phi-psi,项目名称:linux-3.4-sunxi,代码行数:11,代码来源:core.c
示例17: pxa_irda_start
static int pxa_irda_start(struct net_device *dev)
{
struct pxa_irda *si = netdev_priv(dev);
int err;
si->speed = 9600;
err = request_irq(IRQ_STUART, pxa_irda_sir_irq, 0, dev->name, dev);
if (err)
goto err_irq1;
err = request_irq(IRQ_ICP, pxa_irda_fir_irq, 0, dev->name, dev);
if (err)
goto err_irq2;
/*
* The interrupt must remain disabled for now.
*/
disable_irq(IRQ_STUART);
disable_irq(IRQ_ICP);
err = -EBUSY;
si->rxdma = pxa_request_dma("FICP_RX",DMA_PRIO_LOW, pxa_irda_fir_dma_rx_irq, dev);
if (si->rxdma < 0)
goto err_rx_dma;
si->txdma = pxa_request_dma("FICP_TX",DMA_PRIO_LOW, pxa_irda_fir_dma_tx_irq, dev);
if (si->txdma < 0)
goto err_tx_dma;
err = -ENOMEM;
si->dma_rx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT,
&si->dma_rx_buff_phy, GFP_KERNEL );
if (!si->dma_rx_buff)
goto err_dma_rx_buff;
si->dma_tx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT,
&si->dma_tx_buff_phy, GFP_KERNEL );
if (!si->dma_tx_buff)
goto err_dma_tx_buff;
/* Setup the serial port for the initial speed. */
pxa_irda_startup(si);
/*
* Open a new IrLAP layer instance.
*/
si->irlap = irlap_open(dev, &si->qos, "pxa");
err = -ENOMEM;
if (!si->irlap)
goto err_irlap;
/*
* Now enable the interrupt and start the queue
*/
enable_irq(IRQ_STUART);
enable_irq(IRQ_ICP);
netif_start_queue(dev);
printk(KERN_DEBUG "pxa_ir: irda driver opened\n");
return 0;
err_irlap:
pxa_irda_shutdown(si);
dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy);
err_dma_tx_buff:
dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy);
err_dma_rx_buff:
pxa_free_dma(si->txdma);
err_tx_dma:
pxa_free_dma(si->rxdma);
err_rx_dma:
free_irq(IRQ_ICP, dev);
err_irq2:
free_irq(IRQ_STUART, dev);
err_irq1:
return err;
}
开发者ID:E-LLP,项目名称:n900,代码行数:80,代码来源:pxaficp_ir.c
示例18: plat_free_consistent_dmaable_memory
void plat_free_consistent_dmaable_memory(struct device *dev, u32 size, void * addr,u32 dma_addr)
{
dma_free_coherent(dev, size, addr, dma_addr);
}
开发者ID:xuanhoa9985,项目名称:KERNEL-NPM801,代码行数:4,代码来源:synopGMAC_plat.c
示例19: ali_openVG_release
int ali_openVG_release(struct inode *inode, struct file *filp)
{
struct ali_openVG_handle *handle = filp->private_data;
struct list_head* head = handle->mem_list;
struct list_head* allocated_head = handle->allocated_list;
#if MMU_ENABLED
struct ali_ovg_mmuAllocator *temp;
int i;
#endif
ovg_precord();
OVG_PRINTK("Ovg kernel driver close ! \n");
/*memory session begin*/
if(memfp.ovg_session_end)
memfp.ovg_session_end(filp);
#if MMU_ENABLED
temp = mmuSubsystem.first_allocator;
while(temp){
if(temp->ops->ovg_session_end)
temp->ops->ovg_session_end(filp);
temp = temp->next;
}
|
请发表评论