source: rtems/c/src/lib/libbsp/sparc/shared/gpio/gpiolib.c @ 4a7d1026

4.11
Last change on this file since 4a7d1026 was 4a7d1026, checked in by Daniel Hellstrom <daniel@…>, on Apr 13, 2015 at 8:25:52 AM

sparc bsps: updated license to rtems.org

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*  GPIOLIB interface implementation
2 *
3 *  COPYRIGHT (c) 2009.
4 *  Cobham Gaisler AB.
5 *
6 *  The license and distribution terms for this file may be
7 *  found in the file LICENSE in this distribution or at
8 *  http://www.rtems.org/license/LICENSE.
9 */
10
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14
15#include <bsp/gpiolib.h>
16
17struct gpiolib_port;
18
19struct gpiolib_port {
20        struct gpiolib_port     *next;
21        int                     minor;
22        struct gpiolib_drv      *drv;
23        void                    *handle;
24
25        int                     open;
26};
27
28/* Root of GPIO Ports */
29struct gpiolib_port *gpiolib_ports;
30
31/* Number of GPIO ports registered */
32static int port_nr;
33
34/* 1 if libraray initialized */
35static int gpiolib_initied = 0;
36
37/* Insert a port first in ports list */
38static void gpiolib_list_add(struct gpiolib_port *port)
39{
40        port->next = gpiolib_ports;
41        gpiolib_ports = port;
42}
43
44static struct gpiolib_port *gpiolib_find(int minor)
45{
46        struct gpiolib_port *p;
47
48        p = gpiolib_ports;
49        while ( p && (p->minor != minor) ) {
50                p = p->next;
51        }
52        return p;
53}
54
55static struct gpiolib_port *gpiolib_find_by_name(char *name)
56{
57        struct gpiolib_port *p;
58        struct gpiolib_info info;
59        int (*get_info)(void *, struct gpiolib_info *);
60
61        p = gpiolib_ports;
62        while ( p ) {
63                get_info = p->drv->ops->get_info;
64                if ( get_info && (get_info(p->handle, &info) == 0) ) {
65                        if ( strncmp(name, (char *)&info.devName[0], 64) == 0 ) {
66                                break;
67                        }
68                }
69                p = p->next;
70        }
71        return p;
72}
73
74int gpiolib_drv_register(struct gpiolib_drv *drv, void *handle)
75{
76        struct gpiolib_port *port;
77
78        if ( !drv || !drv->ops )
79                return -1;
80
81        port = malloc(sizeof(*port));
82        if ( port == NULL )
83                return -1;
84
85        memset(port, 0, sizeof(*port));
86        port->handle = handle;
87        port->minor = port_nr++;
88        port->drv = drv;
89
90        gpiolib_list_add(port);
91
92        return 0;
93}
94
95void gpiolib_show(int port, void *handle)
96{
97        struct gpiolib_port *p;
98
99        if ( port == -1 ) {
100                p = gpiolib_ports;
101                while (p != NULL) {
102                        if ( p->drv->ops->show )
103                                p->drv->ops->show(p->handle);
104                        p = p->next;
105                }
106        } else {
107                if ( handle ) {
108                        p = handle;
109                } else {
110                        p = gpiolib_find(port);
111                }
112                if ( p == NULL ) {
113                        printf("PORT %d NOT FOUND\n", port);
114                        return;
115                }
116                if ( p->drv->ops->show )
117                        p->drv->ops->show(p->handle);
118        }
119}
120
121static void *gpiolib_open_internal(int port, char *devName)
122{
123        struct gpiolib_port *p;
124
125        if ( gpiolib_initied == 0 )
126                return NULL;
127
128        /* Find */
129        if ( port >= 0 ) {
130                p = gpiolib_find(port);
131        } else {
132                p = gpiolib_find_by_name(devName);
133        }
134        if ( p == NULL )
135                return NULL;
136
137        if ( p->open )
138                return NULL;
139
140        p->open = 1;
141        return p;
142}
143
144void *gpiolib_open(int port)
145{
146        return gpiolib_open_internal(port, NULL);
147}
148
149void *gpiolib_open_by_name(char *devName)
150{
151        return gpiolib_open_internal(-1, devName);
152}
153
154void gpiolib_close(void *handle)
155{
156        struct gpiolib_port *p = handle;
157
158        if ( p && p->open ) {
159                p->open = 0;
160        }
161}
162
163int gpiolib_set_config(void *handle, struct gpiolib_config *cfg)
164{
165        struct gpiolib_port *port = handle;
166
167        if ( !port || !cfg )
168                return -1;
169
170        if ( !port->drv->ops->config )
171                return -1;
172
173        return port->drv->ops->config(port->handle, cfg);
174}
175
176int gpiolib_set(void *handle, int dir, int outval)
177{
178        struct gpiolib_port *port = handle;
179
180        if ( !port )
181                return -1;
182
183        if ( !port->drv->ops->set )
184                return -1;
185
186        return port->drv->ops->set(port->handle, dir, outval); 
187}
188
189int gpiolib_get(void *handle, int *inval)
190{
191        struct gpiolib_port *port = handle;
192
193        if ( !port || !inval)
194                return -1;
195
196        if ( !port->drv->ops->get )
197                return -1;
198
199        return port->drv->ops->get(port->handle, inval);
200}
201
202/*** IRQ Functions ***/
203int gpiolib_irq_register(void *handle, void *func, void *arg)
204{
205        struct gpiolib_port *port = handle;
206
207        if ( !port )
208                return -1;
209
210        if ( !port->drv->ops->irq_register )
211                return -1;
212
213        return port->drv->ops->irq_register(port->handle, func, arg);
214}
215
216static int gpiolib_irq_opts(void *handle, unsigned int options)
217{
218        struct gpiolib_port *port = handle;
219
220        if ( !port )
221                return -1;
222
223        if ( !port->drv->ops->irq_opts )
224                return -1;
225
226        return port->drv->ops->irq_opts(port->handle, options);
227}
228
229int gpiolib_irq_clear(void *handle)
230{
231        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_CLEAR);
232}
233
234int gpiolib_irq_force(void *handle)
235{
236        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_FORCE);
237}
238
239int gpiolib_irq_enable(void *handle)
240{
241        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_ENABLE);
242}
243
244int gpiolib_irq_disable(void *handle)
245{
246        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_DISABLE);
247}
248
249int gpiolib_irq_mask(void *handle)
250{
251        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_MASK);
252}
253
254int gpiolib_irq_unmask(void *handle)
255{
256        return gpiolib_irq_opts(handle, GPIOLIB_IRQ_UNMASK);
257}
258
259
260/*** Initialization ***/
261int gpiolib_initialize(void)
262{
263        if ( gpiolib_initied != 0 )
264                return 0;
265
266        /* Initialize Libarary */
267        port_nr = 0;
268        gpiolib_ports = 0;
269        gpiolib_initied = 1;
270        return 0;
271}
Note: See TracBrowser for help on using the repository browser.