summaryrefslogtreecommitdiff
path: root/common/cmd_fdc.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/cmd_fdc.c')
-rw-r--r--common/cmd_fdc.c62
1 files changed, 60 insertions, 2 deletions
diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c
index e45b336..3ee342f 100644
--- a/common/cmd_fdc.c
+++ b/common/cmd_fdc.c
@@ -188,6 +188,30 @@ static FDC_COMMAND_STRUCT cmd; /* global command struct */
#endif
+#ifdef CONFIG_AMIGAONEG3SE
+unsigned char INT6_Status;
+
+void fdc_interrupt(void)
+{
+ INT6_Status = 0x80;
+}
+
+/* waits for an interrupt (polling) */
+int wait_for_fdc_int(void)
+{
+ unsigned long timeout;
+ timeout = FDC_TIME_OUT;
+ while(((volatile)INT6_Status & 0x80) == 0) {
+ timeout--;
+ udelay(10);
+ if(timeout == 0) /* timeout occured */
+ return FALSE;
+ }
+ INT6_Status = 0;
+ return TRUE;
+}
+#endif
+
/* Supporting Functions */
/* reads a Register of the FDC */
unsigned char read_fdc_reg(unsigned int addr)
@@ -210,6 +234,7 @@ void write_fdc_reg(unsigned int addr, unsigned char val)
tmp[0]=val;
}
+#ifndef CONFIG_AMIGAONEG3SE
/* waits for an interrupt (polling) */
int wait_for_fdc_int(void)
{
@@ -224,6 +249,7 @@ int wait_for_fdc_int(void)
return TRUE;
}
+#endif
/* reads a byte from the FIFO of the FDC and checks direction and RQM bit
of the MSR. returns -1 if timeout, or byte if ok */
@@ -416,7 +442,7 @@ int fdc_seek(FDC_COMMAND_STRUCT *pCMD,FD_GEO_STRUCT *pFG)
return(fdc_issue_cmd(pCMD,pFG));
}
-
+#ifndef CONFIG_AMIGAONEG3SE
/* terminates current command, by not servicing the FIFO
* waits for interrupt and fills in the result bytes */
int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
@@ -430,6 +456,27 @@ int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
}
return TRUE;
}
+#endif
+#ifdef CONFIG_AMIGAONEG3SE
+int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
+{
+ int i;
+ for(i=0;i<100;i++)
+ udelay(500); /* wait 500usec for fifo overrun */
+ while((INT6_Status&0x80)==0x00); /* wait as long as no int has occured */
+ for(i=0;i<7;i++) {
+ pCMD->result[i]=(unsigned char)read_fdc_byte();
+ }
+ INT6_Status = 0;
+ return TRUE;
+}
+
+#endif
+
+#ifdef CONFIG_AMIGAONEG3SE
+#define disable_interrupts() 0
+#define enable_interrupts() (void)0
+#endif
/* reads data from FDC, seek commands are issued automatic */
int fdc_read_data(unsigned char *buffer, unsigned long blocks,FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
@@ -550,6 +597,11 @@ retrycal:
return TRUE;
}
+#ifdef CONFIG_AMIGAONEG3SE
+#undef disable_interrupts()
+#undef enable_interrupts()
+#endif
+
/* Scan all drives and check if drive is present and disk is inserted */
int fdc_check_drive(FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
{
@@ -590,6 +642,7 @@ int fdc_check_drive(FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
}
+
/**************************************************************************
* int fdc_setup
* setup the fdc according the datasheet
@@ -597,9 +650,13 @@ int fdc_check_drive(FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
*/
int fdc_setup(int drive, FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
{
-
int i;
+#ifdef CONFIG_AMIGAONEG3SE
+ irq_install_handler(6, (interrupt_handler_t *)fdc_interrupt, NULL);
+ i8259_unmask_irq(6);
+#endif
+
#ifdef CFG_FDC_HW_INIT
fdc_hw_init ();
#endif
@@ -648,6 +705,7 @@ int fdc_setup(int drive, FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
/* then, we clear the reset in the DOR */
/* fdc_check_drive(pCMD,pFG); */
/* write_fdc_reg(FDC_DOR,0x04); */
+
return TRUE;
}
#endif /* ((CONFIG_COMMANDS & CFG_CMD_FDC)||(CONFIG_COMMANDS & CFG_CMD_FDOS))*/