xref: /netbsd-src/sys/arch/arm/gemini/gemini_lpcvar.h (revision cbab9cadce21ae72fac13910001079fff214cc29)
1*cbab9cadSchs /*	$NetBSD: gemini_lpcvar.h,v 1.4 2012/10/27 17:17:38 chs Exp $	*/
22842dccfScliff 
32842dccfScliff #ifndef _ARM_GEMINI_LPCVAR_H
42842dccfScliff #define _ARM_GEMINI_LPCVAR_H
52842dccfScliff 
62842dccfScliff #include <sys/types.h>
72842dccfScliff #include <sys/device.h>
8cf10107dSdyoung #include <sys/bus.h>
92842dccfScliff 
102842dccfScliff #define GEMINI_LPC_LDN_ALL	-1	/* "global" LDN */
112842dccfScliff 
122842dccfScliff typedef void * lpctag_t;
132842dccfScliff typedef void * lpcintrtag_t;
142842dccfScliff 
152842dccfScliff typedef struct gemini_lpc_attach_args {
16e08eff94Scliff         lpctag_t	lpc_tag;
172842dccfScliff 	uint		lpc_ldn;
182842dccfScliff 	bus_addr_t	lpc_base;
192842dccfScliff 	bus_addr_t	lpc_addr;
202842dccfScliff 	bus_size_t	lpc_size;
212842dccfScliff         uint		lpc_intr;
222842dccfScliff         bus_space_tag_t	lpc_iot;
232842dccfScliff } gemini_lpc_attach_args_t;
242842dccfScliff 
25e08eff94Scliff /* la_flags */
26e08eff94Scliff #define LPC_FL_ENABLED    0x01            /* device is enabled */
27e08eff94Scliff 
28e08eff94Scliff typedef struct gemini_lpc_bus_ops {
29e08eff94Scliff 	uint8_t	(*lpc_pnp_read)(lpctag_t, int, uint);
30e08eff94Scliff 	void	(*lpc_pnp_write)(lpctag_t, int, uint, uint8_t);
31e08eff94Scliff 	void	(*lpc_pnp_enter)(lpctag_t);
32e08eff94Scliff 	void	(*lpc_pnp_exit)(lpctag_t);
33e08eff94Scliff 	void   *(*lpc_intr_establish)(lpctag_t, uint, int, int,
34e08eff94Scliff 			int (*)(void *), void *);
35e08eff94Scliff 	void	(*lpc_intr_disestablish)(lpctag_t, void *);
36e08eff94Scliff } gemini_lpc_bus_ops_t;
37e08eff94Scliff 
382842dccfScliff typedef struct gemini_lpc_softc {
392842dccfScliff 	bus_addr_t			sc_addr;
402842dccfScliff 	bus_size_t			sc_size;
412842dccfScliff 	int				sc_intr;
422842dccfScliff 	bus_space_tag_t			sc_iot;
432842dccfScliff 	bus_space_handle_t		sc_ioh;
442842dccfScliff 	void			       *sc_lpchctag;
45e08eff94Scliff 	struct gemini_lpc_bus_ops      *sc_bus_ops;
462842dccfScliff } gemini_lpc_softc_t;
472842dccfScliff 
482842dccfScliff 
49e08eff94Scliff static inline uint8_t
lpc_pnp_read(lpctag_t tag,int ldn,uint off)50e08eff94Scliff lpc_pnp_read(lpctag_t tag, int ldn, uint off)
51e08eff94Scliff {
52e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
53e08eff94Scliff 	return (*sc->sc_bus_ops->lpc_pnp_read)(tag, ldn, off);
54e08eff94Scliff }
55e08eff94Scliff 
56e08eff94Scliff static inline void
lpc_pnp_write(lpctag_t tag,int ldn,uint off,uint8_t val)57e08eff94Scliff lpc_pnp_write(lpctag_t tag, int ldn, uint off, uint8_t val)
58e08eff94Scliff {
59e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
60e08eff94Scliff 	return (*sc->sc_bus_ops->lpc_pnp_write)(tag, ldn, off, val);
61e08eff94Scliff }
62e08eff94Scliff 
63e08eff94Scliff static inline void
lpc_pnp_enter(lpctag_t tag)64e08eff94Scliff lpc_pnp_enter(lpctag_t tag)
65e08eff94Scliff {
66e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
67e08eff94Scliff 	return (*sc->sc_bus_ops->lpc_pnp_enter)(tag);
68e08eff94Scliff }
69e08eff94Scliff 
70e08eff94Scliff static inline void
lpc_pnp_exit(lpctag_t tag)71e08eff94Scliff lpc_pnp_exit(lpctag_t tag)
72e08eff94Scliff {
73e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
74e08eff94Scliff 	return (*sc->sc_bus_ops->lpc_pnp_exit)(tag);
75e08eff94Scliff }
76e08eff94Scliff 
77e08eff94Scliff static inline void *
lpc_intr_establish(lpctag_t tag,uint intr,int ipl,int ist,int (* func)(void *),void * arg)78e08eff94Scliff lpc_intr_establish(lpctag_t tag, uint intr, int ipl, int ist,
79e08eff94Scliff 	int (*func)(void *), void *arg)
80e08eff94Scliff {
81e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
82e08eff94Scliff 	void *ih;
83e08eff94Scliff 
84e08eff94Scliff 	ih = (*sc->sc_bus_ops->lpc_intr_establish)
85e08eff94Scliff 		(tag, intr, ipl, ist, func, arg);
86e08eff94Scliff 
87e08eff94Scliff 	return ih;
88e08eff94Scliff }
89e08eff94Scliff 
90e08eff94Scliff static inline void
lpc_intr_disestablish(lpctag_t tag,void * ih)91e08eff94Scliff lpc_intr_disestablish(lpctag_t tag, void *ih)
92e08eff94Scliff {
93e08eff94Scliff 	gemini_lpc_softc_t *sc = tag;
94e08eff94Scliff 	return (*sc->sc_bus_ops->lpc_intr_disestablish)(tag, ih);
95e08eff94Scliff }
96e08eff94Scliff 
97e08eff94Scliff 
982842dccfScliff 
992842dccfScliff 
1002842dccfScliff 
1012842dccfScliff #endif	/* _ARM_GEMINI_LPCVAR_H */
102