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

Karol Herbst nouveau at karolherbst.de
Mon Apr 18 19:14:09 UTC 2016


Signed-off-by: Karol Herbst <nouveau at 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(-)

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
-- 
2.8.1



More information about the Nouveau mailing list