Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6374475661172d508a9b93a2740a3fdc9d899756
Commit:     6374475661172d508a9b93a2740a3fdc9d899756
Parent:     990e53f880be9ff93072b4cce590ec2826cee0b6
Author:     Jean Delvare <[EMAIL PROTECTED]>
AuthorDate: Mon Aug 13 11:24:33 2007 +0200
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Oct 12 14:51:04 2007 -0700

    dmi-id: Use dynamic sysfs attributes
    
    We can use sysfs attributes with an extra parameter for dmi id
    attributes. This makes it possible to use the same callback function
    for all attributes, reducing the binary size significantly (-18% on
    x86_64.)
    
    Signed-off-by: Jean Delvare <[EMAIL PROTECTED]>
    Acked-by: Lennart Poettering <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/firmware/dmi-id.c |   38 ++++++++++++++++++++++++++------------
 1 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c
index 2678098..a7bd87d 100644
--- a/drivers/firmware/dmi-id.c
+++ b/drivers/firmware/dmi-id.c
@@ -13,21 +13,35 @@
 #include <linux/device.h>
 #include <linux/autoconf.h>
 
+struct dmi_device_attribute{
+       struct device_attribute dev_attr;
+       int field;
+};
+#define to_dmi_dev_attr(_dev_attr) \
+       container_of(_dev_attr, struct dmi_device_attribute, dev_attr)
+
 #define DEFINE_DMI_ATTR(_name, _mode, _show)           \
 static struct device_attribute sys_dmi_##_name##_attr =        \
        __ATTR(_name, _mode, _show, NULL);
 
-#define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field)                        
\
-static ssize_t sys_dmi_##_name##_show(struct device *dev,              \
-                                     struct device_attribute *attr,    \
-                                     char *page)                       \
-{                                                                      \
-       ssize_t len;                                                    \
-       len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(_field)); \
-       page[len-1] = '\n';                                             \
-       return len;                                                     \
-}                                                                      \
-DEFINE_DMI_ATTR(_name, _mode, sys_dmi_##_name##_show);
+static ssize_t sys_dmi_field_show(struct device *dev,
+                                 struct device_attribute *attr,
+                                 char *page)
+{
+       int field = to_dmi_dev_attr(attr)->field;
+       ssize_t len;
+       len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(field));
+       page[len-1] = '\n';
+       return len;
+}
+
+#define DMI_ATTR(_name, _mode, _show, _field)                  \
+       { .dev_attr = __ATTR(_name, _mode, _show, NULL),        \
+         .field = _field }
+
+#define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field)                \
+static struct dmi_device_attribute sys_dmi_##_name##_attr =    \
+       DMI_ATTR(_name, _mode, sys_dmi_field_show, _field);
 
 DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor,         0444, DMI_BIOS_VENDOR);
 DEFINE_DMI_ATTR_WITH_SHOW(bios_version,                0444, DMI_BIOS_VERSION);
@@ -160,7 +174,7 @@ static struct device *dmi_dev;
 
 #define ADD_DMI_ATTR(_name, _field) \
        if (dmi_get_system_info(_field)) \
-               sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr;
+               sys_dmi_attributes[i++] = &sys_dmi_##_name##_attr.dev_attr.attr;
 
 extern int dmi_available;
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to