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