/* * FILE NAME au1000_gpio.c * * BRIEF MODULE DESCRIPTION * Driver for Alchemy Au1000 GPIO. * * Author: MontaVista Software, Inc. * Steve Longerbeam * * Copyright 2001 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #define VERSION "0.01" static const struct { u32 active_hi; u32 avail_mask; } pinfunc_to_avail[15] = { {1, 0x7<<16}, // 0 = SSI0 / GPIO[18:16] {-1, 0}, // 1 = AC97 / SSI1 {1, 1<<19}, // 2 = IRDA / GPIO19 {1, 1<<20}, // 3 = UART0 / GPIO20 {1, 0x1f<<24}, // 4 = NIC2 / GPIO[28:24] {1, 0x7<<29}, // 5 = I2S / GPIO[31:29] {0, 1<<8}, // 6 = I2SDI / GPIO8 {0, 0x3f<<9}, // 7 = UART3 / GPIO[14:9] {0, 1<<15}, // 8 = IRFIRSEL / GPIO15 {0, 1<<2}, // 9 = EXTCLK0 or OSC / GPIO2 {0, 1<<3}, // 10 = EXTCLK1 / GPIO3 {0, 1<<6}, // 11 = SMROMCKE / GPIO6 {1, 1<<21}, // 12 = UART1 / GPIO21 {1, 1<<22}, // 13 = UART2 / GPIO22 {1, 1<<23} // 14 = UART3 / GPIO23 }; u32 get_au1000_avail_gpio_mask(void) { int i; u32 pinfunc = inl(SYS_PINFUNC); u32 avail_mask = 0; // start with no gpio available // first, check for GPIO's reprogrammed as peripheral pins for (i=0; i<15; i++) { if (pinfunc_to_avail[i].active_hi < 0) continue; if (!(pinfunc_to_avail[i].active_hi ^ ((pinfunc & (1<