Esempio n. 1
0
static int g2d_probe(struct platform_device *pdev)
{
    struct class_device;
    struct class_device *class_dev = NULL;
    
    G2D_INF("\n\n\n===================== G2D probe ======================\n\n\n");

    if (alloc_chrdev_region(&g2d_devno, 0, 1, G2D_DEVNAME))
    {
        G2D_ERR("can't get device major number...\n");
        return -EFAULT;
    }

    G2D_INF("get device major number (%d)\n", g2d_devno);

    g2d_cdev = cdev_alloc();
    g2d_cdev->owner = THIS_MODULE;
    g2d_cdev->ops = &g2d_fops;

    cdev_add(g2d_cdev, g2d_devno, 1);

    g2d_class = class_create(THIS_MODULE, G2D_DEVNAME);
    class_dev = (struct class_device *)device_create(g2d_class, NULL, g2d_devno, NULL, G2D_DEVNAME);

#ifdef G2D_QUEUE
    if (_g2d_create_workqueue())
    {
        G2D_ERR("failed to create workqueue\n");
        return -EFAULT;
    }

    if (_g2d_create_queuebuffer())
    {
        G2D_ERR("failed to create queue buffer\n");
        return -EFAULT;
    }
#else
    init_waitqueue_head(&isr_wait_queue);

    if (!g2d_cmd_buffer)
    {
        g2d_cmd_buffer = (g2d_command_t *)kzalloc(sizeof(g2d_command_t), GFP_KERNEL);
        if (!g2d_cmd_buffer) return -EFAULT;
    }
#endif

    mt6575_irq_set_sens(MT6575_G2D_IRQ_ID, MT65xx_EDGE_SENSITIVE);
    mt6575_irq_set_polarity(MT6575_G2D_IRQ_ID, MT65xx_POLARITY_LOW);

    if (request_irq(MT6575_G2D_IRQ_ID, g2d_drv_isr, 0, "G2D ISR" , NULL))
    {
        G2D_ERR("request irq failed\n");
    }

    G2D_INF("probe is done\n");

    NOT_REFERENCED(class_dev);
    return 0;
}
Esempio n. 2
0
void _g2d_reg_dump(void)
{
    unsigned int reg_value = 0;
    unsigned int index = 0;

    G2D_INF("********************\n");
    G2D_INF("reg (base : 0x%x):\n", G2D_BASE);

    for (index = 0 ; index < 0x158 ; index += 4)
    {
        reg_value = ioread32(G2D_BASE + index);
        G2D_INF("0x%x (0x%x)\n", index, reg_value);
    }

    G2D_INF("********************\n");
}
Esempio n. 3
0
void _g2d_command_handler(g2d_command_t *cmd)
{
    G2D_DBG("start to handle command (0x%04x)\n", cmd->ctx.flag);

    switch (cmd->ctx.flag)
    {
    case G2D_FLAG_END_OF_FRAME:
        g2d_drv_fb_queue_buffer(cmd->ctx.fb_id);
        break;

    case G2D_FLAG_FLUSH:
        break;

    case G2D_FLAG_MIRROR_FRONT_FB:
        if (g2d_drv_fb_fill_mirror_cmd(&cmd->ctx) != 0) break;
    default:
        {
#ifdef G2D_PROFILE
            struct timeval t1, t2;
            do_gettimeofday(&t1);
#endif
            g2d_drv_power_on();

            g2d_drv_run(&cmd->ctx);

            while (g2d_drv_get_status())
            {
                wait_event_interruptible_timeout(isr_wait_queue, !g2d_drv_get_status(), (30 * HZ / 1000));
                if (g2d_drv_get_status()) G2D_ERR("TIMEOUT: G2D is still busy");
            }

#ifdef G2D_PROFILE
            do_gettimeofday(&t2);
            G2D_INF("process time (%u)\n", (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec));
#endif

#ifdef G2D_DEBUG
            _g2d_reg_dump();
#endif

            g2d_drv_reset();

            g2d_drv_power_off();
        }
        break;
    }

    G2D_DBG("handle command (0x%04x) W2M(0x%08x) L0(0x%08x) L1(0x%08x) L2(0x%08x) L3(0x%08x) done\n", cmd->ctx.flag, ioread32(0xF20C5044), ioread32(0xF20C5084), ioread32(0xF20C50C4), ioread32(0xF20C5104), ioread32(0xF20C5144));

    memset(&cmd->ctx, 0, sizeof(g2d_context_t));

#ifdef G2D_QUEUE
    if (cmd->sync_cmd)
    {
        cmd->sync_cmd = false;
        up(&cmd->sync);
    }
    up(&cmd->lock);
#endif
}
Esempio n. 4
0
static void __exit g2d_exit(void)
{
    cdev_del(g2d_cdev);
    unregister_chrdev_region(g2d_devno, 1);

    platform_driver_unregister(&g2d_driver);
    platform_device_unregister(&g2d_device);
	
    device_destroy(g2d_class, g2d_devno);
    class_destroy(g2d_class);
	
    G2D_INF("exit driver...\n");
}
Esempio n. 5
0
static int g2d_remove(struct platform_device *pdev)
{
    G2D_INF("device remove\n");

#ifdef G2D_QUEUE
    _g2d_destroy_queuebuffer();
    _g2d_destroy_workqueue();
#else
    kfree(g2d_cmd_buffer);
    g2d_cmd_buffer = NULL;
#endif

    free_irq(MT_G2D_IRQ_ID, NULL);

    return 0;
}
Esempio n. 6
0
static int __init g2d_init(void)
{
    G2D_INF("initializeing driver...\n");
	
    if (platform_device_register(&g2d_device))
    {
        G2D_ERR("failed to register device\n");
        return -ENODEV;
    }

    if (platform_driver_register(&g2d_driver))
    {
        G2D_ERR("failed to register driver\n");
        platform_device_unregister(&g2d_device);
        return -ENODEV;
    }

    return 0;
}
Esempio n. 7
0
static void g2d_shutdown(struct platform_device *pdev)
{
    G2D_INF("g2d device shutdown\n");
}