diff options
| author | wdenk <wdenk> | 2002-11-19 11:04:11 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2002-11-19 11:04:11 +0000 | 
| commit | c7de829c796978e519984df2f1c8cfcf921a39a4 (patch) | |
| tree | 43e42aa9a09f5265783c1622a5cea080471ef50e /common/cmd_fdc.c | |
| parent | 2262cfeef91458b01a1bfe3812ccbbfdf8b82807 (diff) | |
| download | olio-uboot-2014.01-c7de829c796978e519984df2f1c8cfcf921a39a4.tar.xz olio-uboot-2014.01-c7de829c796978e519984df2f1c8cfcf921a39a4.zip | |
* Patch by Thomas Frieden, 13 Nov 2002:
  Add code for AmigaOne board
  (preliminary merge to U-Boot, still WIP)
* Patch by Jon Diekema, 12 Nov 2002:
  - Adding URL for IEEE OUI lookup
  - Making the autoboot #defines dependent on CONFIG_AUTOBOOT_KEYED
    being defined.
  - In the CONFIG_EXTRA_ENV_SETTINGS #define, the root-on-initrd and
    root-on-nfs macros are designed to switch how the default boot
    method gets defined.
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))*/ |