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