summaryrefslogtreecommitdiffstats
path: root/cpukit/libdrvmgr/drvmgr_res.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdrvmgr/drvmgr_res.c')
-rw-r--r--cpukit/libdrvmgr/drvmgr_res.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/cpukit/libdrvmgr/drvmgr_res.c b/cpukit/libdrvmgr/drvmgr_res.c
new file mode 100644
index 0000000000..5f8598b7d8
--- /dev/null
+++ b/cpukit/libdrvmgr/drvmgr_res.c
@@ -0,0 +1,102 @@
+/* Driver Manager Driver Resource Interface Implementation.
+ *
+ * COPYRIGHT (c) 2009.
+ * Cobham Gaisler AB.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <string.h>
+#include <drvmgr/drvmgr.h>
+
+/* Find all the resource keys for a device among all bus resources */
+int drvmgr_keys_get(struct drvmgr_dev *dev, struct drvmgr_key **keys)
+{
+ struct drvmgr_bus *bus;
+ struct drvmgr_bus_res *node;
+ struct drvmgr_drv_res *res;
+ uint64_t drv_id;
+
+ bus = dev->parent;
+ if (!bus || !dev->drv)
+ return -1;
+
+ drv_id = dev->drv->drv_id;
+
+ /* Loop all resource arrays */
+ node = bus->reslist;
+ while (node) {
+ /* Find driver ID in resource array */
+ res = &node->resource[0];
+ while (res->drv_id) {
+ if (res->drv_id == drv_id) {
+ /* Found resource matching driver, now check
+ * that this resource is for this device.
+ */
+ if (dev->minor_bus == res->minor_bus) {
+ /* Matching driver and core number */
+ if (keys)
+ *keys = res->keys;
+ return 0;
+ }
+ }
+ res++;
+ }
+ node = node->next;
+ }
+ if (keys)
+ *keys = NULL;
+ return 1;
+}
+
+/* Return key that matches key name */
+struct drvmgr_key *drvmgr_key_get(
+ struct drvmgr_key *keys,
+ char *key_name)
+{
+ struct drvmgr_key *key;
+
+ if (!keys)
+ return NULL;
+
+ key = keys;
+ while (key->key_type != KEY_TYPE_NONE) {
+ if (strcmp(key_name, key->key_name) == 0)
+ return key;
+ key++;
+ }
+ return NULL;
+}
+
+union drvmgr_key_value *drvmgr_key_val_get(
+ struct drvmgr_key *keys,
+ char *key_name,
+ int key_type)
+{
+ struct drvmgr_key *key_match;
+
+ key_match = drvmgr_key_get(keys, key_name);
+ if (key_match) {
+ /* Found key, put pointer to value into */
+ if ((key_type == -1) || (key_match->key_type == key_type))
+ return &key_match->key_value;
+ }
+ return NULL;
+}
+
+union drvmgr_key_value *drvmgr_dev_key_get(
+ struct drvmgr_dev *dev,
+ char *key_name,
+ int key_type)
+{
+ struct drvmgr_key *keys = NULL;
+
+ /* Find first entry in key array for the device */
+ if (drvmgr_keys_get(dev, &keys))
+ return NULL;
+
+ /* Find a specific key among the device keys */
+ return drvmgr_key_val_get(keys, key_name, key_type);
+}