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 gpio_map_gpios_t gpio_default_map_gpios; 36 37 int 38 gpio_default_map_gpios(device_t bus, phandle_t dev, 39 phandle_t gparent, int gcells, pcell_t *gpios, uint32_t *pin, 40 uint32_t *flags) 41 { 42 /* Propagate up the bus hierarchy until someone handles it. */ 43 if (device_get_parent(bus) != NULL) 44 return (GPIO_MAP_GPIOS(device_get_parent(bus), dev, 45 gparent, gcells, gpios, pin, flags)); 46 47 /* If that fails, then assume the FreeBSD defaults. */ 48 *pin = gpios[0]; 49 if (gcells == 2 || gcells == 3) 50 *flags = gpios[gcells - 1]; 51 52 return (0); 53 } 54}; 55 56HEADER { 57 #include <dev/ofw/openfirm.h> 58}; 59 60# 61# Get total number of pins 62# 63METHOD int pin_max { 64 device_t dev; 65 int *npins; 66}; 67 68# 69# Set value of pin specifed by pin_num 70# 71METHOD int pin_set { 72 device_t dev; 73 uint32_t pin_num; 74 uint32_t pin_value; 75}; 76 77# 78# Get value of pin specifed by pin_num 79# 80METHOD int pin_get { 81 device_t dev; 82 uint32_t pin_num; 83 uint32_t *pin_value; 84}; 85 86# 87# Toggle value of pin specifed by pin_num 88# 89METHOD int pin_toggle { 90 device_t dev; 91 uint32_t pin_num; 92}; 93 94# 95# Get pin capabilities 96# 97METHOD int pin_getcaps { 98 device_t dev; 99 uint32_t pin_num; 100 uint32_t *caps; 101}; 102 103# 104# Get pin flags 105# 106METHOD int pin_getflags { 107 device_t dev; 108 uint32_t pin_num; 109 uint32_t *flags; 110}; 111 112# 113# Get pin name 114# 115METHOD int pin_getname { 116 device_t dev; 117 uint32_t pin_num; 118 char *name; 119}; 120 121# 122# Set current configuration and capabilities 123# 124METHOD int pin_setflags { 125 device_t dev; 126 uint32_t pin_num; 127 uint32_t flags; 128}; 129 130# 131# Allow the GPIO controller to map the gpio-specifier on its own. 132# 133METHOD int map_gpios { 134 device_t bus; 135 phandle_t dev; 136 phandle_t gparent; 137 int gcells; 138 pcell_t *gpios; 139 uint32_t *pin; 140 uint32_t *flags; 141} DEFAULT gpio_default_map_gpios; 142