忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 993 | 回复: 2

求分析下mx1_camera.c中有个加锁解锁 [复制链接]

论坛徽章:
0
发表于 2016-06-22 18:39 |显示全部楼层

mx1_camera_dma_irq函数里有个spin_lock_irqsave(&pcdev->lock, flags); 对应out:spin_unlock_irqresore(&pcdev->lock, flags);
正常条件下 走到 mx1_camera_wakeup(pcdev, vb, buf);  在这个函数里我也没看到解锁操作. 求大神解释解释为什么不用解锁.??
2.6~3.x的内核  驱动里的代码
static void mx1_camera_wakeup(struct mx1_camera_dev *pcdev,

                              struct videobuf_buffer *vb,
                              struct mx1_buffer *buf)
{
        /* _init is used to debug races, see comment in mx1_camera_reqbufs() */
        list_del_init(&vb->queue);
        vb->state = VIDEOBUF_DONE;
        do_gettimeofday(&vb->ts);
        vb->field_count++;
        wake_up(&vb->done);

        if (list_empty(&pcdev->capture)) {
                pcdev->active = NULL;
                return;
        }

        pcdev->active = list_entry(pcdev->capture.next,
                                   struct mx1_buffer, vb.queue);

        /* setup sg list for future DMA */
        if (likely(!mx1_camera_setup_dma(pcdev))) {
                unsigned int temp;

                /* enable SOF irq */
                temp = __raw_readl(pcdev->base + CSICR1) | CSICR1_SOF_INTEN;
                __raw_writel(temp, pcdev->base + CSICR1);
        }
}

static void mx1_camera_dma_irq(int channel, void *data)
{
        struct mx1_camera_dev *pcdev = data;
        struct device *dev = pcdev->icd->dev.parent;
        struct mx1_buffer *buf;
        struct videobuf_buffer *vb;
        unsigned long flags;

        spin_lock_irqsave(&pcdev->lock, flags);

        imx_dma_disable(channel);

        if (unlikely(!pcdev->active)) {
                dev_err(dev, "DMA End IRQ with no active buffer\n");
                goto out;
        }

        vb = &pcdev->active->vb;
        buf = container_of(vb, struct mx1_buffer, vb);
        WARN_ON(buf->inwork || list_empty(&vb->queue));
        dev_dbg(dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
                vb, vb->baddr, vb->bsize);

        mx1_camera_wakeup(pcdev, vb, buf);
out:
        spin_unlock_irqrestore(&pcdev->lock, flags);
}

static struct videobuf_queue_ops mx1_videobuf_ops = {
        .buf_setup        = mx1_videobuf_setup,
        .buf_prepare        = mx1_videobuf_prepare,
        .buf_queue        = mx1_videobuf_queue,
        .buf_release        = mx1_videobuf_release,
};

static void mx1_camera_init_videobuf(struct videobuf_queue *q,
                                     struct soc_camera_device *icd)
{
        struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
        struct mx1_camera_dev *pcdev = ici->priv;

        videobuf_queue_dma_contig_init(q, &mx1_videobuf_ops, icd->dev.parent,
                                        &pcdev->lock,
                                        V4L2_BUF_TYPE_VIDEO_CAPTURE,
                                        V4L2_FIELD_NONE,
                                        sizeof(struct mx1_buffer), icd);
}

论坛徽章:
0
发表于 2017-01-23 17:21 |显示全部楼层
mx1_camera_wakeu函数完了不久到out这个地方来了吗?,C都没学好,眼高手低了。

论坛徽章:
0
发表于 2017-02-13 13:58 |显示全部楼层
out后面不是解锁吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10张SACC2017门票等你来拿~

在数字化转型时代,云已成为万物智能的数字化大脑。而随着大数据应用、人工智能、移动互联网等技术的飞速发展,“智慧 +” 的概念正在深入到各行各业,提升企业效率,释放商业潜能,创造全新机遇。作为国内顶级技术盛会之一,2017 中国系统架构师大会(SACC2017)将于 10 月 19-21 日在北京新云南皇冠假日酒店震撼来袭。今年,大会以 “云智未来” 为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置 2 大主会场,18 个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100 余位技术专家及行业领袖来分享他们的经验;并将吸引 4000 + 人次的系统运维、架构师及 IT 决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年10月19日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP