avila_led.c revision 164508
1164508Skevlo/*-
2164508Skevlo * Copyright (c) 2006 Kevin Lo.  All rights reserved.
3164508Skevlo *
4164508Skevlo * Redistribution and use in source and binary forms, with or without
5164508Skevlo * modification, are permitted provided that the following conditions
6164508Skevlo * are met:
7164508Skevlo * 1. Redistributions of source code must retain the above copyright
8164508Skevlo *    notice, this list of conditions and the following disclaimer.
9164508Skevlo * 2. Redistributions in binary form must reproduce the above copyright
10164508Skevlo *    notice, this list of conditions and the following disclaimer in the
11164508Skevlo *    documentation and/or other materials provided with the distribution.
12164508Skevlo *
13164508Skevlo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14164508Skevlo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15164508Skevlo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16164508Skevlo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17164508Skevlo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18164508Skevlo * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19164508Skevlo * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20164508Skevlo * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21164508Skevlo * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22164508Skevlo * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23164508Skevlo */
24164508Skevlo
25164508Skevlo#include <sys/cdefs.h>
26164508Skevlo__FBSDID("$FreeBSD: head/sys/arm/xscale/ixp425/avila_led.c 164508 2006-11-22 12:57:17Z kevlo $");
27164508Skevlo
28164508Skevlo#include <sys/param.h>
29164508Skevlo#include <sys/systm.h>
30164508Skevlo#include <sys/kernel.h>
31164508Skevlo#include <sys/module.h>
32164508Skevlo#include <sys/bus.h>
33164508Skevlo
34164508Skevlo#include <arm/xscale/ixp425/ixp425reg.h>
35164508Skevlo#include <arm/xscale/ixp425/ixp425var.h>
36164508Skevlo
37164508Skevlo#include <dev/led/led.h>
38164508Skevlo
39164508Skevlo#define	GPIO_LED_STATUS	3
40164508Skevlo#define	  GPIO_LED_STATUS_BIT	(1U << GPIO_LED_STATUS)
41164508Skevlo
42164508Skevlostatic struct cdev *gpioled;
43164508Skevlo
44164508Skevlostruct led_avila_softc {
45164508Skevlo	device_t		sc_dev;
46164508Skevlo	bus_space_tag_t		sc_iot;
47164508Skevlo	bus_space_handle_t	sc_gpio_ioh;
48164508Skevlo};
49164508Skevlo
50164508Skevlostatic struct led_avila_softc *led_avila_sc = NULL;
51164508Skevlo
52164508Skevlostatic void
53164508Skevloled_func(void *unused, int onoff)
54164508Skevlo{
55164508Skevlo	struct led_avila_softc *sc = led_avila_sc;
56164508Skevlo	uint32_t reg;
57164508Skevlo
58164508Skevlo	reg = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPOUTR);
59164508Skevlo	if (onoff)
60164508Skevlo		reg &= ~GPIO_LED_STATUS_BIT;
61164508Skevlo	else
62164508Skevlo		reg |= GPIO_LED_STATUS_BIT;
63164508Skevlo	GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOUTR, reg);
64164508Skevlo}
65164508Skevlo
66164508Skevlostatic int
67164508Skevloled_avila_probe(device_t dev)
68164508Skevlo{
69164508Skevlo	device_set_desc(dev, "Gateworks Avila GPIO connected LED");
70164508Skevlo	return (0);
71164508Skevlo}
72164508Skevlo
73164508Skevlostatic int
74164508Skevloled_avila_attach(device_t dev)
75164508Skevlo{
76164508Skevlo	struct led_avila_softc *sc = device_get_softc(dev);
77164508Skevlo	struct ixp425_softc *sa = device_get_softc(device_get_parent(dev));
78164508Skevlo	void *led = NULL;
79164508Skevlo	uint32_t reg;
80164508Skevlo
81164508Skevlo	led_avila_sc = sc;
82164508Skevlo
83164508Skevlo	sc->sc_dev = dev;
84164508Skevlo	sc->sc_iot = sa->sc_iot;
85164508Skevlo	sc->sc_gpio_ioh = sa->sc_gpio_ioh;
86164508Skevlo
87164508Skevlo	/* Configure LED GPIO pin as output */
88164508Skevlo	reg = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPOER);
89164508Skevlo	reg &= ~GPIO_LED_STATUS_BIT;
90164508Skevlo	GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOER, reg);
91164508Skevlo
92164508Skevlo	gpioled = led_create(led_func, led, "gpioled");
93164508Skevlo
94164508Skevlo	/* Turn on LED */
95164508Skevlo	led_func(led, 1);
96164508Skevlo
97164508Skevlo	return (0);
98164508Skevlo}
99164508Skevlo
100164508Skevlostatic device_method_t led_avila_methods[] = {
101164508Skevlo	DEVMETHOD(device_probe,		led_avila_probe),
102164508Skevlo	DEVMETHOD(device_attach,	led_avila_attach),
103164508Skevlo
104164508Skevlo	{0, 0},
105164508Skevlo};
106164508Skevlo
107164508Skevlostatic driver_t led_avila_driver = {
108164508Skevlo	"led_avila",
109164508Skevlo	led_avila_methods,
110164508Skevlo	sizeof(struct led_avila_softc),
111164508Skevlo};
112164508Skevlostatic devclass_t led_avila_devclass;
113164508Skevlo
114164508SkevloDRIVER_MODULE(led_avila, ixp, led_avila_driver, led_avila_devclass, 0, 0);
115