diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-06-16 21:25:57 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-09-20 02:01:45 -0400 |
commit | 77e7da6814623927cc4435d992bef9c84075594c (patch) | |
tree | 4aa3a5c56635e22b4d0153933a48998b4847fdca /drivers | |
parent | 3b0582d31d11faad1b40377d5adb28f0aa545fce (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.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_pm.c | 11 |
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) |