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; }
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"); }
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 }
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"); }
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; }
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; }
static void g2d_shutdown(struct platform_device *pdev) { G2D_INF("g2d device shutdown\n"); }