From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S262886AbUCPBWt (ORCPT ); Mon, 15 Mar 2004 20:22:49 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S262997AbUCPBSn (ORCPT ); Mon, 15 Mar 2004 20:18:43 -0500 Received: from mail.kroah.org ([65.200.24.183]:55983 "EHLO perch.kroah.org") by vger.kernel.org with ESMTP id S262944AbUCPADU convert rfc822-to-8bit (ORCPT ); Mon, 15 Mar 2004 19:03:20 -0500 Subject: Re: [PATCH] Driver Core update for 2.6.4 In-Reply-To: <10793951483511@kroah.com> X-Mailer: gregkh_patchbomb Date: Mon, 15 Mar 2004 15:59:08 -0800 Message-Id: <1079395148429@kroah.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII To: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 7BIT From: Greg KH Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org ChangeSet 1.1608.84.11, 2004/03/11 16:35:34-08:00, ogasawara@osdl.org [PATCH] add sysfs simple class support for DRI char device Patch adds sysfs simple class support for DRI character device (Major 226). Also, adds some error checking. drivers/char/drm/drm_stub.h | 35 ++++++++++++++++++++++++++++++++--- 1 files changed, 32 insertions(+), 3 deletions(-) diff -Nru a/drivers/char/drm/drm_stub.h b/drivers/char/drm/drm_stub.h --- a/drivers/char/drm/drm_stub.h Mon Mar 15 15:28:51 2004 +++ b/drivers/char/drm/drm_stub.h Mon Mar 15 15:28:51 2004 @@ -35,6 +35,8 @@ #define DRM_STUB_MAXCARDS 16 /* Enough for one machine */ +static struct class_simple *drm_class; + /** Stub list. One for each minor. */ static struct drm_stub_list { const char *name; @@ -117,6 +119,7 @@ DRM(stub_root) = DRM(proc_init)(dev, i, DRM(stub_root), &DRM(stub_list)[i] .dev_root); + class_simple_device_add(drm_class, MKDEV(DRM_MAJOR, i), NULL, name); return i; } } @@ -141,6 +144,7 @@ DRM(proc_cleanup)(minor, DRM(stub_root), DRM(stub_list)[minor].dev_root); if (minor) { + class_simple_device_remove(MKDEV(DRM_MAJOR, minor)); inter_module_put("drm"); } else { inter_module_unregister("drm"); @@ -148,6 +152,8 @@ sizeof(*DRM(stub_list)) * DRM_STUB_MAXCARDS, DRM_MEM_STUB); unregister_chrdev(DRM_MAJOR, "drm"); + class_simple_device_remove(MKDEV(DRM_MAJOR, minor)); + class_simple_destroy(drm_class); } return 0; } @@ -170,10 +176,23 @@ drm_device_t *dev) { struct drm_stub_info *i = NULL; + int ret1; + int ret2; DRM_DEBUG("\n"); - if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) + ret1 = register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops)); + if (!ret1) { + drm_class = class_simple_create(THIS_MODULE, "drm"); + if (IS_ERR(drm_class)) { + printk (KERN_ERR "Error creating drm class.\n"); + unregister_chrdev(DRM_MAJOR, "drm"); + return PTR_ERR(drm_class); + } + } + else if (ret1 == -EBUSY) i = (struct drm_stub_info *)inter_module_get("drm"); + else + return -1; if (i) { /* Already registered */ @@ -186,8 +205,18 @@ DRM_DEBUG("calling inter_module_register\n"); inter_module_register("drm", THIS_MODULE, &DRM(stub_info)); } - if (DRM(stub_info).info_register) - return DRM(stub_info).info_register(name, fops, dev); + if (DRM(stub_info).info_register) { + ret2 = DRM(stub_info).info_register(name, fops, dev); + if (ret2) { + if (!ret1) { + unregister_chrdev(DRM_MAJOR, "drm"); + class_simple_destroy(drm_class); + } + if (!i) + inter_module_unregister("drm"); + } + return ret2; + } return -1; }