Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:16

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /* Driver Manager Driver Interface Implementation.
0004  *
0005  * COPYRIGHT (c) 2009 Cobham Gaisler AB.
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  *
0028  */
0029 
0030 /*
0031  * This is the part the device driver API, the functions rely on that the
0032  * parent bus driver has implemented the neccessary operations correctly.
0033  *
0034  */
0035 
0036 #include <stdio.h>
0037 #include <stdlib.h>
0038 #include <string.h>
0039 
0040 #include <drvmgr/drvmgr.h>
0041 #include "drvmgr_internal.h"
0042 
0043 /* Get device pointer from knowing the Driver and the Driver minor
0044  * that was assigned to it
0045  */
0046 int drvmgr_get_dev(
0047     struct drvmgr_drv *drv,
0048     int minor,
0049     struct drvmgr_dev **pdev)
0050 {
0051     struct drvmgr_dev *dev;
0052     if (!drv)
0053         return -1;
0054 
0055     DRVMGR_LOCK_READ();
0056     dev = drv->dev;
0057     while (dev) {
0058         if (dev->minor_drv == minor)
0059             break;
0060         dev = dev->next_in_drv;
0061     }
0062     DRVMGR_UNLOCK();
0063     if (!dev)
0064         return -1;
0065     if (pdev)
0066         *pdev = dev;
0067     return 0;
0068 }
0069 
0070 /* Get Bus frequency in HZ from bus driver */
0071 int drvmgr_freq_get(
0072     struct drvmgr_dev *dev,
0073     int options,
0074     unsigned int *freq_hz)
0075 {
0076     if (!dev || !dev->parent || !dev->parent->ops->get_freq)
0077         return -1;
0078 
0079     return dev->parent->ops->get_freq(dev, options, freq_hz);
0080 }
0081 
0082 /* Get driver prefix */
0083 int drvmgr_get_dev_prefix(struct drvmgr_dev *dev, char *dev_prefix)
0084 {
0085     struct drvmgr_bus_params params;
0086     if (!dev || !dev->parent || !dev->parent->ops->get_params)
0087         return -1;
0088 
0089     dev->parent->ops->get_params(dev, &params);
0090     if (!params.dev_prefix)
0091         return -1;
0092     if (dev_prefix)
0093         strcpy(dev_prefix, params.dev_prefix);
0094     return 0;
0095 }
0096 
0097 /* Register an interrupt */
0098 int drvmgr_interrupt_register(
0099     struct drvmgr_dev *dev,
0100     int index,
0101     const char *info,
0102     drvmgr_isr isr,
0103     void *arg)
0104 {
0105     if (!dev || !dev->parent || !dev->parent->ops->int_register)
0106         return -1;
0107 
0108     if (!isr)
0109         return -1;
0110 
0111     return dev->parent->ops->int_register(dev, index, info, isr, arg);
0112 }
0113 
0114 /* Unregister an interrupt */
0115 int drvmgr_interrupt_unregister(
0116     struct drvmgr_dev *dev,
0117     int index,
0118     drvmgr_isr isr,
0119     void *arg)
0120 {
0121     if (!dev || !dev->parent || !dev->parent->ops->int_unregister)
0122         return -1;
0123 
0124     if (!isr)
0125         return -1;
0126 
0127     return dev->parent->ops->int_unregister(dev, index, isr, arg);
0128 }
0129 
0130 int drvmgr_interrupt_clear(
0131     struct drvmgr_dev *dev,
0132     int index)
0133 {
0134     if (!dev || !dev->parent || !dev->parent->ops->int_clear)
0135         return -1;
0136 
0137     return dev->parent->ops->int_clear(dev, index);
0138 }
0139 
0140 int drvmgr_interrupt_unmask(
0141     struct drvmgr_dev *dev,
0142     int index)
0143 {
0144     if (!dev || !dev->parent || !dev->parent->ops->int_unmask)
0145         return -1;
0146 
0147     return dev->parent->ops->int_unmask(dev, index);
0148 }
0149 
0150 int drvmgr_interrupt_mask(
0151     struct drvmgr_dev *dev,
0152     int index)
0153 {
0154     if (!dev || !dev->parent || !dev->parent->ops->int_mask)
0155         return -1;
0156 
0157     return dev->parent->ops->int_mask(dev, index);
0158 }
0159 
0160 #ifdef RTEMS_SMP
0161 int drvmgr_interrupt_set_affinity(
0162     struct drvmgr_dev *dev,
0163     int index,
0164     const Processor_mask *cpus)
0165 {
0166     if (!dev || !dev->parent || !dev->parent->ops->int_set_affinity)
0167         return -1;
0168 
0169     return dev->parent->ops->int_set_affinity(dev, index, cpus);
0170 }
0171 #endif
0172 
0173 int drvmgr_on_rootbus(struct drvmgr_dev *dev)
0174 {
0175     if (dev->parent && dev->parent->dev && dev->parent->dev->parent)
0176         return 0;
0177     else
0178         return 1;
0179 }