summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/exynos
diff options
context:
space:
mode:
authorJagan Teki <jagan@amarulasolutions.com>2023-03-08 19:39:48 +0300
committerInki Dae <inki.dae@samsung.com>2023-03-28 03:05:40 +0300
commit48b64ba81f6b4677f0eba812916f7e90e883764f (patch)
treef94080847d66d4978462e542552e4df555ee93e6 /drivers/gpu/drm/exynos
parent70e360f9b548d99f959668d4f047d1363d42fe8e (diff)
downloadlinux-48b64ba81f6b4677f0eba812916f7e90e883764f.tar.xz
drm: exynos: dsi: Add host helper for te_irq_handler
IRQ handler for te-gpio seems to be common across DSIM host. However, Exynos is handling this via CRTC drivers but there is no clear evidence on how the same has been handled in i.MX8MM. Keeping the handler as-it-is can be a viable option but adding DSIM bridge core in upcoming patches is not possible to call Exynos CRTC handler as DSIM bridge has to be common across DRM bridge core instead of platform specific DRM drivers like Exynos here. So, this patch handles the handler via platform host helper, so-that handling platform specific hook across Exynos and generic can be reasonable till it makes it generic across all platforms. Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Marek Vasut <marex@denx.de> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dsi.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 01ed1677a4fd..b75b5cc88bc8 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -325,6 +325,7 @@ struct exynos_dsim_host_ops {
void (*unregister_host)(struct exynos_dsi *dsim);
int (*attach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device);
void (*detach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device);
+ irqreturn_t (*te_irq_handler)(struct exynos_dsi *dsim);
};
struct exynos_dsi_enc {
@@ -1333,11 +1334,10 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id)
static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id)
{
struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id;
- struct exynos_dsi_enc *dsi_enc = dsi->priv;
- struct drm_encoder *encoder = &dsi_enc->encoder;
+ const struct exynos_dsi_plat_data *pdata = dsi->plat_data;
- if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE)
- exynos_drm_crtc_te_handler(encoder->crtc);
+ if (pdata->host_ops && pdata->host_ops->te_irq_handler)
+ return pdata->host_ops->te_irq_handler(dsi);
return IRQ_HANDLED;
}
@@ -1771,6 +1771,17 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
return 0;
}
+static irqreturn_t exynos_dsim_te_irq_handler(struct exynos_dsi *dsim)
+{
+ struct exynos_dsi_enc *dsi_enc = dsim->priv;
+ struct drm_encoder *encoder = &dsi_enc->encoder;
+
+ if (dsim->state & DSIM_STATE_VIDOUT_AVAILABLE)
+ exynos_drm_crtc_te_handler(encoder->crtc);
+
+ return IRQ_HANDLED;
+}
+
static int exynos_dsim_host_attach(struct exynos_dsi *dsim,
struct mipi_dsi_device *device)
{
@@ -2068,6 +2079,7 @@ static const struct exynos_dsim_host_ops exynos_dsi_host_ops = {
.unregister_host = exynos_dsi_unregister_host,
.attach = exynos_dsim_host_attach,
.detach = exynos_dsim_host_detach,
+ .te_irq_handler = exynos_dsim_te_irq_handler,
};
static const struct exynos_dsi_plat_data exynos3250_dsi_pdata = {