aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2012-05-16 12:08:30 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-06-25 08:16:37 -0400
commitd0da3c3565a1dd3cdfa374038d6ccae4b90fe142 (patch)
tree251a88a5a59dc22b69ba483f6c398d8e4b978b36
parent90e614bb4c581eb588ec26f130fcdd65aa047fa8 (diff)
[media] s5p-fimc: Don't create multiple active links to same sink entity
The driver is supposed to create active media link from sensor N (or its corresponding s5p-mipi-csis entity) to FIMC.N by default. Instead s5p-mipi-csis.N entity gets always connected by a default active link to FIMC.N, regardless of there are parallel bus sensor entities already connected to FIMC.N. Correct this. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/s5p-fimc/fimc-mdevice.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-mdevice.c b/drivers/media/video/s5p-fimc/fimc-mdevice.c
index 7450dcdafc87..dffe4da5eaa0 100644
--- a/drivers/media/video/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/video/s5p-fimc/fimc-mdevice.c
@@ -502,12 +502,12 @@ static void fimc_md_unregister_entities(struct fimc_md *fmd)
502 * @source: the source entity to create links to all fimc entities from 502 * @source: the source entity to create links to all fimc entities from
503 * @sensor: sensor subdev linked to FIMC[fimc_id] entity, may be null 503 * @sensor: sensor subdev linked to FIMC[fimc_id] entity, may be null
504 * @pad: the source entity pad index 504 * @pad: the source entity pad index
505 * @fimc_id: index of the fimc device for which link should be enabled 505 * @link_mask: bitmask of the fimc devices for which link should be enabled
506 */ 506 */
507static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd, 507static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
508 struct media_entity *source, 508 struct media_entity *source,
509 struct v4l2_subdev *sensor, 509 struct v4l2_subdev *sensor,
510 int pad, int fimc_id) 510 int pad, int link_mask)
511{ 511{
512 struct fimc_sensor_info *s_info; 512 struct fimc_sensor_info *s_info;
513 struct media_entity *sink; 513 struct media_entity *sink;
@@ -524,7 +524,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
524 if (!fmd->fimc[i]->variant->has_cam_if) 524 if (!fmd->fimc[i]->variant->has_cam_if)
525 continue; 525 continue;
526 526
527 flags = (i == fimc_id) ? MEDIA_LNK_FL_ENABLED : 0; 527 flags = ((1 << i) & link_mask) ? MEDIA_LNK_FL_ENABLED : 0;
528 528
529 sink = &fmd->fimc[i]->vid_cap.subdev.entity; 529 sink = &fmd->fimc[i]->vid_cap.subdev.entity;
530 ret = media_entity_create_link(source, pad, sink, 530 ret = media_entity_create_link(source, pad, sink,
@@ -556,7 +556,10 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
556 if (!fmd->fimc_lite[i]) 556 if (!fmd->fimc_lite[i])
557 continue; 557 continue;
558 558
559 flags = (i == fimc_id) ? MEDIA_LNK_FL_ENABLED : 0; 559 if (link_mask & (1 << (i + FIMC_MAX_DEVS)))
560 flags = MEDIA_LNK_FL_ENABLED;
561 else
562 flags = 0;
560 563
561 sink = &fmd->fimc_lite[i]->subdev.entity; 564 sink = &fmd->fimc_lite[i]->subdev.entity;
562 ret = media_entity_create_link(source, pad, sink, 565 ret = media_entity_create_link(source, pad, sink,
@@ -618,9 +621,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
618 struct s5p_fimc_isp_info *pdata; 621 struct s5p_fimc_isp_info *pdata;
619 struct fimc_sensor_info *s_info; 622 struct fimc_sensor_info *s_info;
620 struct media_entity *source, *sink; 623 struct media_entity *source, *sink;
621 int i, pad, fimc_id = 0; 624 int i, pad, fimc_id = 0, ret = 0;
622 int ret = 0; 625 u32 flags, link_mask = 0;
623 u32 flags;
624 626
625 for (i = 0; i < fmd->num_sensors; i++) { 627 for (i = 0; i < fmd->num_sensors; i++) {
626 if (fmd->sensor[i].subdev == NULL) 628 if (fmd->sensor[i].subdev == NULL)
@@ -672,19 +674,20 @@ static int fimc_md_create_links(struct fimc_md *fmd)
672 if (source == NULL) 674 if (source == NULL)
673 continue; 675 continue;
674 676
677 link_mask = 1 << fimc_id++;
675 ret = __fimc_md_create_fimc_sink_links(fmd, source, sensor, 678 ret = __fimc_md_create_fimc_sink_links(fmd, source, sensor,
676 pad, fimc_id++); 679 pad, link_mask);
677 } 680 }
678 681
679 fimc_id = 0;
680 for (i = 0; i < ARRAY_SIZE(fmd->csis); i++) { 682 for (i = 0; i < ARRAY_SIZE(fmd->csis); i++) {
681 if (fmd->csis[i].sd == NULL) 683 if (fmd->csis[i].sd == NULL)
682 continue; 684 continue;
683 source = &fmd->csis[i].sd->entity; 685 source = &fmd->csis[i].sd->entity;
684 pad = CSIS_PAD_SOURCE; 686 pad = CSIS_PAD_SOURCE;
685 687
688 link_mask = 1 << fimc_id++;
686 ret = __fimc_md_create_fimc_sink_links(fmd, source, NULL, 689 ret = __fimc_md_create_fimc_sink_links(fmd, source, NULL,
687 pad, fimc_id++); 690 pad, link_mask);
688 } 691 }
689 692
690 /* Create immutable links between each FIMC's subdev and video node */ 693 /* Create immutable links between each FIMC's subdev and video node */