1 | /* $NetBSD: gpiovar.h,v 1.16 2016/05/11 18:33:40 bouyer Exp $ */ |
2 | /* $OpenBSD: gpiovar.h,v 1.3 2006/01/14 12:33:49 grange Exp $ */ |
3 | |
4 | /* |
5 | * Copyright (c) 2004, 2006 Alexander Yurchenko <grange@openbsd.org> |
6 | * |
7 | * Permission to use, copy, modify, and distribute this software for any |
8 | * purpose with or without fee is hereby granted, provided that the above |
9 | * copyright notice and this permission notice appear in all copies. |
10 | * |
11 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
12 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
13 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
14 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
15 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
16 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
17 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
18 | */ |
19 | |
20 | #ifndef _DEV_GPIO_GPIOVAR_H_ |
21 | #define _DEV_GPIO_GPIOVAR_H_ |
22 | |
23 | #include <sys/device.h> |
24 | |
25 | /* GPIO controller description */ |
26 | typedef struct gpio_chipset_tag { |
27 | void *gp_cookie; |
28 | |
29 | int (*gp_gc_open)(void *, device_t); |
30 | void (*gp_gc_close)(void *, device_t); |
31 | int (*gp_pin_read)(void *, int); |
32 | void (*gp_pin_write)(void *, int, int); |
33 | void (*gp_pin_ctl)(void *, int, int); |
34 | void (*gp_pin_irqen)(void *, int, bool); |
35 | } *gpio_chipset_tag_t; |
36 | |
37 | /* GPIO pin description */ |
38 | typedef struct gpio_pin { |
39 | int pin_num; /* number */ |
40 | int pin_caps; /* capabilities */ |
41 | int pin_flags; /* current configuration */ |
42 | int pin_state; /* current state */ |
43 | int pin_mapped; /* is mapped */ |
44 | gpio_chipset_tag_t pin_gc; /* reference the controller */ |
45 | void (*pin_callback)(void *); /* irq callback */ |
46 | void * pin_callback_arg; /* callback arg */ |
47 | } gpio_pin_t; |
48 | |
49 | /* Attach GPIO framework to the controller */ |
50 | struct gpiobus_attach_args { |
51 | gpio_chipset_tag_t gba_gc; /* underlying controller */ |
52 | gpio_pin_t *gba_pins; /* pins array */ |
53 | int gba_npins; /* total number of pins */ |
54 | }; |
55 | |
56 | int gpiobus_print(void *, const char *); |
57 | |
58 | /* GPIO framework private methods */ |
59 | #define gpiobus_open(gc, dev) \ |
60 | ((gc)->gp_gc_open ? ((gc)->gp_gc_open((gc)->gp_cookie, dev)) : 0) |
61 | #define gpiobus_close(gc, dev) \ |
62 | ((gc)->gp_gc_close ? ((gc)->gp_gc_close((gc)->gp_cookie, dev)), 1 : 0) |
63 | #define gpiobus_pin_read(gc, pin) \ |
64 | ((gc)->gp_pin_read((gc)->gp_cookie, (pin))) |
65 | #define gpiobus_pin_write(gc, pin, value) \ |
66 | ((gc)->gp_pin_write((gc)->gp_cookie, (pin), (value))) |
67 | #define gpiobus_pin_ctl(gc, pin, flags) \ |
68 | ((gc)->gp_pin_ctl((gc)->gp_cookie, (pin), (flags))) |
69 | #define gpiobus_pin_irqen(gc, pin, en) \ |
70 | ((gc)->gp_pin_irqen((gc)->gp_cookie, (pin), (en))) |
71 | |
72 | /* Attach devices connected to the GPIO pins */ |
73 | struct gpio_attach_args { |
74 | void *ga_gpio; |
75 | int ga_offset; |
76 | uint32_t ga_mask; |
77 | char *ga_dvname; |
78 | uint32_t ga_flags; |
79 | }; |
80 | |
81 | /* GPIO pin map */ |
82 | struct gpio_pinmap { |
83 | int *pm_map; /* pin map */ |
84 | int pm_size; /* map size */ |
85 | }; |
86 | |
87 | struct gpio_dev { |
88 | device_t sc_dev; /* the gpio device */ |
89 | LIST_ENTRY(gpio_dev) sc_next; |
90 | }; |
91 | |
92 | struct gpio_name { |
93 | char gp_name[GPIOMAXNAME]; |
94 | int gp_pin; |
95 | LIST_ENTRY(gpio_name) gp_next; |
96 | }; |
97 | |
98 | void * gpio_find_device(const char *); |
99 | const char * gpio_get_name(void *gpio); |
100 | int gpio_pin_can_map(void *, int, uint32_t); |
101 | int gpio_pin_map(void *, int, uint32_t, struct gpio_pinmap *); |
102 | void gpio_pin_unmap(void *, struct gpio_pinmap *); |
103 | int gpio_pin_read(void *, struct gpio_pinmap *, int); |
104 | void gpio_pin_write(void *, struct gpio_pinmap *, int, int); |
105 | void gpio_pin_ctl(void *, struct gpio_pinmap *, int, int); |
106 | int gpio_pin_ctl_intr(void *, struct gpio_pinmap *, int, int, |
107 | int, void (*)(void *), void *); |
108 | void gpio_pin_irqen(void *, struct gpio_pinmap *, int, bool); |
109 | int gpio_pin_caps(void *, struct gpio_pinmap *, int); |
110 | int gpio_pin_wait(void *, int); |
111 | int gpio_npins(uint32_t); |
112 | |
113 | int gpio_lock(void *); |
114 | void gpio_unlock(void *); |
115 | |
116 | void gpio_intr(device_t, u_int32_t); |
117 | |
118 | #endif /* !_DEV_GPIO_GPIOVAR_H_ */ |
119 | |