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
{
@@ -1436,10 +1443,10 @@ static int register_node(struct bcm2835_isp_dev *dev,
1436
1443
}
1437
1444
1438
1445
/* Define the device names */
1439
- snprintf (vfd -> name , sizeof (node -> vfd .name ), "%s-%s%d" , BCM2835_ISP_NAME ,
1440
- node -> name , node -> id );
1446
+ snprintf (vfd -> name , sizeof (node -> vfd .name ), "%s%d -%s%d" ,
1447
+ BCM2835_ISP_NAME , instance , 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" ,
@@ -1526,7 +1533,8 @@ static void media_controller_unregister(struct bcm2835_isp_dev *dev)
1526
1533
dev -> v4l2_dev .mdev = NULL ;
1527
1534
}
1528
1535
1529
- static int media_controller_register_node (struct bcm2835_isp_dev * dev , int num )
1536
+ static int media_controller_register_node (struct bcm2835_isp_dev * dev ,
1537
+ unsigned int instance , int num )
1530
1538
{
1531
1539
struct bcm2835_isp_node * node = & dev -> node [num ];
1532
1540
struct media_entity * entity = & node -> vfd .entity ;
@@ -1546,8 +1554,8 @@ static int media_controller_register_node(struct bcm2835_isp_dev *dev, int num)
1546
1554
ret = - ENOMEM ;
1547
1555
goto error_no_mem ;
1548
1556
}
1549
- snprintf (name , BCM2835_ISP_ENTITY_NAME_LEN , "%s0 -%s%d" ,
1550
- BCM2835_ISP_NAME , output ? "output" : "capture" , num );
1557
+ snprintf (name , BCM2835_ISP_ENTITY_NAME_LEN , "%s%d -%s%d" ,
1558
+ BCM2835_ISP_NAME , instance , output ? "output" : "capture" , num );
1551
1559
entity -> name = name ;
1552
1560
node -> pad .flags = output ? MEDIA_PAD_FL_SOURCE : MEDIA_PAD_FL_SINK ;
1553
1561
ret = media_entity_pads_init (entity , 1 , & node -> pad );
@@ -1605,7 +1613,8 @@ static int media_controller_register_node(struct bcm2835_isp_dev *dev, int num)
1605
1613
return ret ;
1606
1614
}
1607
1615
1608
- static int media_controller_register (struct bcm2835_isp_dev * dev )
1616
+ static int media_controller_register (struct bcm2835_isp_dev * dev ,
1617
+ unsigned int instance )
1609
1618
{
1610
1619
char * name ;
1611
1620
unsigned int i ;
@@ -1627,7 +1636,7 @@ static int media_controller_register(struct bcm2835_isp_dev *dev)
1627
1636
ret = - ENOMEM ;
1628
1637
goto done ;
1629
1638
}
1630
- snprintf (name , BCM2835_ISP_ENTITY_NAME_LEN , "bcm2835_isp0" );
1639
+ snprintf (name , BCM2835_ISP_ENTITY_NAME_LEN , BCM2835_ISP_NAME );
1631
1640
dev -> entity .name = name ;
1632
1641
dev -> entity .obj_type = MEDIA_ENTITY_TYPE_BASE ;
1633
1642
dev -> entity .function = MEDIA_ENT_F_PROC_VIDEO_SCALER ;
@@ -1648,7 +1657,7 @@ static int media_controller_register(struct bcm2835_isp_dev *dev)
1648
1657
1649
1658
dev -> media_entity_registered = true;
1650
1659
for (i = 0 ; i < BCM2835_ISP_NUM_NODES ; i ++ ) {
1651
- ret = media_controller_register_node (dev , i );
1660
+ ret = media_controller_register_node (dev , instance , i );
1652
1661
if (ret )
1653
1662
goto done ;
1654
1663
}
@@ -1660,9 +1669,8 @@ static int media_controller_register(struct bcm2835_isp_dev *dev)
1660
1669
return ret ;
1661
1670
}
1662
1671
1663
- static int bcm2835_isp_remove (struct platform_device * pdev )
1672
+ static void bcm2835_isp_remove_instance (struct bcm2835_isp_dev * dev )
1664
1673
{
1665
- struct bcm2835_isp_dev * dev = platform_get_drvdata (pdev );
1666
1674
unsigned int i ;
1667
1675
1668
1676
media_controller_unregister (dev );
@@ -1677,11 +1685,11 @@ static int bcm2835_isp_remove(struct platform_device *pdev)
1677
1685
dev -> component );
1678
1686
1679
1687
vchiq_mmal_finalise (dev -> mmal_instance );
1680
-
1681
- return 0 ;
1682
1688
}
1683
1689
1684
- static int bcm2835_isp_probe (struct platform_device * pdev )
1690
+ static int bcm2835_isp_probe_instance (struct platform_device * pdev ,
1691
+ struct bcm2835_isp_dev * * dev_int ,
1692
+ unsigned int instance )
1685
1693
{
1686
1694
struct bcm2835_isp_dev * dev ;
1687
1695
unsigned int i ;
@@ -1708,7 +1716,7 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
1708
1716
if (ret ) {
1709
1717
v4l2_err (& dev -> v4l2_dev ,
1710
1718
"%s: failed to create ril.isp component\n" , __func__ );
1711
- goto error ;
1719
+ return ret ;
1712
1720
}
1713
1721
1714
1722
if (dev -> component -> inputs < BCM2835_ISP_NUM_OUTPUTS ||
@@ -1720,25 +1728,63 @@ static int bcm2835_isp_probe(struct platform_device *pdev)
1720
1728
BCM2835_ISP_NUM_OUTPUTS ,
1721
1729
dev -> component -> outputs ,
1722
1730
BCM2835_ISP_NUM_CAPTURES + BCM2835_ISP_NUM_METADATA );
1723
- goto error ;
1731
+ return - EINVAL ;
1724
1732
}
1725
1733
1726
1734
atomic_set (& dev -> num_streaming , 0 );
1727
1735
1728
1736
for (i = 0 ; i < BCM2835_ISP_NUM_NODES ; i ++ ) {
1729
1737
struct bcm2835_isp_node * node = & dev -> node [i ];
1730
1738
1731
- ret = register_node (dev , node , i );
1739
+ ret = register_node (dev , instance , node , i );
1732
1740
if (ret )
1733
- goto error ;
1741
+ return ret ;
1734
1742
}
1735
1743
1736
- ret = media_controller_register (dev );
1744
+ ret = media_controller_register (dev , instance );
1737
1745
if (ret )
1738
- goto error ;
1746
+ return ret ;
1747
+
1748
+ * dev_int = dev ;
1749
+ return 0 ;
1750
+ }
1751
+
1752
+ static int bcm2835_isp_remove (struct platform_device * pdev )
1753
+ {
1754
+ struct bcm2835_isp_dev * * bcm2835_isp_instances ;
1755
+ unsigned int i ;
1756
+
1757
+ bcm2835_isp_instances = platform_get_drvdata (pdev );
1758
+ for (i = 0 ; i < BCM2835_ISP_NUM_INSTANCES ; i ++ ) {
1759
+ if (bcm2835_isp_instances [i ])
1760
+ bcm2835_isp_remove_instance (bcm2835_isp_instances [i ]);
1761
+ }
1762
+
1763
+ return 0 ;
1764
+ }
1765
+
1766
+ static int bcm2835_isp_probe (struct platform_device * pdev )
1767
+ {
1768
+ struct bcm2835_isp_dev * * bcm2835_isp_instances ;
1769
+ unsigned int i ;
1770
+ int ret ;
1771
+
1772
+ bcm2835_isp_instances = devm_kzalloc (& pdev -> dev ,
1773
+ sizeof (bcm2835_isp_instances ) *
1774
+ BCM2835_ISP_NUM_INSTANCES ,
1775
+ GFP_KERNEL );
1776
+ if (!bcm2835_isp_instances )
1777
+ return - ENOMEM ;
1778
+
1779
+ for (i = 0 ; i < BCM2835_ISP_NUM_INSTANCES ; i ++ ) {
1780
+ ret = bcm2835_isp_probe_instance (pdev ,
1781
+ & bcm2835_isp_instances [i ], i );
1782
+ if (ret )
1783
+ goto error ;
1784
+ }
1739
1785
1740
- platform_set_drvdata (pdev , dev );
1741
- v4l2_info ( & dev -> v4l2_dev , "Loaded V4L2 %s\n" , BCM2835_ISP_NAME );
1786
+ platform_set_drvdata (pdev , bcm2835_isp_instances );
1787
+ dev_info ( & pdev -> dev , "Loaded V4L2 %s\n" , BCM2835_ISP_NAME );
1742
1788
return 0 ;
1743
1789
1744
1790
error :
0 commit comments