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