All of lore.kernel.org
 help / color / mirror / Atom feed
From: Inki Dae <inki.dae@samsung.com>
To: 'Sean Paul' <seanpaul@chromium.org>, dri-devel@lists.freedesktop.org
Cc: marcheu@chromium.org
Subject: RE: [PATCH v3 25/32] drm/exynos: Clean up FIMD power on/off routines
Date: Thu, 31 Oct 2013 19:54:18 +0900	[thread overview]
Message-ID: <031901ced627$8c7fafd0$a57f0f70$%dae@samsung.com> (raw)
In-Reply-To: <1383063198-10526-26-git-send-email-seanpaul@chromium.org>


As I mentioned already, I'll not merge eDP related codes yet. So can you
rebase patche 25 through 26 to top of patch 20?

Thanks,
Inki Dae


> -----Original Message-----
> From: Sean Paul [mailto:seanpaul@chromium.org]
> Sent: Wednesday, October 30, 2013 1:13 AM
> To: dri-devel@lists.freedesktop.org; inki.dae@samsung.com
> Cc: airlied@linux.ie; tomasz.figa@gmail.com; marcheu@chromium.org; Sean
> Paul
> Subject: [PATCH v3 25/32] drm/exynos: Clean up FIMD power on/off routines
> 
> This patch separates the fimd_activate function into poweron/poweroff
> functions to be more consistent with the other drivers in exynos drm. It
> also properly cleans up after failures in poweron. The functions have
> also been shuffled around such that they are all in the same
> spot in the file and poweron/poweroff can be called from the dpms
function.
> 
> Signed-off-by: Sean Paul <seanpaul@chromium.org>
> ---
> 
> Changes in v2:
> 	- Added to the patchset
> Changes in v3: None
> 
>  drivers/gpu/drm/exynos/exynos_drm_fimd.c | 247 +++++++++++++++++---------
> -----
>  1 file changed, 135 insertions(+), 112 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index c6a05f6..ba12916 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -324,6 +324,12 @@ static void fimd_win_commit(struct exynos_drm_manager
> *mgr, int zpos)
> 
>  	win_data = &ctx->win_data[win];
> 
> +	/* If suspended, enable this on resume */
> +	if (ctx->suspended) {
> +		win_data->resume = true;
> +		return;
> +	}
> +
>  	/*
>  	 * SHADOWCON/PRTCON register is used for enabling timing.
>  	 *
> @@ -505,35 +511,6 @@ static void fimd_mgr_remove(struct exynos_drm_manager
> *mgr)
>  		drm_iommu_detach_device(ctx->drm_dev, ctx->dev);
>  }
> 
> -static void fimd_dpms(struct exynos_drm_manager *mgr, int mode)
> -{
> -	struct fimd_context *ctx = mgr->ctx;
> -
> -	DRM_DEBUG_KMS("%d\n", mode);
> -
> -	switch (mode) {
> -	case DRM_MODE_DPMS_ON:
> -		/*
> -		 * enable fimd hardware only if suspended status.
> -		 *
> -		 * P.S. fimd_dpms function would be called at booting time
so
> -		 * clk_enable could be called double time.
> -		 */
> -		if (ctx->suspended)
> -			pm_runtime_get_sync(ctx->dev);
> -		break;
> -	case DRM_MODE_DPMS_STANDBY:
> -	case DRM_MODE_DPMS_SUSPEND:
> -	case DRM_MODE_DPMS_OFF:
> -		if (!ctx->suspended)
> -			pm_runtime_put_sync(ctx->dev);
> -		break;
> -	default:
> -		DRM_DEBUG_KMS("unspecified mode %d\n", mode);
> -		break;
> -	}
> -}
> -
>  static u32 fimd_calc_clkdiv(struct fimd_context *ctx,
>  		const struct drm_display_mode *mode)
>  {
> @@ -726,6 +703,130 @@ static void fimd_wait_for_vblank(struct
> exynos_drm_manager *mgr)
>  		DRM_DEBUG_KMS("vblank wait timed out.\n");
>  }
> 
> +static void fimd_window_suspend(struct exynos_drm_manager *mgr)
> +{
> +	struct fimd_context *ctx = mgr->ctx;
> +	struct fimd_win_data *win_data;
> +	int i;
> +
> +	for (i = 0; i < WINDOWS_NR; i++) {
> +		win_data = &ctx->win_data[i];
> +		win_data->resume = win_data->enabled;
> +		if (win_data->enabled)
> +			fimd_win_disable(mgr, i);
> +	}
> +	fimd_wait_for_vblank(mgr);
> +}
> +
> +static void fimd_window_resume(struct exynos_drm_manager *mgr)
> +{
> +	struct fimd_context *ctx = mgr->ctx;
> +	struct fimd_win_data *win_data;
> +	int i;
> +
> +	for (i = 0; i < WINDOWS_NR; i++) {
> +		win_data = &ctx->win_data[i];
> +		win_data->enabled = win_data->resume;
> +		win_data->resume = false;
> +	}
> +}
> +
> +static int fimd_poweron(struct exynos_drm_manager *mgr)
> +{
> +	struct fimd_context *ctx = mgr->ctx;
> +	int ret;
> +
> +	if (!ctx->suspended)
> +		return 0;
> +
> +	ctx->suspended = false;
> +
> +	ret = clk_prepare_enable(ctx->bus_clk);
> +	if (ret < 0) {
> +		DRM_ERROR("Failed to prepare_enable the bus clk [%d]\n",
> ret);
> +		goto bus_clk_err;
> +	}
> +
> +	ret = clk_prepare_enable(ctx->lcd_clk);
> +	if  (ret < 0) {
> +		DRM_ERROR("Failed to prepare_enable the lcd clk [%d]\n",
> ret);
> +		goto lcd_clk_err;
> +	}
> +
> +	/* if vblank was enabled status, enable it again. */
> +	if (test_and_clear_bit(0, &ctx->irq_flags)) {
> +		ret = fimd_enable_vblank(mgr);
> +		if (ret) {
> +			DRM_ERROR("Failed to re-enable vblank [%d]\n", ret);
> +			goto enable_vblank_err;
> +		}
> +	}
> +
> +	fimd_window_resume(mgr);
> +
> +	fimd_apply(mgr);
> +
> +	return 0;
> +
> +enable_vblank_err:
> +	clk_disable_unprepare(ctx->lcd_clk);
> +lcd_clk_err:
> +	clk_disable_unprepare(ctx->bus_clk);
> +bus_clk_err:
> +	ctx->suspended = true;
> +	return ret;
> +}
> +
> +static int fimd_poweroff(struct exynos_drm_manager *mgr)
> +{
> +	struct fimd_context *ctx = mgr->ctx;
> +
> +	if (ctx->suspended)
> +		return 0;
> +
> +	/*
> +	 * We need to make sure that all windows are disabled before we
> +	 * suspend that connector. Otherwise we might try to scan from
> +	 * a destroyed buffer later.
> +	 */
> +	fimd_window_suspend(mgr);
> +
> +	clk_disable_unprepare(ctx->lcd_clk);
> +	clk_disable_unprepare(ctx->bus_clk);
> +
> +	ctx->suspended = true;
> +	return 0;
> +}
> +
> +static void fimd_dpms(struct exynos_drm_manager *mgr, int mode)
> +{
> +	struct fimd_context *ctx = mgr->ctx;
> +
> +	DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode);
> +
> +	switch (mode) {
> +	case DRM_MODE_DPMS_ON:
> +		/*
> +		 * enable fimd hardware only if suspended status.
> +		 *
> +		 * P.S. fimd_dpms function would be called at booting time
so
> +		 * clk_enable could be called double time.
> +		 */
> +		if (ctx->suspended)
> +			pm_runtime_get_sync(ctx->dev);
> +		break;
> +	case DRM_MODE_DPMS_STANDBY:
> +	case DRM_MODE_DPMS_SUSPEND:
> +	case DRM_MODE_DPMS_OFF:
> +		if (!ctx->suspended)
> +			pm_runtime_put_sync(ctx->dev);
> +		break;
> +	default:
> +		DRM_DEBUG_KMS("unspecified mode %d\n", mode);
> +		break;
> +	}
> +}
> +
>  static struct exynos_drm_manager_ops fimd_manager_ops = {
>  	.initialize = fimd_mgr_initialize,
>  	.remove = fimd_mgr_remove,
> @@ -786,85 +887,6 @@ static void fimd_clear_win(struct fimd_context *ctx,
> int win)
>  	fimd_shadow_protect_win(ctx, win, false);
>  }
> 
> -static int fimd_clock(struct fimd_context *ctx, bool enable)
> -{
> -	if (enable) {
> -		int ret;
> -
> -		ret = clk_prepare_enable(ctx->bus_clk);
> -		if (ret < 0)
> -			return ret;
> -
> -		ret = clk_prepare_enable(ctx->lcd_clk);
> -		if  (ret < 0) {
> -			clk_disable_unprepare(ctx->bus_clk);
> -			return ret;
> -		}
> -	} else {
> -		clk_disable_unprepare(ctx->lcd_clk);
> -		clk_disable_unprepare(ctx->bus_clk);
> -	}
> -
> -	return 0;
> -}
> -
> -static void fimd_window_suspend(struct exynos_drm_manager *mgr)
> -{
> -	struct fimd_context *ctx = mgr->ctx;
> -	struct fimd_win_data *win_data;
> -	int i;
> -
> -	for (i = 0; i < WINDOWS_NR; i++) {
> -		win_data = &ctx->win_data[i];
> -		win_data->resume = win_data->enabled;
> -		fimd_win_disable(mgr, i);
> -	}
> -	fimd_wait_for_vblank(mgr);
> -}
> -
> -static void fimd_window_resume(struct exynos_drm_manager *mgr)
> -{
> -	struct fimd_context *ctx = mgr->ctx;
> -	struct fimd_win_data *win_data;
> -	int i;
> -
> -	for (i = 0; i < WINDOWS_NR; i++) {
> -		win_data = &ctx->win_data[i];
> -		win_data->enabled = win_data->resume;
> -		win_data->resume = false;
> -	}
> -}
> -
> -static int fimd_activate(struct exynos_drm_manager *mgr, bool enable)
> -{
> -	struct fimd_context *ctx = mgr->ctx;
> -
> -	if (enable) {
> -		int ret;
> -
> -		ret = fimd_clock(ctx, true);
> -		if (ret < 0)
> -			return ret;
> -
> -		ctx->suspended = false;
> -
> -		/* if vblank was enabled status, enable it again. */
> -		if (test_and_clear_bit(0, &ctx->irq_flags))
> -			fimd_enable_vblank(mgr);
> -
> -		fimd_window_resume(mgr);
> -
> -		fimd_apply(mgr);
> -	} else {
> -		fimd_window_suspend(mgr);
> -
> -		fimd_clock(ctx, false);
> -		ctx->suspended = true;
> -	}
> -
> -	return 0;
> -}
> -
>  static int fimd_probe(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
> @@ -881,6 +903,7 @@ static int fimd_probe(struct platform_device *pdev)
>  		return -ENOMEM;
> 
>  	ctx->dev = dev;
> +	ctx->suspended = true;
> 
>  	if (of_property_read_bool(dev->of_node, "samsung,invert-vden"))
>  		ctx->vidcon1 |= VIDCON1_INV_VDEN;
> @@ -967,7 +990,7 @@ static int fimd_suspend(struct device *dev)
>  	 * because the usage_count of pm runtime is more than 1.
>  	 */
>  	if (!pm_runtime_suspended(dev))
> -		return fimd_activate(mgr, false);
> +		return fimd_poweroff(mgr);
> 
>  	return 0;
>  }
> @@ -984,7 +1007,7 @@ static int fimd_resume(struct device *dev)
>  	if (pm_runtime_suspended(dev))
>  		return 0;
> 
> -	return fimd_activate(mgr, true);
> +	return fimd_poweron(mgr);
>  }
>  #endif
> 
> @@ -993,14 +1016,14 @@ static int fimd_runtime_suspend(struct device *dev)
>  {
>  	struct exynos_drm_manager *mgr = get_fimd_manager(dev);
> 
> -	return fimd_activate(mgr, false);
> +	return fimd_poweroff(mgr);
>  }
> 
>  static int fimd_runtime_resume(struct device *dev)
>  {
>  	struct exynos_drm_manager *mgr = get_fimd_manager(dev);
> 
> -	return fimd_activate(mgr, true);
> +	return fimd_poweron(mgr);
>  }
>  #endif
> 
> --
> 1.8.4

  reply	other threads:[~2013-10-31 10:54 UTC|newest]

Thread overview: 130+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-29 16:12 [PATCH v3 00/32] drm/exynos: Refactor parts of the exynos driver Sean Paul
2013-10-29 16:12 ` [PATCH v3 01/32] drm/exynos: Remove useless slab.h include Sean Paul
2013-10-31 10:24   ` Inki Dae
2013-10-31 23:32   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 02/32] drm/exynos: Merge overlay_ops into manager_ops Sean Paul
2013-10-31 23:39   ` Tomasz Figa
2013-11-01 19:50     ` Sean Paul
2013-11-01 19:55       ` Tomasz Figa
2013-11-04  7:44         ` Inki Dae
2013-10-29 16:12 ` [PATCH v3 03/32] drm/exynos: Add an initialize function to manager and display Sean Paul
2013-10-31 23:42   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 04/32] drm/exynos: Use manager_op initialize in fimd Sean Paul
2013-10-31 23:49   ` Tomasz Figa
2013-11-01 19:51     ` Sean Paul
2013-11-01 19:57       ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 05/32] drm/exynos: hdmi: Implement initialize op for hdmi Sean Paul
2013-10-31 23:53   ` Tomasz Figa
2013-11-01 19:54     ` Sean Paul
2013-11-01 19:56       ` Tomasz Figa
2013-11-01 20:08         ` Sean Paul
2013-10-29 16:12 ` [PATCH v3 06/32] drm/exynos: Pass exynos_drm_manager in manager ops instead of dev Sean Paul
2013-11-01  0:19   ` Tomasz Figa
2013-11-01 20:01     ` Sean Paul
2013-11-01 20:11       ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 07/32] drm/exynos: Remove apply manager callback Sean Paul
2013-11-08 21:05   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 08/32] drm/exynos: Remove dpms link between encoder/connector Sean Paul
2013-11-08 21:45   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 09/32] drm/exynos: Rename display_op power_on to dpms Sean Paul
2013-11-08 22:09   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 10/32] drm/exynos: Don't keep dpms state in encoder Sean Paul
2013-11-10 20:47   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 11/32] drm/exynos: Use unsigned long for possible_crtcs Sean Paul
2013-11-10 20:47   ` Tomasz Figa
2013-10-29 16:12 ` [PATCH v3 12/32] drm/exynos: Split manager/display/subdrv Sean Paul
2013-10-31 10:30   ` Inki Dae
2013-10-31 16:08     ` Sean Paul
2013-11-01  4:20       ` Inki Dae
2013-11-10 21:09   ` Tomasz Figa
2013-11-12 17:51     ` Sean Paul
2013-11-12 18:35       ` Tomasz Figa
2013-11-26 18:00         ` Olof Johansson
2013-11-27 10:04           ` Thierry Reding
2013-11-28 23:04           ` Tomasz Figa
2013-11-29  7:52             ` Daniel Vetter
2013-11-29  9:10               ` Tomasz Figa
2013-11-29 10:25                 ` Daniel Vetter
2013-11-29 14:13                 ` Rob Clark
2013-11-29 17:05                   ` Tomasz Figa
2013-11-29 18:35                     ` Rob Clark
2013-11-30  5:25                       ` Inki Dae
2013-12-03 21:38                     ` Sean Paul
2013-11-29 10:16             ` Thierry Reding
2013-10-29 16:12 ` [PATCH v3 13/32] drm/exynos: hdmi: remove the i2c drivers and use devtree Sean Paul
2013-11-10 20:46   ` Tomasz Figa
2013-11-11  8:44     ` Thierry Reding
2013-11-28 13:30       ` Tomasz Figa
2013-11-29 10:24         ` Thierry Reding
2013-12-03  0:37           ` Olof Johansson
2013-10-29 16:13 ` [PATCH v3 14/32] drm/exynos: Remove exynos_drm_hdmi shim Sean Paul
2013-11-10 21:24   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 15/32] drm/exynos: Use drm_mode_copy to copy modes Sean Paul
2013-11-10 21:27   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 16/32] drm/exynos: Disable unused crtc planes from crtc Sean Paul
2013-11-10 21:29   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 17/32] drm/exynos: Add mode_set manager operation Sean Paul
2013-11-10 21:31   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 18/32] drm/exynos: Implement mode_fixup " Sean Paul
2013-11-10 21:33   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 19/32] drm/exynos: Use mode_set to configure fimd Sean Paul
2013-11-10 22:03   ` Tomasz Figa
2013-11-15 13:49     ` Daniel Kurtz
2013-11-15 13:53     ` Daniel Kurtz
2013-11-28 22:57       ` Tomasz Figa
2013-12-04 22:37       ` Sean Paul
2013-10-29 16:13 ` [PATCH v3 20/32] drm/exynos: Remove unused/useless fimd_context members Sean Paul
2013-11-11  1:19   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 21/32] drm/exynos: Move dp driver from video/ to drm/ Sean Paul
2013-10-31 10:46   ` Inki Dae
2013-10-31 16:05     ` Sean Paul
2013-10-31 23:06     ` Jingoo Han
2013-10-31 23:06       ` Jingoo Han
2013-10-31 23:11       ` Tomasz Figa
2013-10-31 23:11         ` Tomasz Figa
2013-10-31 23:23         ` Jingoo Han
2013-10-31 23:23           ` Jingoo Han
2013-10-31 23:27           ` Tomasz Figa
2013-10-31 23:27             ` Tomasz Figa
2013-10-31 23:55             ` Jingoo Han
2013-10-31 23:55               ` Jingoo Han
2013-11-01  0:01               ` Tomasz Figa
2013-11-01  0:01                 ` Tomasz Figa
     [not found]   ` <3513711.0qTZKxmOZX@flatron>
2013-12-04 23:07     ` Sean Paul
2013-10-29 16:13 ` [PATCH v3 22/32] drm/exynos: Move display implementation into dp Sean Paul
     [not found]   ` <1383063198-10526-23-git-send-email-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2013-11-11  1:53     ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 23/32] ARM: dts: Move display-timings node from fimd to dp Sean Paul
2013-10-29 16:13 ` [PATCH v3 24/32] drm/exynos: Implement dpms display callback in DP Sean Paul
2013-11-11  2:04   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 25/32] drm/exynos: Clean up FIMD power on/off routines Sean Paul
2013-10-31 10:54   ` Inki Dae [this message]
     [not found]     ` <1630995.NnKzZB9Rl5@flatron>
2013-11-11  4:08       ` Inki Dae
2013-11-11  2:09   ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 26/32] drm/exynos: Consolidate suspend/resume in drm_drv Sean Paul
2013-11-29 14:58   ` Tomasz Figa
2013-12-19 16:48   ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 27/32] drm/exynos: Add create_connector callback Sean Paul
2013-11-11  2:19   ` Tomasz Figa
2013-12-03  5:01   ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 28/32] drm/exynos: Implement drm_connector in hdmi directly Sean Paul
2013-11-29 15:58   ` Tomasz Figa
2013-12-02  9:46     ` Thierry Reding
2013-12-02  9:54       ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 29/32] drm/exynos: Implement drm_connector directly in dp driver Sean Paul
2013-11-29 16:04   ` Tomasz Figa
2013-12-03  4:45   ` Inki Dae
2013-12-04  6:46     ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 30/32] drm/exynos: Implement drm_connector directly in vidi driver Sean Paul
2013-11-29 16:13   ` Tomasz Figa
2013-12-03  4:47   ` Inki Dae
2013-12-04  6:47     ` Inki Dae
2013-10-29 16:13 ` [PATCH v3 31/32] drm/exynos: Move lvds bridge discovery into DP driver Sean Paul
2013-11-29 16:55   ` Tomasz Figa
2013-11-30  5:18     ` Inki Dae
2013-11-30 12:27       ` Tomasz Figa
2013-10-29 16:13 ` [PATCH v3 32/32] drm/exynos: Remove the exynos_drm_connector shim Sean Paul
2013-11-29 16:14   ` Tomasz Figa
2013-11-07  5:48 ` [PATCH v3 00/32] drm/exynos: Refactor parts of the exynos driver Inki Dae
2013-11-07 18:20   ` Sean Paul
2013-11-08 21:01   ` Tomasz Figa
2013-11-08 21:22     ` Sean Paul

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='031901ced627$8c7fafd0$a57f0f70$%dae@samsung.com' \
    --to=inki.dae@samsung.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=marcheu@chromium.org \
    --cc=seanpaul@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.