From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thorsten Schoel Subject: [Patch 3/3] edid override: make edid writable in sysfs Date: Tue, 24 Apr 2012 10:49:49 +0200 Message-ID: <1335257389.1563.42.camel@ges14.uni-leipzig.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from fmmailgate02.web.de (fmmailgate02.web.de [217.72.192.227]) by gabe.freedesktop.org (Postfix) with ESMTP id 7363A9E740 for ; Tue, 24 Apr 2012 01:58:47 -0700 (PDT) Received: from moweb002.kundenserver.de (moweb002.kundenserver.de [172.19.20.108]) by fmmailgate02.web.de (Postfix) with ESMTP id 91E2D1C3E1DEE for ; Tue, 24 Apr 2012 10:49:49 +0200 (CEST) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org From: Thorsten Schoel Makes class/drm/[CONNECTOR]/edid writable for adding edid overrides. Signed-off-by: Thorsten Schoel --- 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, }; /** ---