xref: /rk3399_ARM-atf/drivers/gpio/gpio.c (revision 195889829e3f3fc4eabb3297b3d686daf14af7f5)
11ffecc24SHaojian Zhuang /*
21ffecc24SHaojian Zhuang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
31ffecc24SHaojian Zhuang  *
41ffecc24SHaojian Zhuang  * Redistribution and use in source and binary forms, with or without
51ffecc24SHaojian Zhuang  * modification, are permitted provided that the following conditions are met:
61ffecc24SHaojian Zhuang  *
71ffecc24SHaojian Zhuang  * Redistributions of source code must retain the above copyright notice, this
81ffecc24SHaojian Zhuang  * list of conditions and the following disclaimer.
91ffecc24SHaojian Zhuang  *
101ffecc24SHaojian Zhuang  * Redistributions in binary form must reproduce the above copyright notice,
111ffecc24SHaojian Zhuang  * this list of conditions and the following disclaimer in the documentation
121ffecc24SHaojian Zhuang  * and/or other materials provided with the distribution.
131ffecc24SHaojian Zhuang  *
141ffecc24SHaojian Zhuang  * Neither the name of ARM nor the names of its contributors may be used
151ffecc24SHaojian Zhuang  * to endorse or promote products derived from this software without specific
161ffecc24SHaojian Zhuang  * prior written permission.
171ffecc24SHaojian Zhuang  *
181ffecc24SHaojian Zhuang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
191ffecc24SHaojian Zhuang  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201ffecc24SHaojian Zhuang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
211ffecc24SHaojian Zhuang  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
221ffecc24SHaojian Zhuang  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
231ffecc24SHaojian Zhuang  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
241ffecc24SHaojian Zhuang  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
251ffecc24SHaojian Zhuang  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
261ffecc24SHaojian Zhuang  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
271ffecc24SHaojian Zhuang  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
281ffecc24SHaojian Zhuang  * POSSIBILITY OF SUCH DAMAGE.
291ffecc24SHaojian Zhuang  *
301ffecc24SHaojian Zhuang  * GPIO -- General Purpose Input/Output
311ffecc24SHaojian Zhuang  *
321ffecc24SHaojian Zhuang  * Defines a simple and generic interface to access GPIO device.
331ffecc24SHaojian Zhuang  *
341ffecc24SHaojian Zhuang  */
351ffecc24SHaojian Zhuang 
361ffecc24SHaojian Zhuang #include <assert.h>
371ffecc24SHaojian Zhuang #include <errno.h>
381ffecc24SHaojian Zhuang #include <gpio.h>
391ffecc24SHaojian Zhuang 
401ffecc24SHaojian Zhuang /*
411ffecc24SHaojian Zhuang  * The gpio implementation
421ffecc24SHaojian Zhuang  */
431ffecc24SHaojian Zhuang static const gpio_ops_t *ops;
441ffecc24SHaojian Zhuang 
451ffecc24SHaojian Zhuang int gpio_get_direction(int gpio)
461ffecc24SHaojian Zhuang {
471ffecc24SHaojian Zhuang 	assert(ops);
481ffecc24SHaojian Zhuang 	assert(ops->get_direction != 0);
491ffecc24SHaojian Zhuang 	assert(gpio >= 0);
501ffecc24SHaojian Zhuang 
511ffecc24SHaojian Zhuang 	return ops->get_direction(gpio);
521ffecc24SHaojian Zhuang }
531ffecc24SHaojian Zhuang 
541ffecc24SHaojian Zhuang void gpio_set_direction(int gpio, int direction)
551ffecc24SHaojian Zhuang {
561ffecc24SHaojian Zhuang 	assert(ops);
571ffecc24SHaojian Zhuang 	assert(ops->set_direction != 0);
581ffecc24SHaojian Zhuang 	assert((direction == GPIO_DIR_OUT) || (direction == GPIO_DIR_IN));
591ffecc24SHaojian Zhuang 	assert(gpio >= 0);
601ffecc24SHaojian Zhuang 
611ffecc24SHaojian Zhuang 	ops->set_direction(gpio, direction);
621ffecc24SHaojian Zhuang }
631ffecc24SHaojian Zhuang 
641ffecc24SHaojian Zhuang int gpio_get_value(int gpio)
651ffecc24SHaojian Zhuang {
661ffecc24SHaojian Zhuang 	assert(ops);
671ffecc24SHaojian Zhuang 	assert(ops->get_value != 0);
681ffecc24SHaojian Zhuang 	assert(gpio >= 0);
691ffecc24SHaojian Zhuang 
701ffecc24SHaojian Zhuang 	return ops->get_value(gpio);
711ffecc24SHaojian Zhuang }
721ffecc24SHaojian Zhuang 
731ffecc24SHaojian Zhuang void gpio_set_value(int gpio, int value)
741ffecc24SHaojian Zhuang {
751ffecc24SHaojian Zhuang 	assert(ops);
761ffecc24SHaojian Zhuang 	assert(ops->set_value != 0);
771ffecc24SHaojian Zhuang 	assert((value == GPIO_LEVEL_LOW) || (value == GPIO_LEVEL_HIGH));
781ffecc24SHaojian Zhuang 	assert(gpio >= 0);
791ffecc24SHaojian Zhuang 
801ffecc24SHaojian Zhuang 	ops->set_value(gpio, value);
811ffecc24SHaojian Zhuang }
821ffecc24SHaojian Zhuang 
83*19588982SCaesar Wang void gpio_set_pull(int gpio, int pull)
84*19588982SCaesar Wang {
85*19588982SCaesar Wang 	assert(ops);
86*19588982SCaesar Wang 	assert(ops->set_pull != 0);
87*19588982SCaesar Wang 	assert((pull == GPIO_PULL_NONE) || (pull == GPIO_PULL_UP) ||
88*19588982SCaesar Wang 	       (pull == GPIO_PULL_DOWN));
89*19588982SCaesar Wang 	assert(gpio >= 0);
90*19588982SCaesar Wang 
91*19588982SCaesar Wang 	ops->set_pull(gpio, pull);
92*19588982SCaesar Wang }
93*19588982SCaesar Wang 
94*19588982SCaesar Wang int gpio_get_pull(int gpio)
95*19588982SCaesar Wang {
96*19588982SCaesar Wang 	assert(ops);
97*19588982SCaesar Wang 	assert(ops->get_pull != 0);
98*19588982SCaesar Wang 	assert(gpio >= 0);
99*19588982SCaesar Wang 
100*19588982SCaesar Wang 	return ops->get_pull(gpio);
101*19588982SCaesar Wang }
102*19588982SCaesar Wang 
1031ffecc24SHaojian Zhuang /*
1041ffecc24SHaojian Zhuang  * Initialize the gpio. The fields in the provided gpio
1051ffecc24SHaojian Zhuang  * ops pointer must be valid.
1061ffecc24SHaojian Zhuang  */
1071ffecc24SHaojian Zhuang void gpio_init(const gpio_ops_t *ops_ptr)
1081ffecc24SHaojian Zhuang {
1091ffecc24SHaojian Zhuang 	assert(ops_ptr != 0  &&
1101ffecc24SHaojian Zhuang 	       (ops_ptr->get_direction != 0) &&
1111ffecc24SHaojian Zhuang 	       (ops_ptr->set_direction != 0) &&
1121ffecc24SHaojian Zhuang 	       (ops_ptr->get_value != 0) &&
1131ffecc24SHaojian Zhuang 	       (ops_ptr->set_value != 0));
1141ffecc24SHaojian Zhuang 
1151ffecc24SHaojian Zhuang 	ops = ops_ptr;
1161ffecc24SHaojian Zhuang }
117