2
* Freescale MPC83xx GPIO handling.
4
* SPDX-License-Identifier: GPL-2.0+
12
#ifndef CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION
13
#define CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION 0
15
#ifndef CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION
16
#define CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION 0
18
#ifndef CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN
19
#define CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN 0
21
#ifndef CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN
22
#define CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN 0
24
#ifndef CONFIG_MPC83XX_GPIO_0_INIT_VALUE
25
#define CONFIG_MPC83XX_GPIO_0_INIT_VALUE 0
27
#ifndef CONFIG_MPC83XX_GPIO_1_INIT_VALUE
28
#define CONFIG_MPC83XX_GPIO_1_INIT_VALUE 0
31
static unsigned int gpio_output_value[MPC83XX_GPIO_CTRLRS];
34
* Generic_GPIO primitives.
37
int gpio_request(unsigned gpio, const char *label)
39
if (gpio >= MAX_NUM_GPIOS)
45
int gpio_free(unsigned gpio)
47
/* Do not set to input */
51
/* set GPIO pin 'gpio' as an input */
52
int gpio_direction_input(unsigned gpio)
54
immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
57
unsigned int line_mask;
59
/* 32-bits per controller */
64
line_mask = 1 << (31 - line);
66
clrbits_be32(&im->gpio[ctrlr].dir, line_mask);
71
/* set GPIO pin 'gpio' as an output, with polarity 'value' */
72
int gpio_direction_output(unsigned gpio, int value)
74
immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
77
unsigned int line_mask;
79
if (value != 0 && value != 1) {
80
printf("Error: Value parameter must be 0 or 1.\n");
84
gpio_set_value(gpio, value);
86
/* 32-bits per controller */
91
line_mask = 1 << (31 - line);
93
/* Make the line output */
94
setbits_be32(&im->gpio[ctrlr].dir, line_mask);
99
/* read GPIO IN value of pin 'gpio' */
100
int gpio_get_value(unsigned gpio)
102
immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
105
unsigned int line_mask;
107
/* 32-bits per controller */
109
line = gpio & (0x1F);
112
line_mask = 1 << (31 - line);
114
/* Read the value and mask off the bit */
115
return (in_be32(&im->gpio[ctrlr].dat) & line_mask) != 0;
118
/* write GPIO OUT value to pin 'gpio' */
119
int gpio_set_value(unsigned gpio, int value)
121
immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
124
unsigned int line_mask;
126
if (value != 0 && value != 1) {
127
printf("Error: Value parameter must be 0 or 1.\n");
131
/* 32-bits per controller */
133
line = gpio & (0x1F);
136
line_mask = 1 << (31 - line);
138
/* Update the local output buffer soft copy */
139
gpio_output_value[ctrlr] =
140
(gpio_output_value[ctrlr] & ~line_mask) | \
141
(value ? line_mask : 0);
143
/* Write the output */
144
out_be32(&im->gpio[ctrlr].dat, gpio_output_value[ctrlr]);
149
/* Configure GPIO registers early */
150
void mpc83xx_gpio_init_f(void)
152
immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
154
#if MPC83XX_GPIO_CTRLRS >= 1
155
out_be32(&im->gpio[0].dir, CONFIG_MPC83XX_GPIO_0_INIT_DIRECTION);
156
out_be32(&im->gpio[0].odr, CONFIG_MPC83XX_GPIO_0_INIT_OPEN_DRAIN);
157
out_be32(&im->gpio[0].dat, CONFIG_MPC83XX_GPIO_0_INIT_VALUE);
158
out_be32(&im->gpio[0].ier, 0xFFFFFFFF); /* Clear all events */
159
out_be32(&im->gpio[0].imr, 0);
160
out_be32(&im->gpio[0].icr, 0);
163
#if MPC83XX_GPIO_CTRLRS >= 2
164
out_be32(&im->gpio[1].dir, CONFIG_MPC83XX_GPIO_1_INIT_DIRECTION);
165
out_be32(&im->gpio[1].odr, CONFIG_MPC83XX_GPIO_1_INIT_OPEN_DRAIN);
166
out_be32(&im->gpio[1].dat, CONFIG_MPC83XX_GPIO_1_INIT_VALUE);
167
out_be32(&im->gpio[1].ier, 0xFFFFFFFF); /* Clear all events */
168
out_be32(&im->gpio[1].imr, 0);
169
out_be32(&im->gpio[1].icr, 0);
173
/* Initialize GPIO soft-copies */
174
void mpc83xx_gpio_init_r(void)
176
#if MPC83XX_GPIO_CTRLRS >= 1
177
gpio_output_value[0] = CONFIG_MPC83XX_GPIO_0_INIT_VALUE;
180
#if MPC83XX_GPIO_CTRLRS >= 2
181
gpio_output_value[1] = CONFIG_MPC83XX_GPIO_1_INIT_VALUE;