mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
rk: vpu_service: support rk3026 by irq import
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user