1239709Srwatson/*- 2239709Srwatson * Copyright (c) 2012 Robert N. M. Watson 3239709Srwatson * All rights reserved. 4239709Srwatson * 5239709Srwatson * This software was developed by SRI International and the University of 6239709Srwatson * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) 7239709Srwatson * ("CTSRD"), as part of the DARPA CRASH research programme. 8239709Srwatson * 9239709Srwatson * Redistribution and use in source and binary forms, with or without 10239709Srwatson * modification, are permitted provided that the following conditions 11239709Srwatson * are met: 12239709Srwatson * 1. Redistributions of source code must retain the above copyright 13239709Srwatson * notice, this list of conditions and the following disclaimer. 14239709Srwatson * 2. Redistributions in binary form must reproduce the above copyright 15239709Srwatson * notice, this list of conditions and the following disclaimer in the 16239709Srwatson * documentation and/or other materials provided with the distribution. 17239709Srwatson * 18239709Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19239709Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20239709Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21239709Srwatson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22239709Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23239709Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24239709Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25239709Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26239709Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27239709Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28239709Srwatson * SUCH DAMAGE. 29239709Srwatson */ 30239709Srwatson 31239709Srwatson#include <sys/cdefs.h> 32239709Srwatson__FBSDID("$FreeBSD: releng/10.2/sys/dev/terasic/de4led/terasic_de4led.c 245380 2013-01-13 16:57:11Z rwatson $"); 33239709Srwatson 34239709Srwatson#include <sys/param.h> 35239709Srwatson#include <sys/bus.h> 36239709Srwatson#include <sys/lock.h> 37239709Srwatson#include <sys/mutex.h> 38239709Srwatson#include <sys/rman.h> 39239709Srwatson 40239709Srwatson#include <machine/bus.h> 41239709Srwatson#include <machine/resource.h> 42239709Srwatson 43239709Srwatson#include <dev/led/led.h> 44239709Srwatson#include <dev/terasic/de4led/terasic_de4led.h> 45239709Srwatson 46245380Srwatsondevclass_t terasic_de4led_devclass; 47245380Srwatson 48239709Srwatsonstatic void 49239709Srwatsonterasic_de4led_update(struct terasic_de4led_softc *sc) 50239709Srwatson{ 51239709Srwatson 52239709Srwatson TERASIC_DE4LED_LOCK_ASSERT(sc); 53239709Srwatson 54239709Srwatson bus_write_1(sc->tdl_res, TERASIC_DE4LED_OFF_LED, sc->tdl_bits); 55239709Srwatson} 56239709Srwatson 57239709Srwatsonstatic void 58239709Srwatsonled_update(struct terasic_de4led_softc *sc, int bit, int onoff) 59239709Srwatson{ 60239709Srwatson 61239709Srwatson TERASIC_DE4LED_LOCK(sc); 62239709Srwatson TERASIC_DE4LED_SETLED(sc, bit, onoff); 63239709Srwatson terasic_de4led_update(sc); 64239709Srwatson TERASIC_DE4LED_UNLOCK(sc); 65239709Srwatson} 66239709Srwatson 67239709Srwatsonstatic void 68239709Srwatsonled_0(void *arg, int onoff) 69239709Srwatson{ 70239709Srwatson 71239709Srwatson led_update(arg, 0, onoff); 72239709Srwatson} 73239709Srwatson 74239709Srwatsonstatic void 75239709Srwatsonled_1(void *arg, int onoff) 76239709Srwatson{ 77239709Srwatson 78239709Srwatson led_update(arg, 1, onoff); 79239709Srwatson} 80239709Srwatson 81239709Srwatsonstatic void 82239709Srwatsonled_2(void *arg, int onoff) 83239709Srwatson{ 84239709Srwatson 85239709Srwatson led_update(arg, 2, onoff); 86239709Srwatson} 87239709Srwatson 88239709Srwatsonstatic void 89239709Srwatsonled_3(void *arg, int onoff) 90239709Srwatson{ 91239709Srwatson 92239709Srwatson led_update(arg, 3, onoff); 93239709Srwatson} 94239709Srwatson 95239709Srwatsonstatic void 96239709Srwatsonled_4(void *arg, int onoff) 97239709Srwatson{ 98239709Srwatson 99239709Srwatson led_update(arg, 4, onoff); 100239709Srwatson} 101239709Srwatson 102239709Srwatsonstatic void 103239709Srwatsonled_5(void *arg, int onoff) 104239709Srwatson{ 105239709Srwatson 106239709Srwatson led_update(arg, 5, onoff); 107239709Srwatson} 108239709Srwatson 109239709Srwatsonstatic void 110239709Srwatsonled_6(void *arg, int onoff) 111239709Srwatson{ 112239709Srwatson 113239709Srwatson led_update(arg, 6, onoff); 114239709Srwatson} 115239709Srwatson 116239709Srwatsonstatic void 117239709Srwatsonled_7(void *arg, int onoff) 118239709Srwatson{ 119239709Srwatson 120239709Srwatson led_update(arg, 7, onoff); 121239709Srwatson} 122239709Srwatson 123239709Srwatsonvoid 124239709Srwatsonterasic_de4led_attach(struct terasic_de4led_softc *sc) 125239709Srwatson{ 126239709Srwatson const char *cmd; 127239709Srwatson 128239709Srwatson TERASIC_DE4LED_LOCK_INIT(sc); 129239709Srwatson 130239709Srwatson /* 131239709Srwatson * Clear the LED array before we start. 132239709Srwatson */ 133239709Srwatson TERASIC_DE4LED_LOCK(sc); 134239709Srwatson TERASIC_DE4LED_CLEARBAR(sc); 135239709Srwatson terasic_de4led_update(sc); 136239709Srwatson TERASIC_DE4LED_UNLOCK(sc); 137239709Srwatson 138239709Srwatson /* 139239709Srwatson * Register the LED array with led(4). 140239709Srwatson */ 141239709Srwatson sc->tdl_leds[0] = led_create(led_0, sc, "de4led_0"); 142239709Srwatson sc->tdl_leds[1] = led_create(led_1, sc, "de4led_1"); 143239709Srwatson sc->tdl_leds[2] = led_create(led_2, sc, "de4led_2"); 144239709Srwatson sc->tdl_leds[3] = led_create(led_3, sc, "de4led_3"); 145239709Srwatson sc->tdl_leds[4] = led_create(led_4, sc, "de4led_4"); 146239709Srwatson sc->tdl_leds[5] = led_create(led_5, sc, "de4led_5"); 147239709Srwatson sc->tdl_leds[6] = led_create(led_6, sc, "de4led_6"); 148239709Srwatson sc->tdl_leds[7] = led_create(led_7, sc, "de4led_7"); 149239709Srwatson 150239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 151239709Srwatson sc->tdl_unit, "de4led_0_cmd", &cmd) == 0) 152239709Srwatson led_set("de4led_0", cmd); 153239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 154239709Srwatson sc->tdl_unit, "de4led_1_cmd", &cmd) == 0) 155239709Srwatson led_set("de4led_1", cmd); 156239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 157239709Srwatson sc->tdl_unit, "de4led_2_cmd", &cmd) == 0) 158239709Srwatson led_set("de4led_2", cmd); 159239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 160239709Srwatson sc->tdl_unit, "de4led_3_cmd", &cmd) == 0) 161239709Srwatson led_set("de4led_3", cmd); 162239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 163239709Srwatson sc->tdl_unit, "de4led_4_cmd", &cmd) == 0) 164239709Srwatson led_set("de4led_4", cmd); 165239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 166239709Srwatson sc->tdl_unit, "de4led_5_cmd", &cmd) == 0) 167239709Srwatson led_set("de4led_5", cmd); 168239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 169239709Srwatson sc->tdl_unit, "de4led_6_cmd", &cmd) == 0) 170239709Srwatson led_set("de4led_6", cmd); 171239709Srwatson if (resource_string_value(device_get_name(sc->tdl_dev), 172239709Srwatson sc->tdl_unit, "de4led_7_cmd", &cmd) == 0) 173239709Srwatson led_set("de4led_7", cmd); 174239709Srwatson} 175239709Srwatson 176239709Srwatsonvoid 177239709Srwatsonterasic_de4led_detach(struct terasic_de4led_softc *sc) 178239709Srwatson{ 179239709Srwatson int i; 180239709Srwatson 181239709Srwatson for (i = 0; i < 8; i++) { 182239709Srwatson led_destroy(sc->tdl_leds[i]); 183239709Srwatson sc->tdl_leds[i] = NULL; 184239709Srwatson } 185239709Srwatson TERASIC_DE4LED_LOCK(sc); 186239709Srwatson TERASIC_DE4LED_CLEARBAR(sc); 187239709Srwatson terasic_de4led_update(sc); 188239709Srwatson TERASIC_DE4LED_UNLOCK(sc); 189239709Srwatson TERASIC_DE4LED_LOCK_DESTROY(sc); 190239709Srwatson} 191