32 #include <linux/module.h>
36 #include <linux/gameport.h>
37 #include <linux/slab.h>
44 static int ns558_isa_portlist[] = { 0x201, 0x200, 0x202, 0x203, 0x204, 0x205, 0x207, 0x209,
45 0x20b, 0x20c, 0x20e, 0x20f, 0x211, 0x219, 0x101, 0 };
64 static int ns558_isa_probe(
int io)
67 unsigned char c,
u,
v;
85 if (~(u = v =
inb(io)) & 3) {
94 for (i = 0; i < 1000; i++) v &=
inb(io);
107 for (i = 0; i < 1000; i++)
108 if ((u ^
inb(io)) & 0xf) {
117 for (i = 1; i < 5; i++) {
124 outb(0xff, io & (-1 << i));
125 for (j = b = 0; j < 1000; j++)
126 if (
inb(io & (-1 << i)) !=
inb((io & (-1 << i)) + (1 << i) - 1)) b++;
142 ns558 = kzalloc(
sizeof(
struct ns558),
GFP_KERNEL);
143 port = gameport_allocate_port();
144 if (!ns558 || !port) {
148 gameport_free_port(port);
153 ns558->
size = 1 <<
i;
157 gameport_set_name(port,
"NS558 ISA Gameport");
160 gameport_register_port(port);
162 list_add(&ns558->
node, &ns558_list);
170 { .
id =
"@P@0001", .driver_data = 0 },
171 { .id =
"@P@0020", .driver_data = 0 },
172 { .id =
"@P@1001", .driver_data = 0 },
173 { .id =
"@P@2001", .driver_data = 0 },
174 { .id =
"ASB16fd", .driver_data = 0 },
175 { .id =
"AZT3001", .driver_data = 0 },
176 { .id =
"CDC0001", .driver_data = 0 },
177 { .id =
"CSC0001", .driver_data = 0 },
178 { .id =
"CSC000f", .driver_data = 0 },
179 { .id =
"CSC0101", .driver_data = 0 },
180 { .id =
"CTL7001", .driver_data = 0 },
181 { .id =
"CTL7002", .driver_data = 0 },
182 { .id =
"CTL7005", .driver_data = 0 },
183 { .id =
"ENS2020", .driver_data = 0 },
184 { .id =
"ESS0001", .driver_data = 0 },
185 { .id =
"ESS0005", .driver_data = 0 },
186 { .id =
"ESS6880", .driver_data = 0 },
187 { .id =
"IBM0012", .driver_data = 0 },
188 { .id =
"OPT0001", .driver_data = 0 },
189 { .id =
"YMH0006", .driver_data = 0 },
190 { .id =
"YMH0022", .driver_data = 0 },
191 { .id =
"PNPb02f", .driver_data = 0 },
203 if (!pnp_port_valid(dev, 0)) {
208 ioport = pnp_port_start(dev, 0);
209 iolen = pnp_port_len(dev, 0);
214 ns558 = kzalloc(
sizeof(
struct ns558),
GFP_KERNEL);
215 port = gameport_allocate_port();
216 if (!ns558 || !port) {
219 gameport_free_port(port);
228 gameport_set_name(port,
"NS558 PnP Gameport");
230 port->
dev.parent = &dev->
dev;
233 gameport_register_port(port);
241 .id_table = pnp_devids,
242 .probe = ns558_pnp_probe,
251 static int __init ns558_init(
void)
257 if (error && error != -
ENODEV)
266 while (ns558_isa_portlist[i])
267 ns558_isa_probe(ns558_isa_portlist[i++]);
269 return list_empty(&ns558_list) && error ? -
ENODEV : 0;
272 static void __exit ns558_exit(
void)
274 struct ns558 *ns558, *
safe;