gemini_lpcvar.h revision 1.4 1 1.4 chs /* $NetBSD: gemini_lpcvar.h,v 1.4 2012/10/27 17:17:38 chs Exp $ */
2 1.1 cliff
3 1.1 cliff #ifndef _ARM_GEMINI_LPCVAR_H
4 1.1 cliff #define _ARM_GEMINI_LPCVAR_H
5 1.1 cliff
6 1.1 cliff #include <sys/types.h>
7 1.1 cliff #include <sys/device.h>
8 1.3 dyoung #include <sys/bus.h>
9 1.1 cliff
10 1.1 cliff #define GEMINI_LPC_LDN_ALL -1 /* "global" LDN */
11 1.1 cliff
12 1.1 cliff typedef void * lpctag_t;
13 1.1 cliff typedef void * lpcintrtag_t;
14 1.1 cliff
15 1.1 cliff typedef struct gemini_lpc_attach_args {
16 1.2 cliff lpctag_t lpc_tag;
17 1.1 cliff uint lpc_ldn;
18 1.1 cliff bus_addr_t lpc_base;
19 1.1 cliff bus_addr_t lpc_addr;
20 1.1 cliff bus_size_t lpc_size;
21 1.1 cliff uint lpc_intr;
22 1.1 cliff bus_space_tag_t lpc_iot;
23 1.1 cliff } gemini_lpc_attach_args_t;
24 1.1 cliff
25 1.2 cliff /* la_flags */
26 1.2 cliff #define LPC_FL_ENABLED 0x01 /* device is enabled */
27 1.2 cliff
28 1.2 cliff typedef struct gemini_lpc_bus_ops {
29 1.2 cliff uint8_t (*lpc_pnp_read)(lpctag_t, int, uint);
30 1.2 cliff void (*lpc_pnp_write)(lpctag_t, int, uint, uint8_t);
31 1.2 cliff void (*lpc_pnp_enter)(lpctag_t);
32 1.2 cliff void (*lpc_pnp_exit)(lpctag_t);
33 1.2 cliff void *(*lpc_intr_establish)(lpctag_t, uint, int, int,
34 1.2 cliff int (*)(void *), void *);
35 1.2 cliff void (*lpc_intr_disestablish)(lpctag_t, void *);
36 1.2 cliff } gemini_lpc_bus_ops_t;
37 1.2 cliff
38 1.1 cliff typedef struct gemini_lpc_softc {
39 1.2 cliff bus_addr_t sc_addr;
40 1.2 cliff bus_size_t sc_size;
41 1.2 cliff int sc_intr;
42 1.2 cliff bus_space_tag_t sc_iot;
43 1.2 cliff bus_space_handle_t sc_ioh;
44 1.2 cliff void *sc_lpchctag;
45 1.2 cliff struct gemini_lpc_bus_ops *sc_bus_ops;
46 1.1 cliff } gemini_lpc_softc_t;
47 1.1 cliff
48 1.1 cliff
49 1.2 cliff static inline uint8_t
50 1.2 cliff lpc_pnp_read(lpctag_t tag, int ldn, uint off)
51 1.2 cliff {
52 1.2 cliff gemini_lpc_softc_t *sc = tag;
53 1.2 cliff return (*sc->sc_bus_ops->lpc_pnp_read)(tag, ldn, off);
54 1.2 cliff }
55 1.2 cliff
56 1.2 cliff static inline void
57 1.2 cliff lpc_pnp_write(lpctag_t tag, int ldn, uint off, uint8_t val)
58 1.2 cliff {
59 1.2 cliff gemini_lpc_softc_t *sc = tag;
60 1.2 cliff return (*sc->sc_bus_ops->lpc_pnp_write)(tag, ldn, off, val);
61 1.2 cliff }
62 1.2 cliff
63 1.2 cliff static inline void
64 1.2 cliff lpc_pnp_enter(lpctag_t tag)
65 1.2 cliff {
66 1.2 cliff gemini_lpc_softc_t *sc = tag;
67 1.2 cliff return (*sc->sc_bus_ops->lpc_pnp_enter)(tag);
68 1.2 cliff }
69 1.2 cliff
70 1.2 cliff static inline void
71 1.2 cliff lpc_pnp_exit(lpctag_t tag)
72 1.2 cliff {
73 1.2 cliff gemini_lpc_softc_t *sc = tag;
74 1.2 cliff return (*sc->sc_bus_ops->lpc_pnp_exit)(tag);
75 1.2 cliff }
76 1.2 cliff
77 1.2 cliff static inline void *
78 1.2 cliff lpc_intr_establish(lpctag_t tag, uint intr, int ipl, int ist,
79 1.2 cliff int (*func)(void *), void *arg)
80 1.2 cliff {
81 1.2 cliff gemini_lpc_softc_t *sc = tag;
82 1.2 cliff void *ih;
83 1.2 cliff
84 1.2 cliff ih = (*sc->sc_bus_ops->lpc_intr_establish)
85 1.2 cliff (tag, intr, ipl, ist, func, arg);
86 1.2 cliff
87 1.2 cliff return ih;
88 1.2 cliff }
89 1.2 cliff
90 1.2 cliff static inline void
91 1.2 cliff lpc_intr_disestablish(lpctag_t tag, void *ih)
92 1.2 cliff {
93 1.2 cliff gemini_lpc_softc_t *sc = tag;
94 1.2 cliff return (*sc->sc_bus_ops->lpc_intr_disestablish)(tag, ih);
95 1.2 cliff }
96 1.2 cliff
97 1.2 cliff
98 1.1 cliff
99 1.1 cliff
100 1.1 cliff
101 1.1 cliff #endif /* _ARM_GEMINI_LPCVAR_H */
102