1 /* Low-level parallel port routines for the Atari builtin port
3 * Author: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
5 * Based on parport_amiga.c.
7 * The built-in Atari parallel port provides one port at a fixed address
8 * with 8 output data lines (D0 - D7), 1 output control line (STROBE)
9 * and 1 input status line (BUSY) able to cause an interrupt.
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/parport.h>
15 #include <asm/setup.h>
16 #include <asm/atarihw.h>
18 #include <asm/atariints.h>
20 static struct parport *this_port = NULL;
23 parport_atari_read_data(struct parport *p)
30 sound_ym.rd_data_reg_sel = 15;
31 data = sound_ym.rd_data_reg_sel;
37 parport_atari_write_data(struct parport *p, unsigned char data)
43 sound_ym.rd_data_reg_sel = 15;
44 sound_ym.wd_data = data;
49 parport_atari_read_control(struct parport *p)
52 unsigned char control = 0;
56 sound_ym.rd_data_reg_sel = 14;
57 if (!(sound_ym.rd_data_reg_sel & (1 << 5)))
58 control = PARPORT_CONTROL_STROBE;
64 parport_atari_write_control(struct parport *p, unsigned char control)
70 sound_ym.rd_data_reg_sel = 14;
71 if (control & PARPORT_CONTROL_STROBE)
72 sound_ym.wd_data = sound_ym.rd_data_reg_sel & ~(1 << 5);
74 sound_ym.wd_data = sound_ym.rd_data_reg_sel | (1 << 5);
79 parport_atari_frob_control(struct parport *p, unsigned char mask,
82 unsigned char old = parport_atari_read_control(p);
83 parport_atari_write_control(p, (old & ~mask) ^ val);
88 parport_atari_read_status(struct parport *p)
90 return ((mfp.par_dt_reg & 1 ? 0 : PARPORT_STATUS_BUSY) |
91 PARPORT_STATUS_SELECT | PARPORT_STATUS_ERROR);
95 parport_atari_init_state(struct pardevice *d, struct parport_state *s)
100 parport_atari_save_state(struct parport *p, struct parport_state *s)
105 parport_atari_restore_state(struct parport *p, struct parport_state *s)
110 parport_atari_interrupt(int irq, void *dev_id, struct pt_regs *regs)
112 parport_generic_irq(irq, (struct parport *) dev_id, regs);
116 parport_atari_enable_irq(struct parport *p)
118 enable_irq(IRQ_MFP_BUSY);
122 parport_atari_disable_irq(struct parport *p)
124 disable_irq(IRQ_MFP_BUSY);
128 parport_atari_data_forward(struct parport *p)
134 /* Soundchip port B as output. */
135 sound_ym.rd_data_reg_sel = 7;
136 sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x40;
137 restore_flags(flags);
141 parport_atari_data_reverse(struct parport *p)
143 #if 0 /* too dangerous, can kill sound chip */
148 /* Soundchip port B as input. */
149 sound_ym.rd_data_reg_sel = 7;
150 sound_ym.wd_data = sound_ym.rd_data_reg_sel & ~0x40;
151 restore_flags(flags);
156 parport_atari_inc_use_count(void)
162 parport_atari_dec_use_count(void)
167 static struct parport_operations parport_atari_ops = {
168 parport_atari_write_data,
169 parport_atari_read_data,
171 parport_atari_write_control,
172 parport_atari_read_control,
173 parport_atari_frob_control,
175 parport_atari_read_status,
177 parport_atari_enable_irq,
178 parport_atari_disable_irq,
180 parport_atari_data_forward,
181 parport_atari_data_reverse,
183 parport_atari_init_state,
184 parport_atari_save_state,
185 parport_atari_restore_state,
187 parport_atari_inc_use_count,
188 parport_atari_dec_use_count,
190 parport_ieee1284_epp_write_data,
191 parport_ieee1284_epp_read_data,
192 parport_ieee1284_epp_write_addr,
193 parport_ieee1284_epp_read_addr,
195 parport_ieee1284_ecp_write_data,
196 parport_ieee1284_ecp_read_data,
197 parport_ieee1284_ecp_write_addr,
199 parport_ieee1284_write_compat,
200 parport_ieee1284_read_nibble,
201 parport_ieee1284_read_byte,
206 parport_atari_init(void)
214 /* Soundchip port A/B as output. */
215 sound_ym.rd_data_reg_sel = 7;
216 sound_ym.wd_data = (sound_ym.rd_data_reg_sel & 0x3f) | 0xc0;
218 sound_ym.rd_data_reg_sel = 14;
219 sound_ym.wd_data = sound_ym.rd_data_reg_sel | (1 << 5);
220 restore_flags(flags);
221 /* MFP port I0 as input. */
223 /* MFP port I0 interrupt on high->low edge. */
224 mfp.active_edge &= ~1;
225 p = parport_register_port((unsigned long)&sound_ym.wd_data,
226 IRQ_MFP_BUSY, PARPORT_DMA_NONE,
230 if (request_irq(IRQ_MFP_BUSY, parport_atari_interrupt,
231 IRQ_TYPE_SLOW, p->name, p)) {
232 parport_unregister_port (p);
237 printk(KERN_INFO "%s: Atari built-in port using irq\n", p->name);
238 parport_proc_register(p);
240 parport_announce_port (p);
249 MODULE_AUTHOR("Andreas Schwab");
250 MODULE_DESCRIPTION("Parport Driver for Atari builtin Port");
251 MODULE_SUPPORTED_DEVICE("Atari builtin Parallel Port");
252 MODULE_LICENSE("GPL");
257 return parport_atari_init() ? 0 : -ENODEV;
263 if (this_port->irq != PARPORT_IRQ_NONE)
264 free_irq(IRQ_MFP_BUSY, this_port);
265 parport_proc_unregister(this_port);
266 parport_unregister_port(this_port);