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_write_status(struct parport
*p
, unsigned char status
)
100 parport_atari_init_state(struct parport_state
*s
)
105 parport_atari_save_state(struct parport
*p
, struct parport_state
*s
)
110 parport_atari_restore_state(struct parport
*p
, struct parport_state
*s
)
115 parport_atari_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
117 parport_generic_irq(irq
, (struct parport
*) dev_id
, regs
);
121 parport_atari_inc_use_count(void)
127 parport_atari_dec_use_count(void)
133 parport_atari_fill_inode(struct inode
*inode
, int fill
)
143 static struct parport_operations parport_atari_ops
= {
144 parport_atari_write_data
,
145 parport_atari_read_data
,
147 parport_atari_write_control
,
148 parport_atari_read_control
,
149 parport_atari_frob_control
,
151 NULL
, /* write_econtrol */
152 NULL
, /* read_econtrol */
153 NULL
, /* frob_econtrol */
155 parport_atari_write_status
,
156 parport_atari_read_status
,
158 NULL
, /* write fifo */
159 NULL
, /* read fifo */
161 NULL
, /* change_mode */
163 NULL
, /* epp_write_data */
164 NULL
, /* epp_read_data */
165 NULL
, /* epp_write_addr */
166 NULL
, /* epp_read_addr */
167 NULL
, /* epp_check_timeout */
169 NULL
, /* epp_write_block */
170 NULL
, /* epp_read_block */
172 NULL
, /* ecp_write_block */
173 NULL
, /* ecp_read_block */
175 parport_atari_init_state
,
176 parport_atari_save_state
,
177 parport_atari_restore_state
,
179 NULL
, /* enable_irq */
180 NULL
, /* disable_irq */
181 parport_atari_interrupt
,
183 parport_atari_inc_use_count
,
184 parport_atari_dec_use_count
,
185 parport_atari_fill_inode
190 parport_atari_init(void)
198 /* Soundchip port A/B as output. */
199 sound_ym
.rd_data_reg_sel
= 7;
200 sound_ym
.wd_data
= (sound_ym
.rd_data_reg_sel
& 0x3f) | 0xc0;
202 sound_ym
.rd_data_reg_sel
= 14;
203 sound_ym
.wd_data
= sound_ym
.rd_data_reg_sel
| (1 << 5);
204 restore_flags(flags
);
205 /* MFP port I0 as input. */
207 /* MFP port I0 interrupt on high->low edge. */
208 mfp
.active_edge
&= ~1;
209 p
= parport_register_port((unsigned long)&sound_ym
.wd_data
,
210 IRQ_MFP_BUSY
, PARPORT_DMA_NONE
,
214 if (request_irq(IRQ_MFP_BUSY
, parport_atari_interrupt
,
215 IRQ_TYPE_SLOW
, p
->name
, p
)) {
216 parport_unregister_port (p
);
221 printk(KERN_INFO
"%s: Atari built-in port using irq\n", p
->name
);
222 parport_proc_register(p
);
224 parport_announce_port (p
);
233 MODULE_AUTHOR("Andreas Schwab");
234 MODULE_DESCRIPTION("Parport Driver for Atari builtin Port");
235 MODULE_SUPPORTED_DEVICE("Atari builtin Parallel Port");
240 return parport_atari_init() ? 0 : -ENODEV
;
246 if (p
->irq
!= PARPORT_IRQ_NONE
)
247 free_irq(IRQ_MFP_BUSY
, p
);
248 parport_proc_unregister(this_port
);
249 parport_unregister_port(this_port
);