diff options
Diffstat (limited to 'common/cmd_fdc.c')
| -rw-r--r-- | common/cmd_fdc.c | 62 | 
1 files changed, 60 insertions, 2 deletions
| diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c index e45b3361c..3ee342fcf 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))*/ |