Dream: Hook up trackball to drivers/staging interface
Pavel Machek
pavel at ucw.cz
Sat Mar 13 07:38:41 EST 2010
Hi!
With this and fixes from -rc4, applied on top of -working-mmc tree, I
get working trackball. (Tested with cat, not evtest).
Signed-off-by: Pavel Machek <pavel at ucw.cz>
diff --git a/arch/arm/mach-msm/board-dream.c b/arch/arm/mach-msm/board-dream.c
index d40ce48..f48c797 100644
--- a/arch/arm/mach-msm/board-dream.c
+++ b/arch/arm/mach-msm/board-dream.c
@@ -31,6 +31,132 @@
#include "board-dream.h"
#include "proc_comm.h"
+#include <linux/gpio.h>
+
+/*
+ * Input devices
+ */
+
+#ifndef CONFIG_INPUT_GPIO
+#error Gpio input is very recommended on Dream
+#else
+#include "../../../drivers/staging/dream/include/linux/gpio_event.h"
+struct dream_axis_info {
+ struct gpio_event_axis_info info;
+ uint16_t in_state;
+ uint16_t out_state;
+};
+static bool nav_just_on;
+static int nav_on_jiffies;
+
+uint16_t dream_axis_map(struct gpio_event_axis_info *info, uint16_t in)
+{
+ struct dream_axis_info *ai = container_of(info, struct dream_axis_info, info);
+ uint16_t out = ai->out_state;
+
+ if (nav_just_on) {
+ if (jiffies == nav_on_jiffies || jiffies == nav_on_jiffies + 1)
+ goto ignore;
+ nav_just_on = 0;
+ }
+ if((ai->in_state ^ in) & 1)
+ out--;
+ if((ai->in_state ^ in) & 2)
+ out++;
+ ai->out_state = out;
+ignore:
+ ai->in_state = in;
+ return out;
+}
+
+int dream_nav_power(const struct gpio_event_platform_data *pdata, bool on)
+{
+ gpio_set_value(DREAM_GPIO_JOG_EN, on);
+ if (on) {
+ nav_just_on = 1;
+ nav_on_jiffies = jiffies;
+ }
+ return 0;
+}
+
+static uint32_t dream_4_x_axis_gpios[] = {
+ DREAM_4_BALL_LEFT_0, DREAM_4_BALL_RIGHT_0
+};
+static uint32_t dream_5_x_axis_gpios[] = {
+ DREAM_5_BALL_LEFT_0, DREAM_5_BALL_RIGHT_0
+};
+
+static struct dream_axis_info dream_x_axis = {
+ .info = {
+ .info.func = gpio_event_axis_func,
+ .count = ARRAY_SIZE(dream_5_x_axis_gpios),
+ .type = EV_REL,
+ .code = REL_X,
+ .decoded_size = 1U << ARRAY_SIZE(dream_5_x_axis_gpios),
+ .map = dream_axis_map,
+ .gpio = dream_5_x_axis_gpios,
+ .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION /*| GPIOEAF_PRINT_RAW | GPIOEAF_PRINT_EVENT */
+ }
+};
+
+static uint32_t dream_4_y_axis_gpios[] = {
+ DREAM_4_BALL_UP_0, DREAM_4_BALL_DOWN_0
+};
+static uint32_t dream_5_y_axis_gpios[] = {
+ DREAM_5_BALL_UP_0, DREAM_5_BALL_DOWN_0
+};
+
+static struct dream_axis_info dream_y_axis = {
+ .info = {
+ .info.func = gpio_event_axis_func,
+ .count = ARRAY_SIZE(dream_5_y_axis_gpios),
+ .type = EV_REL,
+ .code = REL_Y,
+ .decoded_size = 1U << ARRAY_SIZE(dream_5_y_axis_gpios),
+ .map = dream_axis_map,
+ .gpio = dream_5_y_axis_gpios,
+ .flags = GPIOEAF_PRINT_UNKNOWN_DIRECTION /*| GPIOEAF_PRINT_RAW | GPIOEAF_PRINT_EVENT */
+ }
+};
+
+static struct gpio_event_direct_entry dream_nav_buttons[] = {
+ { DREAM_GPIO_NAVI_ACT_N, BTN_MOUSE }
+};
+
+static struct gpio_event_input_info dream_nav_button_info = {
+ .info.func = gpio_event_input_func,
+ .flags = 0,
+ .type = EV_KEY,
+ .keymap = dream_nav_buttons,
+ .keymap_size = ARRAY_SIZE(dream_nav_buttons)
+};
+
+static struct gpio_event_info *dream_nav_info[] = {
+ &dream_x_axis.info.info,
+ &dream_y_axis.info.info,
+ &dream_nav_button_info.info
+};
+
+static struct gpio_event_platform_data dream_nav_data = {
+ .name = "dream-nav",
+ .info = dream_nav_info,
+ .info_count = ARRAY_SIZE(dream_nav_info),
+ .power = dream_nav_power,
+};
+
+static struct platform_device dream_nav_device = {
+ .name = GPIO_EVENT_DEV_NAME,
+ .id = 2,
+ .dev = {
+ .platform_data = &dream_nav_data,
+ },
+};
+#endif
+
+/*
+ * Core stuff
+ */
+
extern int dream_init_mmc(unsigned int);
static struct platform_device *devices[] __initdata = {
@@ -39,6 +165,9 @@ static struct platform_device *devices[] __initdata = {
&msm_device_nand,
&msm_device_hsusb,
&msm_device_i2c,
+#ifdef CONFIG_INPUT_GPIO
+ &dream_nav_device,
+#endif
};
extern struct sys_timer msm_timer;
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
More information about the linux-arm-kernel
mailing list