11
11
*/
12
12
13
13
#include <linux/bug.h>
14
+ #include <linux/clk.h>
15
+ #include <linux/clk-provider.h>
14
16
#include <linux/device.h>
15
17
#include <linux/errno.h>
16
18
#include <linux/i2c.h>
@@ -1276,6 +1278,14 @@ int fimc_md_set_camclk(struct v4l2_subdev *sd, bool on)
1276
1278
struct fimc_source_info * si = v4l2_get_subdev_hostdata (sd );
1277
1279
struct fimc_md * fmd = entity_to_fimc_mdev (& sd -> entity );
1278
1280
1281
+ /*
1282
+ * If there is a clock provider registered the sensors will
1283
+ * handle their clock themselves, no need to control it on
1284
+ * the host interface side.
1285
+ */
1286
+ if (fmd -> clk_provider .num_clocks > 0 )
1287
+ return 0 ;
1288
+
1279
1289
return __fimc_md_set_camclk (fmd , si , on );
1280
1290
}
1281
1291
@@ -1437,6 +1447,103 @@ static int fimc_md_get_pinctrl(struct fimc_md *fmd)
1437
1447
return 0 ;
1438
1448
}
1439
1449
1450
+ #ifdef CONFIG_OF
1451
+ static int cam_clk_prepare (struct clk_hw * hw )
1452
+ {
1453
+ struct cam_clk * camclk = to_cam_clk (hw );
1454
+ int ret ;
1455
+
1456
+ if (camclk -> fmd -> pmf == NULL )
1457
+ return - ENODEV ;
1458
+
1459
+ ret = pm_runtime_get_sync (camclk -> fmd -> pmf );
1460
+ return ret < 0 ? ret : 0 ;
1461
+ }
1462
+
1463
+ static void cam_clk_unprepare (struct clk_hw * hw )
1464
+ {
1465
+ struct cam_clk * camclk = to_cam_clk (hw );
1466
+
1467
+ if (camclk -> fmd -> pmf == NULL )
1468
+ return ;
1469
+
1470
+ pm_runtime_put_sync (camclk -> fmd -> pmf );
1471
+ }
1472
+
1473
+ static const struct clk_ops cam_clk_ops = {
1474
+ .prepare = cam_clk_prepare ,
1475
+ .unprepare = cam_clk_unprepare ,
1476
+ };
1477
+
1478
+ static void fimc_md_unregister_clk_provider (struct fimc_md * fmd )
1479
+ {
1480
+ struct cam_clk_provider * cp = & fmd -> clk_provider ;
1481
+ unsigned int i ;
1482
+
1483
+ if (cp -> of_node )
1484
+ of_clk_del_provider (cp -> of_node );
1485
+
1486
+ for (i = 0 ; i < cp -> num_clocks ; i ++ )
1487
+ clk_unregister (cp -> clks [i ]);
1488
+ }
1489
+
1490
+ static int fimc_md_register_clk_provider (struct fimc_md * fmd )
1491
+ {
1492
+ struct cam_clk_provider * cp = & fmd -> clk_provider ;
1493
+ struct device * dev = & fmd -> pdev -> dev ;
1494
+ int i , ret ;
1495
+
1496
+ for (i = 0 ; i < FIMC_MAX_CAMCLKS ; i ++ ) {
1497
+ struct cam_clk * camclk = & cp -> camclk [i ];
1498
+ struct clk_init_data init ;
1499
+ const char * p_name ;
1500
+
1501
+ ret = of_property_read_string_index (dev -> of_node ,
1502
+ "clock-output-names" , i , & init .name );
1503
+ if (ret < 0 )
1504
+ break ;
1505
+
1506
+ p_name = __clk_get_name (fmd -> camclk [i ].clock );
1507
+
1508
+ /* It's safe since clk_register() will duplicate the string. */
1509
+ init .parent_names = & p_name ;
1510
+ init .num_parents = 1 ;
1511
+ init .ops = & cam_clk_ops ;
1512
+ init .flags = CLK_SET_RATE_PARENT ;
1513
+ camclk -> hw .init = & init ;
1514
+ camclk -> fmd = fmd ;
1515
+
1516
+ cp -> clks [i ] = clk_register (NULL , & camclk -> hw );
1517
+ if (IS_ERR (cp -> clks [i ])) {
1518
+ dev_err (dev , "failed to register clock: %s (%ld)\n" ,
1519
+ init .name , PTR_ERR (cp -> clks [i ]));
1520
+ ret = PTR_ERR (cp -> clks [i ]);
1521
+ goto err ;
1522
+ }
1523
+ cp -> num_clocks ++ ;
1524
+ }
1525
+
1526
+ if (cp -> num_clocks == 0 ) {
1527
+ dev_warn (dev , "clk provider not registered\n" );
1528
+ return 0 ;
1529
+ }
1530
+
1531
+ cp -> clk_data .clks = cp -> clks ;
1532
+ cp -> clk_data .clk_num = cp -> num_clocks ;
1533
+ cp -> of_node = dev -> of_node ;
1534
+ ret = of_clk_add_provider (dev -> of_node , of_clk_src_onecell_get ,
1535
+ & cp -> clk_data );
1536
+ if (ret == 0 )
1537
+ return 0 ;
1538
+ err :
1539
+ fimc_md_unregister_clk_provider (fmd );
1540
+ return ret ;
1541
+ }
1542
+ #else
1543
+ #define fimc_md_register_clk_provider (fmd ) (0)
1544
+ #define fimc_md_unregister_clk_provider (fmd ) (0)
1545
+ #endif
1546
+
1440
1547
static int fimc_md_probe (struct platform_device * pdev )
1441
1548
{
1442
1549
struct device * dev = & pdev -> dev ;
@@ -1464,16 +1571,24 @@ static int fimc_md_probe(struct platform_device *pdev)
1464
1571
1465
1572
fmd -> use_isp = fimc_md_is_isp_available (dev -> of_node );
1466
1573
1574
+ ret = fimc_md_register_clk_provider (fmd );
1575
+ if (ret < 0 ) {
1576
+ v4l2_err (v4l2_dev , "clock provider registration failed\n" );
1577
+ return ret ;
1578
+ }
1579
+
1467
1580
ret = v4l2_device_register (dev , & fmd -> v4l2_dev );
1468
1581
if (ret < 0 ) {
1469
1582
v4l2_err (v4l2_dev , "Failed to register v4l2_device: %d\n" , ret );
1470
1583
return ret ;
1471
1584
}
1585
+
1472
1586
ret = media_device_register (& fmd -> media_dev );
1473
1587
if (ret < 0 ) {
1474
1588
v4l2_err (v4l2_dev , "Failed to register media device: %d\n" , ret );
1475
1589
goto err_md ;
1476
1590
}
1591
+
1477
1592
ret = fimc_md_get_clocks (fmd );
1478
1593
if (ret )
1479
1594
goto err_clk ;
@@ -1507,6 +1622,7 @@ static int fimc_md_probe(struct platform_device *pdev)
1507
1622
ret = fimc_md_create_links (fmd );
1508
1623
if (ret )
1509
1624
goto err_unlock ;
1625
+
1510
1626
ret = v4l2_device_register_subdev_nodes (& fmd -> v4l2_dev );
1511
1627
if (ret )
1512
1628
goto err_unlock ;
@@ -1527,6 +1643,7 @@ static int fimc_md_probe(struct platform_device *pdev)
1527
1643
media_device_unregister (& fmd -> media_dev );
1528
1644
err_md :
1529
1645
v4l2_device_unregister (& fmd -> v4l2_dev );
1646
+ fimc_md_unregister_clk_provider (fmd );
1530
1647
return ret ;
1531
1648
}
1532
1649
@@ -1537,6 +1654,7 @@ static int fimc_md_remove(struct platform_device *pdev)
1537
1654
if (!fmd )
1538
1655
return 0 ;
1539
1656
1657
+ fimc_md_unregister_clk_provider (fmd );
1540
1658
v4l2_device_unregister (& fmd -> v4l2_dev );
1541
1659
device_remove_file (& pdev -> dev , & dev_attr_subdev_conf_mode );
1542
1660
fimc_md_unregister_entities (fmd );
0 commit comments