[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