1#- 2# Copyright (c) 2009 Oleksandr Tymoshenko <gonzo@freebsd.org> 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24# SUCH DAMAGE. 25# 26# $FreeBSD$ 27# 28 29#include <sys/bus.h> 30#include <sys/gpio.h> 31 32INTERFACE gpio; 33 34CODE { 35 static device_t 36 gpio_default_get_bus(void) 37 { 38 39 return (NULL); 40 } 41 42 static int 43 gpio_default_map_gpios(device_t bus, phandle_t dev, 44 phandle_t gparent, int gcells, pcell_t *gpios, uint32_t *pin, 45 uint32_t *flags) 46 { 47 /* Propagate up the bus hierarchy until someone handles it. */ 48 if (device_get_parent(bus) != NULL) 49 return (GPIO_MAP_GPIOS(device_get_parent(bus), dev, 50 gparent, gcells, gpios, pin, flags)); 51 52 /* If that fails, then assume the FreeBSD defaults. */ 53 *pin = gpios[0]; 54 if (gcells == 2 || gcells == 3) 55 *flags = gpios[gcells - 1]; 56 57 return (0); 58 } 59}; 60 61HEADER { 62 #include <dev/ofw/openfirm.h> 63}; 64 65# 66# Return the gpiobus device reference 67# 68METHOD device_t get_bus { 69 device_t dev; 70} DEFAULT gpio_default_get_bus; 71 72# 73# Get maximum pin number 74# 75METHOD int pin_max { 76 device_t dev; 77 int *maxpin; 78}; 79 80# 81# Set value of pin specifed by pin_num 82# 83METHOD int pin_set { 84 device_t dev; 85 uint32_t pin_num; 86 uint32_t pin_value; 87}; 88 89# 90# Get value of pin specifed by pin_num 91# 92METHOD int pin_get { 93 device_t dev; 94 uint32_t pin_num; 95 uint32_t *pin_value; 96}; 97 98# 99# Toggle value of pin specifed by pin_num 100# 101METHOD int pin_toggle { 102 device_t dev; 103 uint32_t pin_num; 104}; 105 106# 107# Get pin capabilities 108# 109METHOD int pin_getcaps { 110 device_t dev; 111 uint32_t pin_num; 112 uint32_t *caps; 113}; 114 115# 116# Get pin flags 117# 118METHOD int pin_getflags { 119 device_t dev; 120 uint32_t pin_num; 121 uint32_t *flags; 122}; 123 124# 125# Get pin name 126# 127METHOD int pin_getname { 128 device_t dev; 129 uint32_t pin_num; 130 char *name; 131}; 132 133# 134# Set current configuration and capabilities 135# 136METHOD int pin_setflags { 137 device_t dev; 138 uint32_t pin_num; 139 uint32_t flags; 140}; 141 142# 143# Allow the GPIO controller to map the gpio-specifier on its own. 144# 145METHOD int map_gpios { 146 device_t bus; 147 phandle_t dev; 148 phandle_t gparent; 149 int gcells; 150 pcell_t *gpios; 151 uint32_t *pin; 152 uint32_t *flags; 153} DEFAULT gpio_default_map_gpios; 154