1 /* 2 * Copyright (C) 2009 3 * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de> 4 * 5 * See file CREDITS for list of people who contributed to this 6 * project. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 #include <common.h> 24 #ifdef CONFIG_MX31 25 #include <asm/arch/mx31-regs.h> 26 #endif 27 #if defined(CONFIG_MX51) || defined(CONFIG_MX53) 28 #include <asm/arch/imx-regs.h> 29 #endif 30 #include <asm/io.h> 31 #include <mxc_gpio.h> 32 33 /* GPIO port description */ 34 static unsigned long gpio_ports[] = { 35 [0] = GPIO1_BASE_ADDR, 36 [1] = GPIO2_BASE_ADDR, 37 [2] = GPIO3_BASE_ADDR, 38 #if defined(CONFIG_MX51) || defined(CONFIG_MX53) 39 [3] = GPIO4_BASE_ADDR, 40 #endif 41 #if defined(CONFIG_MX53) 42 [4] = GPIO5_BASE_ADDR, 43 [5] = GPIO6_BASE_ADDR, 44 [6] = GPIO7_BASE_ADDR, 45 #endif 46 }; 47 48 int mxc_gpio_direction(unsigned int gpio, enum mxc_gpio_direction direction) 49 { 50 unsigned int port = gpio >> 5; 51 struct gpio_regs *regs; 52 u32 l; 53 54 if (port >= ARRAY_SIZE(gpio_ports)) 55 return 1; 56 57 gpio &= 0x1f; 58 59 regs = (struct gpio_regs *)gpio_ports[port]; 60 61 l = readl(®s->gpio_dir); 62 63 switch (direction) { 64 case MXC_GPIO_DIRECTION_OUT: 65 l |= 1 << gpio; 66 break; 67 case MXC_GPIO_DIRECTION_IN: 68 l &= ~(1 << gpio); 69 } 70 writel(l, ®s->gpio_dir); 71 72 return 0; 73 } 74 75 void mxc_gpio_set(unsigned int gpio, unsigned int value) 76 { 77 unsigned int port = gpio >> 5; 78 struct gpio_regs *regs; 79 u32 l; 80 81 if (port >= ARRAY_SIZE(gpio_ports)) 82 return; 83 84 gpio &= 0x1f; 85 86 regs = (struct gpio_regs *)gpio_ports[port]; 87 88 l = readl(®s->gpio_dr); 89 if (value) 90 l |= 1 << gpio; 91 else 92 l &= ~(1 << gpio); 93 writel(l, ®s->gpio_dr); 94 } 95 96 int mxc_gpio_get(unsigned int gpio) 97 { 98 unsigned int port = gpio >> 5; 99 struct gpio_regs *regs; 100 u32 l; 101 102 if (port >= ARRAY_SIZE(gpio_ports)) 103 return -1; 104 105 gpio &= 0x1f; 106 107 regs = (struct gpio_regs *)gpio_ports[port]; 108 109 l = (readl(®s->gpio_dr) >> gpio) & 0x01; 110 111 return l; 112 } 113