aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/ipu-v3
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-11-04 20:06:56 -0500
committerDave Airlie <airlied@redhat.com>2015-11-04 20:06:56 -0500
commitcb0fb271213e8a06ca8815a459dfaddd5bb47b4b (patch)
tree068308d5dc785d8e3c0c4e003632ed817f4de8f3 /drivers/gpu/ipu-v3
parent793423ffcb229ae5654b382a1356906f81da2018 (diff)
parenta5f4185c4b8c131c0ccafa6b1b00cd4e5413e47e (diff)
Merge tag 'imx-drm-next-2015-10-30' of git://git.pengutronix.de/git/pza/linux into drm-next
imx-drm fixes and color format updates - Some correctness fixes found by coccinelle - Add drivers/gpu/ipu-v3 directory to MAINTAINERS - Add support for more color formats - Fix a regression, making displays larger than FullHD work again * tag 'imx-drm-next-2015-10-30' of git://git.pengutronix.de/git/pza/linux: drm/imx: hdmi: fix HDMI setup to allow modes larger than FullHD gpu: ipu-v3: fix div_ratio type gpu: ipu-v3: csi: add support for 8 bpp grayscale sensors. drm/imx: enable ARGB4444 16-bit color format gpu: ipu-v3: add support for ARGB4444 16-bit color format drm/imx: ipuv3-plane: enable support for RGBX8888 and RGBA8888 pixel formats gpu: ipu-v3: add support for RGBX8888 and RGBA8888 pixel formats drm/imx: enable 15-bit RGB with 1-bit alpha formats gpu: ipu-v3: add support for 15-bit RGB with 1-bit alpha formats MAINTAINERS: Add IPUv3 core driver to the i.MX DRM driver section gpu: ipu-v3: ipu-csi: bool test doesn't need a comparison to false
Diffstat (limited to 'drivers/gpu/ipu-v3')
-rw-r--r--drivers/gpu/ipu-v3/ipu-common.c5
-rw-r--r--drivers/gpu/ipu-v3/ipu-cpmem.c87
-rw-r--r--drivers/gpu/ipu-v3/ipu-csi.c5
3 files changed, 91 insertions, 6 deletions
diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
index e5a38d202a21..ba47b30d28fa 100644
--- a/drivers/gpu/ipu-v3/ipu-common.c
+++ b/drivers/gpu/ipu-v3/ipu-common.c
@@ -57,10 +57,15 @@ EXPORT_SYMBOL_GPL(ipu_srm_dp_sync_update);
57enum ipu_color_space ipu_drm_fourcc_to_colorspace(u32 drm_fourcc) 57enum ipu_color_space ipu_drm_fourcc_to_colorspace(u32 drm_fourcc)
58{ 58{
59 switch (drm_fourcc) { 59 switch (drm_fourcc) {
60 case DRM_FORMAT_ARGB1555:
61 case DRM_FORMAT_ABGR1555:
62 case DRM_FORMAT_RGBA5551:
63 case DRM_FORMAT_BGRA5551:
60 case DRM_FORMAT_RGB565: 64 case DRM_FORMAT_RGB565:
61 case DRM_FORMAT_BGR565: 65 case DRM_FORMAT_BGR565:
62 case DRM_FORMAT_RGB888: 66 case DRM_FORMAT_RGB888:
63 case DRM_FORMAT_BGR888: 67 case DRM_FORMAT_BGR888:
68 case DRM_FORMAT_ARGB4444:
64 case DRM_FORMAT_XRGB8888: 69 case DRM_FORMAT_XRGB8888:
65 case DRM_FORMAT_XBGR8888: 70 case DRM_FORMAT_XBGR8888:
66 case DRM_FORMAT_RGBX8888: 71 case DRM_FORMAT_RGBX8888:
diff --git a/drivers/gpu/ipu-v3/ipu-cpmem.c b/drivers/gpu/ipu-v3/ipu-cpmem.c
index 3bf05bc4ab67..63eb16bf2cf0 100644
--- a/drivers/gpu/ipu-v3/ipu-cpmem.c
+++ b/drivers/gpu/ipu-v3/ipu-cpmem.c
@@ -452,7 +452,7 @@ void ipu_cpmem_set_yuv_planar(struct ipuv3_channel *ch,
452} 452}
453EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_planar); 453EXPORT_SYMBOL_GPL(ipu_cpmem_set_yuv_planar);
454 454
455static const struct ipu_rgb def_rgb_32 = { 455static const struct ipu_rgb def_xrgb_32 = {
456 .red = { .offset = 16, .length = 8, }, 456 .red = { .offset = 16, .length = 8, },
457 .green = { .offset = 8, .length = 8, }, 457 .green = { .offset = 8, .length = 8, },
458 .blue = { .offset = 0, .length = 8, }, 458 .blue = { .offset = 0, .length = 8, },
@@ -460,7 +460,7 @@ static const struct ipu_rgb def_rgb_32 = {
460 .bits_per_pixel = 32, 460 .bits_per_pixel = 32,
461}; 461};
462 462
463static const struct ipu_rgb def_bgr_32 = { 463static const struct ipu_rgb def_xbgr_32 = {
464 .red = { .offset = 0, .length = 8, }, 464 .red = { .offset = 0, .length = 8, },
465 .green = { .offset = 8, .length = 8, }, 465 .green = { .offset = 8, .length = 8, },
466 .blue = { .offset = 16, .length = 8, }, 466 .blue = { .offset = 16, .length = 8, },
@@ -468,6 +468,22 @@ static const struct ipu_rgb def_bgr_32 = {
468 .bits_per_pixel = 32, 468 .bits_per_pixel = 32,
469}; 469};
470 470
471static const struct ipu_rgb def_rgbx_32 = {
472 .red = { .offset = 24, .length = 8, },
473 .green = { .offset = 16, .length = 8, },
474 .blue = { .offset = 8, .length = 8, },
475 .transp = { .offset = 0, .length = 8, },
476 .bits_per_pixel = 32,
477};
478
479static const struct ipu_rgb def_bgrx_32 = {
480 .red = { .offset = 8, .length = 8, },
481 .green = { .offset = 16, .length = 8, },
482 .blue = { .offset = 24, .length = 8, },
483 .transp = { .offset = 0, .length = 8, },
484 .bits_per_pixel = 32,
485};
486
471static const struct ipu_rgb def_rgb_24 = { 487static const struct ipu_rgb def_rgb_24 = {
472 .red = { .offset = 16, .length = 8, }, 488 .red = { .offset = 16, .length = 8, },
473 .green = { .offset = 8, .length = 8, }, 489 .green = { .offset = 8, .length = 8, },
@@ -500,6 +516,46 @@ static const struct ipu_rgb def_bgr_16 = {
500 .bits_per_pixel = 16, 516 .bits_per_pixel = 16,
501}; 517};
502 518
519static const struct ipu_rgb def_argb_16 = {
520 .red = { .offset = 10, .length = 5, },
521 .green = { .offset = 5, .length = 5, },
522 .blue = { .offset = 0, .length = 5, },
523 .transp = { .offset = 15, .length = 1, },
524 .bits_per_pixel = 16,
525};
526
527static const struct ipu_rgb def_argb_16_4444 = {
528 .red = { .offset = 8, .length = 4, },
529 .green = { .offset = 4, .length = 4, },
530 .blue = { .offset = 0, .length = 4, },
531 .transp = { .offset = 12, .length = 4, },
532 .bits_per_pixel = 16,
533};
534
535static const struct ipu_rgb def_abgr_16 = {
536 .red = { .offset = 0, .length = 5, },
537 .green = { .offset = 5, .length = 5, },
538 .blue = { .offset = 10, .length = 5, },
539 .transp = { .offset = 15, .length = 1, },
540 .bits_per_pixel = 16,
541};
542
543static const struct ipu_rgb def_rgba_16 = {
544 .red = { .offset = 11, .length = 5, },
545 .green = { .offset = 6, .length = 5, },
546 .blue = { .offset = 1, .length = 5, },
547 .transp = { .offset = 0, .length = 1, },
548 .bits_per_pixel = 16,
549};
550
551static const struct ipu_rgb def_bgra_16 = {
552 .red = { .offset = 1, .length = 5, },
553 .green = { .offset = 6, .length = 5, },
554 .blue = { .offset = 11, .length = 5, },
555 .transp = { .offset = 0, .length = 1, },
556 .bits_per_pixel = 16,
557};
558
503#define Y_OFFSET(pix, x, y) ((x) + pix->width * (y)) 559#define Y_OFFSET(pix, x, y) ((x) + pix->width * (y))
504#define U_OFFSET(pix, x, y) ((pix->width * pix->height) + \ 560#define U_OFFSET(pix, x, y) ((pix->width * pix->height) + \
505 (pix->width * (y) / 4) + (x) / 2) 561 (pix->width * (y) / 4) + (x) / 2)
@@ -563,11 +619,19 @@ int ipu_cpmem_set_fmt(struct ipuv3_channel *ch, u32 drm_fourcc)
563 break; 619 break;
564 case DRM_FORMAT_ABGR8888: 620 case DRM_FORMAT_ABGR8888:
565 case DRM_FORMAT_XBGR8888: 621 case DRM_FORMAT_XBGR8888:
566 ipu_cpmem_set_format_rgb(ch, &def_bgr_32); 622 ipu_cpmem_set_format_rgb(ch, &def_xbgr_32);
567 break; 623 break;
568 case DRM_FORMAT_ARGB8888: 624 case DRM_FORMAT_ARGB8888:
569 case DRM_FORMAT_XRGB8888: 625 case DRM_FORMAT_XRGB8888:
570 ipu_cpmem_set_format_rgb(ch, &def_rgb_32); 626 ipu_cpmem_set_format_rgb(ch, &def_xrgb_32);
627 break;
628 case DRM_FORMAT_RGBA8888:
629 case DRM_FORMAT_RGBX8888:
630 ipu_cpmem_set_format_rgb(ch, &def_rgbx_32);
631 break;
632 case DRM_FORMAT_BGRA8888:
633 case DRM_FORMAT_BGRX8888:
634 ipu_cpmem_set_format_rgb(ch, &def_bgrx_32);
571 break; 635 break;
572 case DRM_FORMAT_BGR888: 636 case DRM_FORMAT_BGR888:
573 ipu_cpmem_set_format_rgb(ch, &def_bgr_24); 637 ipu_cpmem_set_format_rgb(ch, &def_bgr_24);
@@ -581,6 +645,21 @@ int ipu_cpmem_set_fmt(struct ipuv3_channel *ch, u32 drm_fourcc)
581 case DRM_FORMAT_BGR565: 645 case DRM_FORMAT_BGR565:
582 ipu_cpmem_set_format_rgb(ch, &def_bgr_16); 646 ipu_cpmem_set_format_rgb(ch, &def_bgr_16);
583 break; 647 break;
648 case DRM_FORMAT_ARGB1555:
649 ipu_cpmem_set_format_rgb(ch, &def_argb_16);
650 break;
651 case DRM_FORMAT_ABGR1555:
652 ipu_cpmem_set_format_rgb(ch, &def_abgr_16);
653 break;
654 case DRM_FORMAT_RGBA5551:
655 ipu_cpmem_set_format_rgb(ch, &def_rgba_16);
656 break;
657 case DRM_FORMAT_BGRA5551:
658 ipu_cpmem_set_format_rgb(ch, &def_bgra_16);
659 break;
660 case DRM_FORMAT_ARGB4444:
661 ipu_cpmem_set_format_rgb(ch, &def_argb_16_4444);
662 break;
584 default: 663 default:
585 return -EINVAL; 664 return -EINVAL;
586 } 665 }
diff --git a/drivers/gpu/ipu-v3/ipu-csi.c b/drivers/gpu/ipu-v3/ipu-csi.c
index 752cdd2da89a..06631ac61b04 100644
--- a/drivers/gpu/ipu-v3/ipu-csi.c
+++ b/drivers/gpu/ipu-v3/ipu-csi.c
@@ -202,7 +202,7 @@ static int ipu_csi_set_testgen_mclk(struct ipu_csi *csi, u32 pixel_clk,
202 u32 ipu_clk) 202 u32 ipu_clk)
203{ 203{
204 u32 temp; 204 u32 temp;
205 u32 div_ratio; 205 int div_ratio;
206 206
207 div_ratio = (ipu_clk / pixel_clk) - 1; 207 div_ratio = (ipu_clk / pixel_clk) - 1;
208 208
@@ -271,6 +271,7 @@ static int mbus_code_to_bus_cfg(struct ipu_csi_bus_config *cfg, u32 mbus_code)
271 case MEDIA_BUS_FMT_SGBRG8_1X8: 271 case MEDIA_BUS_FMT_SGBRG8_1X8:
272 case MEDIA_BUS_FMT_SGRBG8_1X8: 272 case MEDIA_BUS_FMT_SGRBG8_1X8:
273 case MEDIA_BUS_FMT_SRGGB8_1X8: 273 case MEDIA_BUS_FMT_SRGGB8_1X8:
274 case MEDIA_BUS_FMT_Y8_1X8:
274 cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER; 275 cfg->data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
275 cfg->mipi_dt = MIPI_DT_RAW8; 276 cfg->mipi_dt = MIPI_DT_RAW8;
276 cfg->data_width = IPU_CSI_DATA_WIDTH_8; 277