summaryrefslogtreecommitdiffstats
path: root/sys/arm/ti
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-11-02 10:45:19 -0200
committerRenato Botelho <renato@netgate.com>2016-11-02 10:45:19 -0200
commit841f35badba9e12f94b576f843daf49955da85fa (patch)
tree637fcf5764747ea0ed464f94cb59da330f03d629 /sys/arm/ti
parent02fa2d6083daaf327638f8e0fb9aa0be9bff743a (diff)
parent0f6aead99b2a420a730d47a074145dcb7d0f6721 (diff)
downloadFreeBSD-src-841f35badba9e12f94b576f843daf49955da85fa.zip
FreeBSD-src-841f35badba9e12f94b576f843daf49955da85fa.tar.gz
Merge remote-tracking branch 'origin/stable/11' into devel-11
Diffstat (limited to 'sys/arm/ti')
-rw-r--r--sys/arm/ti/ti_adc.c76
-rw-r--r--sys/arm/ti/ti_adcreg.h1
-rw-r--r--sys/arm/ti/ti_adcvar.h5
3 files changed, 81 insertions, 1 deletions
diff --git a/sys/arm/ti/ti_adc.c b/sys/arm/ti/ti_adc.c
index 9f545e0..154cd78 100644
--- a/sys/arm/ti/ti_adc.c
+++ b/sys/arm/ti/ti_adc.c
@@ -27,6 +27,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_evdev.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -52,6 +54,11 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#ifdef EVDEV_SUPPORT
+#include <dev/evdev/input.h>
+#include <dev/evdev/evdev.h>
+#endif
+
#include <arm/ti/ti_prcm.h>
#include <arm/ti/ti_adcreg.h>
#include <arm/ti/ti_adcvar.h>
@@ -80,6 +87,20 @@ static struct ti_adc_input ti_adc_inputs[TI_ADC_NPINS] = {
static int ti_adc_samples[5] = { 0, 2, 4, 8, 16 };
+static int ti_adc_detach(device_t dev);
+
+#ifdef EVDEV_SUPPORT
+static void
+ti_adc_ev_report(struct ti_adc_softc *sc)
+{
+
+ evdev_push_event(sc->sc_evdev, EV_ABS, ABS_X, sc->sc_x);
+ evdev_push_event(sc->sc_evdev, EV_ABS, ABS_Y, sc->sc_y);
+ evdev_push_event(sc->sc_evdev, EV_KEY, BTN_TOUCH, sc->sc_pen_down);
+ evdev_sync(sc->sc_evdev);
+}
+#endif /* EVDEV */
+
static void
ti_adc_enable(struct ti_adc_softc *sc)
{
@@ -450,7 +471,14 @@ ti_adc_tsc_read_data(struct ti_adc_softc *sc)
#ifdef DEBUG_TSC
device_printf(sc->sc_dev, "touchscreen x: %d, y: %d\n", x, y);
#endif
- /* TODO: That's where actual event reporting should take place */
+
+#ifdef EVDEV_SUPPORT
+ if ((sc->sc_x != x) || (sc->sc_y != y)) {
+ sc->sc_x = x;
+ sc->sc_y = y;
+ ti_adc_ev_report(sc);
+ }
+#endif
}
static void
@@ -488,11 +516,17 @@ ti_adc_intr(void *arg)
status |= ADC_IRQ_HW_PEN_ASYNC;
ADC_WRITE4(sc, ADC_IRQENABLE_CLR,
ADC_IRQ_HW_PEN_ASYNC);
+#ifdef EVDEV_SUPPORT
+ ti_adc_ev_report(sc);
+#endif
}
if (rawstatus & ADC_IRQ_PEN_UP) {
sc->sc_pen_down = 0;
status |= ADC_IRQ_PEN_UP;
+#ifdef EVDEV_SUPPORT
+ ti_adc_ev_report(sc);
+#endif
}
if (status & ADC_IRQ_FIFO0_THRES)
@@ -840,6 +874,38 @@ ti_adc_attach(device_t dev)
ti_adc_setup(sc);
TI_ADC_UNLOCK(sc);
+#ifdef EVDEV_SUPPORT
+ if (sc->sc_tsc_wires > 0) {
+ sc->sc_evdev = evdev_alloc();
+ evdev_set_name(sc->sc_evdev, device_get_desc(dev));
+ evdev_set_phys(sc->sc_evdev, device_get_nameunit(dev));
+ evdev_set_id(sc->sc_evdev, BUS_VIRTUAL, 0, 0, 0);
+ evdev_support_prop(sc->sc_evdev, INPUT_PROP_DIRECT);
+ evdev_support_event(sc->sc_evdev, EV_SYN);
+ evdev_support_event(sc->sc_evdev, EV_ABS);
+ evdev_support_event(sc->sc_evdev, EV_KEY);
+
+ evdev_support_abs(sc->sc_evdev, ABS_X, 0, 0,
+ ADC_MAX_VALUE, 0, 0, 0);
+ evdev_support_abs(sc->sc_evdev, ABS_Y, 0, 0,
+ ADC_MAX_VALUE, 0, 0, 0);
+
+ evdev_support_key(sc->sc_evdev, BTN_TOUCH);
+
+ err = evdev_register(sc->sc_evdev);
+ if (err) {
+ device_printf(dev,
+ "failed to register evdev: error=%d\n", err);
+ ti_adc_detach(dev);
+ return (err);
+ }
+
+ sc->sc_pen_down = 0;
+ sc->sc_x = -1;
+ sc->sc_y = -1;
+ }
+#endif /* EVDEV */
+
return (0);
}
@@ -854,6 +920,11 @@ ti_adc_detach(device_t dev)
TI_ADC_LOCK(sc);
ti_adc_reset(sc);
ti_adc_setup(sc);
+
+#ifdef EVDEV_SUPPORT
+ evdev_free(sc->sc_evdev);
+#endif
+
TI_ADC_UNLOCK(sc);
TI_ADC_LOCK_DESTROY(sc);
@@ -887,3 +958,6 @@ static devclass_t ti_adc_devclass;
DRIVER_MODULE(ti_adc, simplebus, ti_adc_driver, ti_adc_devclass, 0, 0);
MODULE_VERSION(ti_adc, 1);
MODULE_DEPEND(ti_adc, simplebus, 1, 1, 1);
+#ifdef EVDEV_SUPPORT
+MODULE_DEPEND(ti_adc, evdev, 1, 1, 1);
+#endif
diff --git a/sys/arm/ti/ti_adcreg.h b/sys/arm/ti/ti_adcreg.h
index ee15f16..bc3b972 100644
--- a/sys/arm/ti/ti_adcreg.h
+++ b/sys/arm/ti/ti_adcreg.h
@@ -122,5 +122,6 @@
#define ADC_FIFO_STEP_ID_MSK 0x000f0000
#define ADC_FIFO_STEP_ID_SHIFT 16
#define ADC_FIFO_DATA_MSK 0x00000fff
+#define ADC_MAX_VALUE 0xfff
#endif /* _TI_ADCREG_H_ */
diff --git a/sys/arm/ti/ti_adcvar.h b/sys/arm/ti/ti_adcvar.h
index 0cd0c34..b9cc0f0 100644
--- a/sys/arm/ti/ti_adcvar.h
+++ b/sys/arm/ti/ti_adcvar.h
@@ -55,6 +55,11 @@ struct ti_adc_softc {
int sc_yn_bit, sc_yn_inp;
uint32_t sc_tsc_enabled;
int sc_pen_down;
+#ifdef EVDEV_SUPPORT
+ int sc_x;
+ int sc_y;
+ struct evdev_dev *sc_evdev;
+#endif
};
struct ti_adc_input {
OpenPOWER on IntegriCloud