亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2388 | 回復(fù): 2
打印 上一主題 下一主題

求分析下mx1_camera.c中有個(gè)加鎖解鎖 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-06-22 18:39 |只看該作者 |倒序?yàn)g覽

mx1_camera_dma_irq函數(shù)里有個(gè)spin_lock_irqsave(&pcdev->lock, flags); 對(duì)應(yīng)out:spin_unlock_irqresore(&pcdev->lock, flags);
正常條件下 走到 mx1_camera_wakeup(pcdev, vb, buf);  在這個(gè)函數(shù)里我也沒看到解鎖操作. 求大神解釋解釋為什么不用解鎖.??
2.6~3.x的內(nèi)核  驅(qū)動(dòng)里的代碼
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
2 [報(bào)告]
發(fā)表于 2017-01-23 17:21 |只看該作者
mx1_camera_wakeu函數(shù)完了不久到out這個(gè)地方來了嗎?,C都沒學(xué)好,眼高手低了。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2017-02-13 13:58 |只看該作者
out后面不是解鎖嗎?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP