Reporting an error is better than silently refusing to reclock.
V2: Use the same logic on nv40
Signed-off-by: Martin Peres <martin.peres@labri.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
 
        int  (*clocks_get)(struct drm_device *, struct nouveau_pm_level *);
        void *(*clocks_pre)(struct drm_device *, struct nouveau_pm_level *);
-       void (*clocks_set)(struct drm_device *, void *);
+       int (*clocks_set)(struct drm_device *, void *);
 
        int (*voltage_get)(struct drm_device *);
        int (*voltage_set)(struct drm_device *, int voltage);
 
 /* nv40_pm.c */
 int nv40_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
 void *nv40_pm_clocks_pre(struct drm_device *, struct nouveau_pm_level *);
-void nv40_pm_clocks_set(struct drm_device *, void *);
+int nv40_pm_clocks_set(struct drm_device *, void *);
 int nv40_pm_pwm_get(struct drm_device *, struct dcb_gpio_entry *, u32*, u32*);
 int nv40_pm_pwm_set(struct drm_device *, struct dcb_gpio_entry *, u32, u32);
 
 /* nva3_pm.c */
 int nva3_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
 void *nva3_pm_clocks_pre(struct drm_device *, struct nouveau_pm_level *);
-void nva3_pm_clocks_set(struct drm_device *, void *);
+int nva3_pm_clocks_set(struct drm_device *, void *);
 
 /* nvc0_pm.c */
 int nvc0_pm_clocks_get(struct drm_device *, struct nouveau_pm_level *);
 
        return true;
 }
 
-void
+int
 nv40_pm_clocks_set(struct drm_device *dev, void *pre_state)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct bit_entry M;
        u32 crtc_mask = 0;
        u8 sr1[2];
-       int i;
+       int i, ret = -EAGAIN;
 
        /* determine which CRTCs are active, fetch VGA_SR1 for each */
        for (i = 0; i < 2; i++) {
        if (!nv_wait_cb(dev, nv40_pm_gr_idle, dev))
                goto resume;
 
+       ret = 0;
+
        /* set engine clocks */
        nv_mask(dev, 0x00c040, 0x00000333, 0x00000000);
        nv_wr32(dev, 0x004004, info->npll_coef);
        spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
 
        kfree(info);
+       return ret;
 }
 
 int
 
        return false;
 }
 
-void
+int
 nva3_pm_clocks_set(struct drm_device *dev, void *pre_state)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nva3_pm_state *info = pre_state;
        unsigned long flags;
+       int ret = -EAGAIN;
 
        /* prevent any new grctx switches from starting */
        spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
                nv_wr32(dev, 0x100210, 0x80000000);
        }
 
+       ret = 0;
+
 cleanup:
        /* unfreeze PFIFO */
        nv_mask(dev, 0x002504, 0x00000001, 0x00000000);
                nv_mask(dev, 0x400824, 0x10000000, 0x10000000);
        spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
        kfree(info);
+       return ret;
 }