static int mt_isp_write_reg(mt_isp_reg_io_t *preg_io)
{
    int ret = 0;
    int size = preg_io->count * sizeof(mt_isp_reg_t);
    int hold_size = hold_count * sizeof(mt_isp_reg_t);
    mt_isp_reg_t *preg = (mt_isp_reg_t *) (pwrite_buf + hold_size);

    if (dbgMask & ISP_DBG_WRITE_REG) {
//seanlin        ISP_LOG("[mt_isp_write_reg] data: 0x%x, count: %d \n", (u32) preg_io->data, (u32) preg_io->count);
    }
    //
    if (atomic_read(&hold_reg)) {
        if (atomic_read(&writing_reg)) {
            int timeout;
            // Should wait until write done
            if (dbgMask & ISP_DBG_TASKLET) {
//seanlin                ISP_LOG("[mt_isp_write_reg] Start wait ... \n");
            }
            timeout = wait_event_interruptible_timeout(
                isp_wait_queue, atomic_read(&writing_reg) == 0 , ms_to_jiffies(500));
            if (dbgMask & ISP_DBG_TASKLET) {
//seanlin                ISP_LOG("[mt_isp_write_reg] End wait \n");
            }
            if (timeout == 0) {
                ISP_ERR("Should not happen \n");
                ret = -EFAULT;
                goto mt_isp_write_reg_exit;
            }
        }
    }
    //
    if ((size + hold_size) > buf_size) {
        ISP_ERR("size too big \n");
        ret = -EFAULT;
        goto mt_isp_write_reg_exit;
    }
    //
    if (copy_from_user((u8 *)preg, (u8 *) preg_io->data, size) != 0) {
        ISP_ERR("copy_from_user failed \n");
        ret = -EFAULT;
        goto mt_isp_write_reg_exit;
    }
    //
    if (atomic_read(&hold_reg)) {
        // Write register to buffer
        hold_count += preg_io->count;
    }
    else {
        // Write register to hw
        ret = mt_isp_write_reg_to_hw(preg, preg_io->count);
    }
    //
mt_isp_write_reg_exit:

    return ret;
}
Пример #2
0
/*=======================================================================*/
static int MT6573FDVT_WaitIRQ(u32 * u4IRQMask)
{
    int timeout;
    timeout=wait_event_interruptible_timeout(g_MT6573FDVTWQ, (g_u4MT6573FDVTIRQMSK & g_u4MT6573FDVTIRQ) , ms_to_jiffies(500));
    
    if (timeout == 0) {
    	FDVTPARMDB("wait_event_interruptible_timeout timeout, %d, %d \n", g_u4MT6573FDVTIRQMSK, g_u4MT6573FDVTIRQ);
        iowrite32(0x00030000, FDVT_START);  //LDVT Disable
        iowrite32(0x00000000, FDVT_START);  //LDVT Disable
        return -EAGAIN;
    }
    
    *u4IRQMask = g_u4MT6573FDVTIRQ;
    //FDVTPARMDB("[FDVT] IRQ : 0x%8x \n",g_u4MT6573FDVTIRQ);

    if (! (g_u4MT6573FDVTIRQMSK & g_u4MT6573FDVTIRQ)) { 
        FDVTPARMDB("wait_event_interruptible Not FDVT, %d, %d \n", g_u4MT6573FDVTIRQMSK, g_u4MT6573FDVTIRQ); 
        MT6573FDVT_DUMPREG(); 
        return -1; 
    }
    
    g_u4MT6573FDVTIRQ = 0;

    return 0;
}