aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2013-02-01 13:00:40 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-02-05 14:55:58 -0500
commit56bc911ac3b94c731db3a6de20258827f1a61c20 (patch)
treea5fc7486fa4d94364fa43db503b98eb5de84bcb8 /drivers/media/platform
parentb84ef24e1e421da266fe9c0a3ee82a49db517ddf (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.c8
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-lite-reg.h4
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-mdevice.c16
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-mdevice.h2
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-reg.c34
-rw-r--r--drivers/media/platform/s5p-fimc/fimc-reg.h6
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 */
189void flite_hw_set_camera_bus(struct fimc_lite *dev, 189void 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
218static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f) 218static 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);
131void flite_hw_capture_start(struct fimc_lite *dev); 131void flite_hw_capture_start(struct fimc_lite *dev);
132void flite_hw_capture_stop(struct fimc_lite *dev); 132void flite_hw_capture_stop(struct fimc_lite *dev);
133void flite_hw_set_camera_bus(struct fimc_lite *dev, 133void flite_hw_set_camera_bus(struct fimc_lite *dev,
134 struct s5p_fimc_isp_info *s_info); 134 struct fimc_source_info *s_info);
135void flite_hw_set_camera_polarity(struct fimc_lite *dev, 135void flite_hw_set_camera_polarity(struct fimc_lite *dev,
136 struct s5p_fimc_isp_info *cam); 136 struct fimc_source_info *cam);
137void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f); 137void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f);
138void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f); 138void 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 */
55struct fimc_sensor_info { 55struct 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
556int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, 556int 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
598int fimc_hw_set_camera_source(struct fimc_dev *fimc, 598int 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
657int fimc_hw_set_camera_type(struct fimc_dev *fimc, 660int 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);
297void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr, 297void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
298 int index); 298 int index);
299int fimc_hw_set_camera_source(struct fimc_dev *fimc, 299int fimc_hw_set_camera_source(struct fimc_dev *fimc,
300 struct s5p_fimc_isp_info *cam); 300 struct fimc_source_info *cam);
301void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f); 301void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
302int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, 302int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
303 struct s5p_fimc_isp_info *cam); 303 struct fimc_source_info *cam);
304int fimc_hw_set_camera_type(struct fimc_dev *fimc, 304int fimc_hw_set_camera_type(struct fimc_dev *fimc,
305 struct s5p_fimc_isp_info *cam); 305 struct fimc_source_info *cam);
306void fimc_hw_clear_irq(struct fimc_dev *dev); 306void fimc_hw_clear_irq(struct fimc_dev *dev);
307void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on); 307void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on);
308void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on); 308void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on);