patch-1.3.94 linux/drivers/char/lp_intern.c
Next file: linux/drivers/char/lp_m68k.c
Previous file: linux/drivers/char/keyb_m68k.c
Back to the patch index
Back to the overall index
- Lines: 170
- Date:
Wed Mar 20 19:53:12 1996
- Orig file:
v1.3.93/linux/drivers/char/lp_intern.c
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.93/linux/drivers/char/lp_intern.c linux/drivers/char/lp_intern.c
@@ -0,0 +1,169 @@
+
+/*
+ * split into mid and low-level for better support of diffent hardware
+ * by Joerg Dorchain (dorchain@mpi-sb.mpg.de)
+ *
+ * Amiga printer device by Michael Rausch (linux@uni-koblenz.de);
+ * Atari support added by Andreas Schwab (schwab@ls5.informatik.uni-dortmund.de);
+ * based upon work from
+ *
+ * Copyright (C) 1992 by Jim Weigand and Linus Torvalds
+ * Copyright (C) 1992,1993 by Michael K. Johnson
+ * - Thanks much to Gunter Windau for pointing out to me where the error
+ * checking ought to be.
+ * Copyright (C) 1993 by Nigel Gamble (added interrupt code)
+ */
+
+#include <linux/config.h>
+#include <linux/lp_intern.h>
+#include <linux/kernel.h>
+#ifdef CONFIG_AMIGA
+#include <asm/amigahw.h>
+#endif
+#ifdef CONFIG_ATARI
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <asm/atarihw.h>
+#endif
+
+
+static void lp_int_out(int, int);
+static int lp_int_busy(int);
+static int lp_int_pout(int);
+static int lp_int_online(int);
+static int lp_int_interrupt(int);
+
+int lp_internal_init(struct lp_struct *, int, int, int);
+
+
+static void
+lp_int_out (int c, int dev)
+{
+ switch (boot_info.machtype)
+ {
+#ifdef CONFIG_AMIGA
+ case MACH_AMIGA:
+ {
+ int wait = 0;
+ while (wait != lp_table[dev].wait) wait++;
+ ciaa.prb = c;
+ }
+ break;
+#endif
+#ifdef CONFIG_ATARI
+ case MACH_ATARI:
+ {
+ int wait = 0;
+ sound_ym.rd_data_reg_sel = 15;
+ sound_ym.wd_data = c;
+ sound_ym.rd_data_reg_sel = 14;
+ while (wait != lp_table[dev].wait) wait++;
+ sound_ym.wd_data = sound_ym.rd_data_reg_sel & ~(1 << 5);
+ while (wait) wait--;
+ sound_ym.wd_data = sound_ym.rd_data_reg_sel | (1 << 5);
+ break;
+ }
+#endif
+ }
+}
+
+static int
+lp_int_busy (int dev)
+{
+ switch (boot_info.machtype)
+ {
+#ifdef CONFIG_AMIGA
+ case MACH_AMIGA:
+ return ciab.pra & 1;
+#endif
+#ifdef CONFIG_ATARI
+ case MACH_ATARI:
+ return mfp.par_dt_reg & 1;
+#endif
+ default:
+ return 0;
+ }
+}
+
+static int
+lp_int_pout (int dev)
+{
+ switch (boot_info.machtype)
+ {
+#ifdef CONFIG_AMIGA
+ case MACH_AMIGA:
+ return ciab.pra & 2;
+#endif
+#ifdef CONFIG_ATARI
+ case MACH_ATARI:
+#endif
+ default:
+ return 0;
+ }
+}
+
+static int
+lp_int_online (int dev)
+{
+ switch (boot_info.machtype)
+ {
+#ifdef CONFIG_AMIGA
+ case MACH_AMIGA:
+ return ciab.pra & 4;
+#endif
+#ifdef CONFIG_ATARI
+ case MACH_ATARI:
+ return !(mfp.par_dt_reg & 1);
+#endif
+ default:
+ return 0;
+ }
+}
+
+static int lp_int_interrupt(int dev)
+{
+ return 1;
+}
+
+int lp_internal_init(struct lp_struct *lp_table, int entry,
+ int max_lp, int irq)
+{
+ if (max_lp-entry < 1)
+ return 0;
+#ifdef CONFIG_AMIGA
+ if (MACH_IS_AMIGA)
+ {
+ ciaa.ddrb = 0xff;
+ ciab.ddra &= 0xf8;
+ }
+#endif
+#ifdef CONFIG_ATARI
+ if (MACH_IS_ATARI)
+ {
+ unsigned long flags;
+
+ save_flags(flags);
+ cli();
+ sound_ym.rd_data_reg_sel = 7;
+ sound_ym.wd_data = (sound_ym.rd_data_reg_sel & 0x3f) | 0xc0;
+ restore_flags(flags);
+ }
+#endif
+ lp_table[entry].name = "Builtin LP";
+ lp_table[entry].lp_out = lp_int_out;
+ lp_table[entry].lp_is_busy = lp_int_busy;
+ lp_table[entry].lp_has_pout = lp_int_pout;
+ lp_table[entry].lp_is_online = lp_int_online;
+ lp_table[entry].lp_my_interrupt = lp_int_interrupt;
+ lp_table[entry].flags = LP_EXIST;
+ lp_table[entry].chars = LP_INIT_CHAR;
+ lp_table[entry].time = LP_INIT_TIME;
+ lp_table[entry].wait = LP_INIT_WAIT;
+ lp_table[entry].lp_wait_q = NULL;
+
+ printk("lp%d: internal port\n", entry);
+
+ return 1;
+}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this