root/drivers/input/mouse/atarimouse.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. atamouse_interrupt
  2. atamouse_open
  3. atamouse_close
  4. atamouse_init
  5. atamouse_exit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *  Atari mouse driver for Linux/m68k
   4  *
   5  *  Copyright (c) 2005 Michael Schmitz
   6  *
   7  *  Based on:
   8  *  Amiga mouse driver for Linux/m68k
   9  *
  10  *  Copyright (c) 2000-2002 Vojtech Pavlik
  11  */
  12 /*
  13  * The low level init and interrupt stuff is handled in arch/mm68k/atari/atakeyb.c
  14  * (the keyboard ACIA also handles the mouse and joystick data, and the keyboard
  15  * interrupt is shared with the MIDI ACIA so MIDI data also get handled there).
  16  * This driver only deals with handing key events off to the input layer.
  17  *
  18  * Largely based on the old:
  19  *
  20  * Atari Mouse Driver for Linux
  21  * by Robert de Vries (robert@and.nl) 19Jul93
  22  *
  23  * 16 Nov 1994 Andreas Schwab
  24  * Compatibility with busmouse
  25  * Support for three button mouse (shamelessly stolen from MiNT)
  26  * third button wired to one of the joystick directions on joystick 1
  27  *
  28  * 1996/02/11 Andreas Schwab
  29  * Module support
  30  * Allow multiple open's
  31  *
  32  * Converted to use new generic busmouse code.  5 Apr 1998
  33  *   Russell King <rmk@arm.uk.linux.org>
  34  */
  35 
  36 
  37 
  38 #include <linux/module.h>
  39 #include <linux/init.h>
  40 #include <linux/input.h>
  41 #include <linux/interrupt.h>
  42 
  43 #include <asm/irq.h>
  44 #include <asm/setup.h>
  45 #include <linux/uaccess.h>
  46 #include <asm/atarihw.h>
  47 #include <asm/atarikb.h>
  48 #include <asm/atariints.h>
  49 
  50 MODULE_AUTHOR("Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>");
  51 MODULE_DESCRIPTION("Atari mouse driver");
  52 MODULE_LICENSE("GPL");
  53 
  54 static int mouse_threshold[2] = {2, 2};
  55 module_param_array(mouse_threshold, int, NULL, 0);
  56 
  57 #ifdef FIXED_ATARI_JOYSTICK
  58 extern int atari_mouse_buttons;
  59 #endif
  60 
  61 static struct input_dev *atamouse_dev;
  62 
  63 static void atamouse_interrupt(char *buf)
  64 {
  65         int buttons, dx, dy;
  66 
  67         buttons = (buf[0] & 1) | ((buf[0] & 2) << 1);
  68 #ifdef FIXED_ATARI_JOYSTICK
  69         buttons |= atari_mouse_buttons & 2;
  70         atari_mouse_buttons = buttons;
  71 #endif
  72 
  73         /* only relative events get here */
  74         dx = buf[1];
  75         dy = buf[2];
  76 
  77         input_report_rel(atamouse_dev, REL_X, dx);
  78         input_report_rel(atamouse_dev, REL_Y, dy);
  79 
  80         input_report_key(atamouse_dev, BTN_LEFT,   buttons & 0x4);
  81         input_report_key(atamouse_dev, BTN_MIDDLE, buttons & 0x2);
  82         input_report_key(atamouse_dev, BTN_RIGHT,  buttons & 0x1);
  83 
  84         input_sync(atamouse_dev);
  85 
  86         return;
  87 }
  88 
  89 static int atamouse_open(struct input_dev *dev)
  90 {
  91 #ifdef FIXED_ATARI_JOYSTICK
  92         atari_mouse_buttons = 0;
  93 #endif
  94         ikbd_mouse_y0_top();
  95         ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]);
  96         ikbd_mouse_rel_pos();
  97         atari_input_mouse_interrupt_hook = atamouse_interrupt;
  98 
  99         return 0;
 100 }
 101 
 102 static void atamouse_close(struct input_dev *dev)
 103 {
 104         ikbd_mouse_disable();
 105         atari_input_mouse_interrupt_hook = NULL;
 106 }
 107 
 108 static int __init atamouse_init(void)
 109 {
 110         int error;
 111 
 112         if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP))
 113                 return -ENODEV;
 114 
 115         error = atari_keyb_init();
 116         if (error)
 117                 return error;
 118 
 119         atamouse_dev = input_allocate_device();
 120         if (!atamouse_dev)
 121                 return -ENOMEM;
 122 
 123         atamouse_dev->name = "Atari mouse";
 124         atamouse_dev->phys = "atamouse/input0";
 125         atamouse_dev->id.bustype = BUS_HOST;
 126         atamouse_dev->id.vendor = 0x0001;
 127         atamouse_dev->id.product = 0x0002;
 128         atamouse_dev->id.version = 0x0100;
 129 
 130         atamouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
 131         atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
 132         atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) |
 133                 BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
 134 
 135         atamouse_dev->open = atamouse_open;
 136         atamouse_dev->close = atamouse_close;
 137 
 138         error = input_register_device(atamouse_dev);
 139         if (error) {
 140                 input_free_device(atamouse_dev);
 141                 return error;
 142         }
 143 
 144         return 0;
 145 }
 146 
 147 static void __exit atamouse_exit(void)
 148 {
 149         input_unregister_device(atamouse_dev);
 150 }
 151 
 152 module_init(atamouse_init);
 153 module_exit(atamouse_exit);

/* [<][>][^][v][top][bottom][index][help] */