diff options
Diffstat (limited to 'drivers/input/joystick/amijoy.c')
-rw-r--r-- | drivers/input/joystick/amijoy.c | 85 |
1 files changed, 48 insertions, 37 deletions
diff --git a/drivers/input/joystick/amijoy.c b/drivers/input/joystick/amijoy.c index e996183c5b06..8558a99f6635 100644 --- a/drivers/input/joystick/amijoy.c +++ b/drivers/input/joystick/amijoy.c | |||
@@ -53,11 +53,9 @@ __obsolete_setup("amijoy="); | |||
53 | 53 | ||
54 | static int amijoy_used; | 54 | static int amijoy_used; |
55 | static DECLARE_MUTEX(amijoy_sem); | 55 | static DECLARE_MUTEX(amijoy_sem); |
56 | static struct input_dev amijoy_dev[2]; | 56 | static struct input_dev *amijoy_dev[2]; |
57 | static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" }; | 57 | static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" }; |
58 | 58 | ||
59 | static char *amijoy_name = "Amiga joystick"; | ||
60 | |||
61 | static irqreturn_t amijoy_interrupt(int irq, void *dummy, struct pt_regs *fp) | 59 | static irqreturn_t amijoy_interrupt(int irq, void *dummy, struct pt_regs *fp) |
62 | { | 60 | { |
63 | int i, data = 0, button = 0; | 61 | int i, data = 0, button = 0; |
@@ -70,15 +68,15 @@ static irqreturn_t amijoy_interrupt(int irq, void *dummy, struct pt_regs *fp) | |||
70 | case 1: data = ~custom.joy1dat; button = (~ciaa.pra >> 7) & 1; break; | 68 | case 1: data = ~custom.joy1dat; button = (~ciaa.pra >> 7) & 1; break; |
71 | } | 69 | } |
72 | 70 | ||
73 | input_regs(amijoy_dev + i, fp); | 71 | input_regs(amijoy_dev[i], fp); |
74 | 72 | ||
75 | input_report_key(amijoy_dev + i, BTN_TRIGGER, button); | 73 | input_report_key(amijoy_dev[i], BTN_TRIGGER, button); |
76 | 74 | ||
77 | input_report_abs(amijoy_dev + i, ABS_X, ((data >> 1) & 1) - ((data >> 9) & 1)); | 75 | input_report_abs(amijoy_dev[i], ABS_X, ((data >> 1) & 1) - ((data >> 9) & 1)); |
78 | data = ~(data ^ (data << 1)); | 76 | data = ~(data ^ (data << 1)); |
79 | input_report_abs(amijoy_dev + i, ABS_Y, ((data >> 1) & 1) - ((data >> 9) & 1)); | 77 | input_report_abs(amijoy_dev[i], ABS_Y, ((data >> 1) & 1) - ((data >> 9) & 1)); |
80 | 78 | ||
81 | input_sync(amijoy_dev + i); | 79 | input_sync(amijoy_dev[i]); |
82 | } | 80 | } |
83 | return IRQ_HANDLED; | 81 | return IRQ_HANDLED; |
84 | } | 82 | } |
@@ -114,39 +112,52 @@ static void amijoy_close(struct input_dev *dev) | |||
114 | static int __init amijoy_init(void) | 112 | static int __init amijoy_init(void) |
115 | { | 113 | { |
116 | int i, j; | 114 | int i, j; |
115 | int err; | ||
117 | 116 | ||
118 | for (i = 0; i < 2; i++) | 117 | for (i = 0; i < 2; i++) { |
119 | if (amijoy[i]) { | 118 | if (!amijoy[i]) |
120 | if (!request_mem_region(CUSTOM_PHYSADDR+10+i*2, 2, | 119 | continue; |
121 | "amijoy [Denise]")) { | ||
122 | if (i == 1 && amijoy[0]) { | ||
123 | input_unregister_device(amijoy_dev); | ||
124 | release_mem_region(CUSTOM_PHYSADDR+10, 2); | ||
125 | } | ||
126 | return -EBUSY; | ||
127 | } | ||
128 | 120 | ||
129 | amijoy_dev[i].open = amijoy_open; | 121 | amijoy_dev[i] = input_allocate_device(); |
130 | amijoy_dev[i].close = amijoy_close; | 122 | if (!amijoy_dev[i]) { |
131 | amijoy_dev[i].evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 123 | err = -ENOMEM; |
132 | amijoy_dev[i].absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | 124 | goto fail; |
133 | amijoy_dev[i].keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 125 | } |
134 | for (j = 0; j < 2; j++) { | ||
135 | amijoy_dev[i].absmin[ABS_X + j] = -1; | ||
136 | amijoy_dev[i].absmax[ABS_X + j] = 1; | ||
137 | } | ||
138 | 126 | ||
139 | amijoy_dev[i].name = amijoy_name; | 127 | if (!request_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2, "amijoy [Denise]")) { |
140 | amijoy_dev[i].phys = amijoy_phys[i]; | 128 | input_free_device(amijoy_dev[i]); |
141 | amijoy_dev[i].id.bustype = BUS_AMIGA; | 129 | err = -EBUSY; |
142 | amijoy_dev[i].id.vendor = 0x0001; | 130 | goto fail; |
143 | amijoy_dev[i].id.product = 0x0003; | 131 | } |
144 | amijoy_dev[i].id.version = 0x0100; | ||
145 | 132 | ||
146 | input_register_device(amijoy_dev + i); | 133 | amijoy_dev[i]->name = "Amiga joystick"; |
147 | printk(KERN_INFO "input: %s at joy%ddat\n", amijoy_name, i); | 134 | amijoy_dev[i]->phys = amijoy_phys[i]; |
135 | amijoy_dev[i]->id.bustype = BUS_AMIGA; | ||
136 | amijoy_dev[i]->id.vendor = 0x0001; | ||
137 | amijoy_dev[i]->id.product = 0x0003; | ||
138 | amijoy_dev[i]->id.version = 0x0100; | ||
139 | |||
140 | amijoy_dev[i]->open = amijoy_open; | ||
141 | amijoy_dev[i]->close = amijoy_close; | ||
142 | |||
143 | amijoy_dev[i]->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
144 | amijoy_dev[i]->absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | ||
145 | amijoy_dev[i]->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
146 | for (j = 0; j < 2; j++) { | ||
147 | amijoy_dev[i]->absmin[ABS_X + j] = -1; | ||
148 | amijoy_dev[i]->absmax[ABS_X + j] = 1; | ||
148 | } | 149 | } |
150 | |||
151 | input_register_device(amijoy_dev[i]); | ||
152 | } | ||
149 | return 0; | 153 | return 0; |
154 | |||
155 | fail: while (--i >= 0) | ||
156 | if (amijoy[i]) { | ||
157 | input_unregister_device(amijoy_dev[i]); | ||
158 | release_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2); | ||
159 | } | ||
160 | return err; | ||
150 | } | 161 | } |
151 | 162 | ||
152 | static void __exit amijoy_exit(void) | 163 | static void __exit amijoy_exit(void) |
@@ -155,8 +166,8 @@ static void __exit amijoy_exit(void) | |||
155 | 166 | ||
156 | for (i = 0; i < 2; i++) | 167 | for (i = 0; i < 2; i++) |
157 | if (amijoy[i]) { | 168 | if (amijoy[i]) { |
158 | input_unregister_device(amijoy_dev + i); | 169 | input_unregister_device(amijoy_dev[i]); |
159 | release_mem_region(CUSTOM_PHYSADDR+10+i*2, 2); | 170 | release_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2); |
160 | } | 171 | } |
161 | } | 172 | } |
162 | 173 | ||