Skip to content

Commit 263734a

Browse files
Yu Qiaoweirkhuangtao
authored andcommitted
video: rockchip: rga3: Add drv_shutdown callback
Need to reset hardware when driver exits. Update driver version to 1.3.6 Signed-off-by: Yu Qiaowei <[email protected]> Change-Id: I4c6cb394a1339cf689d2d0d011d5df3fb24f0425
1 parent b430f82 commit 263734a

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

drivers/video/rockchip/rga3/include/rga_drv.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888

8989
#define DRIVER_MAJOR_VERISON 1
9090
#define DRIVER_MINOR_VERSION 3
91-
#define DRIVER_REVISION_VERSION 5
91+
#define DRIVER_REVISION_VERSION 6
9292
#define DRIVER_PATCH_VERSION
9393

9494
#define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \
@@ -450,6 +450,9 @@ struct rga_drvdata_t {
450450
#ifdef CONFIG_ROCKCHIP_RGA_DEBUGGER
451451
struct rga_debugger *debugger;
452452
#endif
453+
454+
bool shutdown;
455+
struct rw_semaphore rwsem;
453456
};
454457

455458
struct rga_irqs_data_t {

drivers/video/rockchip/rga3/include/rga_job.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct rga_request *rga_request_lookup(struct rga_pending_request_manager *reque
3838
uint32_t id);
3939

4040
int rga_request_commit(struct rga_request *user_request);
41+
void rga_request_scheduler_shutdown(struct rga_scheduler_t *scheduler);
4142
void rga_request_scheduler_abort(struct rga_scheduler_t *scheduler);
4243
void rga_request_session_destroy_abort(struct rga_session *session);
4344
int rga_request_put(struct rga_request *request);

drivers/video/rockchip/rga3/rga_drv.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,15 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
927927
if (DEBUGGER_EN(NONUSE))
928928
return 0;
929929

930+
down_read(&rga_drvdata->rwsem);
931+
932+
if (rga_drvdata->shutdown) {
933+
rga_log("driver has been shutdown\n");
934+
up_read(&rga_drvdata->rwsem);
935+
936+
return -EBUSY;
937+
}
938+
930939
switch (cmd) {
931940
case RGA_BLIT_SYNC:
932941
case RGA_BLIT_ASYNC:
@@ -1053,6 +1062,8 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
10531062
break;
10541063
}
10551064

1065+
up_read(&rga_drvdata->rwsem);
1066+
10561067
return ret;
10571068
}
10581069

@@ -1442,17 +1453,38 @@ static int rga_drv_probe(struct platform_device *pdev)
14421453

14431454
static int rga_drv_remove(struct platform_device *pdev)
14441455
{
1456+
struct rga_scheduler_t *scheduler = NULL;
1457+
1458+
down_write(&rga_drvdata->rwsem);
1459+
rga_drvdata->shutdown = true;
1460+
1461+
scheduler = (struct rga_scheduler_t *)platform_get_drvdata(pdev);
1462+
if (scheduler)
1463+
rga_request_scheduler_shutdown(scheduler);
1464+
14451465
#ifndef RGA_DISABLE_PM
14461466
device_init_wakeup(&pdev->dev, false);
14471467
pm_runtime_disable(&pdev->dev);
14481468
#endif /* #ifndef RGA_DISABLE_PM */
14491469

1470+
up_write(&rga_drvdata->rwsem);
1471+
14501472
return 0;
14511473
}
14521474

1475+
static void rga_drv_shutdown(struct platform_device *pdev)
1476+
{
1477+
struct device *dev = &pdev->dev;
1478+
1479+
rga_drv_remove(pdev);
1480+
1481+
dev_info(dev, "shutdown success\n");
1482+
}
1483+
14531484
static struct platform_driver rga3_driver = {
14541485
.probe = rga_drv_probe,
14551486
.remove = rga_drv_remove,
1487+
.shutdown = rga_drv_shutdown,
14561488
.driver = {
14571489
.name = "rga3",
14581490
.of_match_table = of_match_ptr(rga3_dt_ids),
@@ -1462,6 +1494,7 @@ static struct platform_driver rga3_driver = {
14621494
static struct platform_driver rga2_driver = {
14631495
.probe = rga_drv_probe,
14641496
.remove = rga_drv_remove,
1497+
.shutdown = rga_drv_shutdown,
14651498
.driver = {
14661499
.name = "rga2",
14671500
.of_match_table = of_match_ptr(rga2_dt_ids),
@@ -1479,6 +1512,8 @@ static int __init rga_init(void)
14791512
}
14801513

14811514
mutex_init(&rga_drvdata->lock);
1515+
init_rwsem(&rga_drvdata->rwsem);
1516+
rga_drvdata->shutdown = false;
14821517

14831518
ret = platform_driver_register(&rga3_driver);
14841519
if (ret != 0) {

drivers/video/rockchip/rga3/rga_job.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,56 @@ struct rga_request *rga_request_lookup(struct rga_pending_request_manager *manag
633633
return request;
634634
}
635635

636+
void rga_request_scheduler_shutdown(struct rga_scheduler_t *scheduler)
637+
{
638+
struct rga_job *job, *job_q;
639+
unsigned long flags;
640+
641+
rga_power_enable(scheduler);
642+
643+
spin_lock_irqsave(&scheduler->irq_lock, flags);
644+
645+
job = scheduler->running_job;
646+
if (job) {
647+
if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state) ||
648+
test_bit(RGA_JOB_STATE_FINISH, &job->state)) {
649+
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
650+
goto finish;
651+
}
652+
653+
scheduler->running_job = NULL;
654+
scheduler->status = RGA_SCHEDULER_ABORT;
655+
scheduler->ops->soft_reset(scheduler);
656+
657+
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
658+
659+
rga_mm_unmap_job_info(job);
660+
661+
job->ret = -EBUSY;
662+
rga_request_release_signal(scheduler, job);
663+
664+
/*
665+
* Since the running job was abort, turn off the power here that
666+
* should have been turned off after job done (corresponds to
667+
* power_enable in rga_job_run()).
668+
*/
669+
rga_power_disable(scheduler);
670+
} else {
671+
/* Clean up the jobs in the todo list that need to be free. */
672+
list_for_each_entry_safe(job, job_q, &scheduler->todo_list, head) {
673+
rga_mm_unmap_job_info(job);
674+
675+
job->ret = -EBUSY;
676+
rga_request_release_signal(scheduler, job);
677+
}
678+
679+
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
680+
}
681+
682+
finish:
683+
rga_power_disable(scheduler);
684+
}
685+
636686
void rga_request_scheduler_abort(struct rga_scheduler_t *scheduler)
637687
{
638688
struct rga_job *job;

0 commit comments

Comments
 (0)