1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * arch/arm/mach-imx/generic.c 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * author: Sascha Hauer 5*4882a593Smuzhiyun * Created: april 20th, 2004 6*4882a593Smuzhiyun * Copyright: Synertronixx GmbH 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Common code for i.MX machines 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <common.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifdef CONFIG_IMX 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <asm/arch/imx-regs.h> 18*4882a593Smuzhiyun imx_gpio_mode(int gpio_mode)19*4882a593Smuzhiyunvoid imx_gpio_mode(int gpio_mode) 20*4882a593Smuzhiyun { 21*4882a593Smuzhiyun unsigned int pin = gpio_mode & GPIO_PIN_MASK; 22*4882a593Smuzhiyun unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> 5; 23*4882a593Smuzhiyun unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> 10; 24*4882a593Smuzhiyun unsigned int tmp; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Pullup enable */ 27*4882a593Smuzhiyun if(gpio_mode & GPIO_PUEN) 28*4882a593Smuzhiyun PUEN(port) |= (1<<pin); 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun PUEN(port) &= ~(1<<pin); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Data direction */ 33*4882a593Smuzhiyun if(gpio_mode & GPIO_OUT) 34*4882a593Smuzhiyun DDIR(port) |= 1<<pin; 35*4882a593Smuzhiyun else 36*4882a593Smuzhiyun DDIR(port) &= ~(1<<pin); 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* Primary / alternate function */ 39*4882a593Smuzhiyun if(gpio_mode & GPIO_AF) 40*4882a593Smuzhiyun GPR(port) |= (1<<pin); 41*4882a593Smuzhiyun else 42*4882a593Smuzhiyun GPR(port) &= ~(1<<pin); 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* use as gpio? */ 45*4882a593Smuzhiyun if( ocr == 3 ) 46*4882a593Smuzhiyun GIUS(port) |= (1<<pin); 47*4882a593Smuzhiyun else 48*4882a593Smuzhiyun GIUS(port) &= ~(1<<pin); 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Output / input configuration */ 51*4882a593Smuzhiyun /* FIXME: I'm not very sure about OCR and ICONF, someone 52*4882a593Smuzhiyun * should have a look over it 53*4882a593Smuzhiyun */ 54*4882a593Smuzhiyun if(pin<16) { 55*4882a593Smuzhiyun tmp = OCR1(port); 56*4882a593Smuzhiyun tmp &= ~( 3<<(pin*2)); 57*4882a593Smuzhiyun tmp |= (ocr << (pin*2)); 58*4882a593Smuzhiyun OCR1(port) = tmp; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun if( gpio_mode & GPIO_AOUT ) 61*4882a593Smuzhiyun ICONFA1(port) &= ~( 3<<(pin*2)); 62*4882a593Smuzhiyun if( gpio_mode & GPIO_BOUT ) 63*4882a593Smuzhiyun ICONFB1(port) &= ~( 3<<(pin*2)); 64*4882a593Smuzhiyun } else { 65*4882a593Smuzhiyun tmp = OCR2(port); 66*4882a593Smuzhiyun tmp &= ~( 3<<((pin-16)*2)); 67*4882a593Smuzhiyun tmp |= (ocr << ((pin-16)*2)); 68*4882a593Smuzhiyun OCR2(port) = tmp; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun if( gpio_mode & GPIO_AOUT ) 71*4882a593Smuzhiyun ICONFA2(port) &= ~( 3<<((pin-16)*2)); 72*4882a593Smuzhiyun if( gpio_mode & GPIO_BOUT ) 73*4882a593Smuzhiyun ICONFB2(port) &= ~( 3<<((pin-16)*2)); 74*4882a593Smuzhiyun } 75*4882a593Smuzhiyun } 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #endif /* CONFIG_IMX */ 78