[v4,35/37] clk: set clocks to pre suspend state after suspend

Submitted by Karol Herbst on April 18, 2016, 7:14 p.m.

Details

Message ID 1461006851-5007-36-git-send-email-nouveau@karolherbst.de
State New
Headers show
Series "Volting/Clocking improvements for Fermi and newer" ( rev: 4 ) in Nouveau

Not browsing as part of any series.

Commit Message

Karol Herbst April 18, 2016, 7:14 p.m.
Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
---
 drm/nouveau/nvkm/subdev/clk/base.c  | 19 +++++++++++--------
 drm/nouveau/nvkm/subdev/clk/gf100.c |  4 ++--
 drm/nouveau/nvkm/subdev/clk/nv40.c  |  2 +-
 drm/nouveau/nvkm/subdev/clk/priv.h  |  6 +++---
 4 files changed, 17 insertions(+), 14 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drm/nouveau/nvkm/subdev/clk/base.c b/drm/nouveau/nvkm/subdev/clk/base.c
index 2776d79..d5440a9 100644
--- a/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drm/nouveau/nvkm/subdev/clk/base.c
@@ -324,7 +324,7 @@  nvkm_pstate_prog(struct nvkm_clk *clk, int pstateid)
 }
 
 static void
-nvkm_clk_update_impl(struct nvkm_clk *clk)
+nvkm_clk_update_impl(struct nvkm_clk *clk, bool force)
 {
 	struct nvkm_subdev *subdev = &clk->subdev;
 	int pstate;
@@ -349,7 +349,7 @@  nvkm_clk_update_impl(struct nvkm_clk *clk)
 		pstate = -1;
 	}
 
-	clk->func->update(clk, pstate);
+	clk->func->update(clk, pstate, force);
 }
 
 static void
@@ -360,7 +360,7 @@  nvkm_clk_update_work(struct work_struct *work)
 	if (!atomic_xchg(&clk->waiting, 0))
 		return;
 
-	nvkm_clk_update_impl(clk);
+	nvkm_clk_update_impl(clk, false);
 
 	wake_up_all(&clk->wait);
 	nvkm_notify_get(&clk->pwrsrc_ntfy);
@@ -613,11 +613,7 @@  nvkm_clk_init(struct nvkm_subdev *subdev)
 	if (clk->func->init)
 		return clk->func->init(clk);
 
-	clk->astate = -1;
-	clk->pstate = NULL;
-	clk->exp_cstate = NVKM_CLK_CSTATE_DEFAULT;
-	clk->set_cstate = NULL;
-	nvkm_clk_update(clk, true);
+	nvkm_clk_update_impl(clk, true);
 	return 0;
 }
 
@@ -672,8 +668,15 @@  nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
 	clk->func = func;
 	INIT_LIST_HEAD(&clk->states);
 	clk->domains = func->domains;
+
+	clk->pstate = NULL;
+	clk->astate = -1;
 	clk->ustate_ac = -1;
 	clk->ustate_dc = -1;
+
+	clk->exp_cstate = NVKM_CLK_CSTATE_DEFAULT;
+	clk->set_cstate = NULL;
+
 	clk->allow_reclock = allow_reclock;
 
 	INIT_WORK(&clk->work, nvkm_clk_update_work);
diff --git a/drm/nouveau/nvkm/subdev/clk/gf100.c b/drm/nouveau/nvkm/subdev/clk/gf100.c
index 5025dcc..5621daf 100644
--- a/drm/nouveau/nvkm/subdev/clk/gf100.c
+++ b/drm/nouveau/nvkm/subdev/clk/gf100.c
@@ -447,12 +447,12 @@  gf100_clk_update_volt(struct nvkm_clk *clk)
 }
 
 void
-gf100_clk_update(struct nvkm_clk *clk, int pstate)
+gf100_clk_update(struct nvkm_clk *clk, int pstate, bool force)
 {
 	struct nvkm_subdev *subdev = &clk->subdev;
 	int ret;
 
-	if (!clk->pstate || clk->pstate->pstate != pstate) {
+	if (!clk->pstate || clk->pstate->pstate != pstate || force) {
 		nvkm_trace(subdev, "-> P %d\n", pstate);
 		ret = nvkm_pstate_prog(clk, pstate);
 		if (ret) {
diff --git a/drm/nouveau/nvkm/subdev/clk/nv40.c b/drm/nouveau/nvkm/subdev/clk/nv40.c
index 5b10ee2..055063a 100644
--- a/drm/nouveau/nvkm/subdev/clk/nv40.c
+++ b/drm/nouveau/nvkm/subdev/clk/nv40.c
@@ -202,7 +202,7 @@  nv40_clk_tidy(struct nvkm_clk *obj)
 }
 
 void
-nv40_clk_update(struct nvkm_clk *clk, int pstate)
+nv40_clk_update(struct nvkm_clk *clk, int pstate, bool force)
 {
 	struct nvkm_subdev *subdev = &clk->subdev;
 	int ret;
diff --git a/drm/nouveau/nvkm/subdev/clk/priv.h b/drm/nouveau/nvkm/subdev/clk/priv.h
index e2f15c4..06a78a2 100644
--- a/drm/nouveau/nvkm/subdev/clk/priv.h
+++ b/drm/nouveau/nvkm/subdev/clk/priv.h
@@ -10,7 +10,7 @@  struct nvkm_clk_func {
 	int (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
 	int (*prog)(struct nvkm_clk *);
 	void (*tidy)(struct nvkm_clk *);
-	void (*update)(struct nvkm_clk *, int pstate);
+	void (*update)(struct nvkm_clk *, int pstate, bool force);
 	struct nvkm_pstate *pstates;
 	int nr_pstates;
 	struct nvkm_domain domains[];
@@ -30,6 +30,6 @@  int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
 		      struct nvkm_pll_vals *);
 int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
 
-void nv40_clk_update(struct nvkm_clk *, int pstate);
-void gf100_clk_update(struct nvkm_clk *, int pstate);
+void nv40_clk_update(struct nvkm_clk *, int pstate, bool force);
+void gf100_clk_update(struct nvkm_clk *, int pstate, bool force);
 #endif

Comments

On 18/04/16 22:14, Karol Herbst wrote:
> Signed-off-by: Karol Herbst <nouveau@karolherbst.de>

Reviewed-by: Martin Peres <martin.peres@free.fr>
> ---
>   drm/nouveau/nvkm/subdev/clk/base.c  | 19 +++++++++++--------
>   drm/nouveau/nvkm/subdev/clk/gf100.c |  4 ++--
>   drm/nouveau/nvkm/subdev/clk/nv40.c  |  2 +-
>   drm/nouveau/nvkm/subdev/clk/priv.h  |  6 +++---
>   4 files changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/drm/nouveau/nvkm/subdev/clk/base.c b/drm/nouveau/nvkm/subdev/clk/base.c
> index 2776d79..d5440a9 100644
> --- a/drm/nouveau/nvkm/subdev/clk/base.c
> +++ b/drm/nouveau/nvkm/subdev/clk/base.c
> @@ -324,7 +324,7 @@ nvkm_pstate_prog(struct nvkm_clk *clk, int pstateid)
>   }
>   
>   static void
> -nvkm_clk_update_impl(struct nvkm_clk *clk)
> +nvkm_clk_update_impl(struct nvkm_clk *clk, bool force)
>   {
>   	struct nvkm_subdev *subdev = &clk->subdev;
>   	int pstate;
> @@ -349,7 +349,7 @@ nvkm_clk_update_impl(struct nvkm_clk *clk)
>   		pstate = -1;
>   	}
>   
> -	clk->func->update(clk, pstate);
> +	clk->func->update(clk, pstate, force);
>   }
>   
>   static void
> @@ -360,7 +360,7 @@ nvkm_clk_update_work(struct work_struct *work)
>   	if (!atomic_xchg(&clk->waiting, 0))
>   		return;
>   
> -	nvkm_clk_update_impl(clk);
> +	nvkm_clk_update_impl(clk, false);
>   
>   	wake_up_all(&clk->wait);
>   	nvkm_notify_get(&clk->pwrsrc_ntfy);
> @@ -613,11 +613,7 @@ nvkm_clk_init(struct nvkm_subdev *subdev)
>   	if (clk->func->init)
>   		return clk->func->init(clk);
>   
> -	clk->astate = -1;
> -	clk->pstate = NULL;
> -	clk->exp_cstate = NVKM_CLK_CSTATE_DEFAULT;
> -	clk->set_cstate = NULL;
> -	nvkm_clk_update(clk, true);
> +	nvkm_clk_update_impl(clk, true);
>   	return 0;
>   }
>   
> @@ -672,8 +668,15 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
>   	clk->func = func;
>   	INIT_LIST_HEAD(&clk->states);
>   	clk->domains = func->domains;
> +
> +	clk->pstate = NULL;
> +	clk->astate = -1;
>   	clk->ustate_ac = -1;
>   	clk->ustate_dc = -1;
> +
> +	clk->exp_cstate = NVKM_CLK_CSTATE_DEFAULT;
> +	clk->set_cstate = NULL;
> +
>   	clk->allow_reclock = allow_reclock;
>   
>   	INIT_WORK(&clk->work, nvkm_clk_update_work);
> diff --git a/drm/nouveau/nvkm/subdev/clk/gf100.c b/drm/nouveau/nvkm/subdev/clk/gf100.c
> index 5025dcc..5621daf 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gf100.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gf100.c
> @@ -447,12 +447,12 @@ gf100_clk_update_volt(struct nvkm_clk *clk)
>   }
>   
>   void
> -gf100_clk_update(struct nvkm_clk *clk, int pstate)
> +gf100_clk_update(struct nvkm_clk *clk, int pstate, bool force)
>   {
>   	struct nvkm_subdev *subdev = &clk->subdev;
>   	int ret;
>   
> -	if (!clk->pstate || clk->pstate->pstate != pstate) {
> +	if (!clk->pstate || clk->pstate->pstate != pstate || force) {
>   		nvkm_trace(subdev, "-> P %d\n", pstate);
>   		ret = nvkm_pstate_prog(clk, pstate);
>   		if (ret) {
> diff --git a/drm/nouveau/nvkm/subdev/clk/nv40.c b/drm/nouveau/nvkm/subdev/clk/nv40.c
> index 5b10ee2..055063a 100644
> --- a/drm/nouveau/nvkm/subdev/clk/nv40.c
> +++ b/drm/nouveau/nvkm/subdev/clk/nv40.c
> @@ -202,7 +202,7 @@ nv40_clk_tidy(struct nvkm_clk *obj)
>   }
>   
>   void
> -nv40_clk_update(struct nvkm_clk *clk, int pstate)
> +nv40_clk_update(struct nvkm_clk *clk, int pstate, bool force)
>   {
>   	struct nvkm_subdev *subdev = &clk->subdev;
>   	int ret;
> diff --git a/drm/nouveau/nvkm/subdev/clk/priv.h b/drm/nouveau/nvkm/subdev/clk/priv.h
> index e2f15c4..06a78a2 100644
> --- a/drm/nouveau/nvkm/subdev/clk/priv.h
> +++ b/drm/nouveau/nvkm/subdev/clk/priv.h
> @@ -10,7 +10,7 @@ struct nvkm_clk_func {
>   	int (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
>   	int (*prog)(struct nvkm_clk *);
>   	void (*tidy)(struct nvkm_clk *);
> -	void (*update)(struct nvkm_clk *, int pstate);
> +	void (*update)(struct nvkm_clk *, int pstate, bool force);
>   	struct nvkm_pstate *pstates;
>   	int nr_pstates;
>   	struct nvkm_domain domains[];
> @@ -30,6 +30,6 @@ int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
>   		      struct nvkm_pll_vals *);
>   int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
>   
> -void nv40_clk_update(struct nvkm_clk *, int pstate);
> -void gf100_clk_update(struct nvkm_clk *, int pstate);
> +void nv40_clk_update(struct nvkm_clk *, int pstate, bool force);
> +void gf100_clk_update(struct nvkm_clk *, int pstate, bool force);
>   #endif