26
26
#include "bcm2835-isp-ctrls.h"
27
27
#include "bcm2835-isp-fmts.h"
28
28
29
+ /*
30
+ * We want to instantiate 2 independent instances allowing 2 simultaneous users
31
+ * of the ISP hardware.
32
+ */
33
+ #define BCM2835_ISP_NUM_INSTANCES 2
34
+
29
35
static unsigned int debug ;
30
36
module_param (debug , uint , 0644 );
31
37
MODULE_PARM_DESC (debug , "activates debug info" );
32
38
33
- static unsigned int video_nr = 13 ;
34
- module_param (video_nr , uint , 0644 );
35
- MODULE_PARM_DESC (video_nr , "base video device number " );
39
+ static unsigned int video_nr [ BCM2835_ISP_NUM_INSTANCES ] = { 13 , 20 } ;
40
+ module_param_array (video_nr , uint , NULL , 0644 );
41
+ MODULE_PARM_DESC (video_nr , "base video device numbers " );
36
42
37
43
#define BCM2835_ISP_NAME "bcm2835-isp"
38
44
#define BCM2835_ISP_ENTITY_NAME_LEN 32
@@ -1279,6 +1285,7 @@ static int bcm2835_isp_get_supported_fmts(struct bcm2835_isp_node *node)
1279
1285
* or output nodes.
1280
1286
*/
1281
1287
static int register_node (struct bcm2835_isp_dev * dev ,
1288
+ unsigned int instance ,
1282
1289
struct bcm2835_isp_node * node ,
1283
1290
int index )
1284
1291
{
@@ -1439,7 +1446,7 @@ static int register_node(struct bcm2835_isp_dev *dev,
1439
1446
snprintf (vfd -> name , sizeof (node -> vfd .name ), "%s-%s%d" , BCM2835_ISP_NAME ,
1440
1447
node -> name , node -> id );
1441
1448
1442
- ret = video_register_device (vfd , VFL_TYPE_VIDEO , video_nr + index );
1449
+ ret = video_register_device (vfd , VFL_TYPE_VIDEO , video_nr [ instance ] );
1443
1450
if (ret ) {
1444
1451
v4l2_err (& dev -> v4l2_dev ,
1445
1452
"Failed to register video %s[%d] device node\n" ,
@@ -1660,9 +1667,8 @@ static int media_controller_register(struct bcm2835_isp_dev *dev)
1660
1667
return ret ;
1661
1668
}
1662
1669
1663
- static int bcm2835_isp_remove (struct platform_device * pdev )
1670
+ static void bcm2835_isp_remove_instance (struct bcm2835_isp_dev * dev )
1664
1671
{
1665
- struct bcm2835_isp_dev * dev = platform_get_drvdata (pdev );
1666
1672
unsigned int i ;
1667
1673
1668
1674
media_controller_unregister (dev );
@@ -1677,11 +1683,11 @@ static int bcm2835_isp_remove(struct platform_device *pdev)
1677
1683
dev -> component );
1678
1684
1679
1685
vchiq_mmal_finalise (dev -> mmal_instance );
1680
-
1681
- return 0 ;
1682
1686
}
1683
1687
1684
- static int bcm2835_isp_probe (struct platform_device * pdev )
1688
+ static int bcm2835_isp_probe_instance (struct platform_device * pdev ,
1689
+ struct bcm2835_isp_dev * * dev_int ,
1690
+ unsigned int instance )
1685
1691
{
1686
1692
struct bcm2835_isp_dev * dev ;
1687
1693
unsigned int i ;
@@ -1708,7 +1714,7 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
1708
1714
if (ret ) {
1709
1715
v4l2_err (& dev -> v4l2_dev ,
1710
1716
"%s: failed to create ril.isp component\n" , __func__ );
1711
- goto error ;
1717
+ return ret ;
1712
1718
}
1713
1719
1714
1720
if (dev -> component -> inputs < BCM2835_ISP_NUM_OUTPUTS ||
@@ -1720,25 +1726,63 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
1720
1726
BCM2835_ISP_NUM_OUTPUTS ,
1721
1727
dev -> component -> outputs ,
1722
1728
BCM2835_ISP_NUM_CAPTURES + BCM2835_ISP_NUM_METADATA );
1723
- goto error ;
1729
+ return - EINVAL ;
1724
1730
}
1725
1731
1726
1732
atomic_set (& dev -> num_streaming , 0 );
1727
1733
1728
1734
for (i = 0 ; i < BCM2835_ISP_NUM_NODES ; i ++ ) {
1729
1735
struct bcm2835_isp_node * node = & dev -> node [i ];
1730
1736
1731
- ret = register_node (dev , node , i );
1737
+ ret = register_node (dev , instance , node , i );
1732
1738
if (ret )
1733
- goto error ;
1739
+ return ret ;
1734
1740
}
1735
1741
1736
1742
ret = media_controller_register (dev );
1737
1743
if (ret )
1738
- goto error ;
1744
+ return ret ;
1745
+
1746
+ * dev_int = dev ;
1747
+ return 0 ;
1748
+ }
1749
+
1750
+ static int bcm2835_isp_remove (struct platform_device * pdev )
1751
+ {
1752
+ struct bcm2835_isp_dev * * bcm2835_isp_instances ;
1753
+ unsigned int i ;
1754
+
1755
+ bcm2835_isp_instances = platform_get_drvdata (pdev );
1756
+ for (i = 0 ; i < BCM2835_ISP_NUM_INSTANCES ; i ++ ) {
1757
+ if (bcm2835_isp_instances [i ])
1758
+ bcm2835_isp_remove_instance (bcm2835_isp_instances [i ]);
1759
+ }
1760
+
1761
+ return 0 ;
1762
+ }
1763
+
1764
+ static int bcm2835_isp_probe (struct platform_device * pdev )
1765
+ {
1766
+ struct bcm2835_isp_dev * * bcm2835_isp_instances ;
1767
+ unsigned int i ;
1768
+ int ret ;
1769
+
1770
+ bcm2835_isp_instances = devm_kzalloc (& pdev -> dev ,
1771
+ sizeof (bcm2835_isp_instances ) *
1772
+ BCM2835_ISP_NUM_INSTANCES ,
1773
+ GFP_KERNEL );
1774
+ if (!bcm2835_isp_instances )
1775
+ return - ENOMEM ;
1776
+
1777
+ for (i = 0 ; i < BCM2835_ISP_NUM_INSTANCES ; i ++ ) {
1778
+ ret = bcm2835_isp_probe_instance (pdev ,
1779
+ & bcm2835_isp_instances [i ], i );
1780
+ if (ret )
1781
+ goto error ;
1782
+ }
1739
1783
1740
- platform_set_drvdata (pdev , dev );
1741
- v4l2_info ( & dev -> v4l2_dev , "Loaded V4L2 %s\n" , BCM2835_ISP_NAME );
1784
+ platform_set_drvdata (pdev , bcm2835_isp_instances );
1785
+ dev_info ( & pdev -> dev , "Loaded V4L2 %s\n" , BCM2835_ISP_NAME );
1742
1786
return 0 ;
1743
1787
1744
1788
error :
0 commit comments