xref: /openbmc/u-boot/arch/arm/cpu/arm920t/imx/generic.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
284ad6884SPeter Tyser /*
384ad6884SPeter Tyser  *  arch/arm/mach-imx/generic.c
484ad6884SPeter Tyser  *
584ad6884SPeter Tyser  *  author: Sascha Hauer
684ad6884SPeter Tyser  *  Created: april 20th, 2004
784ad6884SPeter Tyser  *  Copyright: Synertronixx GmbH
884ad6884SPeter Tyser  *
984ad6884SPeter Tyser  *  Common code for i.MX machines
1084ad6884SPeter Tyser  */
1184ad6884SPeter Tyser 
1284ad6884SPeter Tyser #include <common.h>
1384ad6884SPeter Tyser 
1484ad6884SPeter Tyser #ifdef CONFIG_IMX
1584ad6884SPeter Tyser 
1684ad6884SPeter Tyser #include <asm/arch/imx-regs.h>
1784ad6884SPeter Tyser 
imx_gpio_mode(int gpio_mode)1884ad6884SPeter Tyser void imx_gpio_mode(int gpio_mode)
1984ad6884SPeter Tyser {
2084ad6884SPeter Tyser 	unsigned int pin = gpio_mode & GPIO_PIN_MASK;
2184ad6884SPeter Tyser 	unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> 5;
2284ad6884SPeter Tyser 	unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> 10;
2384ad6884SPeter Tyser 	unsigned int tmp;
2484ad6884SPeter Tyser 
2584ad6884SPeter Tyser 	/* Pullup enable */
2684ad6884SPeter Tyser 	if(gpio_mode & GPIO_PUEN)
2784ad6884SPeter Tyser 		PUEN(port) |= (1<<pin);
2884ad6884SPeter Tyser 	else
2984ad6884SPeter Tyser 		PUEN(port) &= ~(1<<pin);
3084ad6884SPeter Tyser 
3184ad6884SPeter Tyser 	/* Data direction */
3284ad6884SPeter Tyser 	if(gpio_mode & GPIO_OUT)
3384ad6884SPeter Tyser 		DDIR(port) |= 1<<pin;
3484ad6884SPeter Tyser 	else
3584ad6884SPeter Tyser 		DDIR(port) &= ~(1<<pin);
3684ad6884SPeter Tyser 
3784ad6884SPeter Tyser 	/* Primary / alternate function */
3884ad6884SPeter Tyser 	if(gpio_mode & GPIO_AF)
3984ad6884SPeter Tyser 		GPR(port) |= (1<<pin);
4084ad6884SPeter Tyser 	else
4184ad6884SPeter Tyser 		GPR(port) &= ~(1<<pin);
4284ad6884SPeter Tyser 
4384ad6884SPeter Tyser 	/* use as gpio? */
4484ad6884SPeter Tyser 	if( ocr == 3 )
4584ad6884SPeter Tyser 		GIUS(port) |= (1<<pin);
4684ad6884SPeter Tyser 	else
4784ad6884SPeter Tyser 		GIUS(port) &= ~(1<<pin);
4884ad6884SPeter Tyser 
4984ad6884SPeter Tyser 	/* Output / input configuration */
5084ad6884SPeter Tyser 	/* FIXME: I'm not very sure about OCR and ICONF, someone
5184ad6884SPeter Tyser 	 * should have a look over it
5284ad6884SPeter Tyser 	 */
5384ad6884SPeter Tyser 	if(pin<16) {
5484ad6884SPeter Tyser 		tmp = OCR1(port);
5584ad6884SPeter Tyser 		tmp &= ~( 3<<(pin*2));
5684ad6884SPeter Tyser 		tmp |= (ocr << (pin*2));
5784ad6884SPeter Tyser 		OCR1(port) = tmp;
5884ad6884SPeter Tyser 
5984ad6884SPeter Tyser 		if( gpio_mode &	GPIO_AOUT )
6084ad6884SPeter Tyser 			ICONFA1(port) &= ~( 3<<(pin*2));
6184ad6884SPeter Tyser 		if( gpio_mode &	GPIO_BOUT )
6284ad6884SPeter Tyser 			ICONFB1(port) &= ~( 3<<(pin*2));
6384ad6884SPeter Tyser 	} else {
6484ad6884SPeter Tyser 		tmp = OCR2(port);
6584ad6884SPeter Tyser 		tmp &= ~( 3<<((pin-16)*2));
6684ad6884SPeter Tyser 		tmp |= (ocr << ((pin-16)*2));
6784ad6884SPeter Tyser 		OCR2(port) = tmp;
6884ad6884SPeter Tyser 
6984ad6884SPeter Tyser 		if( gpio_mode &	GPIO_AOUT )
7084ad6884SPeter Tyser 			ICONFA2(port) &= ~( 3<<((pin-16)*2));
7184ad6884SPeter Tyser 		if( gpio_mode &	GPIO_BOUT )
7284ad6884SPeter Tyser 			ICONFB2(port) &= ~( 3<<((pin-16)*2));
7384ad6884SPeter Tyser 	}
7484ad6884SPeter Tyser }
7584ad6884SPeter Tyser 
7684ad6884SPeter Tyser #endif /* CONFIG_IMX */
77