@@ -1538,6 +1538,20 @@ static int camss_icc_get(struct camss *camss)
1538
1538
return 0 ;
1539
1539
}
1540
1540
1541
+ static void camss_genpd_cleanup (struct camss * camss )
1542
+ {
1543
+ int i ;
1544
+
1545
+ if (camss -> genpd_num == 1 )
1546
+ return ;
1547
+
1548
+ if (camss -> genpd_num > camss -> vfe_num )
1549
+ device_link_del (camss -> genpd_link [camss -> genpd_num - 1 ]);
1550
+
1551
+ for (i = 0 ; i < camss -> genpd_num ; i ++ )
1552
+ dev_pm_domain_detach (camss -> genpd [i ], true);
1553
+ }
1554
+
1541
1555
/*
1542
1556
* camss_probe - Probe CAMSS platform device
1543
1557
* @pdev: Pointer to CAMSS platform device
@@ -1627,11 +1641,11 @@ static int camss_probe(struct platform_device *pdev)
1627
1641
1628
1642
ret = camss_init_subdevices (camss );
1629
1643
if (ret < 0 )
1630
- return ret ;
1644
+ goto err_genpd_cleanup ;
1631
1645
1632
1646
ret = dma_set_mask_and_coherent (dev , 0xffffffff );
1633
1647
if (ret )
1634
- return ret ;
1648
+ goto err_genpd_cleanup ;
1635
1649
1636
1650
camss -> media_dev .dev = camss -> dev ;
1637
1651
strscpy (camss -> media_dev .model , "Qualcomm Camera Subsystem" ,
@@ -1643,7 +1657,7 @@ static int camss_probe(struct platform_device *pdev)
1643
1657
ret = v4l2_device_register (camss -> dev , & camss -> v4l2_dev );
1644
1658
if (ret < 0 ) {
1645
1659
dev_err (dev , "Failed to register V4L2 device: %d\n" , ret );
1646
- return ret ;
1660
+ goto err_genpd_cleanup ;
1647
1661
}
1648
1662
1649
1663
v4l2_async_nf_init (& camss -> notifier , & camss -> v4l2_dev );
@@ -1693,28 +1707,19 @@ static int camss_probe(struct platform_device *pdev)
1693
1707
err_v4l2_device_unregister :
1694
1708
v4l2_device_unregister (& camss -> v4l2_dev );
1695
1709
v4l2_async_nf_cleanup (& camss -> notifier );
1710
+ err_genpd_cleanup :
1711
+ camss_genpd_cleanup (camss );
1696
1712
1697
1713
return ret ;
1698
1714
}
1699
1715
1700
1716
void camss_delete (struct camss * camss )
1701
1717
{
1702
- int i ;
1703
-
1704
1718
v4l2_device_unregister (& camss -> v4l2_dev );
1705
1719
media_device_unregister (& camss -> media_dev );
1706
1720
media_device_cleanup (& camss -> media_dev );
1707
1721
1708
1722
pm_runtime_disable (camss -> dev );
1709
-
1710
- if (camss -> genpd_num == 1 )
1711
- return ;
1712
-
1713
- if (camss -> genpd_num > camss -> vfe_num )
1714
- device_link_del (camss -> genpd_link [camss -> genpd_num - 1 ]);
1715
-
1716
- for (i = 0 ; i < camss -> genpd_num ; i ++ )
1717
- dev_pm_domain_detach (camss -> genpd [i ], true);
1718
1723
}
1719
1724
1720
1725
/*
@@ -1733,6 +1738,8 @@ static void camss_remove(struct platform_device *pdev)
1733
1738
1734
1739
if (atomic_read (& camss -> ref_count ) == 0 )
1735
1740
camss_delete (camss );
1741
+
1742
+ camss_genpd_cleanup (camss );
1736
1743
}
1737
1744
1738
1745
static const struct of_device_id camss_dt_match [] = {
0 commit comments