aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-06-16 21:25:57 -0400
committerBen Skeggs <bskeggs@redhat.com>2011-09-20 02:01:45 -0400
commit77e7da6814623927cc4435d992bef9c84075594c (patch)
tree4aa3a5c56635e22b4d0153933a48998b4847fdca /drivers
parent3b0582d31d11faad1b40377d5adb28f0aa545fce (diff)
drm/nouveau/pm: add hooks to get/set *all* clocks at once
This is probably better than having to tell the common code about all the clocks that exist on every chipset. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h5
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_pm.c11
2 files changed, 16 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 491158d73046..7a88d9cb2ac1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -498,6 +498,11 @@ struct nouveau_pm_engine {
498 void *(*clock_pre)(struct drm_device *, struct nouveau_pm_level *, 498 void *(*clock_pre)(struct drm_device *, struct nouveau_pm_level *,
499 u32 id, int khz); 499 u32 id, int khz);
500 void (*clock_set)(struct drm_device *, void *); 500 void (*clock_set)(struct drm_device *, void *);
501
502 int (*clocks_get)(struct drm_device *, struct nouveau_pm_level *);
503 void *(*clocks_pre)(struct drm_device *, struct nouveau_pm_level *);
504 void (*clocks_set)(struct drm_device *, void *);
505
501 int (*voltage_get)(struct drm_device *); 506 int (*voltage_get)(struct drm_device *);
502 int (*voltage_set)(struct drm_device *, int voltage); 507 int (*voltage_set)(struct drm_device *, int voltage);
503 int (*fanspeed_get)(struct drm_device *); 508 int (*fanspeed_get)(struct drm_device *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
index 179067a1d261..db68531b8114 100644
--- a/drivers/gpu/drm/nouveau/nouveau_pm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
@@ -72,6 +72,12 @@ nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl)
72 } 72 }
73 } 73 }
74 74
75 if (pm->clocks_pre) {
76 void *state = pm->clocks_pre(dev, perflvl);
77 if (IS_ERR(state))
78 return PTR_ERR(state);
79 pm->clocks_set(dev, state);
80 } else
75 if (pm->clock_set) { 81 if (pm->clock_set) {
76 nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core); 82 nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core);
77 nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader); 83 nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader);
@@ -124,6 +130,11 @@ nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
124 130
125 memset(perflvl, 0, sizeof(*perflvl)); 131 memset(perflvl, 0, sizeof(*perflvl));
126 132
133 if (pm->clocks_get) {
134 ret = pm->clocks_get(dev, perflvl);
135 if (ret)
136 return ret;
137 } else
127 if (pm->clock_get) { 138 if (pm->clock_get) {
128 ret = pm->clock_get(dev, PLL_CORE); 139 ret = pm->clock_get(dev, PLL_CORE);
129 if (ret > 0) 140 if (ret > 0)