ecore-drm: Add support for DPMS on an output
authorChris Michael <cp.michael@samsung.com>
Tue, 7 Apr 2015 15:41:21 +0000 (11:41 -0400)
committerStefan Schmidt <s.schmidt@samsung.com>
Fri, 10 Apr 2015 09:09:49 +0000 (11:09 +0200)
Summary: This commit adds support for setting DPMS level of an output.
This adds a new API function 'ecore_drm_output_dpms_set' to set the
level.

@feature

Signed-off-by: Chris Michael <cp.michael@samsung.com>
src/lib/ecore_drm/Ecore_Drm.h
src/lib/ecore_drm/ecore_drm_output.c
src/lib/ecore_drm/ecore_drm_private.h

index d09e43f..e2281f9 100644 (file)
@@ -319,6 +319,19 @@ EAPI Eina_Stringshare *ecore_drm_output_model_get(Ecore_Drm_Output *output);
 EAPI Eina_Stringshare *ecore_drm_output_make_get(Ecore_Drm_Output *output);
 
 /**
+ * Set the dpms level of an Ecore_Drm_Output
+ *
+ * This function will set the DPMS level of an Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to set the dpms level on
+ * @param level The level to set
+ * 
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+EAPI void ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level);
+
+/**
  * Get the pointer position of Ecore_Drm_Device
  *
  * This function will give the pointer position of Ecore_Drm_Device
index 36c4f09..2315fde 100644 (file)
@@ -25,6 +25,25 @@ static const char *conn_types[] =
 
 EAPI int ECORE_DRM_EVENT_OUTPUT = 0;
 
+static drmModePropertyPtr
+_ecore_drm_output_property_get(int fd, drmModeConnectorPtr conn, const char *name)
+{
+   drmModePropertyPtr prop;
+   int i = 0;
+
+   for (; i < conn->count_props; i++)
+     {
+        if (!(prop = drmModeGetProperty(fd, conn->props[i])))
+          continue;
+
+        if (!strcmp(prop->name, name)) return prop;
+
+        drmModeFreeProperty(prop);
+     }
+
+   return NULL;
+}
+
 static void 
 _ecore_drm_output_edid_parse_string(const uint8_t *data, char text[])
 {
@@ -430,6 +449,7 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto
    output->conn_id = conn->connector_id;
    dev->conn_allocator |= (1 << output->conn_id);
    output->crtc = drmModeGetCrtc(dev->drm.fd, output->crtc_id);
+   output->dpms = _ecore_drm_output_property_get(dev->drm.fd, conn, "DPMS");
 
    memset(&mode, 0, sizeof(mode));
    if ((enc = drmModeGetEncoder(dev->drm.fd, conn->encoder_id)))
@@ -500,6 +520,7 @@ mode_err:
    eina_stringshare_del(output->name);
    EINA_LIST_FREE(output->modes, mode)
      free(mode);
+   drmModeFreeProperty(output->dpms);
    drmModeFreeCrtc(output->crtc);
    dev->crtc_allocator &= ~(1 << output->crtc_id);
    dev->conn_allocator &= ~(1 << output->conn_id);
@@ -537,6 +558,7 @@ _ecore_drm_output_free(Ecore_Drm_Output *output)
    if (output->model) eina_stringshare_del(output->model);
    if (output->make) eina_stringshare_del(output->make);
 
+   if (output->dpms) drmModeFreeProperty(output->dpms);
    if (output->crtc) drmModeFreeCrtc(output->crtc);
 
    free(output);
@@ -871,6 +893,8 @@ ecore_drm_output_enable(Ecore_Drm_Output *output)
 
    if ((!output) || (!output->current)) return EINA_FALSE;
 
+   ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_ON);
+
    mode = output->current_mode;
    if (drmModeSetCrtc(output->drm_fd, output->crtc_id, output->current->id, 
                       0, 0, &output->conn_id, 1, &mode->info) < 0)
@@ -1075,3 +1099,13 @@ ecore_drm_output_make_get(Ecore_Drm_Output *output)
 
    return output->make;
 }
+
+EAPI void
+ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level)
+{
+   EINA_SAFETY_ON_NULL_RETURN(output);
+   EINA_SAFETY_ON_NULL_RETURN(output->dpms);
+
+   drmModeConnectorSetProperty(output->dev->drm.fd, output->conn_id,
+                               output->dpms->prop_id, level);
+}
index 7b834cb..a0bcf12 100644 (file)
@@ -113,6 +113,7 @@ struct _Ecore_Drm_Output
    unsigned int crtc_id;
    unsigned int conn_id;
    drmModeCrtcPtr crtc;
+   drmModePropertyPtr dpms;
 
    int x, y, phys_width, phys_height;
    int drm_fd;