modesetting-101: rename modeflags, as to avoid conflicts with the xorg definitions
[platform/upstream/libdrm.git] / linux-core / nv50_dac.c
index f827fed..ce01d57 100644 (file)
@@ -73,10 +73,10 @@ static int nv50_dac_execute_mode(struct nv50_output *output, bool disconnect)
                mode_ctl |= 0x100;
        }
 
-       if (desired_mode->flags & V_NHSYNC)
+       if (desired_mode->flags & DRM_MODE_FLAG_NHSYNC)
                mode_ctl2 |= NV50_DAC_MODE_CTRL2_NHSYNC;
 
-       if (desired_mode->flags & V_NVSYNC)
+       if (desired_mode->flags & DRM_MODE_FLAG_NVSYNC)
                mode_ctl2 |= NV50_DAC_MODE_CTRL2_NVSYNC;
 
        OUT_MODE(NV50_DAC0_MODE_CTRL + offset, mode_ctl);
@@ -96,6 +96,43 @@ static int nv50_dac_set_clock_mode(struct nv50_output *output)
        return 0;
 }
 
+static int nv50_dac_set_power_mode(struct nv50_output *output, int mode)
+{
+       struct drm_nouveau_private *dev_priv = output->dev->dev_private;
+       uint32_t val;
+       int or = nv50_output_or_offset(output);
+
+       NV50_DEBUG("or %d\n", or);
+
+       /* wait for it to be done */
+       while (NV_READ(NV50_PDISPLAY_DAC_REGS_DPMS_CTRL(or)) & NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_PENDING);
+
+       val = NV_READ(NV50_PDISPLAY_DAC_REGS_DPMS_CTRL(or)) & ~0x7F;
+
+       if (mode != DPMSModeOn)
+               val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_BLANKED;
+
+       switch (mode) {
+               case DPMSModeStandby:
+                       val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_HSYNC_OFF;
+                       break;
+               case DPMSModeSuspend:
+                       val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_VSYNC_OFF;
+                       break;
+               case DPMSModeOff:
+                       val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_OFF;
+                       val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_HSYNC_OFF;
+                       val |= NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_VSYNC_OFF;
+                       break;
+               default:
+                       break;
+       }
+
+       NV_WRITE(NV50_PDISPLAY_DAC_REGS_DPMS_CTRL(or), val | NV50_PDISPLAY_DAC_REGS_DPMS_CTRL_PENDING);
+
+       return 0;
+}
+
 static int nv50_dac_destroy(struct nv50_output *output)
 {
        struct drm_device *dev = output->dev;
@@ -107,7 +144,7 @@ static int nv50_dac_destroy(struct nv50_output *output)
        if (!display || !output)
                return -EINVAL;
 
-       list_del(&output->head);
+       list_del(&output->item);
 
        kfree(output->native_mode);
        if (dev_priv->free_output)
@@ -122,6 +159,7 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
        struct nv50_output *output = NULL;
        struct nv50_display *display = NULL;
        struct dcb_entry *entry = NULL;
+       int rval = 0;
 
        NV50_DEBUG("\n");
 
@@ -135,12 +173,16 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
        output->dev = dev;
 
        display = nv50_get_display(dev);
-       if (!display)
+       if (!display) {
+               rval = -EINVAL;
                goto out;
+       }
 
        entry = &dev_priv->dcb_table.entry[dcb_entry];
-       if (!entry)
+       if (!entry) {
+               rval = -EINVAL;
                goto out;
+       }
 
        switch (entry->type) {
                case DCB_OUTPUT_ANALOG:
@@ -148,20 +190,26 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
                        DRM_INFO("Detected a DAC output\n");
                        break;
                default:
+                       rval = -EINVAL;
                        goto out;
        }
 
        output->dcb_entry = dcb_entry;
        output->bus = entry->bus;
 
-       list_add_tail(&output->head, &display->outputs);
+       list_add_tail(&output->item, &display->outputs);
 
        output->native_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
+       if (!output->native_mode) {
+               rval = -ENOMEM;
+               goto out;
+       }
 
        /* Set function pointers. */
        output->validate_mode = nv50_dac_validate_mode;
        output->execute_mode = nv50_dac_execute_mode;
        output->set_clock_mode = nv50_dac_set_clock_mode;
+       output->set_power_mode = nv50_dac_set_power_mode;
        output->detect = NULL; /* TODO */
        output->destroy = nv50_dac_destroy;
 
@@ -172,6 +220,6 @@ out:
                kfree(output->native_mode);
        if (dev_priv->free_output)
                dev_priv->free_output(output);
-       return -EINVAL;
+       return rval;
 }