1/*- 2 * Copyright (c) 2011 Jakub Wojciech Klama <jceel@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 --- 36 unchanged lines hidden (view full) --- 45 * [52..64] -> P2.0..P2.12 (port 2) 46 * [65..88] -> P1.0..P1.23 (port 1) 47 * [89..96] -> P0.0..P0.7 (port 0) 48 * 49 */ 50 51 52#include <sys/cdefs.h> |
53__FBSDID("$FreeBSD: head/sys/arm/lpc/lpc_gpio.c 277996 2015-01-31 19:32:14Z loos $"); |
54 55#include <sys/param.h> 56#include <sys/systm.h> 57#include <sys/bio.h> 58#include <sys/bus.h> 59#include <sys/conf.h> 60#include <sys/endian.h> 61#include <sys/kernel.h> --- 12 unchanged lines hidden (view full) --- 74 75#include <machine/bus.h> 76#include <machine/cpu.h> 77#include <machine/cpufunc.h> 78#include <machine/resource.h> 79#include <machine/intr.h> 80#include <machine/fdt.h> 81 |
82#include <dev/gpio/gpiobusvar.h> |
83#include <dev/ofw/ofw_bus.h> 84#include <dev/ofw/ofw_bus_subr.h> 85 86#include <arm/lpc/lpcreg.h> 87#include <arm/lpc/lpcvar.h> 88 89#include "gpio_if.h" 90 91struct lpc_gpio_softc 92{ 93 device_t lg_dev; |
94 device_t lg_busdev; |
95 struct resource * lg_res; 96 bus_space_tag_t lg_bst; 97 bus_space_handle_t lg_bsh; 98}; 99 100struct lpc_gpio_pinmap 101{ 102 int lp_start_idx; --- 29 unchanged lines hidden (view full) --- 132 133#define LPC_GPIO_PIN_BIT(_map, _idx) \ 134 (_map->lp_start_bit + LPC_GPIO_PIN_IDX(_map, _idx)) 135 136static int lpc_gpio_probe(device_t); 137static int lpc_gpio_attach(device_t); 138static int lpc_gpio_detach(device_t); 139 |
140static device_t lpc_gpio_get_bus(device_t); |
141static int lpc_gpio_pin_max(device_t, int *); 142static int lpc_gpio_pin_getcaps(device_t, uint32_t, uint32_t *); 143static int lpc_gpio_pin_getflags(device_t, uint32_t, uint32_t *); 144static int lpc_gpio_pin_setflags(device_t, uint32_t, uint32_t); 145static int lpc_gpio_pin_getname(device_t, uint32_t, char *); 146static int lpc_gpio_pin_get(device_t, uint32_t, uint32_t *); 147static int lpc_gpio_pin_set(device_t, uint32_t, uint32_t); 148static int lpc_gpio_pin_toggle(device_t, uint32_t); --- 41 unchanged lines hidden (view full) --- 190 return (ENXIO); 191 } 192 193 sc->lg_bst = rman_get_bustag(sc->lg_res); 194 sc->lg_bsh = rman_get_bushandle(sc->lg_res); 195 196 lpc_gpio_sc = sc; 197 |
198 sc->lg_busdev = gpiobus_attach_bus(dev); 199 if (sc->lg_busdev == NULL) { 200 bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->lg_res); 201 return (ENXIO); 202 } |
203 |
204 return (0); |
205} 206 207static int 208lpc_gpio_detach(device_t dev) 209{ 210 return (EBUSY); 211} 212 |
213static device_t 214lpc_gpio_get_bus(device_t dev) 215{ 216 struct lpc_gpio_softc *sc; 217 218 sc = device_get_softc(dev); 219 220 return (sc->lg_busdev); 221} 222 |
223static int 224lpc_gpio_pin_max(device_t dev, int *npins) 225{ 226 *npins = LPC_GPIO_NPINS - 1; 227 return (0); 228} 229 230static int --- 307 unchanged lines hidden (view full) --- 538 539static device_method_t lpc_gpio_methods[] = { 540 /* Device interface */ 541 DEVMETHOD(device_probe, lpc_gpio_probe), 542 DEVMETHOD(device_attach, lpc_gpio_attach), 543 DEVMETHOD(device_detach, lpc_gpio_detach), 544 545 /* GPIO interface */ |
546 DEVMETHOD(gpio_get_bus, lpc_gpio_get_bus), |
547 DEVMETHOD(gpio_pin_max, lpc_gpio_pin_max), 548 DEVMETHOD(gpio_pin_getcaps, lpc_gpio_pin_getcaps), 549 DEVMETHOD(gpio_pin_getflags, lpc_gpio_pin_getflags), 550 DEVMETHOD(gpio_pin_setflags, lpc_gpio_pin_setflags), 551 DEVMETHOD(gpio_pin_getname, lpc_gpio_pin_getname), 552 DEVMETHOD(gpio_pin_set, lpc_gpio_pin_set), 553 DEVMETHOD(gpio_pin_get, lpc_gpio_pin_get), 554 DEVMETHOD(gpio_pin_toggle, lpc_gpio_pin_toggle), --- 19 unchanged lines hidden --- |