mirror of
https://github.com/torvalds/linux.git
synced 2025-12-01 07:26:02 +07:00
Merge tag 'exynos-drm-next-for-v6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next
New feature - Add glue layer support for Exynos7870 DSIM in Exynos DSI driver . Introduces Exynos7870 DSIM bridge integration at Exynos DRM DSI layer. Bug fixups for exynos7_drm_decon.c module - Remove redundant ctx->suspended state handling . Cleans up unused state check logic as call flow is now correctly managed. . Fixes an issue where decon_commit() was blocked from decon_atomic_enable() due to incorrect state setting. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Inki Dae <inki.dae@samsung.com> Link: https://lore.kernel.org/r/20250915113543.51294-1-inki.dae@samsung.com
This commit is contained in:
@@ -80,6 +80,21 @@ properties:
|
||||
- const: vsync
|
||||
- const: lcd_sys
|
||||
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle to a node describing a reserved framebuffer memory region.
|
||||
For example, the splash memory region set up by the bootloader.
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
Output port which is connected to either a Mobile Image Compressor
|
||||
(MIC) or a DSI Master device.
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
@@ -92,6 +107,7 @@ required:
|
||||
- clock-names
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- port
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
@@ -118,4 +134,9 @@ examples:
|
||||
"decon0_vclk";
|
||||
pinctrl-0 = <&lcd_clk &pwm1_out>;
|
||||
pinctrl-names = "default";
|
||||
port {
|
||||
decon_to_dsi: endpoint {
|
||||
remote-endpoint = <&dsi_to_decon>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -69,7 +69,6 @@ struct decon_context {
|
||||
void __iomem *regs;
|
||||
unsigned long irq_flags;
|
||||
bool i80_if;
|
||||
bool suspended;
|
||||
wait_queue_head_t wait_vsync_queue;
|
||||
atomic_t wait_vsync_event;
|
||||
|
||||
@@ -132,9 +131,6 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
|
||||
|
||||
static void decon_wait_for_vblank(struct decon_context *ctx)
|
||||
{
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
atomic_set(&ctx->wait_vsync_event, 1);
|
||||
|
||||
/*
|
||||
@@ -210,9 +206,6 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
|
||||
struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
|
||||
u32 val, clkdiv;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
/* nothing to do if we haven't set the mode yet */
|
||||
if (mode->htotal == 0 || mode->vtotal == 0)
|
||||
return;
|
||||
@@ -274,9 +267,6 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
u32 val;
|
||||
|
||||
if (ctx->suspended)
|
||||
return -EPERM;
|
||||
|
||||
if (!test_and_set_bit(0, &ctx->irq_flags)) {
|
||||
val = readl(ctx->regs + VIDINTCON0);
|
||||
|
||||
@@ -299,9 +289,6 @@ static void decon_disable_vblank(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
u32 val;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
if (test_and_clear_bit(0, &ctx->irq_flags)) {
|
||||
val = readl(ctx->regs + VIDINTCON0);
|
||||
|
||||
@@ -404,9 +391,6 @@ static void decon_atomic_begin(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
int i;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
for (i = 0; i < WINDOWS_NR; i++)
|
||||
decon_shadow_protect_win(ctx, i, true);
|
||||
}
|
||||
@@ -427,9 +411,6 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
|
||||
unsigned int pitch = fb->pitches[0];
|
||||
unsigned int vidw_addr0_base = ctx->data->vidw_buf_start_base;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
/*
|
||||
* SHADOWCON/PRTCON register is used for enabling timing.
|
||||
*
|
||||
@@ -517,9 +498,6 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
|
||||
unsigned int win = plane->index;
|
||||
u32 val;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
/* protect windows */
|
||||
decon_shadow_protect_win(ctx, win, true);
|
||||
|
||||
@@ -538,9 +516,6 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
int i;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
for (i = 0; i < WINDOWS_NR; i++)
|
||||
decon_shadow_protect_win(ctx, i, false);
|
||||
exynos_crtc_handle_event(crtc);
|
||||
@@ -568,9 +543,6 @@ static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
int ret;
|
||||
|
||||
if (!ctx->suspended)
|
||||
return;
|
||||
|
||||
ret = pm_runtime_resume_and_get(ctx->dev);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(ctx->dev, "failed to enable DECON device.\n");
|
||||
@@ -584,8 +556,6 @@ static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
|
||||
decon_enable_vblank(ctx->crtc);
|
||||
|
||||
decon_commit(ctx->crtc);
|
||||
|
||||
ctx->suspended = false;
|
||||
}
|
||||
|
||||
static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
|
||||
@@ -593,9 +563,6 @@ static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
int i;
|
||||
|
||||
if (ctx->suspended)
|
||||
return;
|
||||
|
||||
/*
|
||||
* We need to make sure that all windows are disabled before we
|
||||
* suspend that connector. Otherwise we might try to scan from
|
||||
@@ -605,8 +572,6 @@ static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
|
||||
decon_disable_plane(crtc, &ctx->planes[i]);
|
||||
|
||||
pm_runtime_put_sync(ctx->dev);
|
||||
|
||||
ctx->suspended = true;
|
||||
}
|
||||
|
||||
static const struct exynos_drm_crtc_ops decon_crtc_ops = {
|
||||
@@ -727,7 +692,6 @@ static int decon_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
ctx->dev = dev;
|
||||
ctx->suspended = true;
|
||||
ctx->data = of_device_get_match_data(dev);
|
||||
|
||||
i80_if_timings = of_get_child_by_name(dev->of_node, "i80-if-timings");
|
||||
|
||||
@@ -154,6 +154,11 @@ static const struct samsung_dsim_plat_data exynos5433_dsi_pdata = {
|
||||
.host_ops = &exynos_dsi_exynos_host_ops,
|
||||
};
|
||||
|
||||
static const struct samsung_dsim_plat_data exynos7870_dsi_pdata = {
|
||||
.hw_type = DSIM_TYPE_EXYNOS7870,
|
||||
.host_ops = &exynos_dsi_exynos_host_ops,
|
||||
};
|
||||
|
||||
static const struct of_device_id exynos_dsi_of_match[] = {
|
||||
{
|
||||
.compatible = "samsung,exynos3250-mipi-dsi",
|
||||
@@ -175,6 +180,10 @@ static const struct of_device_id exynos_dsi_of_match[] = {
|
||||
.compatible = "samsung,exynos5433-mipi-dsi",
|
||||
.data = &exynos5433_dsi_pdata,
|
||||
},
|
||||
{
|
||||
.compatible = "samsung,exynos7870-mipi-dsi",
|
||||
.data = &exynos7870_dsi_pdata,
|
||||
},
|
||||
{ /* sentinel. */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
|
||||
|
||||
Reference in New Issue
Block a user