Exemple #1
0
static int mtkfb_vsync_probe(struct platform_device *pdev)
{
    struct class_device;
    struct class_device *class_dev = NULL;
    
    printk("\n=== MTKFB_VSYNC probe ===\n");

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

    printk("get device major number (%d)\n", mtkfb_vsync_devno);

    mtkfb_vsync_cdev = cdev_alloc();
    mtkfb_vsync_cdev->owner = THIS_MODULE;
    mtkfb_vsync_cdev->ops = &mtkfb_vsync_fops;

    cdev_add(mtkfb_vsync_cdev, mtkfb_vsync_devno, 1);

    mtkfb_vsync_class = class_create(THIS_MODULE, MTKFB_VSYNC_DEVNAME);
    class_dev = (struct class_device *)device_create(mtkfb_vsync_class, NULL, mtkfb_vsync_devno, NULL, MTKFB_VSYNC_DEVNAME);

    VSYNC_INF("probe is done\n");
    return 0;
}
static void __exit mtkfb_vsync_exit(void)
{
    cdev_del(mtkfb_vsync_cdev);
    unregister_chrdev_region(mtkfb_vsync_devno, 1);

    platform_driver_unregister(&mtkfb_vsync_driver);
    platform_device_unregister(&mtkfb_vsync_device);
	
    device_destroy(mtkfb_vsync_class, mtkfb_vsync_devno);
    class_destroy(mtkfb_vsync_class);
	
    VSYNC_INF("exit driver...\n");
}
static int __init mtkfb_vsync_init(void)
{
	VSYNC_INF("initializeing driver...\n");

	if (platform_device_register(&mtkfb_vsync_device)) {
		VSYNC_ERR("failed to register device\n");
		return -ENODEV;
	}

	if (platform_driver_register(&mtkfb_vsync_driver)) {
		VSYNC_ERR("failed to register driver\n");
		platform_device_unregister(&mtkfb_vsync_device);
		return -ENODEV;
	}

	return 0;
}
static int mtkfb_vsync_remove(struct platform_device *pdev)
{
    VSYNC_INF("device remove\n");
    return 0;
}
static long mtkfb_vsync_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	int ret = 0;
	MTKFB_VSYNC_FUNC();
	switch (cmd) {
	case MTKFB_VSYNC_IOCTL:
		{
			MTKFB_VSYNC_LOG("[MTKFB_VSYNC]: enter MTKFB_VSYNC_IOCTL %ld\n", arg);

#if defined(CONFIG_SINGLE_PANEL_OUTPUT)
			if (is_hdmi_active()) {
#else
			if (arg == MTKFB_VSYNC_SOURCE_HDMI) {
#endif
#if defined(CONFIG_MTK_HDMI_SUPPORT)
				if (down_interruptible(&mtkfb_vsync_sem)) {
					MTKFB_MSG("[mtkfb_vsync_ioctl] can't get semaphore,%d\n",
						  __LINE__);
					msleep(20);
					return ret;
				}
				hdmi_waitVsync();
				up(&mtkfb_vsync_sem);
				MTKFB_VSYNC_LOG("[MTKFB_VSYNC]: leave MTKFB_VSYNC_IOCTL, %d\n",
						__LINE__);
#else
				MTKFB_VSYNC_LOG("[MTKFB_VSYNC]: NS leave MTKFB_VSYNC_IOCTL, %d\n",
						__LINE__);
				ret = -EFAULT;
#endif
				return ret;
			}

			if (down_interruptible(&mtkfb_vsync_sem)) {
				MTKFB_MSG("[mtkfb_vsync_ioctl] can't get semaphore,%d\n", __LINE__);
				msleep(20);
				return ret;
			}
			mtkfb_waitVsync();
			up(&mtkfb_vsync_sem);
			MTKFB_VSYNC_LOG("[MTKFB_VSYNC]: leave MTKFB_VSYNC_IOCTL\n");
		}
		break;
	}
	return ret;
}


static const struct file_operations mtkfb_vsync_fops = {
	.owner = THIS_MODULE,
	.unlocked_ioctl = mtkfb_vsync_unlocked_ioctl,
	.open = mtkfb_vsync_open,
	.release = mtkfb_vsync_release,
	.flush = mtkfb_vsync_flush,
	.read = mtkfb_vsync_read,
};

static int mtkfb_vsync_probe(struct platform_device *pdev)
{
	struct class_device;
	struct class_device *class_dev = NULL;

	MTKFB_MSG("\n=== MTKFB_VSYNC probe ===\n");

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

	MTKFB_MSG("get device major number (%d)\n", mtkfb_vsync_devno);

	mtkfb_vsync_cdev = cdev_alloc();
	mtkfb_vsync_cdev->owner = THIS_MODULE;
	mtkfb_vsync_cdev->ops = &mtkfb_vsync_fops;

	cdev_add(mtkfb_vsync_cdev, mtkfb_vsync_devno, 1);

	mtkfb_vsync_class = class_create(THIS_MODULE, MTKFB_VSYNC_DEVNAME);
	class_dev =
	    (struct class_device *)device_create(mtkfb_vsync_class, NULL, mtkfb_vsync_devno, NULL,
						 MTKFB_VSYNC_DEVNAME);

	VSYNC_INF("probe is done\n");
	return 0;
}

static int mtkfb_vsync_remove(struct platform_device *pdev)
{
	VSYNC_INF("device remove\n");
	return 0;
}