Commit e6700703 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'exynos-drm-next-v5.18' of...

Merge tag 'exynos-drm-next-v5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next

New feature
- Add BGR pixel format support for FIMD device. As for this,
  this patch uses undocumented register, WIN_RGB_ORDER, but
  it is safe because product kernels have been using same
  register.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Inki Dae <inki.dae@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220304085220.324245-1-inki.dae@samsung.com
parents 6de7e4f0 2d684f4e
...@@ -678,7 +678,6 @@ static int decon_probe(struct platform_device *pdev) ...@@ -678,7 +678,6 @@ static int decon_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct decon_context *ctx; struct decon_context *ctx;
struct device_node *i80_if_timings; struct device_node *i80_if_timings;
struct resource *res;
int ret; int ret;
if (!dev->of_node) if (!dev->of_node)
...@@ -728,16 +727,11 @@ static int decon_probe(struct platform_device *pdev) ...@@ -728,16 +727,11 @@ static int decon_probe(struct platform_device *pdev)
goto err_iounmap; goto err_iounmap;
} }
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
ctx->i80_if ? "lcd_sys" : "vsync"); if (ret < 0)
if (!res) {
dev_err(dev, "irq request failed.\n");
ret = -ENXIO;
goto err_iounmap; goto err_iounmap;
}
ret = devm_request_irq(dev, res->start, decon_irq_handler, ret = devm_request_irq(dev, ret, decon_irq_handler, 0, "drm_decon", ctx);
0, "drm_decon", ctx);
if (ret) { if (ret) {
dev_err(dev, "irq request failed.\n"); dev_err(dev, "irq request failed.\n");
goto err_iounmap; goto err_iounmap;
......
...@@ -1335,8 +1335,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, ...@@ -1335,8 +1335,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi,
int ret; int ret;
int te_gpio_irq; int te_gpio_irq;
dsi->te_gpio = devm_gpiod_get_optional(dsi->dev, "te", GPIOD_IN); dsi->te_gpio = gpiod_get_optional(panel, "te", GPIOD_IN);
if (IS_ERR(dsi->te_gpio)) { if (!dsi->te_gpio) {
return 0;
} else if (IS_ERR(dsi->te_gpio)) {
dev_err(dsi->dev, "gpio request failed with %ld\n", dev_err(dsi->dev, "gpio request failed with %ld\n",
PTR_ERR(dsi->te_gpio)); PTR_ERR(dsi->te_gpio));
return PTR_ERR(dsi->te_gpio); return PTR_ERR(dsi->te_gpio);
......
...@@ -1267,7 +1267,6 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1267,7 +1267,6 @@ static int fimc_probe(struct platform_device *pdev)
struct exynos_drm_ipp_formats *formats; struct exynos_drm_ipp_formats *formats;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct fimc_context *ctx; struct fimc_context *ctx;
struct resource *res;
int ret; int ret;
int i, j, num_limits, num_formats; int i, j, num_limits, num_formats;
...@@ -1330,14 +1329,12 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1330,14 +1329,12 @@ static int fimc_probe(struct platform_device *pdev)
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
/* resource irq */ /* resource irq */
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ret = platform_get_irq(pdev, 0);
if (!res) { if (ret < 0)
dev_err(dev, "failed to request irq resource.\n"); return ret;
return -ENOENT;
}
ret = devm_request_irq(dev, res->start, fimc_irq_handler, ret = devm_request_irq(dev, ret, fimc_irq_handler,
0, dev_name(dev), ctx); 0, dev_name(dev), ctx);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "failed to request irq.\n"); dev_err(dev, "failed to request irq.\n");
return ret; return ret;
......
...@@ -109,6 +109,7 @@ struct fimd_driver_data { ...@@ -109,6 +109,7 @@ struct fimd_driver_data {
unsigned int has_dp_clk:1; unsigned int has_dp_clk:1;
unsigned int has_hw_trigger:1; unsigned int has_hw_trigger:1;
unsigned int has_trigger_per_te:1; unsigned int has_trigger_per_te:1;
unsigned int has_bgr_support:1;
}; };
static struct fimd_driver_data s3c64xx_fimd_driver_data = { static struct fimd_driver_data s3c64xx_fimd_driver_data = {
...@@ -138,6 +139,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = { ...@@ -138,6 +139,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = {
.lcdblk_bypass_shift = 1, .lcdblk_bypass_shift = 1,
.has_shadowcon = 1, .has_shadowcon = 1,
.has_vtsel = 1, .has_vtsel = 1,
.has_bgr_support = 1,
}; };
static struct fimd_driver_data exynos5_fimd_driver_data = { static struct fimd_driver_data exynos5_fimd_driver_data = {
...@@ -149,6 +151,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = { ...@@ -149,6 +151,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = {
.has_vidoutcon = 1, .has_vidoutcon = 1,
.has_vtsel = 1, .has_vtsel = 1,
.has_dp_clk = 1, .has_dp_clk = 1,
.has_bgr_support = 1,
}; };
static struct fimd_driver_data exynos5420_fimd_driver_data = { static struct fimd_driver_data exynos5420_fimd_driver_data = {
...@@ -162,6 +165,7 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = { ...@@ -162,6 +165,7 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = {
.has_vtsel = 1, .has_vtsel = 1,
.has_mic_bypass = 1, .has_mic_bypass = 1,
.has_dp_clk = 1, .has_dp_clk = 1,
.has_bgr_support = 1,
}; };
struct fimd_context { struct fimd_context {
...@@ -226,6 +230,18 @@ static const uint32_t fimd_formats[] = { ...@@ -226,6 +230,18 @@ static const uint32_t fimd_formats[] = {
DRM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888,
}; };
static const uint32_t fimd_extended_formats[] = {
DRM_FORMAT_C8,
DRM_FORMAT_XRGB1555,
DRM_FORMAT_XBGR1555,
DRM_FORMAT_RGB565,
DRM_FORMAT_BGR565,
DRM_FORMAT_XRGB8888,
DRM_FORMAT_XBGR8888,
DRM_FORMAT_ARGB8888,
DRM_FORMAT_ABGR8888,
};
static const unsigned int capabilities[WINDOWS_NR] = { static const unsigned int capabilities[WINDOWS_NR] = {
0, 0,
EXYNOS_DRM_PLANE_CAP_WIN_BLEND | EXYNOS_DRM_PLANE_CAP_PIX_BLEND, EXYNOS_DRM_PLANE_CAP_WIN_BLEND | EXYNOS_DRM_PLANE_CAP_PIX_BLEND,
...@@ -673,21 +689,25 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win, ...@@ -673,21 +689,25 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
val |= WINCONx_BYTSWP; val |= WINCONx_BYTSWP;
break; break;
case DRM_FORMAT_XRGB1555: case DRM_FORMAT_XRGB1555:
case DRM_FORMAT_XBGR1555:
val |= WINCON0_BPPMODE_16BPP_1555; val |= WINCON0_BPPMODE_16BPP_1555;
val |= WINCONx_HAWSWP; val |= WINCONx_HAWSWP;
val |= WINCONx_BURSTLEN_16WORD; val |= WINCONx_BURSTLEN_16WORD;
break; break;
case DRM_FORMAT_RGB565: case DRM_FORMAT_RGB565:
case DRM_FORMAT_BGR565:
val |= WINCON0_BPPMODE_16BPP_565; val |= WINCON0_BPPMODE_16BPP_565;
val |= WINCONx_HAWSWP; val |= WINCONx_HAWSWP;
val |= WINCONx_BURSTLEN_16WORD; val |= WINCONx_BURSTLEN_16WORD;
break; break;
case DRM_FORMAT_XRGB8888: case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_XBGR8888:
val |= WINCON0_BPPMODE_24BPP_888; val |= WINCON0_BPPMODE_24BPP_888;
val |= WINCONx_WSWP; val |= WINCONx_WSWP;
val |= WINCONx_BURSTLEN_16WORD; val |= WINCONx_BURSTLEN_16WORD;
break; break;
case DRM_FORMAT_ARGB8888: case DRM_FORMAT_ARGB8888:
case DRM_FORMAT_ABGR8888:
default: default:
val |= WINCON1_BPPMODE_25BPP_A1888; val |= WINCON1_BPPMODE_25BPP_A1888;
val |= WINCONx_WSWP; val |= WINCONx_WSWP;
...@@ -695,6 +715,18 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win, ...@@ -695,6 +715,18 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
break; break;
} }
switch (pixel_format) {
case DRM_FORMAT_XBGR1555:
case DRM_FORMAT_XBGR8888:
case DRM_FORMAT_ABGR8888:
case DRM_FORMAT_BGR565:
writel(WIN_RGB_ORDER_REVERSE, ctx->regs + WIN_RGB_ORDER(win));
break;
default:
writel(WIN_RGB_ORDER_FORWARD, ctx->regs + WIN_RGB_ORDER(win));
break;
}
/* /*
* Setting dma-burst to 16Word causes permanent tearing for very small * Setting dma-burst to 16Word causes permanent tearing for very small
* buffers, e.g. cursor buffer. Burst Mode switching which based on * buffers, e.g. cursor buffer. Burst Mode switching which based on
...@@ -1074,8 +1106,14 @@ static int fimd_bind(struct device *dev, struct device *master, void *data) ...@@ -1074,8 +1106,14 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
ctx->drm_dev = drm_dev; ctx->drm_dev = drm_dev;
for (i = 0; i < WINDOWS_NR; i++) { for (i = 0; i < WINDOWS_NR; i++) {
ctx->configs[i].pixel_formats = fimd_formats; if (ctx->driver_data->has_bgr_support) {
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats); ctx->configs[i].pixel_formats = fimd_extended_formats;
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_extended_formats);
} else {
ctx->configs[i].pixel_formats = fimd_formats;
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats);
}
ctx->configs[i].zpos = i; ctx->configs[i].zpos = i;
ctx->configs[i].type = fimd_win_types[i]; ctx->configs[i].type = fimd_win_types[i];
ctx->configs[i].capabilities = capabilities[i]; ctx->configs[i].capabilities = capabilities[i];
...@@ -1133,7 +1171,6 @@ static int fimd_probe(struct platform_device *pdev) ...@@ -1133,7 +1171,6 @@ static int fimd_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct fimd_context *ctx; struct fimd_context *ctx;
struct device_node *i80_if_timings; struct device_node *i80_if_timings;
struct resource *res;
int ret; int ret;
if (!dev->of_node) if (!dev->of_node)
...@@ -1206,15 +1243,11 @@ static int fimd_probe(struct platform_device *pdev) ...@@ -1206,15 +1243,11 @@ static int fimd_probe(struct platform_device *pdev)
if (IS_ERR(ctx->regs)) if (IS_ERR(ctx->regs))
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
ctx->i80_if ? "lcd_sys" : "vsync"); if (ret < 0)
if (!res) { return ret;
dev_err(dev, "irq request failed.\n");
return -ENXIO;
}
ret = devm_request_irq(dev, res->start, fimd_irq_handler, ret = devm_request_irq(dev, ret, fimd_irq_handler, 0, "drm_fimd", ctx);
0, "drm_fimd", ctx);
if (ret) { if (ret) {
dev_err(dev, "irq request failed.\n"); dev_err(dev, "irq request failed.\n");
return ret; return ret;
......
...@@ -1220,7 +1220,6 @@ static int gsc_probe(struct platform_device *pdev) ...@@ -1220,7 +1220,6 @@ static int gsc_probe(struct platform_device *pdev)
struct gsc_driverdata *driver_data; struct gsc_driverdata *driver_data;
struct exynos_drm_ipp_formats *formats; struct exynos_drm_ipp_formats *formats;
struct gsc_context *ctx; struct gsc_context *ctx;
struct resource *res;
int num_formats, ret, i, j; int num_formats, ret, i, j;
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
...@@ -1275,13 +1274,10 @@ static int gsc_probe(struct platform_device *pdev) ...@@ -1275,13 +1274,10 @@ static int gsc_probe(struct platform_device *pdev)
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
/* resource irq */ /* resource irq */
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ctx->irq = platform_get_irq(pdev, 0);
if (!res) { if (ctx->irq < 0)
dev_err(dev, "failed to request irq resource.\n"); return ctx->irq;
return -ENOENT;
}
ctx->irq = res->start;
ret = devm_request_irq(dev, ctx->irq, gsc_irq_handler, 0, ret = devm_request_irq(dev, ctx->irq, gsc_irq_handler, 0,
dev_name(dev), ctx); dev_name(dev), ctx);
if (ret < 0) { if (ret < 0) {
......
...@@ -809,19 +809,17 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) ...@@ -809,19 +809,17 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx)
return -ENXIO; return -ENXIO;
} }
res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_IRQ, 0); ret = platform_get_irq(mixer_ctx->pdev, 0);
if (res == NULL) { if (ret < 0)
dev_err(dev, "get interrupt resource failed.\n"); return ret;
return -ENXIO; mixer_ctx->irq = ret;
}
ret = devm_request_irq(dev, res->start, mixer_irq_handler, ret = devm_request_irq(dev, mixer_ctx->irq, mixer_irq_handler,
0, "drm_mixer", mixer_ctx); 0, "drm_mixer", mixer_ctx);
if (ret) { if (ret) {
dev_err(dev, "request interrupt failed.\n"); dev_err(dev, "request interrupt failed.\n");
return ret; return ret;
} }
mixer_ctx->irq = res->start;
return 0; return 0;
} }
......
...@@ -476,6 +476,10 @@ ...@@ -476,6 +476,10 @@
* 1111 -none- -none- -none- -none- -none- * 1111 -none- -none- -none- -none- -none-
*/ */
#define WIN_RGB_ORDER(_win) (0x2020 + ((_win) * 4))
#define WIN_RGB_ORDER_FORWARD (0 << 11)
#define WIN_RGB_ORDER_REVERSE (1 << 11)
/* FIMD Version 8 register offset definitions */ /* FIMD Version 8 register offset definitions */
#define FIMD_V8_VIDTCON0 0x20010 #define FIMD_V8_VIDTCON0 0x20010
#define FIMD_V8_VIDTCON1 0x20014 #define FIMD_V8_VIDTCON1 0x20014
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment