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