xref: /rk3399_ARM-atf/drivers/gpio/gpio.c (revision 9a207532f8216bf83fed0891fed9ed0bc72ca450)
11ffecc24SHaojian Zhuang /*
21ffecc24SHaojian Zhuang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
31ffecc24SHaojian Zhuang  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
51ffecc24SHaojian Zhuang  *
61ffecc24SHaojian Zhuang  * GPIO -- General Purpose Input/Output
71ffecc24SHaojian Zhuang  *
81ffecc24SHaojian Zhuang  * Defines a simple and generic interface to access GPIO device.
91ffecc24SHaojian Zhuang  *
101ffecc24SHaojian Zhuang  */
111ffecc24SHaojian Zhuang 
121ffecc24SHaojian Zhuang #include <assert.h>
131ffecc24SHaojian Zhuang #include <errno.h>
14*09d40e0eSAntonio Nino Diaz 
15*09d40e0eSAntonio Nino Diaz #include <drivers/gpio.h>
161ffecc24SHaojian Zhuang 
171ffecc24SHaojian Zhuang /*
181ffecc24SHaojian Zhuang  * The gpio implementation
191ffecc24SHaojian Zhuang  */
201ffecc24SHaojian Zhuang static const gpio_ops_t *ops;
211ffecc24SHaojian Zhuang 
gpio_get_direction(int gpio)221ffecc24SHaojian Zhuang int gpio_get_direction(int gpio)
231ffecc24SHaojian Zhuang {
241ffecc24SHaojian Zhuang 	assert(ops);
251ffecc24SHaojian Zhuang 	assert(ops->get_direction != 0);
261ffecc24SHaojian Zhuang 	assert(gpio >= 0);
271ffecc24SHaojian Zhuang 
281ffecc24SHaojian Zhuang 	return ops->get_direction(gpio);
291ffecc24SHaojian Zhuang }
301ffecc24SHaojian Zhuang 
gpio_set_direction(int gpio,int direction)311ffecc24SHaojian Zhuang void gpio_set_direction(int gpio, int direction)
321ffecc24SHaojian Zhuang {
331ffecc24SHaojian Zhuang 	assert(ops);
341ffecc24SHaojian Zhuang 	assert(ops->set_direction != 0);
351ffecc24SHaojian Zhuang 	assert((direction == GPIO_DIR_OUT) || (direction == GPIO_DIR_IN));
361ffecc24SHaojian Zhuang 	assert(gpio >= 0);
371ffecc24SHaojian Zhuang 
381ffecc24SHaojian Zhuang 	ops->set_direction(gpio, direction);
391ffecc24SHaojian Zhuang }
401ffecc24SHaojian Zhuang 
gpio_get_value(int gpio)411ffecc24SHaojian Zhuang int gpio_get_value(int gpio)
421ffecc24SHaojian Zhuang {
431ffecc24SHaojian Zhuang 	assert(ops);
441ffecc24SHaojian Zhuang 	assert(ops->get_value != 0);
451ffecc24SHaojian Zhuang 	assert(gpio >= 0);
461ffecc24SHaojian Zhuang 
471ffecc24SHaojian Zhuang 	return ops->get_value(gpio);
481ffecc24SHaojian Zhuang }
491ffecc24SHaojian Zhuang 
gpio_set_value(int gpio,int value)501ffecc24SHaojian Zhuang void gpio_set_value(int gpio, int value)
511ffecc24SHaojian Zhuang {
521ffecc24SHaojian Zhuang 	assert(ops);
531ffecc24SHaojian Zhuang 	assert(ops->set_value != 0);
541ffecc24SHaojian Zhuang 	assert((value == GPIO_LEVEL_LOW) || (value == GPIO_LEVEL_HIGH));
551ffecc24SHaojian Zhuang 	assert(gpio >= 0);
561ffecc24SHaojian Zhuang 
571ffecc24SHaojian Zhuang 	ops->set_value(gpio, value);
581ffecc24SHaojian Zhuang }
591ffecc24SHaojian Zhuang 
gpio_set_pull(int gpio,int pull)6019588982SCaesar Wang void gpio_set_pull(int gpio, int pull)
6119588982SCaesar Wang {
6219588982SCaesar Wang 	assert(ops);
6319588982SCaesar Wang 	assert(ops->set_pull != 0);
6419588982SCaesar Wang 	assert((pull == GPIO_PULL_NONE) || (pull == GPIO_PULL_UP) ||
6519588982SCaesar Wang 	       (pull == GPIO_PULL_DOWN));
6619588982SCaesar Wang 	assert(gpio >= 0);
6719588982SCaesar Wang 
6819588982SCaesar Wang 	ops->set_pull(gpio, pull);
6919588982SCaesar Wang }
7019588982SCaesar Wang 
gpio_get_pull(int gpio)7119588982SCaesar Wang int gpio_get_pull(int gpio)
7219588982SCaesar Wang {
7319588982SCaesar Wang 	assert(ops);
7419588982SCaesar Wang 	assert(ops->get_pull != 0);
7519588982SCaesar Wang 	assert(gpio >= 0);
7619588982SCaesar Wang 
7719588982SCaesar Wang 	return ops->get_pull(gpio);
7819588982SCaesar Wang }
7919588982SCaesar Wang 
801ffecc24SHaojian Zhuang /*
811ffecc24SHaojian Zhuang  * Initialize the gpio. The fields in the provided gpio
821ffecc24SHaojian Zhuang  * ops pointer must be valid.
831ffecc24SHaojian Zhuang  */
gpio_init(const gpio_ops_t * ops_ptr)841ffecc24SHaojian Zhuang void gpio_init(const gpio_ops_t *ops_ptr)
851ffecc24SHaojian Zhuang {
861ffecc24SHaojian Zhuang 	assert(ops_ptr != 0  &&
871ffecc24SHaojian Zhuang 	       (ops_ptr->get_direction != 0) &&
881ffecc24SHaojian Zhuang 	       (ops_ptr->set_direction != 0) &&
891ffecc24SHaojian Zhuang 	       (ops_ptr->get_value != 0) &&
901ffecc24SHaojian Zhuang 	       (ops_ptr->set_value != 0));
911ffecc24SHaojian Zhuang 
921ffecc24SHaojian Zhuang 	ops = ops_ptr;
931ffecc24SHaojian Zhuang }
94