diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2012-05-16 12:08:30 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-06-25 08:16:37 -0400 |
commit | d0da3c3565a1dd3cdfa374038d6ccae4b90fe142 (patch) | |
tree | 251a88a5a59dc22b69ba483f6c398d8e4b978b36 | |
parent | 90e614bb4c581eb588ec26f130fcdd65aa047fa8 (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.c | 23 |
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 | */ |
507 | static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd, | 507 | static 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 */ |