| /* |
| * CF IDE addon card code |
| * |
| * Enter bugs at http://blackfin.uclinux.org/ |
| * |
| * Copyright (c) 2005-2009 Analog Devices Inc. |
| * |
| * Licensed under the GPL-2 or later. |
| */ |
| |
| #include <common.h> |
| #include <config.h> |
| #include <asm/blackfin.h> |
| |
| void cf_outb(unsigned char val, volatile unsigned char *addr) |
| { |
| /* "ETHERNET" means the expansion memory banks */ |
| swap_to(ETHERNET); |
| |
| *addr = val; |
| SSYNC(); |
| |
| swap_to(FLASH); |
| } |
| |
| unsigned char cf_inb(volatile unsigned char *addr) |
| { |
| unsigned char c; |
| |
| swap_to(ETHERNET); |
| |
| c = *addr; |
| SSYNC(); |
| |
| swap_to(FLASH); |
| |
| return c; |
| } |
| |
| void cf_insw(unsigned short *sect_buf, unsigned short *addr, int words) |
| { |
| int i; |
| |
| swap_to(ETHERNET); |
| |
| for (i = 0; i < words; i++) { |
| *(sect_buf + i) = *addr; |
| SSYNC(); |
| } |
| |
| swap_to(FLASH); |
| } |
| |
| void cf_outsw(unsigned short *addr, unsigned short *sect_buf, int words) |
| { |
| int i; |
| |
| swap_to(ETHERNET); |
| |
| for (i = 0; i < words; i++) { |
| *addr = *(sect_buf + i); |
| SSYNC(); |
| } |
| |
| swap_to(FLASH); |
| } |
| |
| /* Definitions used in Compact Flash Boot support */ |
| #define FIO_EDGE_CF_BITS 0x0000 |
| #define FIO_POLAR_CF_BITS 0x0000 |
| #define FIO_EDGE_BITS 0x1E0 |
| #define FIO_POLAR_BITS 0x160 |
| |
| /* Compact flash status bits in status register */ |
| #define CF_STAT_BITS 0x00000060 |
| |
| void cf_ide_init(void) |
| { |
| int i, cf_stat; |
| |
| /* Check whether CF card is inserted */ |
| bfin_write_FIO_EDGE(FIO_EDGE_CF_BITS); |
| bfin_write_FIO_POLAR(FIO_POLAR_CF_BITS); |
| for (i = 0; i < 0x300; i++) |
| asm volatile("nop;"); |
| |
| cf_stat = bfin_read_FIO_FLAG_S() & CF_STAT_BITS; |
| |
| bfin_write_FIO_EDGE(FIO_EDGE_BITS); |
| bfin_write_FIO_POLAR(FIO_POLAR_BITS); |
| |
| if (!cf_stat) { |
| for (i = 0; i < 0x3000; i++) |
| asm volatile("nop;"); |
| |
| ide_init(); |
| } |
| } |