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