source: rtems/cpukit/libdrvmgr/drvmgr_drvinf.c

Last change on this file was 72d83c61, checked in by Joel Sherrill <joel@…>, on 02/28/22 at 23:09:22

cpukit/libdrvmsg: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/* Driver Manager Driver Interface Implementation.
4 *
5 * COPYRIGHT (c) 2009 Cobham Gaisler AB.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30/*
31 * This is the part the device driver API, the functions rely on that the
32 * parent bus driver has implemented the neccessary operations correctly.
33 *
34 */
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <string.h>
39
40#include <drvmgr/drvmgr.h>
41#include "drvmgr_internal.h"
42
43/* Get device pointer from knowing the Driver and the Driver minor
44 * that was assigned to it
45 */
46int drvmgr_get_dev(
47        struct drvmgr_drv *drv,
48        int minor,
49        struct drvmgr_dev **pdev)
50{
51        struct drvmgr_dev *dev;
52        if (!drv)
53                return -1;
54
55        DRVMGR_LOCK_READ();
56        dev = drv->dev;
57        while (dev) {
58                if (dev->minor_drv == minor)
59                        break;
60                dev = dev->next_in_drv;
61        }
62        DRVMGR_UNLOCK();
63        if (!dev)
64                return -1;
65        if (pdev)
66                *pdev = dev;
67        return 0;
68}
69
70/* Get Bus frequency in HZ from bus driver */
71int drvmgr_freq_get(
72        struct drvmgr_dev *dev,
73        int options,
74        unsigned int *freq_hz)
75{
76        if (!dev || !dev->parent || !dev->parent->ops->get_freq)
77                return -1;
78
79        return dev->parent->ops->get_freq(dev, options, freq_hz);
80}
81
82/* Get driver prefix */
83int drvmgr_get_dev_prefix(struct drvmgr_dev *dev, char *dev_prefix)
84{
85        struct drvmgr_bus_params params;
86        if (!dev || !dev->parent || !dev->parent->ops->get_params)
87                return -1;
88
89        dev->parent->ops->get_params(dev, &params);
90        if (!params.dev_prefix)
91                return -1;
92        if (dev_prefix)
93                strcpy(dev_prefix, params.dev_prefix);
94        return 0;
95}
96
97/* Register an interrupt */
98int drvmgr_interrupt_register(
99        struct drvmgr_dev *dev,
100        int index,
101        const char *info,
102        drvmgr_isr isr,
103        void *arg)
104{
105        if (!dev || !dev->parent || !dev->parent->ops->int_register)
106                return -1;
107
108        if (!isr)
109                return -1;
110
111        return dev->parent->ops->int_register(dev, index, info, isr, arg);
112}
113
114/* Unregister an interrupt */
115int drvmgr_interrupt_unregister(
116        struct drvmgr_dev *dev,
117        int index,
118        drvmgr_isr isr,
119        void *arg)
120{
121        if (!dev || !dev->parent || !dev->parent->ops->int_unregister)
122                return -1;
123
124        if (!isr)
125                return -1;
126
127        return dev->parent->ops->int_unregister(dev, index, isr, arg);
128}
129
130int drvmgr_interrupt_clear(
131        struct drvmgr_dev *dev,
132        int index)
133{
134        if (!dev || !dev->parent || !dev->parent->ops->int_clear)
135                return -1;
136
137        return dev->parent->ops->int_clear(dev, index);
138}
139
140int drvmgr_interrupt_unmask(
141        struct drvmgr_dev *dev,
142        int index)
143{
144        if (!dev || !dev->parent || !dev->parent->ops->int_unmask)
145                return -1;
146
147        return dev->parent->ops->int_unmask(dev, index);
148}
149
150int drvmgr_interrupt_mask(
151        struct drvmgr_dev *dev,
152        int index)
153{
154        if (!dev || !dev->parent || !dev->parent->ops->int_mask)
155                return -1;
156
157        return dev->parent->ops->int_mask(dev, index);
158}
159
160#ifdef RTEMS_SMP
161int drvmgr_interrupt_set_affinity(
162        struct drvmgr_dev *dev,
163        int index,
164        const Processor_mask *cpus)
165{
166        if (!dev || !dev->parent || !dev->parent->ops->int_set_affinity)
167                return -1;
168
169        return dev->parent->ops->int_set_affinity(dev, index, cpus);
170}
171#endif
172
173int drvmgr_on_rootbus(struct drvmgr_dev *dev)
174{
175        if (dev->parent && dev->parent->dev && dev->parent->dev->parent)
176                return 0;
177        else
178                return 1;
179}
Note: See TracBrowser for help on using the repository browser.