Beispiel #1
0
/*
** 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;
}
Beispiel #2
0
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;
}