Lines Matching +full:port +full:- +full:2
2 * IEEE 1284.3 Parallel port daisy chain and multiplexor code
9 * 2 of the License, or (at your option) any later version.
11 * ??-12-1998: Initial implementation.
12 * 31-01-1999: Make port-cloning transparent.
13 * 13-02-1999: Move DeviceID technique from parport_probe.
14 * 13-03-1999: Get DeviceID from non-IEEE 1284.3 devices too.
15 * 22-02-2000: Count devices that are actually detected.
41 struct parport *port; member
49 /* Forward-declaration of lower-level functions. */
50 static int mux_present(struct parport *port);
51 static int num_mux_ports(struct parport *port);
52 static int select_port(struct parport *port);
53 static int assign_addrs(struct parport *port);
56 static void add_dev(int devnum, struct parport *port, int daisy) in add_dev() argument
61 newdev->port = port; in add_dev()
62 newdev->daisy = daisy; in add_dev()
63 newdev->devnum = devnum; in add_dev()
65 for (p = &topology; *p && (*p)->devnum<devnum; p = &(*p)->next) in add_dev()
67 newdev->next = *p; in add_dev()
76 struct parport *extra = parport_register_port(real->base, in clone_parport()
77 real->irq, in clone_parport()
78 real->dma, in clone_parport()
79 real->ops); in clone_parport()
81 extra->portnum = real->portnum; in clone_parport()
82 extra->physport = real; in clone_parport()
83 extra->muxport = muxport; in clone_parport()
84 real->slaves[muxport-1] = extra; in clone_parport()
90 /* Discover the IEEE1284.3 topology on a port -- muxes and daisy chains.
92 int parport_daisy_init(struct parport *port) in parport_daisy_init() argument
105 /* If mux present on normal port, need to create new in parport_daisy_init()
106 * parports for each extra port. */ in parport_daisy_init()
107 if (port->muxport < 0 && mux_present(port) && in parport_daisy_init()
108 /* don't be fooled: a mux must have 2 or 4 ports. */ in parport_daisy_init()
109 ((num_ports = num_mux_ports(port)) == 2 || num_ports == 4)) { in parport_daisy_init()
110 /* Leave original as port zero. */ in parport_daisy_init()
111 port->muxport = 0; in parport_daisy_init()
113 "%s: 1st (default) port of %d-way multiplexor\n", in parport_daisy_init()
114 port->name, num_ports); in parport_daisy_init()
116 /* Clone the port. */ in parport_daisy_init()
117 struct parport *extra = clone_parport(port, i); in parport_daisy_init()
127 "%s: %d%s port of %d-way multiplexor on %s\n", in parport_daisy_init()
128 extra->name, i + 1, th[i + 1], num_ports, in parport_daisy_init()
129 port->name); in parport_daisy_init()
131 /* Analyse that port too. We won't recurse in parport_daisy_init()
132 forever because of the 'port->muxport < 0' in parport_daisy_init()
138 if (port->muxport >= 0) in parport_daisy_init()
139 select_port(port); in parport_daisy_init()
141 parport_daisy_deselect_all(port); in parport_daisy_init()
142 detected += assign_addrs(port); in parport_daisy_init()
145 add_dev(numdevs++, port, -1); in parport_daisy_init()
150 if (parport_device_id(numdevs - 1, deviceid, 1024) > 2) in parport_daisy_init()
160 parport_daisy_fini(port); in parport_daisy_init()
161 parport_write_control(port, PARPORT_CONTROL_SELECT); in parport_daisy_init()
163 parport_write_control(port, in parport_daisy_init()
174 /* Forget about devices on a physical port. */
175 void parport_daisy_fini(struct parport *port) in parport_daisy_fini() argument
183 if (dev->port != port) { in parport_daisy_fini()
184 p = &dev->next; in parport_daisy_fini()
187 *p = dev->next; in parport_daisy_fini()
200 * parport_open - find a device by canonical device number
205 * that it locates a device by its number rather than by the port
216 struct parport *port; in parport_open() local
221 while (p && p->devnum != devnum) in parport_open()
222 p = p->next; in parport_open()
229 daisy = p->daisy; in parport_open()
230 port = parport_get_port(p->port); in parport_open()
233 dev = parport_register_device(port, name, NULL, NULL, NULL, 0, NULL); in parport_open()
234 parport_put_port(port); in parport_open()
238 dev->daisy = daisy; in parport_open()
244 selected = port->daisy; in parport_open()
258 * parport_close - close a device opened with parport_open()
270 /* Send a daisy-chain-style CPP command packet. */
271 static int cpp_daisy(struct parport *port, int cmd) in cpp_daisy() argument
275 parport_data_forward(port); in cpp_daisy()
276 parport_write_data(port, 0xaa); udelay(2); in cpp_daisy()
277 parport_write_data(port, 0x55); udelay(2); in cpp_daisy()
278 parport_write_data(port, 0x00); udelay(2); in cpp_daisy()
279 parport_write_data(port, 0xff); udelay(2); in cpp_daisy()
280 s = parport_read_status(port) & (PARPORT_STATUS_BUSY in cpp_daisy()
289 port->name, s); in cpp_daisy()
290 return -ENXIO; in cpp_daisy()
293 parport_write_data(port, 0x87); udelay(2); in cpp_daisy()
294 s = parport_read_status(port) & (PARPORT_STATUS_BUSY in cpp_daisy()
300 port->name, s); in cpp_daisy()
301 return -ENXIO; in cpp_daisy()
304 parport_write_data(port, 0x78); udelay(2); in cpp_daisy()
305 parport_write_data(port, cmd); udelay(2); in cpp_daisy()
306 parport_frob_control(port, in cpp_daisy()
310 s = parport_read_status(port); in cpp_daisy()
311 parport_frob_control(port, PARPORT_CONTROL_STROBE, 0); in cpp_daisy()
313 parport_write_data(port, 0xff); udelay(2); in cpp_daisy()
318 /* Send a mux-style CPP command packet. */
319 static int cpp_mux(struct parport *port, int cmd) in cpp_mux() argument
324 parport_data_forward(port); in cpp_mux()
325 parport_write_data(port, 0xaa); udelay(2); in cpp_mux()
326 parport_write_data(port, 0x55); udelay(2); in cpp_mux()
327 parport_write_data(port, 0xf0); udelay(2); in cpp_mux()
328 parport_write_data(port, 0x0f); udelay(2); in cpp_mux()
329 parport_write_data(port, 0x52); udelay(2); in cpp_mux()
330 parport_write_data(port, 0xad); udelay(2); in cpp_mux()
331 parport_write_data(port, cmd); udelay(2); in cpp_mux()
333 s = parport_read_status(port); in cpp_mux()
336 port->name, cmd, s); in cpp_mux()
337 return -EIO; in cpp_mux()
342 ((s & PARPORT_STATUS_BUSY ? 0 : 1) << 2) | in cpp_mux()
348 void parport_daisy_deselect_all(struct parport *port) in parport_daisy_deselect_all() argument
350 cpp_daisy(port, 0x30); in parport_daisy_deselect_all()
353 int parport_daisy_select(struct parport *port, int daisy, int mode) in parport_daisy_select() argument
361 return !(cpp_daisy(port, 0x20 + daisy) & in parport_daisy_select()
368 return !(cpp_daisy(port, 0xd0 + daisy) & in parport_daisy_select()
379 return !(cpp_daisy(port, 0xe0 + daisy) & in parport_daisy_select()
384 static int mux_present(struct parport *port) in mux_present() argument
386 return cpp_mux(port, 0x51) == 3; in mux_present()
389 static int num_mux_ports(struct parport *port) in num_mux_ports() argument
391 return cpp_mux(port, 0x58); in num_mux_ports()
394 static int select_port(struct parport *port) in select_port() argument
396 int muxport = port->muxport; in select_port()
397 return cpp_mux(port, 0x60 + muxport) == muxport; in select_port()
400 static int assign_addrs(struct parport *port) in assign_addrs() argument
408 parport_data_forward(port); in assign_addrs()
409 parport_write_data(port, 0xaa); udelay(2); in assign_addrs()
410 parport_write_data(port, 0x55); udelay(2); in assign_addrs()
411 parport_write_data(port, 0x00); udelay(2); in assign_addrs()
412 parport_write_data(port, 0xff); udelay(2); in assign_addrs()
413 s = parport_read_status(port) & (PARPORT_STATUS_BUSY in assign_addrs()
422 port->name, s); in assign_addrs()
426 parport_write_data(port, 0x87); udelay(2); in assign_addrs()
427 s = parport_read_status(port) & (PARPORT_STATUS_BUSY in assign_addrs()
433 port->name, s); in assign_addrs()
437 parport_write_data(port, 0x78); udelay(2); in assign_addrs()
438 s = parport_read_status(port); in assign_addrs()
445 parport_write_data(port, daisy); in assign_addrs()
446 udelay(2); in assign_addrs()
447 parport_frob_control(port, in assign_addrs()
451 parport_frob_control(port, PARPORT_CONTROL_STROBE, 0); in assign_addrs()
454 add_dev(numdevs++, port, daisy); in assign_addrs()
463 work status lines from some non-daisy chain in assign_addrs()
465 s = parport_read_status(port); in assign_addrs()
468 parport_write_data(port, 0xff); udelay(2); in assign_addrs()
469 detected = numdevs - thisdev; in assign_addrs()
470 DPRINTK(KERN_DEBUG "%s: Found %d daisy-chained devices\n", port->name, in assign_addrs()