rk: vpu_service: support rk3026 by irq import
author黄涛 <huangtao@rock-chips.com>
Thu, 1 Aug 2013 07:33:10 +0000 (15:33 +0800)
committer黄涛 <huangtao@rock-chips.com>
Thu, 1 Aug 2013 07:33:10 +0000 (15:33 +0800)
arch/arm/plat-rk/vpu_service.c

index cbd2be865a4d723fa1d048b5bb72c7e47836aad3..4ad5124e1373fb2b722a777f982b76ad394d1b45 100644 (file)
@@ -231,6 +231,9 @@ static struct clk *hclk_cpu_vcodec;
 static vpu_service_info service;
 static vpu_device      dec_dev;
 static vpu_device      enc_dev;
+static unsigned int irq_vdpu = IRQ_VDPU;
+static unsigned int irq_vepu = IRQ_VEPU;
+static bool dev_already_added = false;
 
 #define VPU_POWER_OFF_DELAY            4*HZ /* 4s */
 #define VPU_TIMEOUT_DELAY              2*HZ /* 2s */
@@ -1028,7 +1031,27 @@ static struct platform_device vpu_service_device = {
        .id                = -1,
 };
 
+static int vpu_service_probe(struct platform_device *pdev)
+{
+       int irq;
+
+       if (dev_already_added)
+               return -EEXIST;
+
+       irq = platform_get_irq_byname(pdev, "irq_vdpu");
+       if (irq > 0)
+               irq_vdpu = irq;
+       irq = platform_get_irq_byname(pdev, "irq_vepu");
+       if (irq > 0)
+               irq_vepu = irq;
+
+       dev_already_added = true;
+
+       return 0;
+}
+
 static struct platform_driver vpu_service_driver = {
+       .probe     = vpu_service_probe,
        .driver    = {
                .name  = "vpu_service",
                .owner = THIS_MODULE,
@@ -1343,7 +1366,8 @@ static int __init vpu_service_init(void)
 {
        int ret;
 
-       pr_debug("baseaddr = 0x%08x vdpu irq = %d vepu irq = %d\n", VCODEC_PHYS, IRQ_VDPU, IRQ_VEPU);
+       platform_driver_register(&vpu_service_driver);
+       pr_debug("baseaddr = 0x%08x vdpu irq = %d vepu irq = %d\n", VCODEC_PHYS, irq_vdpu, irq_vepu);
 
        wake_lock_init(&service.wake_lock, WAKE_LOCK_SUSPEND, "vpu");
        INIT_LIST_HEAD(&service.waiting);
@@ -1384,15 +1408,15 @@ static int __init vpu_service_init(void)
        }
 
        /* get the IRQ line */
-       ret = request_threaded_irq(IRQ_VDPU, vdpu_irq, vdpu_isr, IRQF_SHARED, "vdpu", (void *)&dec_dev);
+       ret = request_threaded_irq(irq_vdpu, vdpu_irq, vdpu_isr, 0, "vdpu", (void *)&dec_dev);
        if (ret) {
-               pr_err("error: can't request vdpu irq %d\n", IRQ_VDPU);
+               pr_err("error: can't request vdpu irq %d\n", irq_vdpu);
                goto err_req_vdpu_irq;
        }
 
-       ret = request_threaded_irq(IRQ_VEPU, vepu_irq, vepu_isr, IRQF_SHARED, "vepu", (void *)&enc_dev);
+       ret = request_threaded_irq(irq_vepu, vepu_irq, vepu_isr, 0, "vepu", (void *)&enc_dev);
        if (ret) {
-               pr_err("error: can't request vepu irq %d\n", IRQ_VEPU);
+               pr_err("error: can't request vepu irq %d\n", irq_vepu);
                goto err_req_vepu_irq;
        }
 
@@ -1402,8 +1426,8 @@ static int __init vpu_service_init(void)
                goto err_register;
        }
 
-       platform_device_register(&vpu_service_device);
-       platform_driver_probe(&vpu_service_driver, NULL);
+       if (!dev_already_added)
+               platform_device_register(&vpu_service_device);
        get_hw_info();
        vpu_service_power_off();
        pr_info("init success\n");
@@ -1412,9 +1436,9 @@ static int __init vpu_service_init(void)
        return 0;
 
 err_register:
-       free_irq(IRQ_VEPU, (void *)&enc_dev);
+       free_irq(irq_vepu, (void *)&enc_dev);
 err_req_vepu_irq:
-       free_irq(IRQ_VDPU, (void *)&dec_dev);
+       free_irq(irq_vdpu, (void *)&dec_dev);
 err_req_vdpu_irq:
        pr_info("init failed\n");
 err_reserve_io:
@@ -1440,8 +1464,8 @@ static void __exit vpu_service_exit(void)
        platform_device_unregister(&vpu_service_device);
        platform_driver_unregister(&vpu_service_driver);
        misc_deregister(&vpu_service_misc_device);
-       free_irq(IRQ_VEPU, (void *)&enc_dev);
-       free_irq(IRQ_VDPU, (void *)&dec_dev);
+       free_irq(irq_vepu, (void *)&enc_dev);
+       free_irq(irq_vdpu, (void *)&dec_dev);
        vpu_service_release_io();
        vpu_put_clk();
        wake_lock_destroy(&service.wake_lock);