/* ** Function Name : MFC_Init ** ** Function Description : This function initialize MFC. ** MFC initailzation contains memory setup, clock configuration, HW initialization, IST initialization. ** First, You have to create mutex for mutual exclusive access of MFC. */ DWORD MFC_Init( DWORD dwContext ) { ///////////////////////// // 1. Mutex Creation // ///////////////////////// if (MFC_Mutex_Create() == FALSE) { // No CleanUp return FALSE; } /////////////////////////// // 2. MFC Memory Setup // /////////////////////////// if (MFC_MemorySetup() == FALSE) { // CleanUp MFC_Mutex_Delete(); return FALSE; } ///////////////////////////////////////// // 3. MFC Clock divider configuration // ///////////////////////////////////////// if (Mfc_Set_ClkDiv(MFC_CLOCK_DIVIDER_RATIO_HALF) == FALSE) { // CleanUp MFC_Mutex_Delete(); return FALSE; } /////////////////////////////////////////////////////// // 4. IST(Interrupt Service Thread) Initialization // /////////////////////////////////////////////////////// if (InitializeIST() == FALSE) { // CleanUp MFC_Mutex_Delete(); return FALSE; } // Number of open handle _openhandle_count = 0; return MFC_INIT_SUCCESS; }
static int s3c_mfc_probe(struct platform_device *pdev) { struct resource *res; int size; int ret; #ifdef USE_MFC_DOMAIN_GATING DOMAIN_POWER_ON; #endif /* USE_MFC_DOMAIN_GATING */ // mfc clock enable #ifdef CONFIG_PLAT_S3C64XX mfc_hclk = clk_get(&pdev->dev, "hclk_mfc"); if (!mfc_hclk || IS_ERR(mfc_hclk)) { #else mfc_hd1clk = clk_get(&pdev->dev, "mfc"); if (!mfc_hd1clk || IS_ERR(mfc_hd1clk)) { #endif /* CONFIG_PLAT_S3C64XX */ printk(KERN_ERR "failed to get mfc clk source\n"); return -ENOENT; } #ifndef CONFIG_PLAT_S5P64XX mfc_sclk = clk_get(&pdev->dev, "sclk_mfc"); if (!mfc_sclk || IS_ERR(mfc_sclk)) { printk(KERN_ERR "failed to get mfc clk source\n"); return -ENOENT; } mfc_pclk = clk_get(&pdev->dev, "pclk_mfc"); if (!mfc_pclk || IS_ERR(mfc_pclk)) { printk(KERN_ERR "failed to get mfc clk source\n"); return -ENOENT; } #endif /* CONFIG_PLAT_S5P64XX */ #ifdef USE_MFC_DOMAIN_GATING CLOCK_ENABLE; #endif /* USE_MFC_DOMAIN_GATING */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { printk(KERN_INFO "failed to get memory region resouce\n"); ret = -ENOENT; goto err_mem; } size = (res->end-res->start)+1; mfc_mem = request_mem_region(res->start, size, pdev->name); if (mfc_mem == NULL) { printk(KERN_INFO "failed to get memory region\n"); ret = -ENOENT; goto err_mem; } mfc_base = ioremap(res->start, size); if (mfc_base == 0) { printk(KERN_INFO "failed to ioremap() region\n"); ret = -EINVAL; goto err_ioremap; } res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (res == NULL) { printk(KERN_INFO "failed to get irq resource\n"); ret = -ENOENT; goto err_irq; } ret = request_irq(res->start, (irq_handler_t) s3c_mfc_irq, 0, pdev->name, pdev); if (ret != 0) { printk(KERN_INFO "failed to install irq (%d)\n", ret); goto err_irq; } if (MFC_Mutex_Create() == FALSE) { ret = -ENOMEM; goto err_mutex; } #ifndef CONFIG_PLAT_S5P64XX { unsigned mfc_clk_val; // mfc clock set 133 Mhz mfc_clk_val = readl(S3C_CLK_DIV0); mfc_clk_val |= (1<<28); __raw_writel(mfc_clk_val, S3C_CLK_DIV0); } #endif /* CONFIG_PLAT_S5P64XX */ ////////////////////////////////// // 2. MFC Memory Setup // ////////////////////////////////// if (MFC_MemorySetup() == FALSE) { ret = -ENOMEM; goto err_MFC_memory_setup; } ////////////////////////////////////// // 3. MFC Hardware Initialization // ////////////////////////////////////// if (MFC_HW_Init() == FALSE) { ret = -ENODEV; goto err_MFC_HW_Init; } ret = misc_register(&s3c_mfc_miscdev); if (ret < 0) goto err_misc_register; ret = 0; goto no_err; err_misc_register: err_MFC_HW_Init: err_MFC_memory_setup: MFC_Mutex_Delete (); err_mutex: free_irq (res->start, pdev); err_irq: iounmap (mfc_base); err_ioremap: release_resource(mfc_mem); kfree(mfc_mem); mfc_mem = NULL; err_mem: no_err: #ifdef USE_MFC_DOMAIN_GATING CLOCK_DISABLE; DOMAIN_POWER_OFF; #endif /* USE_MFC_DOMAIN_GATING */ return ret; } static int s3c_mfc_remove(struct platform_device *pdev) { misc_deregister(&s3c_mfc_miscdev); MFC_Mutex_Delete (); free_irq (IRQ_MFC, pdev); iounmap (mfc_base); if (mfc_mem != NULL) { release_resource(mfc_mem); kfree(mfc_mem); mfc_mem = NULL; } #ifdef USE_MFC_DOMAIN_GATING while (_openhandle_count-- > 0) { CLOCK_DISABLE; } DOMAIN_POWER_OFF; #endif /* USE_MFC_DOMAIN_GATING */ return 0; }