From e7fade3ac4559214ab0508dc54a71a3d1f522afb Mon Sep 17 00:00:00 2001 From: Daniel Hellstrom Date: Mon, 28 Nov 2011 09:52:03 +0100 Subject: DRVMGR: added driver manager to cpukit/libdrvmgr --- cpukit/libdrvmgr/drvmgr_drvinf.c | 148 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 cpukit/libdrvmgr/drvmgr_drvinf.c (limited to 'cpukit/libdrvmgr/drvmgr_drvinf.c') 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 +#include +#include + +#include +#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, ¶ms); + 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; +} -- cgit v1.2.3