drm/exynos: Use manager_op initialize in fimd
This patch implements the intitialize manager op in fimd. This will allow us to keep track of drm_dev in context instead of using subdev, which in turn makes it easier to remove subdev from fimd. Signed-off-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
Родитель
1f9cafc3ad
Коммит
40c8ab4bcc
|
@ -106,6 +106,7 @@ struct fimd_win_data {
|
||||||
|
|
||||||
struct fimd_context {
|
struct fimd_context {
|
||||||
struct exynos_drm_subdrv subdrv;
|
struct exynos_drm_subdrv subdrv;
|
||||||
|
struct drm_device *drm_dev;
|
||||||
int irq;
|
int irq;
|
||||||
struct drm_crtc *crtc;
|
struct drm_crtc *crtc;
|
||||||
struct clk *bus_clk;
|
struct clk *bus_clk;
|
||||||
|
@ -181,6 +182,16 @@ static struct exynos_drm_display_ops fimd_display_ops = {
|
||||||
.power_on = fimd_display_power_on,
|
.power_on = fimd_display_power_on,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int fimd_mgr_initialize(struct device *subdrv_dev,
|
||||||
|
struct drm_device *drm_dev)
|
||||||
|
{
|
||||||
|
struct fimd_context *ctx = get_fimd_context(subdrv_dev);
|
||||||
|
|
||||||
|
ctx->drm_dev = drm_dev;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void fimd_dpms(struct device *subdrv_dev, int mode)
|
static void fimd_dpms(struct device *subdrv_dev, int mode)
|
||||||
{
|
{
|
||||||
struct fimd_context *ctx = get_fimd_context(subdrv_dev);
|
struct fimd_context *ctx = get_fimd_context(subdrv_dev);
|
||||||
|
@ -660,6 +671,7 @@ static void fimd_win_disable(struct device *dev, int zpos)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct exynos_drm_manager_ops fimd_manager_ops = {
|
static struct exynos_drm_manager_ops fimd_manager_ops = {
|
||||||
|
.initialize = fimd_mgr_initialize,
|
||||||
.dpms = fimd_dpms,
|
.dpms = fimd_dpms,
|
||||||
.apply = fimd_apply,
|
.apply = fimd_apply,
|
||||||
.commit = fimd_commit,
|
.commit = fimd_commit,
|
||||||
|
@ -681,7 +693,6 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct fimd_context *ctx = (struct fimd_context *)dev_id;
|
struct fimd_context *ctx = (struct fimd_context *)dev_id;
|
||||||
struct exynos_drm_subdrv *subdrv = &ctx->subdrv;
|
struct exynos_drm_subdrv *subdrv = &ctx->subdrv;
|
||||||
struct drm_device *drm_dev = subdrv->drm_dev;
|
|
||||||
struct exynos_drm_manager *manager = subdrv->manager;
|
struct exynos_drm_manager *manager = subdrv->manager;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
@ -692,11 +703,11 @@ static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
|
||||||
writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);
|
writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);
|
||||||
|
|
||||||
/* check the crtc is detached already from encoder */
|
/* check the crtc is detached already from encoder */
|
||||||
if (manager->pipe < 0)
|
if (manager->pipe < 0 || !ctx->drm_dev)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
drm_handle_vblank(drm_dev, manager->pipe);
|
drm_handle_vblank(ctx->drm_dev, manager->pipe);
|
||||||
exynos_drm_crtc_finish_pageflip(drm_dev, manager->pipe);
|
exynos_drm_crtc_finish_pageflip(ctx->drm_dev, manager->pipe);
|
||||||
|
|
||||||
/* set wait vsync event to zero and wake up queue. */
|
/* set wait vsync event to zero and wake up queue. */
|
||||||
if (atomic_read(&ctx->wait_vsync_event)) {
|
if (atomic_read(&ctx->wait_vsync_event)) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче