summaryrefslogtreecommitdiffstats
path: root/cpukit/libdrvmgr/drvmgr_drvinf.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdrvmgr/drvmgr_drvinf.c')
-rw-r--r--cpukit/libdrvmgr/drvmgr_drvinf.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/cpukit/libdrvmgr/drvmgr_drvinf.c b/cpukit/libdrvmgr/drvmgr_drvinf.c
new file mode 100644
index 0000000000..9f7c7a5713
--- /dev/null
+++ b/cpukit/libdrvmgr/drvmgr_drvinf.c
@@ -0,0 +1,148 @@
+/* Driver Manager Driver 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.
+ *
+ */
+
+/*
+ * This is the part the device driver API, the functions rely on that the
+ * parent bus driver has implemented the neccessary operations correctly.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <drvmgr/drvmgr.h>
+#include "drvmgr_internal.h"
+
+/* Get device pointer from knowing the Driver and the Driver minor
+ * that was assigned to it
+ */
+int drvmgr_get_dev(
+ struct drvmgr_drv *drv,
+ int minor,
+ struct drvmgr_dev **pdev)
+{
+ struct drvmgr_dev *dev;
+ if (!drv)
+ return -1;
+
+ DRVMGR_LOCK_READ();
+ dev = drv->dev;
+ while (dev) {
+ if (dev->minor_drv == minor)
+ break;
+ dev = dev->next_in_drv;
+ }
+ DRVMGR_UNLOCK();
+ if (!dev)
+ return -1;
+ if (pdev)
+ *pdev = dev;
+ return 0;
+}
+
+/* Get Bus frequency in HZ from bus driver */
+int drvmgr_freq_get(
+ struct drvmgr_dev *dev,
+ int options,
+ unsigned int *freq_hz)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->freq_get)
+ return -1;
+
+ return dev->parent->ops->freq_get(dev, options, freq_hz);
+}
+
+/* Get driver prefix */
+int drvmgr_get_dev_prefix(struct drvmgr_dev *dev, char *dev_prefix)
+{
+ struct drvmgr_bus_params params;
+ if (!dev || !dev->parent || !dev->parent->ops->get_params)
+ return -1;
+
+ dev->parent->ops->get_params(dev, &params);
+ if (!params.dev_prefix)
+ return -1;
+ if (dev_prefix)
+ strcpy(dev_prefix, params.dev_prefix);
+ return 0;
+}
+
+/* Register an interrupt */
+int drvmgr_interrupt_register(
+ struct drvmgr_dev *dev,
+ int index,
+ const char *info,
+ drvmgr_isr isr,
+ void *arg)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->int_register)
+ return -1;
+
+ if (!isr)
+ return -1;
+
+ return dev->parent->ops->int_register(dev, index, info, isr, arg);
+}
+
+/* Unregister an interrupt */
+int drvmgr_interrupt_unregister(
+ struct drvmgr_dev *dev,
+ int index,
+ drvmgr_isr isr,
+ void *arg)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->int_unregister)
+ return -1;
+
+ if (!isr)
+ return -1;
+
+ return dev->parent->ops->int_unregister(dev, index, isr, arg);
+}
+
+int drvmgr_interrupt_clear(
+ struct drvmgr_dev *dev,
+ int index)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->int_clear)
+ return -1;
+
+ return dev->parent->ops->int_clear(dev, index);
+}
+
+int drvmgr_interrupt_unmask(
+ struct drvmgr_dev *dev,
+ int index)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->int_unmask)
+ return -1;
+
+ return dev->parent->ops->int_unmask(dev, index);
+}
+
+int drvmgr_interrupt_mask(
+ struct drvmgr_dev *dev,
+ int index)
+{
+ if (!dev || !dev->parent || !dev->parent->ops->int_mask)
+ return -1;
+
+ return dev->parent->ops->int_mask(dev, index);
+}
+
+int drvmgr_on_rootbus(struct drvmgr_dev *dev)
+{
+ if (dev->parent && dev->parent->dev && dev->parent->dev->parent)
+ return 0;
+ else
+ return 1;
+}