All of lore.kernel.org
 help / color / mirror / Atom feed
* [Patch 3/3] edid override: make edid writable in sysfs
@ 2012-04-24  8:49 Thorsten Schoel
  0 siblings, 0 replies; only message in thread
From: Thorsten Schoel @ 2012-04-24  8:49 UTC (permalink / raw)
  To: dri-devel

From: Thorsten Schoel <tschoel at web.de>

Makes class/drm/[CONNECTOR]/edid writable for adding edid overrides.

Signed-off-by: Thorsten Schoel <tschoel at web.de>
---
diff -Nurp infra/drivers/gpu/drm/drm_sysfs.c sysfs/drivers/gpu/drm/drm_sysfs.c
--- infra/drivers/gpu/drm/drm_sysfs.c	2012-01-12 20:42:45.000000000 +0100
+++ sysfs/drivers/gpu/drm/drm_sysfs.c	2012-01-25 22:13:08.000000000 +0100
@@ -21,6 +21,8 @@
 #include "drm_sysfs.h"
 #include "drm_core.h"
 #include "drmP.h"
+#include "drm_edid.h"
+#include "drm_crtc.h"
 
 #define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
 #define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
@@ -228,6 +230,44 @@ static ssize_t edid_show(struct file *fi
 	return count;
 }
 
+static ssize_t edid_override(struct file *filp, struct kobject *kobj,
+			     struct bin_attribute *attr, char *buf, loff_t off,
+			     size_t count)
+{
+	struct device *connector_dev = container_of(kobj, struct device, kobj);
+	struct drm_connector *connector = to_drm_connector(connector_dev);
+	char *connector_name;
+	unsigned char *edid_new;
+
+	connector_name = drm_get_connector_name(connector);
+	
+	if (!count) {
+		drm_edid_override_remove(connector_name);
+		return 0;
+	}
+	
+	/* Only support writing the whole EDID in one piece */
+	if (off)
+		return 0;
+
+	if (count < EDID_LENGTH)
+		return 0;
+	if (count != (buf[0x7e] + 1) * EDID_LENGTH)
+		return 0;
+	
+	edid_new = kmalloc(count, GFP_KERNEL);
+	if (!edid_new)
+		return 0;
+	
+	memcpy(edid_new,  buf, count);
+
+	if (drm_edid_override_set(connector_name, (struct edid *)edid_new) < 0)
+		count = 0;
+	
+	kfree(edid_new);
+	return count;
+}
+
 static ssize_t modes_show(struct device *device,
 			   struct device_attribute *attr,
 			   char *buf)
@@ -341,9 +381,10 @@ static struct device_attribute connector
 
 static struct bin_attribute edid_attr = {
 	.attr.name = "edid",
-	.attr.mode = 0444,
+	.attr.mode = 0644,
 	.size = 0,
 	.read = edid_show,
+	.write = edid_override,
 };
 
 /**
---

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-04-24  8:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-24  8:49 [Patch 3/3] edid override: make edid writable in sysfs Thorsten Schoel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.