File indexing completed on 2025-05-11 08:24:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
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
0044
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
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
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, ¶ms);
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
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
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 }