]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - drivers/gpio/xilinx_gpio.c
2 * Copyright (c) 2013 Xilinx, Michal Simek
4 * SPDX-License-Identifier: GPL-2.0+
10 #include <linux/list.h>
14 static LIST_HEAD(gpio_list
);
17 GPIO_DIRECTION_OUT
= 0,
18 GPIO_DIRECTION_IN
= 1,
27 #define GPIO_NAME_SIZE 10
30 char name
[GPIO_NAME_SIZE
];
33 /* Initialized, rxbd_current, rx_first_buf must be 0 after init */
34 struct xilinx_gpio_priv
{
35 struct gpio_regs
*regs
;
39 char name
[GPIO_NAME_SIZE
];
40 struct list_head list
;
41 struct gpio_names
*gpio_name
;
44 /* Store number of allocated gpio pins */
45 static u32 xilinx_gpio_max
;
47 /* Get associated gpio controller */
48 static struct xilinx_gpio_priv
*gpio_get_controller(unsigned gpio
)
50 struct list_head
*entry
;
51 struct xilinx_gpio_priv
*priv
= NULL
;
53 list_for_each(entry
, &gpio_list
) {
54 priv
= list_entry(entry
, struct xilinx_gpio_priv
, list
);
55 if (gpio
>= priv
->gpio_min
&& gpio
<= priv
->gpio_max
) {
56 debug("%s: reg: %x, min-max: %d-%d\n", __func__
,
57 (u32
)priv
->regs
, priv
->gpio_min
, priv
->gpio_max
);
61 puts("!!!Can't get gpio controller!!!\n");
65 /* Get gpio pin name if used/setup */
66 static char *get_name(unsigned gpio
)
69 struct xilinx_gpio_priv
*priv
;
71 debug("%s\n", __func__
);
73 priv
= gpio_get_controller(gpio
);
75 gpio_priv
= gpio
- priv
->gpio_min
;
77 return *priv
->gpio_name
[gpio_priv
].name
?
78 priv
->gpio_name
[gpio_priv
].name
: "UNKNOWN";
83 /* Get output value */
84 static int gpio_get_output_value(unsigned gpio
)
87 struct xilinx_gpio_priv
*priv
= gpio_get_controller(gpio
);
90 gpio_priv
= gpio
- priv
->gpio_min
;
91 val
= !!(priv
->gpiodata_store
& (1 << gpio_priv
));
92 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__
,
93 (u32
)priv
->regs
, gpio_priv
, val
);
100 /* Get input value */
101 static int gpio_get_input_value(unsigned gpio
)
104 struct gpio_regs
*regs
;
105 struct xilinx_gpio_priv
*priv
= gpio_get_controller(gpio
);
109 gpio_priv
= gpio
- priv
->gpio_min
;
110 val
= readl(®s
->gpiodata
);
111 val
= !!(val
& (1 << gpio_priv
));
112 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__
,
113 (u32
)priv
->regs
, gpio_priv
, val
);
120 /* Set gpio direction */
121 static int gpio_set_direction(unsigned gpio
, enum gpio_direction direction
)
124 struct gpio_regs
*regs
;
125 struct xilinx_gpio_priv
*priv
= gpio_get_controller(gpio
);
129 val
= readl(®s
->gpiodir
);
131 gpio_priv
= gpio
- priv
->gpio_min
;
132 if (direction
== GPIO_DIRECTION_OUT
)
133 val
&= ~(1 << gpio_priv
);
135 val
|= 1 << gpio_priv
;
137 writel(val
, ®s
->gpiodir
);
138 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__
,
139 (u32
)priv
->regs
, gpio_priv
, val
);
147 /* Get gpio direction */
148 static int gpio_get_direction(unsigned gpio
)
151 struct gpio_regs
*regs
;
152 struct xilinx_gpio_priv
*priv
= gpio_get_controller(gpio
);
156 gpio_priv
= gpio
- priv
->gpio_min
;
157 val
= readl(®s
->gpiodir
);
158 val
= !!(val
& (1 << gpio_priv
));
159 debug("%s: reg: %x, gpio_no: %d, dir: %d\n", __func__
,
160 (u32
)priv
->regs
, gpio_priv
, val
);
170 * for example gpio setup to output only can't get input value
171 * which is breaking gpio toggle command
173 int gpio_get_value(unsigned gpio
)
177 if (gpio_get_direction(gpio
) == GPIO_DIRECTION_OUT
)
178 val
= gpio_get_output_value(gpio
);
180 val
= gpio_get_input_value(gpio
);
185 /* Set output value */
186 static int gpio_set_output_value(unsigned gpio
, int value
)
189 struct gpio_regs
*regs
;
190 struct xilinx_gpio_priv
*priv
= gpio_get_controller(gpio
);
194 gpio_priv
= gpio
- priv
->gpio_min
;
195 val
= priv
->gpiodata_store
;
197 val
|= 1 << gpio_priv
;
199 val
&= ~(1 << gpio_priv
);
201 writel(val
, ®s
->gpiodata
);
202 debug("%s: reg: %x, gpio_no: %d, output_val: %d\n", __func__
,
203 (u32
)priv
->regs
, gpio_priv
, val
);
204 priv
->gpiodata_store
= val
;
212 int gpio_set_value(unsigned gpio
, int value
)
214 if (gpio_get_direction(gpio
) == GPIO_DIRECTION_OUT
)
215 return gpio_set_output_value(gpio
, value
);
220 /* Set GPIO as input */
221 int gpio_direction_input(unsigned gpio
)
223 debug("%s\n", __func__
);
224 return gpio_set_direction(gpio
, GPIO_DIRECTION_IN
);
227 /* Setup GPIO as output and set output value */
228 int gpio_direction_output(unsigned gpio
, int value
)
230 int ret
= gpio_set_direction(gpio
, GPIO_DIRECTION_OUT
);
232 debug("%s\n", __func__
);
237 return gpio_set_output_value(gpio
, value
);
240 /* Show gpio status */
245 struct list_head
*entry
;
246 struct xilinx_gpio_priv
*priv
= NULL
;
248 list_for_each(entry
, &gpio_list
) {
249 priv
= list_entry(entry
, struct xilinx_gpio_priv
, list
);
250 printf("\n%s: %s/%x (%d-%d)\n", __func__
, priv
->name
,
251 (u32
)priv
->regs
, priv
->gpio_min
, priv
->gpio_max
);
253 for (gpio
= priv
->gpio_min
; gpio
<= priv
->gpio_max
; gpio
++) {
254 printf("GPIO_%d:\t%s is an ", gpio
, get_name(gpio
));
255 if (gpio_get_direction(gpio
) == GPIO_DIRECTION_OUT
)
256 printf("OUTPUT value = %d\n",
257 gpio_get_output_value(gpio
));
259 printf("INPUT value = %d\n",
260 gpio_get_input_value(gpio
));
265 int gpio_request(unsigned gpio
, const char *label
)
268 struct xilinx_gpio_priv
*priv
;
270 if (gpio
>= xilinx_gpio_max
)
273 priv
= gpio_get_controller(gpio
);
275 gpio_priv
= gpio
- priv
->gpio_min
;
278 strncpy(priv
->gpio_name
[gpio_priv
].name
, label
,
280 priv
->gpio_name
[gpio_priv
].name
[GPIO_NAME_SIZE
- 1] =
289 int gpio_free(unsigned gpio
)
292 struct xilinx_gpio_priv
*priv
;
294 if (gpio
>= xilinx_gpio_max
)
297 priv
= gpio_get_controller(gpio
);
299 gpio_priv
= gpio
- priv
->gpio_min
;
300 priv
->gpio_name
[gpio_priv
].name
[0] = '\0';
302 /* Do nothing here */
309 int gpio_alloc(u32 baseaddr
, const char *name
, u32 gpio_no
)
311 struct xilinx_gpio_priv
*priv
;
313 priv
= calloc(1, sizeof(struct xilinx_gpio_priv
));
315 /* Setup gpio name */
317 strncpy(priv
->name
, name
, GPIO_NAME_SIZE
);
318 priv
->name
[GPIO_NAME_SIZE
- 1] = '\0';
320 priv
->regs
= (struct gpio_regs
*)baseaddr
;
322 priv
->gpio_min
= xilinx_gpio_max
;
323 xilinx_gpio_max
= priv
->gpio_min
+ gpio_no
;
324 priv
->gpio_max
= xilinx_gpio_max
- 1;
326 priv
->gpio_name
= calloc(gpio_no
, sizeof(struct gpio_names
));
328 INIT_LIST_HEAD(&priv
->list
);
329 list_add_tail(&priv
->list
, &gpio_list
);
331 printf("%s: Add %s (%d-%d)\n", __func__
, name
,
332 priv
->gpio_min
, priv
->gpio_max
);
334 /* Return the first gpio allocated for this device */
335 return priv
->gpio_min
;
338 /* Dual channel gpio is one IP with two independent channels */
339 int gpio_alloc_dual(u32 baseaddr
, const char *name
, u32 gpio_no0
, u32 gpio_no1
)
343 ret
= gpio_alloc(baseaddr
, name
, gpio_no0
);
344 gpio_alloc(baseaddr
+ 8, strcat((char *)name
, "_1"), gpio_no1
);
346 /* Return the first gpio allocated for this device */