xref: /arm-trusted-firmware/drivers/gpio/gpio.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  * GPIO -- General Purpose Input/Output
7*91f16700Schasinglulu  *
8*91f16700Schasinglulu  * Defines a simple and generic interface to access GPIO device.
9*91f16700Schasinglulu  *
10*91f16700Schasinglulu  */
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <assert.h>
13*91f16700Schasinglulu #include <errno.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <drivers/gpio.h>
16*91f16700Schasinglulu 
17*91f16700Schasinglulu /*
18*91f16700Schasinglulu  * The gpio implementation
19*91f16700Schasinglulu  */
20*91f16700Schasinglulu static const gpio_ops_t *ops;
21*91f16700Schasinglulu 
22*91f16700Schasinglulu int gpio_get_direction(int gpio)
23*91f16700Schasinglulu {
24*91f16700Schasinglulu 	assert(ops);
25*91f16700Schasinglulu 	assert(ops->get_direction != 0);
26*91f16700Schasinglulu 	assert(gpio >= 0);
27*91f16700Schasinglulu 
28*91f16700Schasinglulu 	return ops->get_direction(gpio);
29*91f16700Schasinglulu }
30*91f16700Schasinglulu 
31*91f16700Schasinglulu void gpio_set_direction(int gpio, int direction)
32*91f16700Schasinglulu {
33*91f16700Schasinglulu 	assert(ops);
34*91f16700Schasinglulu 	assert(ops->set_direction != 0);
35*91f16700Schasinglulu 	assert((direction == GPIO_DIR_OUT) || (direction == GPIO_DIR_IN));
36*91f16700Schasinglulu 	assert(gpio >= 0);
37*91f16700Schasinglulu 
38*91f16700Schasinglulu 	ops->set_direction(gpio, direction);
39*91f16700Schasinglulu }
40*91f16700Schasinglulu 
41*91f16700Schasinglulu int gpio_get_value(int gpio)
42*91f16700Schasinglulu {
43*91f16700Schasinglulu 	assert(ops);
44*91f16700Schasinglulu 	assert(ops->get_value != 0);
45*91f16700Schasinglulu 	assert(gpio >= 0);
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	return ops->get_value(gpio);
48*91f16700Schasinglulu }
49*91f16700Schasinglulu 
50*91f16700Schasinglulu void gpio_set_value(int gpio, int value)
51*91f16700Schasinglulu {
52*91f16700Schasinglulu 	assert(ops);
53*91f16700Schasinglulu 	assert(ops->set_value != 0);
54*91f16700Schasinglulu 	assert((value == GPIO_LEVEL_LOW) || (value == GPIO_LEVEL_HIGH));
55*91f16700Schasinglulu 	assert(gpio >= 0);
56*91f16700Schasinglulu 
57*91f16700Schasinglulu 	ops->set_value(gpio, value);
58*91f16700Schasinglulu }
59*91f16700Schasinglulu 
60*91f16700Schasinglulu void gpio_set_pull(int gpio, int pull)
61*91f16700Schasinglulu {
62*91f16700Schasinglulu 	assert(ops);
63*91f16700Schasinglulu 	assert(ops->set_pull != 0);
64*91f16700Schasinglulu 	assert((pull == GPIO_PULL_NONE) || (pull == GPIO_PULL_UP) ||
65*91f16700Schasinglulu 	       (pull == GPIO_PULL_DOWN));
66*91f16700Schasinglulu 	assert(gpio >= 0);
67*91f16700Schasinglulu 
68*91f16700Schasinglulu 	ops->set_pull(gpio, pull);
69*91f16700Schasinglulu }
70*91f16700Schasinglulu 
71*91f16700Schasinglulu int gpio_get_pull(int gpio)
72*91f16700Schasinglulu {
73*91f16700Schasinglulu 	assert(ops);
74*91f16700Schasinglulu 	assert(ops->get_pull != 0);
75*91f16700Schasinglulu 	assert(gpio >= 0);
76*91f16700Schasinglulu 
77*91f16700Schasinglulu 	return ops->get_pull(gpio);
78*91f16700Schasinglulu }
79*91f16700Schasinglulu 
80*91f16700Schasinglulu /*
81*91f16700Schasinglulu  * Initialize the gpio. The fields in the provided gpio
82*91f16700Schasinglulu  * ops pointer must be valid.
83*91f16700Schasinglulu  */
84*91f16700Schasinglulu void gpio_init(const gpio_ops_t *ops_ptr)
85*91f16700Schasinglulu {
86*91f16700Schasinglulu 	assert(ops_ptr != 0  &&
87*91f16700Schasinglulu 	       (ops_ptr->get_direction != 0) &&
88*91f16700Schasinglulu 	       (ops_ptr->set_direction != 0) &&
89*91f16700Schasinglulu 	       (ops_ptr->get_value != 0) &&
90*91f16700Schasinglulu 	       (ops_ptr->set_value != 0));
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 	ops = ops_ptr;
93*91f16700Schasinglulu }
94