diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2013-02-01 13:00:40 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-02-05 14:55:58 -0500 |
commit | 56bc911ac3b94c731db3a6de20258827f1a61c20 (patch) | |
tree | a5fc7486fa4d94364fa43db503b98eb5de84bcb8 /drivers/media/platform | |
parent | b84ef24e1e421da266fe9c0a3ee82a49db517ddf (diff) |
[media] s5p-fimc: Redefine platform data structure for fimc-is
Newer Exynos4 SoC are equipped with a local camera ISP that
controls external raw image sensor directly. Such sensors
can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to
the ISP, which then feeds image data to the FIMCn IP. Thus
there can be two busses associated with an image source
(sensor). Rename struct s5p_fimc_isp_info describing external
image sensor (video decoder) to struct fimc_source_info to
avoid confusion. bus_type is split into fimc_bus_type and
sensor_bus_type. The bus type enumeration is extended to
include both FIMC Writeback input types.
The bus_type enumeration and the data structure name in the
board files are modified according to the above changes.
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-lite-reg.c | 8 | ||||
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-lite-reg.h | 4 | ||||
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-mdevice.c | 16 | ||||
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-mdevice.h | 2 | ||||
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-reg.c | 34 | ||||
-rw-r--r-- | drivers/media/platform/s5p-fimc/fimc-reg.h | 6 |
6 files changed, 37 insertions, 33 deletions
diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c index 962652da3b43..f0af0754a7b4 100644 --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.c +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.c | |||
@@ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite *dev, int id) | |||
187 | 187 | ||
188 | /* Select serial or parallel bus, camera port (A,B) and set signals polarity */ | 188 | /* Select serial or parallel bus, camera port (A,B) and set signals polarity */ |
189 | void flite_hw_set_camera_bus(struct fimc_lite *dev, | 189 | void flite_hw_set_camera_bus(struct fimc_lite *dev, |
190 | struct s5p_fimc_isp_info *s_info) | 190 | struct fimc_source_info *si) |
191 | { | 191 | { |
192 | u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL); | 192 | u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL); |
193 | unsigned int flags = s_info->flags; | 193 | unsigned int flags = si->flags; |
194 | 194 | ||
195 | if (s_info->bus_type != FIMC_MIPI_CSI2) { | 195 | if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) { |
196 | cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI | | 196 | cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI | |
197 | FLITE_REG_CIGCTRL_INVPOLPCLK | | 197 | FLITE_REG_CIGCTRL_INVPOLPCLK | |
198 | FLITE_REG_CIGCTRL_INVPOLVSYNC | | 198 | FLITE_REG_CIGCTRL_INVPOLVSYNC | |
@@ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev, | |||
212 | 212 | ||
213 | writel(cfg, dev->regs + FLITE_REG_CIGCTRL); | 213 | writel(cfg, dev->regs + FLITE_REG_CIGCTRL); |
214 | 214 | ||
215 | flite_hw_set_camera_port(dev, s_info->mux_id); | 215 | flite_hw_set_camera_port(dev, si->mux_id); |
216 | } | 216 | } |
217 | 217 | ||
218 | static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f) | 218 | static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f) |
diff --git a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h index adb9e9e6f3c2..0e345844c13a 100644 --- a/drivers/media/platform/s5p-fimc/fimc-lite-reg.h +++ b/drivers/media/platform/s5p-fimc/fimc-lite-reg.h | |||
@@ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev); | |||
131 | void flite_hw_capture_start(struct fimc_lite *dev); | 131 | void flite_hw_capture_start(struct fimc_lite *dev); |
132 | void flite_hw_capture_stop(struct fimc_lite *dev); | 132 | void flite_hw_capture_stop(struct fimc_lite *dev); |
133 | void flite_hw_set_camera_bus(struct fimc_lite *dev, | 133 | void flite_hw_set_camera_bus(struct fimc_lite *dev, |
134 | struct s5p_fimc_isp_info *s_info); | 134 | struct fimc_source_info *s_info); |
135 | void flite_hw_set_camera_polarity(struct fimc_lite *dev, | 135 | void flite_hw_set_camera_polarity(struct fimc_lite *dev, |
136 | struct s5p_fimc_isp_info *cam); | 136 | struct fimc_source_info *cam); |
137 | void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f); | 137 | void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f); |
138 | void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f); | 138 | void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f); |
139 | 139 | ||
diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c index d940454a0297..f49f6f17a3f7 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c | |||
@@ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | |||
290 | for (i = 0; i < num_clients; i++) { | 290 | for (i = 0; i < num_clients; i++) { |
291 | struct v4l2_subdev *sd; | 291 | struct v4l2_subdev *sd; |
292 | 292 | ||
293 | fmd->sensor[i].pdata = pdata->isp_info[i]; | 293 | fmd->sensor[i].pdata = pdata->source_info[i]; |
294 | ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true); | 294 | ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true); |
295 | if (ret) | 295 | if (ret) |
296 | break; | 296 | break; |
@@ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd, | |||
504 | struct v4l2_subdev *sensor, | 504 | struct v4l2_subdev *sensor, |
505 | int pad, int link_mask) | 505 | int pad, int link_mask) |
506 | { | 506 | { |
507 | struct fimc_sensor_info *s_info; | 507 | struct fimc_sensor_info *s_info = NULL; |
508 | struct media_entity *sink; | 508 | struct media_entity *sink; |
509 | unsigned int flags = 0; | 509 | unsigned int flags = 0; |
510 | int ret, i; | 510 | int ret, i; |
@@ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd) | |||
614 | { | 614 | { |
615 | struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL }; | 615 | struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL }; |
616 | struct v4l2_subdev *sensor, *csis; | 616 | struct v4l2_subdev *sensor, *csis; |
617 | struct s5p_fimc_isp_info *pdata; | 617 | struct fimc_source_info *pdata; |
618 | struct fimc_sensor_info *s_info; | 618 | struct fimc_sensor_info *s_info; |
619 | struct media_entity *source, *sink; | 619 | struct media_entity *source, *sink; |
620 | int i, pad, fimc_id = 0, ret = 0; | 620 | int i, pad, fimc_id = 0, ret = 0; |
@@ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd) | |||
632 | source = NULL; | 632 | source = NULL; |
633 | pdata = &s_info->pdata; | 633 | pdata = &s_info->pdata; |
634 | 634 | ||
635 | switch (pdata->bus_type) { | 635 | switch (pdata->sensor_bus_type) { |
636 | case FIMC_MIPI_CSI2: | 636 | case FIMC_BUS_TYPE_MIPI_CSI2: |
637 | if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES, | 637 | if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES, |
638 | "Wrong CSI channel id: %d\n", pdata->mux_id)) | 638 | "Wrong CSI channel id: %d\n", pdata->mux_id)) |
639 | return -EINVAL; | 639 | return -EINVAL; |
@@ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd) | |||
659 | csi_sensors[pdata->mux_id] = sensor; | 659 | csi_sensors[pdata->mux_id] = sensor; |
660 | break; | 660 | break; |
661 | 661 | ||
662 | case FIMC_ITU_601...FIMC_ITU_656: | 662 | case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656: |
663 | source = &sensor->entity; | 663 | source = &sensor->entity; |
664 | pad = 0; | 664 | pad = 0; |
665 | break; | 665 | break; |
666 | 666 | ||
667 | default: | 667 | default: |
668 | v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n", | 668 | v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n", |
669 | pdata->bus_type); | 669 | pdata->sensor_bus_type); |
670 | return -EINVAL; | 670 | return -EINVAL; |
671 | } | 671 | } |
672 | if (source == NULL) | 672 | if (source == NULL) |
@@ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd, | |||
762 | struct fimc_sensor_info *s_info, | 762 | struct fimc_sensor_info *s_info, |
763 | bool on) | 763 | bool on) |
764 | { | 764 | { |
765 | struct s5p_fimc_isp_info *pdata = &s_info->pdata; | 765 | struct fimc_source_info *pdata = &s_info->pdata; |
766 | struct fimc_camclk_info *camclk; | 766 | struct fimc_camclk_info *camclk; |
767 | int ret = 0; | 767 | int ret = 0; |
768 | 768 | ||
diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.h b/drivers/media/platform/s5p-fimc/fimc-mdevice.h index da7d9922cf58..06b0d8276fd2 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.h +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.h | |||
@@ -53,7 +53,7 @@ struct fimc_camclk_info { | |||
53 | * This data structure applies to image sensor and the writeback subdevs. | 53 | * This data structure applies to image sensor and the writeback subdevs. |
54 | */ | 54 | */ |
55 | struct fimc_sensor_info { | 55 | struct fimc_sensor_info { |
56 | struct s5p_fimc_isp_info pdata; | 56 | struct fimc_source_info pdata; |
57 | struct v4l2_subdev *subdev; | 57 | struct v4l2_subdev *subdev; |
58 | struct fimc_dev *host; | 58 | struct fimc_dev *host; |
59 | }; | 59 | }; |
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.c b/drivers/media/platform/s5p-fimc/fimc-reg.c index c05d0444192f..50b97c75b956 100644 --- a/drivers/media/platform/s5p-fimc/fimc-reg.c +++ b/drivers/media/platform/s5p-fimc/fimc-reg.c | |||
@@ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev, | |||
554 | } | 554 | } |
555 | 555 | ||
556 | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | 556 | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, |
557 | struct s5p_fimc_isp_info *cam) | 557 | struct fimc_source_info *cam) |
558 | { | 558 | { |
559 | u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL); | 559 | u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL); |
560 | 560 | ||
@@ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = { | |||
596 | }; | 596 | }; |
597 | 597 | ||
598 | int fimc_hw_set_camera_source(struct fimc_dev *fimc, | 598 | int fimc_hw_set_camera_source(struct fimc_dev *fimc, |
599 | struct s5p_fimc_isp_info *cam) | 599 | struct fimc_source_info *source) |
600 | { | 600 | { |
601 | struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame; | 601 | struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame; |
602 | u32 cfg = 0; | 602 | u32 bus_width, cfg = 0; |
603 | u32 bus_width; | ||
604 | int i; | 603 | int i; |
605 | 604 | ||
606 | if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) { | 605 | switch (source->fimc_bus_type) { |
606 | case FIMC_BUS_TYPE_ITU_601: | ||
607 | case FIMC_BUS_TYPE_ITU_656: | ||
607 | for (i = 0; i < ARRAY_SIZE(pix_desc); i++) { | 608 | for (i = 0; i < ARRAY_SIZE(pix_desc); i++) { |
608 | if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) { | 609 | if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) { |
609 | cfg = pix_desc[i].cisrcfmt; | 610 | cfg = pix_desc[i].cisrcfmt; |
@@ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc, | |||
619 | return -EINVAL; | 620 | return -EINVAL; |
620 | } | 621 | } |
621 | 622 | ||
622 | if (cam->bus_type == FIMC_ITU_601) { | 623 | if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) { |
623 | if (bus_width == 8) | 624 | if (bus_width == 8) |
624 | cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | 625 | cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; |
625 | else if (bus_width == 16) | 626 | else if (bus_width == 16) |
626 | cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT; | 627 | cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT; |
627 | } /* else defaults to ITU-R BT.656 8-bit */ | 628 | } /* else defaults to ITU-R BT.656 8-bit */ |
628 | } else if (cam->bus_type == FIMC_MIPI_CSI2) { | 629 | break; |
630 | case FIMC_BUS_TYPE_MIPI_CSI2: | ||
629 | if (fimc_fmt_is_user_defined(f->fmt->color)) | 631 | if (fimc_fmt_is_user_defined(f->fmt->color)) |
630 | cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | 632 | cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; |
633 | break; | ||
631 | } | 634 | } |
632 | 635 | ||
633 | cfg |= (f->o_width << 16) | f->o_height; | 636 | cfg |= (f->o_width << 16) | f->o_height; |
@@ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f) | |||
655 | } | 658 | } |
656 | 659 | ||
657 | int fimc_hw_set_camera_type(struct fimc_dev *fimc, | 660 | int fimc_hw_set_camera_type(struct fimc_dev *fimc, |
658 | struct s5p_fimc_isp_info *cam) | 661 | struct fimc_source_info *source) |
659 | { | 662 | { |
660 | u32 cfg, tmp; | 663 | u32 cfg, tmp; |
661 | struct fimc_vid_cap *vid_cap = &fimc->vid_cap; | 664 | struct fimc_vid_cap *vid_cap = &fimc->vid_cap; |
@@ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc, | |||
668 | FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB | | 671 | FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB | |
669 | FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG); | 672 | FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG); |
670 | 673 | ||
671 | switch (cam->bus_type) { | 674 | switch (source->fimc_bus_type) { |
672 | case FIMC_MIPI_CSI2: | 675 | case FIMC_BUS_TYPE_MIPI_CSI2: |
673 | cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI; | 676 | cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI; |
674 | 677 | ||
675 | if (cam->mux_id == 0) | 678 | if (source->mux_id == 0) |
676 | cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A; | 679 | cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A; |
677 | 680 | ||
678 | /* TODO: add remaining supported formats. */ | 681 | /* TODO: add remaining supported formats. */ |
@@ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc, | |||
695 | 698 | ||
696 | writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT); | 699 | writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT); |
697 | break; | 700 | break; |
698 | case FIMC_ITU_601...FIMC_ITU_656: | 701 | case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656: |
699 | if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */ | 702 | if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */ |
700 | cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A; | 703 | cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A; |
701 | break; | 704 | break; |
702 | case FIMC_LCD_WB: | 705 | case FIMC_BUS_TYPE_LCD_WRITEBACK_A: |
703 | cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB; | 706 | cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB; |
704 | break; | 707 | break; |
705 | default: | 708 | default: |
706 | v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n"); | 709 | v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n", |
710 | source->fimc_bus_type); | ||
707 | return -EINVAL; | 711 | return -EINVAL; |
708 | } | 712 | } |
709 | writel(cfg, fimc->regs + FIMC_REG_CIGCTRL); | 713 | writel(cfg, fimc->regs + FIMC_REG_CIGCTRL); |
diff --git a/drivers/media/platform/s5p-fimc/fimc-reg.h b/drivers/media/platform/s5p-fimc/fimc-reg.h index f3e0b78a3736..1a40df6d1a80 100644 --- a/drivers/media/platform/s5p-fimc/fimc-reg.h +++ b/drivers/media/platform/s5p-fimc/fimc-reg.h | |||
@@ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr); | |||
297 | void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr, | 297 | void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr, |
298 | int index); | 298 | int index); |
299 | int fimc_hw_set_camera_source(struct fimc_dev *fimc, | 299 | int fimc_hw_set_camera_source(struct fimc_dev *fimc, |
300 | struct s5p_fimc_isp_info *cam); | 300 | struct fimc_source_info *cam); |
301 | void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f); | 301 | void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f); |
302 | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | 302 | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, |
303 | struct s5p_fimc_isp_info *cam); | 303 | struct fimc_source_info *cam); |
304 | int fimc_hw_set_camera_type(struct fimc_dev *fimc, | 304 | int fimc_hw_set_camera_type(struct fimc_dev *fimc, |
305 | struct s5p_fimc_isp_info *cam); | 305 | struct fimc_source_info *cam); |
306 | void fimc_hw_clear_irq(struct fimc_dev *dev); | 306 | void fimc_hw_clear_irq(struct fimc_dev *dev); |
307 | void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on); | 307 | void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on); |
308 | void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on); | 308 | void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on); |