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 #include <asm/arch/imx-regs.h> 25 #include <asm/io.h> 26 #include <mxc_gpio.h> 27 28 /* GPIO port description */ 29 static unsigned long gpio_ports[] = { 30 [0] = GPIO1_BASE_ADDR, 31 [1] = GPIO2_BASE_ADDR, 32 [2] = GPIO3_BASE_ADDR, 33 #if defined(CONFIG_MX51) || defined(CONFIG_MX53) 34 [3] = GPIO4_BASE_ADDR, 35 #endif 36 #if defined(CONFIG_MX53) 37 [4] = GPIO5_BASE_ADDR, 38 [5] = GPIO6_BASE_ADDR, 39 [6] = GPIO7_BASE_ADDR, 40 #endif 41 }; 42 43 int mxc_gpio_direction(unsigned int gpio, enum mxc_gpio_direction direction) 44 { 45 unsigned int port = gpio >> 5; 46 struct gpio_regs *regs; 47 u32 l; 48 49 if (port >= ARRAY_SIZE(gpio_ports)) 50 return 1; 51 52 gpio &= 0x1f; 53 54 regs = (struct gpio_regs *)gpio_ports[port]; 55 56 l = readl(®s->gpio_dir); 57 58 switch (direction) { 59 case MXC_GPIO_DIRECTION_OUT: 60 l |= 1 << gpio; 61 break; 62 case MXC_GPIO_DIRECTION_IN: 63 l &= ~(1 << gpio); 64 } 65 writel(l, ®s->gpio_dir); 66 67 return 0; 68 } 69 70 void mxc_gpio_set(unsigned int gpio, unsigned int value) 71 { 72 unsigned int port = gpio >> 5; 73 struct gpio_regs *regs; 74 u32 l; 75 76 if (port >= ARRAY_SIZE(gpio_ports)) 77 return; 78 79 gpio &= 0x1f; 80 81 regs = (struct gpio_regs *)gpio_ports[port]; 82 83 l = readl(®s->gpio_dr); 84 if (value) 85 l |= 1 << gpio; 86 else 87 l &= ~(1 << gpio); 88 writel(l, ®s->gpio_dr); 89 } 90 91 int mxc_gpio_get(unsigned int gpio) 92 { 93 unsigned int port = gpio >> 5; 94 struct gpio_regs *regs; 95 u32 l; 96 97 if (port >= ARRAY_SIZE(gpio_ports)) 98 return -1; 99 100 gpio &= 0x1f; 101 102 regs = (struct gpio_regs *)gpio_ports[port]; 103 104 l = (readl(®s->gpio_dr) >> gpio) & 0x01; 105 106 return l; 107 } 108