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