aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/s5p-fimc/fimc-reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/s5p-fimc/fimc-reg.c')
-rw-r--r--drivers/media/video/s5p-fimc/fimc-reg.c90
1 files changed, 45 insertions, 45 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-reg.c b/drivers/media/video/s5p-fimc/fimc-reg.c
index 4893b2d91d84..20e664e34163 100644
--- a/drivers/media/video/s5p-fimc/fimc-reg.c
+++ b/drivers/media/video/s5p-fimc/fimc-reg.c
@@ -30,7 +30,7 @@ void fimc_hw_reset(struct fimc_dev *dev)
30 cfg = readl(dev->regs + S5P_CIGCTRL); 30 cfg = readl(dev->regs + S5P_CIGCTRL);
31 cfg |= (S5P_CIGCTRL_SWRST | S5P_CIGCTRL_IRQ_LEVEL); 31 cfg |= (S5P_CIGCTRL_SWRST | S5P_CIGCTRL_IRQ_LEVEL);
32 writel(cfg, dev->regs + S5P_CIGCTRL); 32 writel(cfg, dev->regs + S5P_CIGCTRL);
33 udelay(1000); 33 udelay(10);
34 34
35 cfg = readl(dev->regs + S5P_CIGCTRL); 35 cfg = readl(dev->regs + S5P_CIGCTRL);
36 cfg &= ~S5P_CIGCTRL_SWRST; 36 cfg &= ~S5P_CIGCTRL_SWRST;
@@ -41,19 +41,11 @@ static u32 fimc_hw_get_in_flip(struct fimc_ctx *ctx)
41{ 41{
42 u32 flip = S5P_MSCTRL_FLIP_NORMAL; 42 u32 flip = S5P_MSCTRL_FLIP_NORMAL;
43 43
44 switch (ctx->flip) { 44 if (ctx->hflip)
45 case FLIP_X_AXIS:
46 flip = S5P_MSCTRL_FLIP_X_MIRROR; 45 flip = S5P_MSCTRL_FLIP_X_MIRROR;
47 break; 46 if (ctx->vflip)
48 case FLIP_Y_AXIS:
49 flip = S5P_MSCTRL_FLIP_Y_MIRROR; 47 flip = S5P_MSCTRL_FLIP_Y_MIRROR;
50 break; 48
51 case FLIP_XY_AXIS:
52 flip = S5P_MSCTRL_FLIP_180;
53 break;
54 default:
55 break;
56 }
57 if (ctx->rotation <= 90) 49 if (ctx->rotation <= 90)
58 return flip; 50 return flip;
59 51
@@ -64,19 +56,11 @@ static u32 fimc_hw_get_target_flip(struct fimc_ctx *ctx)
64{ 56{
65 u32 flip = S5P_CITRGFMT_FLIP_NORMAL; 57 u32 flip = S5P_CITRGFMT_FLIP_NORMAL;
66 58
67 switch (ctx->flip) { 59 if (ctx->hflip)
68 case FLIP_X_AXIS: 60 flip |= S5P_CITRGFMT_FLIP_X_MIRROR;
69 flip = S5P_CITRGFMT_FLIP_X_MIRROR; 61 if (ctx->vflip)
70 break; 62 flip |= S5P_CITRGFMT_FLIP_Y_MIRROR;
71 case FLIP_Y_AXIS: 63
72 flip = S5P_CITRGFMT_FLIP_Y_MIRROR;
73 break;
74 case FLIP_XY_AXIS:
75 flip = S5P_CITRGFMT_FLIP_180;
76 break;
77 default:
78 break;
79 }
80 if (ctx->rotation <= 90) 64 if (ctx->rotation <= 90)
81 return flip; 65 return flip;
82 66
@@ -368,17 +352,19 @@ void fimc_hw_en_capture(struct fimc_ctx *ctx)
368 writel(cfg | S5P_CIIMGCPT_IMGCPTEN, dev->regs + S5P_CIIMGCPT); 352 writel(cfg | S5P_CIIMGCPT_IMGCPTEN, dev->regs + S5P_CIIMGCPT);
369} 353}
370 354
371void fimc_hw_set_effect(struct fimc_ctx *ctx) 355void fimc_hw_set_effect(struct fimc_ctx *ctx, bool active)
372{ 356{
373 struct fimc_dev *dev = ctx->fimc_dev; 357 struct fimc_dev *dev = ctx->fimc_dev;
374 struct fimc_effect *effect = &ctx->effect; 358 struct fimc_effect *effect = &ctx->effect;
375 u32 cfg = (S5P_CIIMGEFF_IE_ENABLE | S5P_CIIMGEFF_IE_SC_AFTER); 359 u32 cfg = 0;
376
377 cfg |= effect->type;
378 360
379 if (effect->type == S5P_FIMC_EFFECT_ARBITRARY) { 361 if (active) {
380 cfg |= S5P_CIIMGEFF_PAT_CB(effect->pat_cb); 362 cfg |= S5P_CIIMGEFF_IE_SC_AFTER | S5P_CIIMGEFF_IE_ENABLE;
381 cfg |= S5P_CIIMGEFF_PAT_CR(effect->pat_cr); 363 cfg |= effect->type;
364 if (effect->type == S5P_FIMC_EFFECT_ARBITRARY) {
365 cfg |= S5P_CIIMGEFF_PAT_CB(effect->pat_cb);
366 cfg |= S5P_CIIMGEFF_PAT_CR(effect->pat_cr);
367 }
382 } 368 }
383 369
384 writel(cfg, dev->regs + S5P_CIIMGEFF); 370 writel(cfg, dev->regs + S5P_CIIMGEFF);
@@ -547,20 +533,24 @@ int fimc_hw_set_camera_polarity(struct fimc_dev *fimc,
547 u32 cfg = readl(fimc->regs + S5P_CIGCTRL); 533 u32 cfg = readl(fimc->regs + S5P_CIGCTRL);
548 534
549 cfg &= ~(S5P_CIGCTRL_INVPOLPCLK | S5P_CIGCTRL_INVPOLVSYNC | 535 cfg &= ~(S5P_CIGCTRL_INVPOLPCLK | S5P_CIGCTRL_INVPOLVSYNC |
550 S5P_CIGCTRL_INVPOLHREF | S5P_CIGCTRL_INVPOLHSYNC); 536 S5P_CIGCTRL_INVPOLHREF | S5P_CIGCTRL_INVPOLHSYNC |
537 S5P_CIGCTRL_INVPOLFIELD);
551 538
552 if (cam->flags & FIMC_CLK_INV_PCLK) 539 if (cam->flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)
553 cfg |= S5P_CIGCTRL_INVPOLPCLK; 540 cfg |= S5P_CIGCTRL_INVPOLPCLK;
554 541
555 if (cam->flags & FIMC_CLK_INV_VSYNC) 542 if (cam->flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
556 cfg |= S5P_CIGCTRL_INVPOLVSYNC; 543 cfg |= S5P_CIGCTRL_INVPOLVSYNC;
557 544
558 if (cam->flags & FIMC_CLK_INV_HREF) 545 if (cam->flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
559 cfg |= S5P_CIGCTRL_INVPOLHREF; 546 cfg |= S5P_CIGCTRL_INVPOLHREF;
560 547
561 if (cam->flags & FIMC_CLK_INV_HSYNC) 548 if (cam->flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
562 cfg |= S5P_CIGCTRL_INVPOLHSYNC; 549 cfg |= S5P_CIGCTRL_INVPOLHSYNC;
563 550
551 if (cam->flags & V4L2_MBUS_FIELD_EVEN_LOW)
552 cfg |= S5P_CIGCTRL_INVPOLFIELD;
553
564 writel(cfg, fimc->regs + S5P_CIGCTRL); 554 writel(cfg, fimc->regs + S5P_CIGCTRL);
565 555
566 return 0; 556 return 0;
@@ -588,7 +578,7 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
588 578
589 if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) { 579 if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) {
590 for (i = 0; i < ARRAY_SIZE(pix_desc); i++) { 580 for (i = 0; i < ARRAY_SIZE(pix_desc); i++) {
591 if (fimc->vid_cap.fmt.code == pix_desc[i].pixelcode) { 581 if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) {
592 cfg = pix_desc[i].cisrcfmt; 582 cfg = pix_desc[i].cisrcfmt;
593 bus_width = pix_desc[i].bus_width; 583 bus_width = pix_desc[i].bus_width;
594 break; 584 break;
@@ -596,9 +586,9 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
596 } 586 }
597 587
598 if (i == ARRAY_SIZE(pix_desc)) { 588 if (i == ARRAY_SIZE(pix_desc)) {
599 v4l2_err(&fimc->vid_cap.v4l2_dev, 589 v4l2_err(fimc->vid_cap.vfd,
600 "Camera color format not supported: %d\n", 590 "Camera color format not supported: %d\n",
601 fimc->vid_cap.fmt.code); 591 fimc->vid_cap.mf.code);
602 return -EINVAL; 592 return -EINVAL;
603 } 593 }
604 594
@@ -608,6 +598,9 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc,
608 else if (bus_width == 16) 598 else if (bus_width == 16)
609 cfg |= S5P_CISRCFMT_ITU601_16BIT; 599 cfg |= S5P_CISRCFMT_ITU601_16BIT;
610 } /* else defaults to ITU-R BT.656 8-bit */ 600 } /* else defaults to ITU-R BT.656 8-bit */
601 } else if (cam->bus_type == FIMC_MIPI_CSI2) {
602 if (fimc_fmt_is_jpeg(f->fmt->color))
603 cfg |= S5P_CISRCFMT_ITU601_8BIT;
611 } 604 }
612 605
613 cfg |= S5P_CISRCFMT_HSIZE(f->o_width) | S5P_CISRCFMT_VSIZE(f->o_height); 606 cfg |= S5P_CISRCFMT_HSIZE(f->o_width) | S5P_CISRCFMT_VSIZE(f->o_height);
@@ -649,7 +642,7 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
649 /* Select ITU B interface, disable Writeback path and test pattern. */ 642 /* Select ITU B interface, disable Writeback path and test pattern. */
650 cfg &= ~(S5P_CIGCTRL_TESTPAT_MASK | S5P_CIGCTRL_SELCAM_ITU_A | 643 cfg &= ~(S5P_CIGCTRL_TESTPAT_MASK | S5P_CIGCTRL_SELCAM_ITU_A |
651 S5P_CIGCTRL_SELCAM_MIPI | S5P_CIGCTRL_CAMIF_SELWB | 644 S5P_CIGCTRL_SELCAM_MIPI | S5P_CIGCTRL_CAMIF_SELWB |
652 S5P_CIGCTRL_SELCAM_MIPI_A); 645 S5P_CIGCTRL_SELCAM_MIPI_A | S5P_CIGCTRL_CAM_JPEG);
653 646
654 if (cam->bus_type == FIMC_MIPI_CSI2) { 647 if (cam->bus_type == FIMC_MIPI_CSI2) {
655 cfg |= S5P_CIGCTRL_SELCAM_MIPI; 648 cfg |= S5P_CIGCTRL_SELCAM_MIPI;
@@ -658,11 +651,18 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
658 cfg |= S5P_CIGCTRL_SELCAM_MIPI_A; 651 cfg |= S5P_CIGCTRL_SELCAM_MIPI_A;
659 652
660 /* TODO: add remaining supported formats. */ 653 /* TODO: add remaining supported formats. */
661 if (vid_cap->fmt.code == V4L2_MBUS_FMT_VYUY8_2X8) { 654 switch (vid_cap->mf.code) {
655 case V4L2_MBUS_FMT_VYUY8_2X8:
662 tmp = S5P_CSIIMGFMT_YCBCR422_8BIT; 656 tmp = S5P_CSIIMGFMT_YCBCR422_8BIT;
663 } else { 657 break;
664 err("camera image format not supported: %d", 658 case V4L2_MBUS_FMT_JPEG_1X8:
665 vid_cap->fmt.code); 659 tmp = S5P_CSIIMGFMT_USER(1);
660 cfg |= S5P_CIGCTRL_CAM_JPEG;
661 break;
662 default:
663 v4l2_err(fimc->vid_cap.vfd,
664 "Not supported camera pixel format: %d",
665 vid_cap->mf.code);
666 return -EINVAL; 666 return -EINVAL;
667 } 667 }
668 tmp |= (cam->csi_data_align == 32) << 8; 668 tmp |= (cam->csi_data_align == 32) << 8;