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