155b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromieu32 scx200_gpio_configure(unsigned index, u32 set, u32 clear);
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned scx200_gpio_base;
464b33619a30ff18c1535ee779572ecffcc4711d2Al Viroextern unsigned long scx200_gpio_shadow[2];
558012cd788443b9d144bd7c72260a84b6b30f45dChris Bootextern struct nsc_gpio_ops scx200_gpio_ops;
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define scx200_gpio_present() (scx200_gpio_base!=0)
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Definitions to make sure I do the same thing in all functions */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __SCx200_GPIO_BANK unsigned bank = index>>5
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __SCx200_GPIO_IOADDR unsigned short ioaddr = scx200_gpio_base+0x10*bank
1264b33619a30ff18c1535ee779572ecffcc4711d2Al Viro#define __SCx200_GPIO_SHADOW unsigned long *shadow = scx200_gpio_shadow+bank
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __SCx200_GPIO_INDEX index &= 31
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __SCx200_GPIO_OUT __asm__ __volatile__("outsl":"=mS" (shadow):"d" (ioaddr), "0" (shadow))
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* returns the value of the GPIO pin */
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1955b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline int scx200_gpio_get(unsigned index) {
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_BANK;
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_IOADDR + 0x04;
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (inl(ioaddr) & (1<<index)) ? 1 : 0;
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* return the value driven on the GPIO signal (the value that will be
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   driven if the GPIO is configured as an output, it might not be the
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   state of the GPIO right now if the GPIO is configured as an input) */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3155b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline int scx200_gpio_current(unsigned index) {
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __SCx200_GPIO_BANK;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (scx200_gpio_shadow[bank] & (1<<index)) ? 1 : 0;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* drive the GPIO signal high */
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4055b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline void scx200_gpio_set_high(unsigned index) {
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_BANK;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_IOADDR;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_SHADOW;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
4564b33619a30ff18c1535ee779572ecffcc4711d2Al Viro	set_bit(index, shadow);	/* __set_bit()? */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_OUT;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* drive the GPIO signal low */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5155b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline void scx200_gpio_set_low(unsigned index) {
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_BANK;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_IOADDR;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_SHADOW;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
5664b33619a30ff18c1535ee779572ecffcc4711d2Al Viro	clear_bit(index, shadow); /* __clear_bit()? */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_OUT;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* drive the GPIO signal to state */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6255b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline void scx200_gpio_set(unsigned index, int state) {
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_BANK;
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_IOADDR;
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_SHADOW;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (state)
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_bit(index, shadow);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(index, shadow);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_OUT;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* toggle the GPIO signal */
7555b8c0455b8aeb80f94183fa3aa42e3fa62b1705Jim Cromiestatic inline void scx200_gpio_change(unsigned index) {
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_BANK;
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_IOADDR;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_SHADOW;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_INDEX;
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	change_bit(index, shadow);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__SCx200_GPIO_OUT;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef __SCx200_GPIO_BANK
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef __SCx200_GPIO_IOADDR
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef __SCx200_GPIO_SHADOW
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef __SCx200_GPIO_INDEX
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef __SCx200_GPIO_OUT
89