From 7ca0a63294ec74f25a53fd67635ea4168a3f9ac6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 1 Aug 2013 15:33:10 +0800 Subject: [PATCH] rk: vpu_service: support rk3026 by irq import --- arch/arm/plat-rk/vpu_service.c | 46 ++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/arch/arm/plat-rk/vpu_service.c b/arch/arm/plat-rk/vpu_service.c index cbd2be865a4d..4ad5124e1373 100644 --- a/arch/arm/plat-rk/vpu_service.c +++ b/arch/arm/plat-rk/vpu_service.c @@ -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); -- 2.34.1