* [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.