aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/parport/daisy.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/parport/daisy.c')
-rw-r--r--drivers/parport/daisy.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/parport/daisy.c b/drivers/parport/daisy.c
index 573c5ef20..dddba9713 100644
--- a/drivers/parport/daisy.c
+++ b/drivers/parport/daisy.c
@@ -406,8 +406,33 @@ void parport_daisy_deselect_all (struct parport *port)
int parport_daisy_select (struct parport *port, int daisy, int mode)
{
- /* mode is currently ignored. FIXME? */
- return cpp_daisy (port, 0xe0 + daisy) & PARPORT_STATUS_ERROR;
+ switch (mode)
+ {
+ // For these modes we should switch to EPP mode:
+ case IEEE1284_MODE_EPP:
+ case IEEE1284_MODE_EPPSL:
+ case IEEE1284_MODE_EPPSWE:
+ return (cpp_daisy (port, 0x20 + daisy) &
+ PARPORT_STATUS_ERROR);
+
+ // For these modes we should switch to ECP mode:
+ case IEEE1284_MODE_ECP:
+ case IEEE1284_MODE_ECPRLE:
+ case IEEE1284_MODE_ECPSWE:
+ return (cpp_daisy (port, 0xd0 + daisy) &
+ PARPORT_STATUS_ERROR);
+
+ // Nothing was told for BECP in Daisy chain specification.
+ // May be it's wise to use ECP?
+ case IEEE1284_MODE_BECP:
+ // Others use compat mode
+ case IEEE1284_MODE_NIBBLE:
+ case IEEE1284_MODE_BYTE:
+ case IEEE1284_MODE_COMPAT:
+ default:
+ return (cpp_daisy (port, 0xe0 + daisy) &
+ PARPORT_STATUS_ERROR);
+ }
}
static int mux_present (struct parport *port)