Lines Matching refs:port

2  * IEEE 1284.3 Parallel port daisy chain and multiplexor code
12 * 31-01-1999: Make port-cloning transparent.
35 struct parport *port;
45 static int mux_present(struct parport *port);
46 static int num_mux_ports(struct parport *port);
47 static int select_port(struct parport *port);
48 static int assign_addrs(struct parport *port);
51 static void add_dev(int devnum, struct parport *port, int daisy)
56 newdev->port = port;
103 /* Discover the IEEE1284.3 topology on a port -- muxes and daisy chains.
105 int parport_daisy_init(struct parport *port)
135 /* If mux present on normal port, need to create new
136 * parports for each extra port. */
137 if (port->muxport < 0 && mux_present(port) &&
139 ((num_ports = num_mux_ports(port)) == 2 || num_ports == 4)) {
140 /* Leave original as port zero. */
141 port->muxport = 0;
142 pr_info("%s: 1st (default) port of %d-way multiplexor\n",
143 port->name, num_ports);
145 /* Clone the port. */
146 struct parport *extra = clone_parport(port, i);
155 pr_info("%s: %d%s port of %d-way multiplexor on %s\n",
157 port->name);
159 /* Analyse that port too. We won't recurse
160 forever because of the 'port->muxport < 0'
166 if (port->muxport >= 0)
167 select_port(port);
169 parport_daisy_deselect_all(port);
170 detected += assign_addrs(port);
173 add_dev(numdevs++, port, -1);
188 parport_daisy_fini(port);
189 parport_write_control(port, PARPORT_CONTROL_SELECT);
191 parport_write_control(port,
202 /* Forget about devices on a physical port. */
203 void parport_daisy_fini(struct parport *port)
211 if (dev->port != port) {
233 * that it locates a device by its number rather than by the port
245 struct parport *port;
260 port = parport_get_port(p->port);
263 dev = parport_register_dev_model(port, name, &par_cb, devnum);
264 parport_put_port(port);
274 selected = port->daisy;
301 static int cpp_daisy(struct parport *port, int cmd)
305 parport_data_forward(port);
306 parport_write_data(port, 0xaa); udelay(2);
307 parport_write_data(port, 0x55); udelay(2);
308 parport_write_data(port, 0x00); udelay(2);
309 parport_write_data(port, 0xff); udelay(2);
310 s = parport_read_status(port) & (PARPORT_STATUS_BUSY
318 pr_debug("%s: cpp_daisy: aa5500ff(%02x)\n", port->name, s);
322 parport_write_data(port, 0x87); udelay(2);
323 s = parport_read_status(port) & (PARPORT_STATUS_BUSY
328 pr_debug("%s: cpp_daisy: aa5500ff87(%02x)\n", port->name, s);
332 parport_write_data(port, 0x78); udelay(2);
333 parport_write_data(port, cmd); udelay(2);
334 parport_frob_control(port,
338 s = parport_read_status(port);
339 parport_frob_control(port, PARPORT_CONTROL_STROBE, 0);
341 parport_write_data(port, 0xff); udelay(2);
347 static int cpp_mux(struct parport *port, int cmd)
352 parport_data_forward(port);
353 parport_write_data(port, 0xaa); udelay(2);
354 parport_write_data(port, 0x55); udelay(2);
355 parport_write_data(port, 0xf0); udelay(2);
356 parport_write_data(port, 0x0f); udelay(2);
357 parport_write_data(port, 0x52); udelay(2);
358 parport_write_data(port, 0xad); udelay(2);
359 parport_write_data(port, cmd); udelay(2);
361 s = parport_read_status(port);
364 port->name, cmd, s);
376 void parport_daisy_deselect_all(struct parport *port)
378 cpp_daisy(port, 0x30);
381 int parport_daisy_select(struct parport *port, int daisy, int mode)
389 return !(cpp_daisy(port, 0x20 + daisy) &
396 return !(cpp_daisy(port, 0xd0 + daisy) &
407 return !(cpp_daisy(port, 0xe0 + daisy) &
412 static int mux_present(struct parport *port)
414 return cpp_mux(port, 0x51) == 3;
417 static int num_mux_ports(struct parport *port)
419 return cpp_mux(port, 0x58);
422 static int select_port(struct parport *port)
424 int muxport = port->muxport;
425 return cpp_mux(port, 0x60 + muxport) == muxport;
428 static int assign_addrs(struct parport *port)
436 parport_data_forward(port);
437 parport_write_data(port, 0xaa); udelay(2);
438 parport_write_data(port, 0x55); udelay(2);
439 parport_write_data(port, 0x00); udelay(2);
440 parport_write_data(port, 0xff); udelay(2);
441 s = parport_read_status(port) & (PARPORT_STATUS_BUSY
449 pr_debug("%s: assign_addrs: aa5500ff(%02x)\n", port->name, s);
453 parport_write_data(port, 0x87); udelay(2);
454 s = parport_read_status(port) & (PARPORT_STATUS_BUSY
459 pr_debug("%s: assign_addrs: aa5500ff87(%02x)\n", port->name, s);
463 parport_write_data(port, 0x78); udelay(2);
464 s = parport_read_status(port);
471 parport_write_data(port, daisy);
473 parport_frob_control(port,
477 parport_frob_control(port, PARPORT_CONTROL_STROBE, 0);
480 add_dev(numdevs++, port, daisy);
491 s = parport_read_status(port);
494 parport_write_data(port, 0xff); udelay(2);
496 pr_debug("%s: Found %d daisy-chained devices\n", port->name, detected);