Message ID | 63abbe22845c3332e032053a26948486a3514fa8.1513609024.git-series.maxime.ripard@free-electrons.com |
---|---|
State | Superseded |
Headers | show |
Series | drm/sun4i: Support the Display Engine frontend | expand |
On Mon, Dec 18, 2017 at 10:57 PM, Maxime Ripard <maxime.ripard@free-electrons.com> wrote: > In some cases, the display engine needs to apply some quirks during the > VBLANK event. In the Display Engine 1.0 case for example, we can only > disable the frontend once the backend has been, which is at VBLANK. > > Let's introduce a callback that can be implemented by the various engines. > > Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> > --- > drivers/gpu/drm/sun4i/sun4i_tcon.c | 4 ++++ > drivers/gpu/drm/sun4i/sunxi_engine.h | 12 ++++++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c > index e122f5b2a395..55f54b54293c 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c > +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c > @@ -368,6 +368,7 @@ static irqreturn_t sun4i_tcon_handler(int irq, void *private) > struct sun4i_tcon *tcon = private; > struct drm_device *drm = tcon->drm; > struct sun4i_crtc *scrtc = tcon->crtc; > + struct sunxi_engine *engine = scrtc->engine; > unsigned int status; > > regmap_read(tcon->regs, SUN4I_TCON_GINT0_REG, &status); > @@ -385,6 +386,9 @@ static irqreturn_t sun4i_tcon_handler(int irq, void *private) > SUN4I_TCON_GINT0_VBLANK_INT(1), > 0); > > + if (engine->ops->vblank_quirk) > + engine->ops->vblank_quirk(engine); > + > return IRQ_HANDLED; > } > > diff --git a/drivers/gpu/drm/sun4i/sunxi_engine.h b/drivers/gpu/drm/sun4i/sunxi_engine.h > index da2dd36dfbb6..b810c26d78bb 100644 > --- a/drivers/gpu/drm/sun4i/sunxi_engine.h > +++ b/drivers/gpu/drm/sun4i/sunxi_engine.h > @@ -86,6 +86,18 @@ struct sunxi_engine_ops { > struct drm_plane **(*layers_init)(struct drm_device *drm, > struct sunxi_engine *engine); > > + /** > + * @vblank_quirk: > + * > + * This callback is used to implement backend-specific ^ engine Otherwise, Reviewed-by: Chen-Yu Tsai <wens@csie.org> > + * behaviour part of the VBLANK event. It is run with all the > + * constraints of an interrupt (can't sleep, all local > + * interrupts disabled) and therefore should be as fast as > + * possible. > + * > + * This function is optional. > + */ > + void (*vblank_quirk)(struct sunxi_engine *engine); > }; > > /** > -- > git-series 0.9.1
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index e122f5b2a395..55f54b54293c 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c @@ -368,6 +368,7 @@ static irqreturn_t sun4i_tcon_handler(int irq, void *private) struct sun4i_tcon *tcon = private; struct drm_device *drm = tcon->drm; struct sun4i_crtc *scrtc = tcon->crtc; + struct sunxi_engine *engine = scrtc->engine; unsigned int status; regmap_read(tcon->regs, SUN4I_TCON_GINT0_REG, &status); @@ -385,6 +386,9 @@ static irqreturn_t sun4i_tcon_handler(int irq, void *private) SUN4I_TCON_GINT0_VBLANK_INT(1), 0); + if (engine->ops->vblank_quirk) + engine->ops->vblank_quirk(engine); + return IRQ_HANDLED; } diff --git a/drivers/gpu/drm/sun4i/sunxi_engine.h b/drivers/gpu/drm/sun4i/sunxi_engine.h index da2dd36dfbb6..b810c26d78bb 100644 --- a/drivers/gpu/drm/sun4i/sunxi_engine.h +++ b/drivers/gpu/drm/sun4i/sunxi_engine.h @@ -86,6 +86,18 @@ struct sunxi_engine_ops { struct drm_plane **(*layers_init)(struct drm_device *drm, struct sunxi_engine *engine); + /** + * @vblank_quirk: + * + * This callback is used to implement backend-specific + * behaviour part of the VBLANK event. It is run with all the + * constraints of an interrupt (can't sleep, all local + * interrupts disabled) and therefore should be as fast as + * possible. + * + * This function is optional. + */ + void (*vblank_quirk)(struct sunxi_engine *engine); }; /**
In some cases, the display engine needs to apply some quirks during the VBLANK event. In the Display Engine 1.0 case for example, we can only disable the frontend once the backend has been, which is at VBLANK. Let's introduce a callback that can be implemented by the various engines. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> --- drivers/gpu/drm/sun4i/sun4i_tcon.c | 4 ++++ drivers/gpu/drm/sun4i/sunxi_engine.h | 12 ++++++++++++ 2 files changed, 16 insertions(+)