[PATCH v2 07/14] OdevAttribute: Add support for integer attributes

Hans de Goede hdegoede at redhat.com
Tue Feb 4 12:49:13 CET 2014


Add a couple of new functions for dealing with storing integer values into
OdevAttributes.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 config/config.c                     | 40 +++++++++++++++++++++++++++++++++++++
 hw/xfree86/common/xf86platformBus.c | 18 +++++++++++++++++
 hw/xfree86/common/xf86platformBus.h |  6 ++++++
 include/hotplug.h                   | 16 ++++++++++++++-
 4 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/config/config.c b/config/config.c
index aaef746..5833992 100644
--- a/config/config.c
+++ b/config/config.c
@@ -172,6 +172,26 @@ config_odev_add_attribute(struct OdevAttributes *attribs, int attrib,
     oa->attrib_id = attrib;
     free(oa->attrib_name);
     oa->attrib_name = strdup(attrib_name);
+    oa->attrib_type = odev_attrib_string;
+    xorg_list_append(&oa->member, &attribs->list);
+    return TRUE;
+}
+
+Bool
+config_odev_add_int_attribute(struct OdevAttributes *attribs, int attrib,
+                              int attrib_value)
+{
+    struct OdevAttribute *oa;
+
+    oa = config_odev_find_attribute(attribs, attrib);
+    if (!oa)
+        oa = calloc(1, sizeof(struct OdevAttribute));
+    if (!oa)
+        return FALSE;
+
+    oa->attrib_id = attrib;
+    oa->attrib_value = attrib_value;
+    oa->attrib_type = odev_attrib_int;
     xorg_list_append(&oa->member, &attribs->list);
     return TRUE;
 }
@@ -184,9 +204,29 @@ char *config_odev_get_attribute(struct OdevAttributes *attribs, int attrib_id)
     if (!oa)
         return NULL;
 
+    if (oa->attrib_type != odev_attrib_string) {
+        LogMessage(X_ERROR, "Error config_odev_get_attribute called for non string attrib %d\n", attrib_id);
+        return NULL;
+    }
     return oa->attrib_name;
 }
 
+int config_odev_get_int_attribute(struct OdevAttributes *attribs, int attrib_id, int def)
+{
+    struct OdevAttribute *oa;
+
+    oa = config_odev_find_attribute(attribs, attrib_id);
+    if (!oa)
+        return def;
+
+    if (oa->attrib_type != odev_attrib_int) {
+        LogMessage(X_ERROR, "Error config_odev_get_int_attribute called for non int attrib %d\n", attrib_id);
+        return def;
+    }
+
+    return oa->attrib_value;
+}
+
 void
 config_odev_free_attributes(struct OdevAttributes *attribs)
 {
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 6d3816d..7a9600a 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -89,6 +89,12 @@ xf86_add_platform_device_attrib(int index, int attrib_id, char *attrib_name)
     return config_odev_add_attribute(device->attribs, attrib_id, attrib_name);
 }
 
+Bool
+xf86_add_platform_device_int_attrib(int index, int attrib_id, int attrib_value)
+{
+    return config_odev_add_int_attribute(xf86_platform_devices[index].attribs, attrib_id, attrib_value);
+}
+
 char *
 xf86_get_platform_attrib(int index, int attrib_id)
 {
@@ -101,6 +107,18 @@ xf86_get_platform_device_attrib(struct xf86_platform_device *device, int attrib_
     return config_odev_get_attribute(device->attribs, attrib_id);
 }
 
+int
+xf86_get_platform_int_attrib(int index, int attrib_id, int def)
+{
+    return config_odev_get_int_attribute(xf86_platform_devices[index].attribs, attrib_id, def);
+}
+
+int
+xf86_get_platform_device_int_attrib(struct xf86_platform_device *device, int attrib_id, int def)
+{
+    return config_odev_get_int_attribute(device->attribs, attrib_id, def);
+}
+
 Bool
 xf86_get_platform_device_unowned(int index)
 {
diff --git a/hw/xfree86/common/xf86platformBus.h b/hw/xfree86/common/xf86platformBus.h
index 4e17578..d764026 100644
--- a/hw/xfree86/common/xf86platformBus.h
+++ b/hw/xfree86/common/xf86platformBus.h
@@ -41,12 +41,16 @@ extern int xf86_num_platform_devices;
 extern char *
 xf86_get_platform_attrib(int index, int attrib_id);
 extern int
+xf86_get_platform_int_attrib(int index, int attrib_id, int def);
+extern int
 xf86_add_platform_device(struct OdevAttributes *attribs);
 extern int
 xf86_remove_platform_device(int dev_index);
 extern Bool
 xf86_add_platform_device_attrib(int index, int attrib_id, char *attrib_str);
 extern Bool
+xf86_add_platform_device_int_attrib(int index, int attrib_id, int attrib_value);
+extern Bool
 xf86_get_platform_device_unowned(int index);
 
 extern int
@@ -56,6 +60,8 @@ xf86platformRemoveDevice(int index);
 
 extern _X_EXPORT char *
 xf86_get_platform_device_attrib(struct xf86_platform_device *device, int attrib_id);
+extern _X_EXPORT int
+xf86_get_platform_device_int_attrib(struct xf86_platform_device *device, int attrib_id, int def);
 extern _X_EXPORT Bool
 xf86PlatformDeviceCheckBusID(struct xf86_platform_device *device, const char *busid);
 
diff --git a/include/hotplug.h b/include/hotplug.h
index ee7b7d7..6aa7d8d 100644
--- a/include/hotplug.h
+++ b/include/hotplug.h
@@ -32,10 +32,16 @@ extern _X_EXPORT void config_pre_init(void);
 extern _X_EXPORT void config_init(void);
 extern _X_EXPORT void config_fini(void);
 
+enum { odev_attrib_string, odev_attrib_int };
+
 struct OdevAttribute {
     struct xorg_list member;
     int attrib_id;
-    char *attrib_name;
+    union {
+        char *attrib_name;
+        int attrib_value;
+    };
+    int attrib_type;
 };
 
 struct OdevAttributes {
@@ -56,6 +62,14 @@ config_odev_add_attribute(struct OdevAttributes *attribs, int attrib,
 char *
 config_odev_get_attribute(struct OdevAttributes *attribs, int attrib_id);
 
+Bool
+config_odev_add_int_attribute(struct OdevAttributes *attribs, int attrib,
+                              int attrib_value);
+
+int
+config_odev_get_int_attribute(struct OdevAttributes *attribs, int attrib,
+                              int def);
+
 void
 config_odev_free_attributes(struct OdevAttributes *attribs);
 
-- 
1.8.5.3



More information about the xorg-devel mailing list