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