diff options
Diffstat (limited to 'drivers/media/video/s5p-fimc/fimc-reg.c')
| -rw-r--r-- | drivers/media/video/s5p-fimc/fimc-reg.c | 90 |
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 | ||
| 371 | void fimc_hw_set_effect(struct fimc_ctx *ctx) | 355 | void 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; |
