aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-01-20 15:47:20 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-20 15:47:20 -0800
commitb94f62772b7491873cb24026b92381c631c02b25 (patch)
treed058acf87e86806f367f957064db8e9e87b234c8 /driver
parentb6a24df72b45f2494204e2c1c6019fa099cc7857 (diff)
downloadpatches-b94f62772b7491873cb24026b92381c631c02b25.tar.gz
move drm patch to proper place
Diffstat (limited to 'driver')
-rw-r--r--driver/drm-classdev-cleanup.patch246
1 files changed, 246 insertions, 0 deletions
diff --git a/driver/drm-classdev-cleanup.patch b/driver/drm-classdev-cleanup.patch
new file mode 100644
index 0000000000000..b68d15cce23c0
--- /dev/null
+++ b/driver/drm-classdev-cleanup.patch
@@ -0,0 +1,246 @@
+From foo@baz.org Sun Jun 5 14:33:21 2005
+Date: Fri, 20 Jan 2006 14:08:59 -0800
+To: Greg KH <gregkh@suse.de>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: DRM: fix up classdev interface for drm core
+
+Current drm code doesn't work with userspace programs that listen only
+to the kernel event netlink socket as it is trying to create its own dev
+interface. Turns out lots of code can just be deleted as the driver
+core can do all of this work automatically for you.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+ drivers/char/drm/drmP.h | 10 +--
+ drivers/char/drm/drm_stub.c | 2
+ drivers/char/drm/drm_sysfs.c | 129 +++++++++----------------------------------
+ 3 files changed, 34 insertions(+), 107 deletions(-)
+
+--- gregkh-2.6.orig/drivers/char/drm/drm_sysfs.c 2006-01-17 08:27:27.000000000 -0800
++++ gregkh-2.6/drivers/char/drm/drm_sysfs.c 2006-01-20 14:45:39.000000000 -0800
+@@ -1,3 +1,4 @@
++
+ /*
+ * drm_sysfs.c - Modifications to drm_sysfs_class.c to support
+ * extra sysfs attribute from DRM. Normal drm_sysfs_class
+@@ -19,36 +20,6 @@
+ #include "drm_core.h"
+ #include "drmP.h"
+
+-struct drm_sysfs_class {
+- struct class_device_attribute attr;
+- struct class class;
+-};
+-#define to_drm_sysfs_class(d) container_of(d, struct drm_sysfs_class, class)
+-
+-struct simple_dev {
+- dev_t dev;
+- struct class_device class_dev;
+-};
+-#define to_simple_dev(d) container_of(d, struct simple_dev, class_dev)
+-
+-static void release_simple_dev(struct class_device *class_dev)
+-{
+- struct simple_dev *s_dev = to_simple_dev(class_dev);
+- kfree(s_dev);
+-}
+-
+-static ssize_t show_dev(struct class_device *class_dev, char *buf)
+-{
+- struct simple_dev *s_dev = to_simple_dev(class_dev);
+- return print_dev_t(buf, s_dev->dev);
+-}
+-
+-static void drm_sysfs_class_release(struct class *class)
+-{
+- struct drm_sysfs_class *cs = to_drm_sysfs_class(class);
+- kfree(cs);
+-}
+-
+ /* Display the version of drm_core. This doesn't work right in current design */
+ static ssize_t version_show(struct class *dev, char *buf)
+ {
+@@ -69,38 +40,16 @@
+ * Note, the pointer created here is to be destroyed when finished by making a
+ * call to drm_sysfs_destroy().
+ */
+-struct drm_sysfs_class *drm_sysfs_create(struct module *owner, char *name)
++struct class *drm_sysfs_create(struct module *owner, char *name)
+ {
+- struct drm_sysfs_class *cs;
+- int retval;
++ struct class *class;
++
++ class = class_create(owner, name);
++ if (!class)
++ return class;
+
+- cs = kmalloc(sizeof(*cs), GFP_KERNEL);
+- if (!cs) {
+- retval = -ENOMEM;
+- goto error;
+- }
+- memset(cs, 0x00, sizeof(*cs));
+-
+- cs->class.name = name;
+- cs->class.class_release = drm_sysfs_class_release;
+- cs->class.release = release_simple_dev;
+-
+- cs->attr.attr.name = "dev";
+- cs->attr.attr.mode = S_IRUGO;
+- cs->attr.attr.owner = owner;
+- cs->attr.show = show_dev;
+- cs->attr.store = NULL;
+-
+- retval = class_register(&cs->class);
+- if (retval)
+- goto error;
+- class_create_file(&cs->class, &class_attr_version);
+-
+- return cs;
+-
+- error:
+- kfree(cs);
+- return ERR_PTR(retval);
++ class_create_file(class, &class_attr_version);
++ return class;
+ }
+
+ /**
+@@ -110,12 +59,13 @@
+ * Note, the pointer to be destroyed must have been created with a call to
+ * drm_sysfs_create().
+ */
+-void drm_sysfs_destroy(struct drm_sysfs_class *cs)
++void drm_sysfs_destroy(struct class *class)
+ {
+- if ((cs == NULL) || (IS_ERR(cs)))
++ if ((class == NULL) || (IS_ERR(class)))
+ return;
+
+- class_unregister(&cs->class);
++ class_remove_file(class, &class_attr_version);
++ class_destroy(class);
+ }
+
+ static ssize_t show_dri(struct class_device *class_device, char *buf)
+@@ -132,7 +82,7 @@
+
+ /**
+ * drm_sysfs_device_add - adds a class device to sysfs for a character driver
+- * @cs: pointer to the struct drm_sysfs_class that this device should be registered to.
++ * @cs: pointer to the struct class that this device should be registered to.
+ * @dev: the dev_t for the device to be added.
+ * @device: a pointer to a struct device that is assiociated with this class device.
+ * @fmt: string for the class device's name
+@@ -141,46 +91,26 @@
+ * class. A "dev" file will be created, showing the dev_t for the device. The
+ * pointer to the struct class_device will be returned from the call. Any further
+ * sysfs files that might be required can be created using this pointer.
+- * Note: the struct drm_sysfs_class passed to this function must have previously been
++ * Note: the struct class passed to this function must have previously been
+ * created with a call to drm_sysfs_create().
+ */
+-struct class_device *drm_sysfs_device_add(struct drm_sysfs_class *cs,
+- drm_head_t *head)
++struct class_device *drm_sysfs_device_add(struct class *cs, drm_head_t *head)
+ {
+- struct simple_dev *s_dev = NULL;
+- int i, retval;
++ struct class_device *class_dev;
++ int i;
+
+- if ((cs == NULL) || (IS_ERR(cs))) {
+- retval = -ENODEV;
+- goto error;
+- }
+-
+- s_dev = kmalloc(sizeof(*s_dev), GFP_KERNEL);
+- if (!s_dev) {
+- retval = -ENOMEM;
+- goto error;
+- }
+- memset(s_dev, 0x00, sizeof(*s_dev));
+-
+- s_dev->dev = MKDEV(DRM_MAJOR, head->minor);
+- s_dev->class_dev.dev = &(head->dev->pdev)->dev;
+- s_dev->class_dev.class = &cs->class;
+-
+- snprintf(s_dev->class_dev.class_id, BUS_ID_SIZE, "card%d", head->minor);
+- retval = class_device_register(&s_dev->class_dev);
+- if (retval)
+- goto error;
++ class_dev = class_device_create(cs, NULL,
++ MKDEV(DRM_MAJOR, head->minor),
++ &(head->dev->pdev)->dev,
++ "card%d", head->minor);
++ if (!class_dev)
++ return NULL;
+
+- class_device_create_file(&s_dev->class_dev, &cs->attr);
+- class_set_devdata(&s_dev->class_dev, head);
++ class_set_devdata(class_dev, head);
+
+ for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
+- class_device_create_file(&s_dev->class_dev, &class_device_attrs[i]);
+- return &s_dev->class_dev;
+-
+-error:
+- kfree(s_dev);
+- return ERR_PTR(retval);
++ class_device_create_file(class_dev, &class_device_attrs[i]);
++ return class_dev;
+ }
+
+ /**
+@@ -192,10 +122,9 @@
+ */
+ void drm_sysfs_device_remove(struct class_device *class_dev)
+ {
+- struct simple_dev *s_dev = to_simple_dev(class_dev);
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
+- class_device_remove_file(&s_dev->class_dev, &class_device_attrs[i]);
+- class_device_unregister(&s_dev->class_dev);
++ class_device_remove_file(class_dev, &class_device_attrs[i]);
++ class_device_unregister(class_dev);
+ }
+--- gregkh-2.6.orig/drivers/char/drm/drmP.h 2006-01-17 08:27:27.000000000 -0800
++++ gregkh-2.6/drivers/char/drm/drmP.h 2006-01-20 14:30:33.000000000 -0800
+@@ -979,7 +979,7 @@
+ extern unsigned int drm_debug;
+ extern unsigned int drm_cards_limit;
+ extern drm_head_t **drm_heads;
+-extern struct drm_sysfs_class *drm_class;
++extern struct class *drm_class;
+ extern struct proc_dir_entry *drm_proc_root;
+
+ /* Proc support (drm_proc.h) */
+@@ -1010,11 +1010,9 @@
+ extern void drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah);
+
+ /* sysfs support (drm_sysfs.c) */
+-struct drm_sysfs_class;
+-extern struct drm_sysfs_class *drm_sysfs_create(struct module *owner,
+- char *name);
+-extern void drm_sysfs_destroy(struct drm_sysfs_class *cs);
+-extern struct class_device *drm_sysfs_device_add(struct drm_sysfs_class *cs,
++extern struct class *drm_sysfs_create(struct module *owner, char *name);
++extern void drm_sysfs_destroy(struct class *cs);
++extern struct class_device *drm_sysfs_device_add(struct class *cs,
+ drm_head_t *head);
+ extern void drm_sysfs_device_remove(struct class_device *class_dev);
+
+--- gregkh-2.6.orig/drivers/char/drm/drm_stub.c 2006-01-17 08:27:27.000000000 -0800
++++ gregkh-2.6/drivers/char/drm/drm_stub.c 2006-01-20 14:30:33.000000000 -0800
+@@ -50,7 +50,7 @@
+ module_param_named(debug, drm_debug, int, 0600);
+
+ drm_head_t **drm_heads;
+-struct drm_sysfs_class *drm_class;
++struct class *drm_class;
+ struct proc_dir_entry *drm_proc_root;
+
+ static int drm_fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,