Skip to content

Commit e670070

Browse files
committed
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: Dave 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
2 parents 6de7e4f + 2d684f4 commit e670070

7 files changed

Lines changed: 69 additions & 45 deletions

File tree

drivers/gpu/drm/exynos/exynos7_drm_decon.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,6 @@ static int decon_probe(struct platform_device *pdev)
678678
struct device *dev = &pdev->dev;
679679
struct decon_context *ctx;
680680
struct device_node *i80_if_timings;
681-
struct resource *res;
682681
int ret;
683682

684683
if (!dev->of_node)
@@ -728,16 +727,11 @@ static int decon_probe(struct platform_device *pdev)
728727
goto err_iounmap;
729728
}
730729

731-
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
732-
ctx->i80_if ? "lcd_sys" : "vsync");
733-
if (!res) {
734-
dev_err(dev, "irq request failed.\n");
735-
ret = -ENXIO;
730+
ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
731+
if (ret < 0)
736732
goto err_iounmap;
737-
}
738733

739-
ret = devm_request_irq(dev, res->start, decon_irq_handler,
740-
0, "drm_decon", ctx);
734+
ret = devm_request_irq(dev, ret, decon_irq_handler, 0, "drm_decon", ctx);
741735
if (ret) {
742736
dev_err(dev, "irq request failed.\n");
743737
goto err_iounmap;

drivers/gpu/drm/exynos/exynos_drm_dsi.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,8 +1335,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi,
13351335
int ret;
13361336
int te_gpio_irq;
13371337

1338-
dsi->te_gpio = devm_gpiod_get_optional(dsi->dev, "te", GPIOD_IN);
1339-
if (IS_ERR(dsi->te_gpio)) {
1338+
dsi->te_gpio = gpiod_get_optional(panel, "te", GPIOD_IN);
1339+
if (!dsi->te_gpio) {
1340+
return 0;
1341+
} else if (IS_ERR(dsi->te_gpio)) {
13401342
dev_err(dsi->dev, "gpio request failed with %ld\n",
13411343
PTR_ERR(dsi->te_gpio));
13421344
return PTR_ERR(dsi->te_gpio);

drivers/gpu/drm/exynos/exynos_drm_fimc.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,6 @@ static int fimc_probe(struct platform_device *pdev)
12671267
struct exynos_drm_ipp_formats *formats;
12681268
struct device *dev = &pdev->dev;
12691269
struct fimc_context *ctx;
1270-
struct resource *res;
12711270
int ret;
12721271
int i, j, num_limits, num_formats;
12731272

@@ -1330,14 +1329,12 @@ static int fimc_probe(struct platform_device *pdev)
13301329
return PTR_ERR(ctx->regs);
13311330

13321331
/* resource irq */
1333-
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1334-
if (!res) {
1335-
dev_err(dev, "failed to request irq resource.\n");
1336-
return -ENOENT;
1337-
}
1332+
ret = platform_get_irq(pdev, 0);
1333+
if (ret < 0)
1334+
return ret;
13381335

1339-
ret = devm_request_irq(dev, res->start, fimc_irq_handler,
1340-
0, dev_name(dev), ctx);
1336+
ret = devm_request_irq(dev, ret, fimc_irq_handler,
1337+
0, dev_name(dev), ctx);
13411338
if (ret < 0) {
13421339
dev_err(dev, "failed to request irq.\n");
13431340
return ret;

drivers/gpu/drm/exynos/exynos_drm_fimd.c

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ struct fimd_driver_data {
109109
unsigned int has_dp_clk:1;
110110
unsigned int has_hw_trigger:1;
111111
unsigned int has_trigger_per_te:1;
112+
unsigned int has_bgr_support:1;
112113
};
113114

114115
static struct fimd_driver_data s3c64xx_fimd_driver_data = {
@@ -138,6 +139,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = {
138139
.lcdblk_bypass_shift = 1,
139140
.has_shadowcon = 1,
140141
.has_vtsel = 1,
142+
.has_bgr_support = 1,
141143
};
142144

143145
static struct fimd_driver_data exynos5_fimd_driver_data = {
@@ -149,6 +151,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = {
149151
.has_vidoutcon = 1,
150152
.has_vtsel = 1,
151153
.has_dp_clk = 1,
154+
.has_bgr_support = 1,
152155
};
153156

154157
static struct fimd_driver_data exynos5420_fimd_driver_data = {
@@ -162,6 +165,7 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = {
162165
.has_vtsel = 1,
163166
.has_mic_bypass = 1,
164167
.has_dp_clk = 1,
168+
.has_bgr_support = 1,
165169
};
166170

167171
struct fimd_context {
@@ -226,6 +230,18 @@ static const uint32_t fimd_formats[] = {
226230
DRM_FORMAT_ARGB8888,
227231
};
228232

233+
static const uint32_t fimd_extended_formats[] = {
234+
DRM_FORMAT_C8,
235+
DRM_FORMAT_XRGB1555,
236+
DRM_FORMAT_XBGR1555,
237+
DRM_FORMAT_RGB565,
238+
DRM_FORMAT_BGR565,
239+
DRM_FORMAT_XRGB8888,
240+
DRM_FORMAT_XBGR8888,
241+
DRM_FORMAT_ARGB8888,
242+
DRM_FORMAT_ABGR8888,
243+
};
244+
229245
static const unsigned int capabilities[WINDOWS_NR] = {
230246
0,
231247
EXYNOS_DRM_PLANE_CAP_WIN_BLEND | EXYNOS_DRM_PLANE_CAP_PIX_BLEND,
@@ -673,28 +689,44 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
673689
val |= WINCONx_BYTSWP;
674690
break;
675691
case DRM_FORMAT_XRGB1555:
692+
case DRM_FORMAT_XBGR1555:
676693
val |= WINCON0_BPPMODE_16BPP_1555;
677694
val |= WINCONx_HAWSWP;
678695
val |= WINCONx_BURSTLEN_16WORD;
679696
break;
680697
case DRM_FORMAT_RGB565:
698+
case DRM_FORMAT_BGR565:
681699
val |= WINCON0_BPPMODE_16BPP_565;
682700
val |= WINCONx_HAWSWP;
683701
val |= WINCONx_BURSTLEN_16WORD;
684702
break;
685703
case DRM_FORMAT_XRGB8888:
704+
case DRM_FORMAT_XBGR8888:
686705
val |= WINCON0_BPPMODE_24BPP_888;
687706
val |= WINCONx_WSWP;
688707
val |= WINCONx_BURSTLEN_16WORD;
689708
break;
690709
case DRM_FORMAT_ARGB8888:
710+
case DRM_FORMAT_ABGR8888:
691711
default:
692712
val |= WINCON1_BPPMODE_25BPP_A1888;
693713
val |= WINCONx_WSWP;
694714
val |= WINCONx_BURSTLEN_16WORD;
695715
break;
696716
}
697717

718+
switch (pixel_format) {
719+
case DRM_FORMAT_XBGR1555:
720+
case DRM_FORMAT_XBGR8888:
721+
case DRM_FORMAT_ABGR8888:
722+
case DRM_FORMAT_BGR565:
723+
writel(WIN_RGB_ORDER_REVERSE, ctx->regs + WIN_RGB_ORDER(win));
724+
break;
725+
default:
726+
writel(WIN_RGB_ORDER_FORWARD, ctx->regs + WIN_RGB_ORDER(win));
727+
break;
728+
}
729+
698730
/*
699731
* Setting dma-burst to 16Word causes permanent tearing for very small
700732
* 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)
10741106
ctx->drm_dev = drm_dev;
10751107

10761108
for (i = 0; i < WINDOWS_NR; i++) {
1077-
ctx->configs[i].pixel_formats = fimd_formats;
1078-
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats);
1109+
if (ctx->driver_data->has_bgr_support) {
1110+
ctx->configs[i].pixel_formats = fimd_extended_formats;
1111+
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_extended_formats);
1112+
} else {
1113+
ctx->configs[i].pixel_formats = fimd_formats;
1114+
ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats);
1115+
}
1116+
10791117
ctx->configs[i].zpos = i;
10801118
ctx->configs[i].type = fimd_win_types[i];
10811119
ctx->configs[i].capabilities = capabilities[i];
@@ -1133,7 +1171,6 @@ static int fimd_probe(struct platform_device *pdev)
11331171
struct device *dev = &pdev->dev;
11341172
struct fimd_context *ctx;
11351173
struct device_node *i80_if_timings;
1136-
struct resource *res;
11371174
int ret;
11381175

11391176
if (!dev->of_node)
@@ -1206,15 +1243,11 @@ static int fimd_probe(struct platform_device *pdev)
12061243
if (IS_ERR(ctx->regs))
12071244
return PTR_ERR(ctx->regs);
12081245

1209-
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
1210-
ctx->i80_if ? "lcd_sys" : "vsync");
1211-
if (!res) {
1212-
dev_err(dev, "irq request failed.\n");
1213-
return -ENXIO;
1214-
}
1246+
ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
1247+
if (ret < 0)
1248+
return ret;
12151249

1216-
ret = devm_request_irq(dev, res->start, fimd_irq_handler,
1217-
0, "drm_fimd", ctx);
1250+
ret = devm_request_irq(dev, ret, fimd_irq_handler, 0, "drm_fimd", ctx);
12181251
if (ret) {
12191252
dev_err(dev, "irq request failed.\n");
12201253
return ret;

drivers/gpu/drm/exynos/exynos_drm_gsc.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,6 @@ static int gsc_probe(struct platform_device *pdev)
12201220
struct gsc_driverdata *driver_data;
12211221
struct exynos_drm_ipp_formats *formats;
12221222
struct gsc_context *ctx;
1223-
struct resource *res;
12241223
int num_formats, ret, i, j;
12251224

12261225
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
@@ -1275,13 +1274,10 @@ static int gsc_probe(struct platform_device *pdev)
12751274
return PTR_ERR(ctx->regs);
12761275

12771276
/* resource irq */
1278-
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1279-
if (!res) {
1280-
dev_err(dev, "failed to request irq resource.\n");
1281-
return -ENOENT;
1282-
}
1277+
ctx->irq = platform_get_irq(pdev, 0);
1278+
if (ctx->irq < 0)
1279+
return ctx->irq;
12831280

1284-
ctx->irq = res->start;
12851281
ret = devm_request_irq(dev, ctx->irq, gsc_irq_handler, 0,
12861282
dev_name(dev), ctx);
12871283
if (ret < 0) {

drivers/gpu/drm/exynos/exynos_mixer.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -809,19 +809,17 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx)
809809
return -ENXIO;
810810
}
811811

812-
res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_IRQ, 0);
813-
if (res == NULL) {
814-
dev_err(dev, "get interrupt resource failed.\n");
815-
return -ENXIO;
816-
}
812+
ret = platform_get_irq(mixer_ctx->pdev, 0);
813+
if (ret < 0)
814+
return ret;
815+
mixer_ctx->irq = ret;
817816

818-
ret = devm_request_irq(dev, res->start, mixer_irq_handler,
819-
0, "drm_mixer", mixer_ctx);
817+
ret = devm_request_irq(dev, mixer_ctx->irq, mixer_irq_handler,
818+
0, "drm_mixer", mixer_ctx);
820819
if (ret) {
821820
dev_err(dev, "request interrupt failed.\n");
822821
return ret;
823822
}
824-
mixer_ctx->irq = res->start;
825823

826824
return 0;
827825
}

include/video/samsung_fimd.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,10 @@
476476
* 1111 -none- -none- -none- -none- -none-
477477
*/
478478

479+
#define WIN_RGB_ORDER(_win) (0x2020 + ((_win) * 4))
480+
#define WIN_RGB_ORDER_FORWARD (0 << 11)
481+
#define WIN_RGB_ORDER_REVERSE (1 << 11)
482+
479483
/* FIMD Version 8 register offset definitions */
480484
#define FIMD_V8_VIDTCON0 0x20010
481485
#define FIMD_V8_VIDTCON1 0x20014

0 commit comments

Comments
 (0)