@@ -927,6 +927,15 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
927
927
if (DEBUGGER_EN (NONUSE ))
928
928
return 0 ;
929
929
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
+
930
939
switch (cmd ) {
931
940
case RGA_BLIT_SYNC :
932
941
case RGA_BLIT_ASYNC :
@@ -1053,6 +1062,8 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
1053
1062
break ;
1054
1063
}
1055
1064
1065
+ up_read (& rga_drvdata -> rwsem );
1066
+
1056
1067
return ret ;
1057
1068
}
1058
1069
@@ -1442,17 +1453,38 @@ static int rga_drv_probe(struct platform_device *pdev)
1442
1453
1443
1454
static int rga_drv_remove (struct platform_device * pdev )
1444
1455
{
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
+
1445
1465
#ifndef RGA_DISABLE_PM
1446
1466
device_init_wakeup (& pdev -> dev , false);
1447
1467
pm_runtime_disable (& pdev -> dev );
1448
1468
#endif /* #ifndef RGA_DISABLE_PM */
1449
1469
1470
+ up_write (& rga_drvdata -> rwsem );
1471
+
1450
1472
return 0 ;
1451
1473
}
1452
1474
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
+
1453
1484
static struct platform_driver rga3_driver = {
1454
1485
.probe = rga_drv_probe ,
1455
1486
.remove = rga_drv_remove ,
1487
+ .shutdown = rga_drv_shutdown ,
1456
1488
.driver = {
1457
1489
.name = "rga3" ,
1458
1490
.of_match_table = of_match_ptr (rga3_dt_ids ),
@@ -1462,6 +1494,7 @@ static struct platform_driver rga3_driver = {
1462
1494
static struct platform_driver rga2_driver = {
1463
1495
.probe = rga_drv_probe ,
1464
1496
.remove = rga_drv_remove ,
1497
+ .shutdown = rga_drv_shutdown ,
1465
1498
.driver = {
1466
1499
.name = "rga2" ,
1467
1500
.of_match_table = of_match_ptr (rga2_dt_ids ),
@@ -1479,6 +1512,8 @@ static int __init rga_init(void)
1479
1512
}
1480
1513
1481
1514
mutex_init (& rga_drvdata -> lock );
1515
+ init_rwsem (& rga_drvdata -> rwsem );
1516
+ rga_drvdata -> shutdown = false;
1482
1517
1483
1518
ret = platform_driver_register (& rga3_driver );
1484
1519
if (ret != 0 ) {
0 commit comments