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/11.0/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