1186011Ssam/*-
2186011Ssam * Copyright (c) 2008 Sam Leffler.  All rights reserved.
3186011Ssam *
4186011Ssam * Redistribution and use in source and binary forms, with or without
5186011Ssam * modification, are permitted provided that the following conditions
6186011Ssam * are met:
7186011Ssam * 1. Redistributions of source code must retain the above copyright
8186011Ssam *    notice, this list of conditions and the following disclaimer.
9186011Ssam * 2. Redistributions in binary form must reproduce the above copyright
10186011Ssam *    notice, this list of conditions and the following disclaimer in the
11186011Ssam *    documentation and/or other materials provided with the distribution.
12186011Ssam *
13186011Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14186011Ssam * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15186011Ssam * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16186011Ssam * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17186011Ssam * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18186011Ssam * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19186011Ssam * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20186011Ssam * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21186011Ssam * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22186011Ssam * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23186011Ssam */
24186011Ssam
25186011Ssam#include <sys/cdefs.h>
26186011Ssam__FBSDID("$FreeBSD: releng/11.0/sys/arm/xscale/ixp425/cambria_fled.c 205705 2010-03-26 18:49:43Z rpaulo $");
27186011Ssam/*
28186011Ssam * Cambria Front Panel LED sitting on the I2C bus.
29186011Ssam */
30186011Ssam#include <sys/param.h>
31186011Ssam#include <sys/systm.h>
32186011Ssam#include <sys/kernel.h>
33186011Ssam#include <sys/module.h>
34186011Ssam#include <sys/bus.h>
35186011Ssam
36186011Ssam#include <machine/bus.h>
37186011Ssam
38186011Ssam#include <dev/iicbus/iiconf.h>
39186011Ssam#include <dev/led/led.h>
40186011Ssam
41186011Ssam#include "iicbus_if.h"
42186011Ssam
43186011Ssam#define	IIC_M_WR	0	/* write operation */
44186011Ssam#define	LED_ADDR	0xae	/* slave address */
45186011Ssam
46186011Ssamstruct fled_softc {
47186011Ssam	struct cdev	*sc_led;
48186011Ssam};
49186011Ssam
50186011Ssamstatic int
51186011Ssamfled_probe(device_t dev)
52186011Ssam{
53186011Ssam	device_set_desc(dev, "Gateworks Cambria Front Panel LED");
54186011Ssam	return 0;
55186011Ssam}
56186011Ssam
57186011Ssamstatic void
58186011Ssamfled_cb(void *arg, int onoff)
59186011Ssam{
60186011Ssam	uint8_t data[1];
61186011Ssam	struct iic_msg msgs[1] = {
62186011Ssam	     { LED_ADDR, IIC_M_WR, 1, data },
63186011Ssam	};
64186011Ssam	device_t dev = arg;
65186011Ssam
66186011Ssam	data[0] = (onoff == 0);		/* NB: low true */
67186011Ssam	(void) iicbus_transfer(dev, msgs, 1);
68186011Ssam}
69186011Ssam
70186011Ssamstatic int
71186011Ssamfled_attach(device_t dev)
72186011Ssam{
73186011Ssam	struct fled_softc *sc = device_get_softc(dev);
74186011Ssam
75186011Ssam	sc->sc_led = led_create(fled_cb, dev, "front");
76186011Ssam
77205705Srpaulo	fled_cb(dev, 1);		/* Turn on LED */
78203752Srpaulo
79186011Ssam	return 0;
80186011Ssam}
81186011Ssam
82186011Ssamstatic int
83186011Ssamfled_detach(device_t dev)
84186011Ssam{
85186011Ssam	struct fled_softc *sc = device_get_softc(dev);
86186011Ssam
87186011Ssam	if (sc->sc_led != NULL)
88186011Ssam		led_destroy(sc->sc_led);
89186011Ssam
90186011Ssam	return 0;
91186011Ssam}
92186011Ssam
93186011Ssamstatic device_method_t fled_methods[] = {
94186011Ssam	DEVMETHOD(device_probe,		fled_probe),
95186011Ssam	DEVMETHOD(device_attach,	fled_attach),
96186011Ssam	DEVMETHOD(device_detach,	fled_detach),
97186011Ssam
98186011Ssam	{0, 0},
99186011Ssam};
100186011Ssam
101186011Ssamstatic driver_t fled_driver = {
102186011Ssam	"fled",
103186011Ssam	fled_methods,
104186011Ssam	sizeof(struct fled_softc),
105186011Ssam};
106186011Ssamstatic devclass_t fled_devclass;
107186011Ssam
108186011SsamDRIVER_MODULE(fled, iicbus, fled_driver, fled_devclass, 0, 0);
109186011SsamMODULE_VERSION(fled, 1);
110186011SsamMODULE_DEPEND(fled, iicbus, 1, 1, 1);
111