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);
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;
if (!display || !output)
return -EINVAL;
- list_del(&output->head);
+ list_del(&output->item);
kfree(output->native_mode);
if (dev_priv->free_output)
struct nv50_output *output = NULL;
struct nv50_display *display = NULL;
struct dcb_entry *entry = NULL;
+ int rval = 0;
NV50_DEBUG("\n");
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:
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;
kfree(output->native_mode);
if (dev_priv->free_output)
dev_priv->free_output(output);
- return -EINVAL;
+ return rval;
}