scx200_gpio.h 2.3 KB
Newer Older
1
u32 scx200_gpio_configure(unsigned index, u32 set, u32 clear);
L
Linus Torvalds 已提交
2 3 4

extern unsigned scx200_gpio_base;
extern long scx200_gpio_shadow[2];
C
Chris Boot 已提交
5
extern struct nsc_gpio_ops scx200_gpio_ops;
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18

#define scx200_gpio_present() (scx200_gpio_base!=0)

/* Definitions to make sure I do the same thing in all functions */
#define __SCx200_GPIO_BANK unsigned bank = index>>5
#define __SCx200_GPIO_IOADDR unsigned short ioaddr = scx200_gpio_base+0x10*bank
#define __SCx200_GPIO_SHADOW long *shadow = scx200_gpio_shadow+bank
#define __SCx200_GPIO_INDEX index &= 31

#define __SCx200_GPIO_OUT __asm__ __volatile__("outsl":"=mS" (shadow):"d" (ioaddr), "0" (shadow))

/* returns the value of the GPIO pin */

19
static inline int scx200_gpio_get(unsigned index) {
L
Linus Torvalds 已提交
20 21 22 23 24 25 26 27 28 29 30
	__SCx200_GPIO_BANK;
	__SCx200_GPIO_IOADDR + 0x04;
	__SCx200_GPIO_INDEX;
		
	return (inl(ioaddr) & (1<<index)) ? 1 : 0;
}

/* return the value driven on the GPIO signal (the value that will be
   driven if the GPIO is configured as an output, it might not be the
   state of the GPIO right now if the GPIO is configured as an input) */

31
static inline int scx200_gpio_current(unsigned index) {
L
Linus Torvalds 已提交
32 33 34 35 36 37 38 39
        __SCx200_GPIO_BANK;
	__SCx200_GPIO_INDEX;
		
	return (scx200_gpio_shadow[bank] & (1<<index)) ? 1 : 0;
}

/* drive the GPIO signal high */

40
static inline void scx200_gpio_set_high(unsigned index) {
L
Linus Torvalds 已提交
41 42 43 44 45 46 47 48 49 50
	__SCx200_GPIO_BANK;
	__SCx200_GPIO_IOADDR;
	__SCx200_GPIO_SHADOW;
	__SCx200_GPIO_INDEX;
	set_bit(index, shadow);
	__SCx200_GPIO_OUT;
}

/* drive the GPIO signal low */

51
static inline void scx200_gpio_set_low(unsigned index) {
L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60 61
	__SCx200_GPIO_BANK;
	__SCx200_GPIO_IOADDR;
	__SCx200_GPIO_SHADOW;
	__SCx200_GPIO_INDEX;
	clear_bit(index, shadow);
	__SCx200_GPIO_OUT;
}

/* drive the GPIO signal to state */

62
static inline void scx200_gpio_set(unsigned index, int state) {
L
Linus Torvalds 已提交
63 64 65 66 67 68 69 70 71 72 73 74
	__SCx200_GPIO_BANK;
	__SCx200_GPIO_IOADDR;
	__SCx200_GPIO_SHADOW;
	__SCx200_GPIO_INDEX;
	if (state)
		set_bit(index, shadow);
	else
		clear_bit(index, shadow);
	__SCx200_GPIO_OUT;
}

/* toggle the GPIO signal */
75
static inline void scx200_gpio_change(unsigned index) {
L
Linus Torvalds 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88
	__SCx200_GPIO_BANK;
	__SCx200_GPIO_IOADDR;
	__SCx200_GPIO_SHADOW;
	__SCx200_GPIO_INDEX;
	change_bit(index, shadow);
	__SCx200_GPIO_OUT;
}

#undef __SCx200_GPIO_BANK
#undef __SCx200_GPIO_IOADDR
#undef __SCx200_GPIO_SHADOW
#undef __SCx200_GPIO_INDEX
#undef __SCx200_GPIO_OUT