From 92cfc143cc00d923b50c251445c7055aa10fd4c1 Mon Sep 17 00:00:00 2001 From: Sean Paul Date: Wed, 13 Feb 2013 14:52:26 -0500 Subject: [PATCH] drm/exynos: Untangle dpms a little This patch strives to simplify the various dpms paths. The overarching goal is to not get into a situation where connector->dpms is out of touch with the rest of the driver since that effectively disables userspace control of the power. The patch also eliminates the duplicate paths through crtc and encoder. BUG=chromium-os:37797 TEST=Tested hotplug; idle suspend/resume; idle off/on; lid suspend/resume; powerd_suspend/resume. No regressions noted Change-Id: I79376e07500633505eb0159edac9a4ed9054b0e4 Signed-off-by: Sean Paul Reviewed-on: https://gerrit.chromium.org/gerrit/43196 --- drivers/gpu/drm/exynos/exynos_dp_core.c | 8 +- drivers/gpu/drm/exynos/exynos_drm_connector.c | 1 + drivers/gpu/drm/exynos/exynos_drm_crtc.c | 68 +------ drivers/gpu/drm/exynos/exynos_drm_display.h | 8 +- drivers/gpu/drm/exynos/exynos_drm_drv.c | 15 +- drivers/gpu/drm/exynos/exynos_drm_encoder.c | 172 ++++++------------ drivers/gpu/drm/exynos/exynos_drm_fimd.c | 8 +- drivers/gpu/drm/exynos/exynos_hdmi.c | 4 +- drivers/gpu/drm/exynos/exynos_mixer.c | 8 +- 9 files changed, 83 insertions(+), 209 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c index d787cd8adda9..b56c733e0629 100644 --- a/drivers/gpu/drm/exynos/exynos_dp_core.c +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c @@ -1024,7 +1024,7 @@ static int exynos_dp_power_on(struct exynos_dp_device *dp) return 0; } -static int exynos_dp_power(void *ctx, int mode) +static int exynos_dp_dpms(void *ctx, int mode) { struct exynos_dp_device *dp = ctx; @@ -1070,7 +1070,7 @@ static int exynos_dp_subdrv_probe(void *ctx, struct drm_device *drm_dev) dp->drm_dev = drm_dev; - exynos_dp_power(dp, DRM_MODE_DPMS_ON); + exynos_dp_dpms(dp, DRM_MODE_DPMS_ON); return 0; } @@ -1079,7 +1079,7 @@ static struct exynos_panel_ops dp_panel_ops = { .subdrv_probe = exynos_dp_subdrv_probe, .is_connected = exynos_dp_is_connected, .check_timing = exynos_dp_check_timing, - .power = exynos_dp_power, + .dpms = exynos_dp_dpms, }; static int __devinit exynos_dp_probe(struct platform_device *pdev) @@ -1199,7 +1199,7 @@ static int __devexit exynos_dp_remove(struct platform_device *pdev) struct exynos_dp_device *dp = platform_get_drvdata(pdev); /* power_off will take care of flushing the hotplug_work */ - exynos_dp_power(dp, DRM_MODE_DPMS_OFF); + exynos_dp_dpms(dp, DRM_MODE_DPMS_OFF); if (gpio_is_valid(dp->hpd_gpio)) gpio_free(dp->hpd_gpio); diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 8e92d007ab73..b7ddae574413 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c @@ -310,6 +310,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev, } connector = &exynos_connector->drm_connector; + connector->dpms = DRM_MODE_DPMS_OFF; switch (display->display_type) { case EXYNOS_DRM_DISPLAY_TYPE_MIXER: diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 28631e416e3b..db9167aca766 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -62,7 +62,6 @@ struct exynos_drm_flip_desc { * drm framework doesn't support multiple irq yet. * we can refer to the crtc to current hardware interrupt occured through * this pipe value. - * @dpms: store the crtc dpms value * @flip_pending: there is a flip pending that we need to process next vblank */ struct exynos_drm_crtc { @@ -72,7 +71,6 @@ struct exynos_drm_crtc { DECLARE_KFIFO(flip_fifo, struct exynos_drm_flip_desc, 2); struct exynos_drm_flip_desc scanout_desc; unsigned int pipe; - unsigned int dpms; atomic_t flip_pending; }; @@ -293,40 +291,12 @@ static void exynos_drm_crtc_release_flips(struct drm_crtc *crtc) static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) { - struct drm_device *dev = crtc->dev; - struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); - if (exynos_crtc->dpms == mode) { - DRM_DEBUG_KMS("desired dpms mode is same as previous one.\n"); - return; - } - - mutex_lock(&dev->struct_mutex); - - switch (mode) { - case DRM_MODE_DPMS_ON: - exynos_drm_fn_encoder(crtc, &mode, - exynos_drm_encoder_crtc_dpms); - exynos_crtc->dpms = mode; - break; - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: - exynos_drm_fn_encoder(crtc, &mode, - exynos_drm_encoder_crtc_dpms); #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS + if (mode != DRM_MODE_DPMS_ON) exynos_drm_crtc_release_flips(crtc); #endif - exynos_crtc->dpms = mode; - break; - default: - DRM_ERROR("unspecified mode %d\n", mode); - break; - } - - mutex_unlock(&dev->struct_mutex); } static void exynos_drm_crtc_disable(struct drm_crtc *crtc) @@ -352,8 +322,7 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc, static void exynos_drm_crtc_commit(struct drm_crtc *crtc) { - struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); - int ret; + int ret, mode = DRM_MODE_DPMS_ON; DRM_DEBUG_KMS("%s\n", __FILE__); @@ -363,27 +332,9 @@ static void exynos_drm_crtc_commit(struct drm_crtc *crtc) * no power on then crtc->dpms should be called * with DRM_MODE_DPMS_ON for the hardware power to be on. */ - if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) { - int mode = DRM_MODE_DPMS_ON; + exynos_drm_crtc_dpms(crtc, mode); - /* - * TODO(seanpaul): This has the nasty habit of calling the - * underlying dpms/power callbacks twice on boot. This code - * needs to be cleaned up so this doesn't happen. - */ - - /* - * enable hardware(power on) to all encoders hdmi connected - * to current crtc. - */ - exynos_drm_crtc_dpms(crtc, mode); - /* - * enable dma to all encoders connected to current crtc and - * lcd panel. - */ - exynos_drm_fn_encoder(crtc, &mode, - exynos_drm_encoder_dpms_from_crtc); - } + exynos_drm_fn_encoder(crtc, &mode, exynos_drm_encoder_crtc_dpms); ret = exynos_drm_crtc_page_flip(crtc, crtc->fb, NULL); if (ret) @@ -699,7 +650,6 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr) INIT_KFIFO(exynos_crtc->flip_fifo); exynos_crtc->pipe = nr; - exynos_crtc->dpms = DRM_MODE_DPMS_OFF; exynos_crtc->overlay.zpos = DEFAULT_ZPOS; crtc = &exynos_crtc->drm_crtc; @@ -714,14 +664,9 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr) int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc) { struct exynos_drm_private *private = dev->dev_private; - struct exynos_drm_crtc *exynos_crtc = - to_exynos_crtc(private->crtc[crtc]); DRM_DEBUG_KMS("%s\n", __FILE__); - if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) - return -EPERM; - exynos_drm_fn_encoder(private->crtc[crtc], &crtc, exynos_drm_enable_vblank); @@ -731,14 +676,9 @@ int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc) void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc) { struct exynos_drm_private *private = dev->dev_private; - struct exynos_drm_crtc *exynos_crtc = - to_exynos_crtc(private->crtc[crtc]); DRM_DEBUG_KMS("%s\n", __FILE__); - if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) - return; - exynos_drm_fn_encoder(private->crtc[crtc], &crtc, exynos_drm_disable_vblank); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_display.h b/drivers/gpu/drm/exynos/exynos_drm_display.h index dfc386c46d65..e2762d6669dd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_display.h +++ b/drivers/gpu/drm/exynos/exynos_drm_display.h @@ -21,8 +21,7 @@ * @is_connected: Returns true if the panel is connected * @get_edid: Returns an edid with mode data from the panel * @check_timing: Returns 0 if the given timing is valid for the panel - * @power: Sets the panel's power to mode - * @dpms: Same as power, but called in different places. Best to avoid it + * @dpms: Sets the panel's power to mode * @mode_fixup: Copies and optionally alters mode to adjusted_mode * @mode_set: Sets the panel to output mode * @commit: Commits changes to the panel from mode_set @@ -33,7 +32,6 @@ struct exynos_panel_ops { bool (*is_connected)(void *ctx); struct edid *(*get_edid)(void *ctx, struct drm_connector *connector); int (*check_timing)(void *ctx, void *timing); - int (*power)(void *ctx, int mode); int (*dpms)(void *ctx, int mode); void (*mode_fixup)(void *ctx, struct drm_connector *connector, struct drm_display_mode *mode, @@ -51,8 +49,7 @@ struct exynos_panel_ops { * @get_panel: If we're not using edid, return the panel info * @enable_vblank: Enable the controller's vblank interrupt and set pipe * @disable_vblank: Disable the controller's vblank interrupt - * @power: Sets the controller's power to mode - * @dpms: Same as power, but called in different places. Best to avoid it + * @dpms: Sets the controller's power to mode * @mode_set: Sets the controller to output mode * @commit: Applies controller level settings (as opposed to window level) * @win_commit: Commits the changes on only one window @@ -63,7 +60,6 @@ struct exynos_controller_ops { struct exynos_drm_panel_info *(*get_panel)(void *ctx); int (*enable_vblank)(void *ctx, int pipe); void (*disable_vblank)(void *ctx); - int (*power)(void *ctx, int mode); int (*dpms)(void *ctx, int mode); void (*mode_set)(void *ctx, struct exynos_drm_overlay *overlay); void (*commit)(void *ctx); diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index b326f66cb2de..88ab6cae29b7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -478,12 +478,12 @@ static int exynos_drm_resume_displays(void) for (i = 0; i < EXYNOS_DRM_DISPLAY_NUM_DISPLAYS; i++) { struct exynos_drm_display *display = displays[i]; - struct drm_encoder *encoder = display->subdrv->encoder; + struct drm_connector *connector = display->subdrv->connector; - if (!encoder) + if (!connector || !connector->funcs->dpms) continue; - exynos_drm_encoder_dpms(encoder, display->suspend_dpms); + connector->funcs->dpms(connector, display->suspend_dpms); } return 0; } @@ -494,13 +494,14 @@ static int exynos_drm_suspend_displays(void) for (i = 0; i < EXYNOS_DRM_DISPLAY_NUM_DISPLAYS; i++) { struct exynos_drm_display *display = displays[i]; - struct drm_encoder *encoder = display->subdrv->encoder; + struct drm_connector *connector = display->subdrv->connector; - if (!encoder) + if (!connector) continue; - display->suspend_dpms = exynos_drm_encoder_get_dpms(encoder); - exynos_drm_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); + display->suspend_dpms = connector->dpms; + if (connector->funcs->dpms) + connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF); } return 0; } diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 040f4778ed3e..55960f4c2a91 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c @@ -53,51 +53,42 @@ struct exynos_drm_encoder { static void exynos_drm_display_power(struct drm_encoder *encoder, int mode) { - struct drm_device *dev = encoder->dev; - struct drm_connector *connector; - struct exynos_drm_display *display = exynos_drm_get_display(encoder); struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); + struct exynos_drm_display *display = exynos_drm_get_display(encoder); - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { - if (connector->encoder != encoder) - continue; + /* + * We want to make sure we order things correctly here. When + * turning on, start the controller, then the panel. When + * turning off, do the reverse. + */ + switch (mode) { + case DRM_MODE_DPMS_ON: + if (display->controller_ops->dpms) + display->controller_ops->dpms( + display->controller_ctx, mode); - DRM_DEBUG_KMS("connector[%d] dpms[%d]\n", connector->base.id, - mode); + if (display->panel_ops->dpms) + display->panel_ops->dpms(display->panel_ctx, + mode); - /* We want to make sure we order things correctly here. When - * turning on, start the controller, then the panel. When - * turning off, do the reverse. - */ - switch (mode) { - case DRM_MODE_DPMS_ON: - if (display->controller_ops->power) - display->controller_ops->power( - display->controller_ctx, mode); + exynos_encoder->dpms = mode; + break; + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + case DRM_MODE_DPMS_OFF: + if (display->panel_ops->dpms) + display->panel_ops->dpms(display->panel_ctx, + mode); - if (display->panel_ops->power) - display->panel_ops->power(display->panel_ctx, - mode); + if (display->controller_ops->dpms) + display->controller_ops->dpms( + display->controller_ctx, mode); - exynos_encoder->dpms = mode; - break; - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: - if (display->panel_ops->power) - display->panel_ops->power(display->panel_ctx, - mode); - - if (display->controller_ops->power) - display->controller_ops->power( - display->controller_ctx, mode); - - exynos_encoder->dpms = mode; - break; - default: - DRM_ERROR("Unknown dpms mode: %d\n", mode); + exynos_encoder->dpms = mode; + break; + default: + DRM_ERROR("Unknown dpms mode: %d\n", mode); break; - } } } @@ -114,10 +105,18 @@ int exynos_drm_encoder_get_dpms(struct drm_encoder *encoder) return mode; } +void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data) +{ + int mode = *(int *)data; + + exynos_drm_encoder_dpms(encoder, mode); +} + void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode) { struct drm_device *dev = encoder->dev; struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); + struct exynos_drm_display *display = exynos_drm_get_display(encoder); DRM_DEBUG_KMS("%s, encoder dpms: %d\n", __FILE__, mode); @@ -129,19 +128,15 @@ void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode) return; } - switch (mode) { - case DRM_MODE_DPMS_ON: - exynos_drm_display_power(encoder, mode); - break; - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: - exynos_drm_display_power(encoder, mode); - break; - default: - DRM_ERROR("unspecified mode %d\n", mode); - break; - } + exynos_drm_display_power(encoder, mode); + + /* + * if this condition is ok then it means that the crtc is already + * detached from encoder and last function for detaching is properly + * done, so clear pipe from display to prevent repeated call. + */ + if (mode > DRM_MODE_DPMS_ON && !encoder->crtc) + display->pipe = -1; mutex_unlock(&dev->struct_mutex); } @@ -347,9 +342,13 @@ void exynos_drm_fn_encoder(struct drm_crtc *crtc, void *data, void exynos_drm_enable_vblank(struct drm_encoder *encoder, void *data) { + struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); struct exynos_drm_display *display = exynos_drm_get_display(encoder); int crtc = *(int *)data; + if (exynos_encoder->dpms != DRM_MODE_DPMS_ON) + return; + if (display->pipe == -1) display->pipe = crtc; @@ -361,9 +360,13 @@ void exynos_drm_enable_vblank(struct drm_encoder *encoder, void *data) void exynos_drm_disable_vblank(struct drm_encoder *encoder, void *data) { + struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); struct exynos_drm_display *display = exynos_drm_get_display(encoder); int crtc = *(int *)data; + if (exynos_encoder->dpms != DRM_MODE_DPMS_ON) + return; + /* * TODO(seanpaul): This seems like a hack. I don't think it's actually * needed for 2 reasons: @@ -411,73 +414,6 @@ void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data) exynos_drm_encoder_crtc_plane_commit(encoder, &zpos); } -void exynos_drm_encoder_dpms_from_crtc(struct drm_encoder *encoder, void *data) -{ - int mode = *(int *)data; - - DRM_DEBUG_KMS("%s\n", __FILE__); - - exynos_drm_encoder_dpms(encoder, mode); -} - -void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data) -{ - struct drm_device *dev = encoder->dev; - struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); - struct exynos_drm_display *display = exynos_encoder->display; - struct drm_connector *connector; - int mode = *(int *)data; - - DRM_DEBUG_KMS("%s\n", __FILE__); - - /* We want to make sure we order things correctly here. When turning on, - * start the controller, then the panel. When turning off, do the - * reverse. - */ - switch (mode) { - case DRM_MODE_DPMS_ON: - if (display->controller_ops->dpms) - display->controller_ops->dpms(display->controller_ctx, - mode); - - if (display->panel_ops->dpms) - display->panel_ops->dpms(display->panel_ctx, mode); - break; - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: - if (display->panel_ops->dpms) - display->panel_ops->dpms(display->panel_ctx, mode); - - if (display->controller_ops->dpms) - display->controller_ops->dpms(display->controller_ctx, - mode); - break; - default: - DRM_ERROR("Unknown dpms mode: %d\n", mode); - break; - } - - /* - * set current dpms mode to the connector connected to - * current encoder. connector->dpms would be checked - * at drm_helper_connector_dpms() - */ - list_for_each_entry(connector, &dev->mode_config.connector_list, head) - if (connector->encoder == encoder) - connector->dpms = mode; - - /* - * if this condition is ok then it means that the crtc is already - * detached from encoder and last function for detaching is properly - * done, so clear pipe from display to prevent repeated call. - */ - if (mode > DRM_MODE_DPMS_ON) { - if (!encoder->crtc) - display->pipe = -1; - } -} - void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data) { struct exynos_drm_display *display = exynos_drm_get_display(encoder); diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 82ca11a67a5b..2271c802524d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -120,7 +120,7 @@ static struct exynos_drm_panel_info *fimd_get_panel(void *ctx) static int fimd_power_on(struct fimd_context *ctx, bool enable); -static int fimd_power(void *ctx, int mode) +static int fimd_dpms(void *ctx, int mode) { struct fimd_context *fimd_ctx = ctx; bool enable; @@ -696,7 +696,7 @@ static struct exynos_controller_ops fimd_controller_ops = { .get_panel = fimd_get_panel, .enable_vblank = fimd_enable_vblank, .disable_vblank = fimd_disable_vblank, - .power = fimd_power, + .dpms = fimd_dpms, .mode_set = fimd_win_mode_set, .commit = fimd_commit, .win_commit = fimd_win_commit, @@ -961,7 +961,7 @@ static int __devinit fimd_probe(struct platform_device *pdev) platform_set_drvdata(pdev, fimd_ctx); - fimd_power(fimd_ctx, DRM_MODE_DPMS_ON); + fimd_dpms(fimd_ctx, DRM_MODE_DPMS_ON); for (win = 0; win < WINDOWS_NR; win++) fimd_clear_win(fimd_ctx, win); @@ -1013,7 +1013,7 @@ static int __devexit fimd_remove(struct platform_device *pdev) clk_disable(ctx->lcd_clk); clk_disable(ctx->bus_clk); - fimd_power(ctx, DRM_MODE_DPMS_OFF); + fimd_dpms(ctx, DRM_MODE_DPMS_OFF); out: clk_put(ctx->lcd_clk); diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index d06e2bd45c06..b90fa6620f74 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -2037,7 +2037,7 @@ static void hdmi_resource_poweroff(struct hdmi_context *hdata) regulator_bulk_disable(res->regul_count, res->regul_bulk); } -static int hdmi_power(void *ctx, int mode) +static int hdmi_dpms(void *ctx, int mode) { struct hdmi_context *hdata = ctx; @@ -2078,7 +2078,7 @@ static struct exynos_panel_ops hdmi_ops = { .is_connected = hdmi_is_connected, .get_edid = hdmi_get_edid, .check_timing = hdmi_check_timing, - .power = hdmi_power, + .dpms = hdmi_dpms, /* manager */ .mode_fixup = hdmi_mode_fixup, diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 5d41c9b82a87..4d68b41532d2 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -1038,10 +1038,10 @@ static void mixer_resource_poweron(struct mixer_context *mctx) clk_enable(res->sclk_mixer); } + mctx->is_mixer_powered_on = true; + mixer_win_reset(mctx); mixer_enable_vblank(mctx, mctx->pipe); - - mctx->is_mixer_powered_on = true; mixer_apply(mctx); } @@ -1062,7 +1062,7 @@ static void mixer_resource_poweroff(struct mixer_context *mctx) mctx->is_mixer_powered_on = false; } -static int mixer_power(void *ctx, int mode) +static int mixer_dpms(void *ctx, int mode) { struct mixer_context *mctx = ctx; @@ -1099,7 +1099,7 @@ static struct exynos_controller_ops mixer_ops = { .subdrv_probe = mixer_subdrv_probe, .enable_vblank = mixer_enable_vblank, .disable_vblank = mixer_disable_vblank, - .power = mixer_power, + .dpms = mixer_dpms, /* overlay */ .mode_set = mixer_win_mode_set, -- 2.20.1