BOOL s3c_mfc_setup_memory(void) { BOOL ret_bit, ret_dat; unsigned char *pDataBuf; /* * MFC SFR(Special Function Registers), Bitprocessor buffer, Data buffer의 * physical address 를 virtual address로 mapping 한다 */ ret_bit = s3c_mfc_memmap_bitproc_buff(); if (ret_bit == FALSE) { mfc_err("fail to mapping bitprocessor buffer memory\n"); return FALSE; } ret_dat = s3c_mfc_memmap_databuf(); if (ret_dat == FALSE) { mfc_err("fail to mapping data buffer memory \n"); return FALSE; } /* FramBufMgr Module Initialization */ pDataBuf = (unsigned char *)s3c_mfc_get_databuf_virt_addr(); s3c_mfc_init_yuvbuf_mgr(pDataBuf + S3C_MFC_STREAM_BUF_SIZE, S3C_MFC_YUV_BUF_SIZE); return TRUE; }
static int s3c_mfc_open(struct inode *inode, struct file *file) { s3c_mfc_handle_t *handle; unsigned char *pDataBuf; /* * Mutex Lock */ mutex_lock(s3c_mfc_mutex); clk_enable(s3c_mfc_hclk); clk_enable(s3c_mfc_sclk); clk_enable(s3c_mfc_pclk); s3c_mfc_openhandle_count++; if (s3c_mfc_openhandle_count == 1) { #if defined(CONFIG_S3C6400_KDPMD) || defined(CONFIG_S3C6400_KDPMD_MODULE) kdpmd_set_event(s3c_mfc_pmdev.devid, KDPMD_DRVOPEN); kdpmd_wakeup(); kdpmd_wait(s3c_mfc_pmdev.devid); s3c_mfc_pmdev.state = DEV_RUNNING; mfc_debug("mfc_open woke up\n"); #endif /* FramBufMgr Module Re-initialization */ s3c_mfc_yuv_buffer_mgr_final(); pDataBuf = (unsigned char *)s3c_mfc_get_databuf_virt_addr(); s3c_mfc_init_yuvbuf_mgr(pDataBuf + S3C_MFC_STREAM_BUF_SIZE, S3C_MFC_YUV_BUF_SIZE); /* * 3. MFC Hardware Initialization */ if (s3c_mfc_init_hw() == FALSE) return -ENODEV; } handle = (s3c_mfc_handle_t *)kmalloc(sizeof(s3c_mfc_handle_t), GFP_KERNEL); if (!handle) { mfc_debug("mfc open error\n"); mutex_unlock(s3c_mfc_mutex); return -ENOMEM; } memset(handle, 0, sizeof(s3c_mfc_handle_t)); /* * MFC Instance creation */ handle->mfc_inst = s3c_mfc_inst_create(); if (handle->mfc_inst == NULL) { mfc_err("fail to mfc instance allocation\n"); kfree(handle); mutex_unlock(s3c_mfc_mutex); return -EPERM; } /* * MFC supports multi-instance. so each instance have own data structure * It saves file->private_data */ file->private_data = (s3c_mfc_handle_t *)handle; mutex_unlock(s3c_mfc_mutex); mfc_debug("mfc open success\n"); return 0; }