/*
 * (C) Copyright 2002
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * (C) Copyright 2002 Jun Gu <jung@artesyncp.com>
 * Add support for Am29F016D and dynamic switch setting.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/*
 * Modified 4/5/2001
 * Wait for completion of each sector erase command issued
 * 4/5/2001
 * Chris Hallinan - DS4.COM, Inc. - clh@net1plus.com
 */

#include <common.h>
#include <ppc4xx.h>
#include <asm/processor.h>


#undef DEBUG
#ifdef DEBUG
#define DEBUGF(x...) printf(x)
#else
#define DEBUGF(x...)
#endif /* DEBUG */

#define     BOOT_SMALL_FLASH        32              /* 00100000 */
#define     FLASH_ONBD_N            2               /* 00000010 */
#define     FLASH_SRAM_SEL          1               /* 00000001 */

#define     BOOT_SMALL_FLASH_VAL    4
#define     FLASH_ONBD_N_VAL        2
#define     FLASH_SRAM_SEL_VAL      1


flash_info_t	flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips	*/

static  unsigned    long    flash_addr_table[8][CFG_MAX_FLASH_BANKS] = {
        {0xffc00000, 0xffe00000, 0xff880000},   /* 0:000: configuraton 3 */
        {0xffc00000, 0xffe00000, 0xff800000},   /* 1:001: configuraton 4 */
        {0xffc00000, 0xffe00000, 0x00000000},   /* 2:010: configuraton 7 */
        {0xffc00000, 0xffe00000, 0x00000000},   /* 3:011: configuraton 8 */
        {0xff800000, 0xffa00000, 0xfff80000},   /* 4:100: configuraton 1 */
        {0xff800000, 0xffa00000, 0xfff00000},   /* 5:101: configuraton 2 */
        {0xffc00000, 0xffe00000, 0x00000000},   /* 6:110: configuraton 5 */
        {0xffc00000, 0xffe00000, 0x00000000}    /* 7:111: configuraton 6 */
};

/*-----------------------------------------------------------------------
 * Functions
 */
static ulong flash_get_size (vu_long *addr, flash_info_t *info);
static int write_word (flash_info_t *info, ulong dest, ulong data);
#if 0
static void flash_get_offsets (ulong base, flash_info_t *info);
#endif

#ifdef CONFIG_ADCIOP
#define ADDR0           0x0aa9
#define ADDR1           0x0556
#define FLASH_WORD_SIZE unsigned char
#endif

#ifdef CONFIG_CPCI405
#define ADDR0           0x5555
#define ADDR1           0x2aaa
#define FLASH_WORD_SIZE unsigned short
#endif

#ifdef CONFIG_WALNUT405
#define ADDR0           0x5555
#define ADDR1           0x2aaa
#define FLASH_WORD_SIZE unsigned char
#endif

#ifdef CONFIG_EBONY
#define ADDR0           0x5555
#define ADDR1           0x2aaa
#define FLASH_WORD_SIZE unsigned char
#endif

/*-----------------------------------------------------------------------
 */

unsigned long flash_init (void) {
	unsigned long total_b = 0;
	unsigned long size_b[CFG_MAX_FLASH_BANKS];
	unsigned char * fpga_base = (unsigned char *)CFG_FPGA_BASE;
	unsigned char switch_status;
	unsigned short index = 0;
	int i;


	/* read FPGA base register FPGA_REG0 */
	switch_status = *fpga_base;

	/* check the bitmap of switch status */
	if (switch_status & BOOT_SMALL_FLASH) {
		index += BOOT_SMALL_FLASH_VAL;
	}
	if (switch_status & FLASH_ONBD_N) {
		index += FLASH_ONBD_N_VAL;
	}
	if (switch_status & FLASH_SRAM_SEL) {
		index += FLASH_SRAM_SEL_VAL;
	}

    DEBUGF("\n");
	DEBUGF("FLASH: Index: %d\n", index);

	/* Init: no FLASHes known */
	for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) {
		flash_info[i].flash_id = FLASH_UNKNOWN;
		flash_info[i].sector_count = -1;
		flash_info[i].size = 0;

		/* check whether the address is 0 */
		if (flash_addr_table[index][i] == 0) {
			continue;
		}

		/* call flash_get_size() to initialize sector address */
		size_b[i] = flash_get_size(
			(vu_long *)flash_addr_table[index][i], &flash_info[i]);
		flash_info[i].size = size_b[i];
		if (flash_info[i].flash_id == FLASH_UNKNOWN) {
			printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
				i, size_b[i], size_b[i]<<20);
			flash_info[i].sector_count = -1;
			flash_info[i].size = 0;
		}

		total_b += flash_info[i].size;
	}

	return total_b;
}



/*-----------------------------------------------------------------------
 */
#if 0
static void flash_get_offsets (ulong base, flash_info_t *info)
{
	int i;

	/* set up sector start address table */
	if (((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) ||
	    (info->flash_id  == FLASH_AM040) ||
	    (info->flash_id  == FLASH_AMD016)) {
		for (i = 0; i < info->sector_count; i++)
			info->start[i] = base + (i * 0x00010000);
	} else {
		if (info->flash_id & FLASH_BTYPE) {
			/* set sector offsets for bottom boot block type	*/
			info->start[0] = base + 0x00000000;
			info->start[1] = base + 0x00004000;
			info->start[2] = base + 0x00006000;
			info->start[3] = base + 0x00008000;
			for (i = 4; i < info->sector_count; i++) {
				info->start[i] = base + (i * 0x00010000) - 0x00030000;
			}
		} else {
			/* set sector offsets for top boot block type		*/
			i = info->sector_count - 1;
			info->start[i--] = base + info->size - 0x00004000;
			info->start[i--] = base + info->size - 0x00006000;
			info->start[i--] = base + info->size - 0x00008000;
			for (; i >= 0; i--) {
				info->start[i] = base + i * 0x00010000;
			}
		}
	}
}
#endif /* 0 */

/*-----------------------------------------------------------------------
 */
void flash_print_info  (flash_info_t *info)
{
	int i;
        int k;
        int size;
        int erased;
        volatile unsigned long *flash;

	if (info->flash_id == FLASH_UNKNOWN) {
		printf ("missing or unknown FLASH type\n");
		return;
	}

	switch (info->flash_id & FLASH_VENDMASK) {
	case FLASH_MAN_AMD:	printf ("AMD ");		break;
	case FLASH_MAN_FUJ:	printf ("FUJITSU ");		break;
	case FLASH_MAN_SST:	printf ("SST ");		break;
	default:		printf ("Unknown Vendor ");	break;
	}

	switch (info->flash_id & FLASH_TYPEMASK) {
	case FLASH_AMD016:	printf ("AM29F016D (16 Mbit, uniform sector size)\n");
		break;
	case FLASH_AM040:	printf ("AM29F040 (512 Kbit, uniform sector size)\n");
		break;
	case FLASH_AM400B:	printf ("AM29LV400B (4 Mbit, bottom boot sect)\n");
		break;
	case FLASH_AM400T:	printf ("AM29LV400T (4 Mbit, top boot sector)\n");
		break;
	case FLASH_AM800B:	printf ("AM29LV800B (8 Mbit, bottom boot sect)\n");
		break;
	case FLASH_AM800T:	printf ("AM29LV800T (8 Mbit, top boot sector)\n");
		break;
	case FLASH_AM160B:	printf ("AM29LV160B (16 Mbit, bottom boot sect)\n");
		break;
	case FLASH_AM160T:	printf ("AM29LV160T (16 Mbit, top boot sector)\n");
		break;
	case FLASH_AM320B:	printf ("AM29LV320B (32 Mbit, bottom boot sect)\n");
		break;
	case FLASH_AM320T:	printf ("AM29LV320T (32 Mbit, top boot sector)\n");
		break;
	case FLASH_SST800A:	printf ("SST39LF/VF800 (8 Mbit, uniform sector size)\n");
		break;
	case FLASH_SST160A:	printf ("SST39LF/VF160 (16 Mbit, uniform sector size)\n");
		break;
	default:		printf ("Unknown Chip Type\n");
		break;
	}

	printf ("  Size: %ld KB in %d Sectors\n",
		info->size >> 10, info->sector_count);

	printf ("  Sector Start Addresses:");
	for (i=0; i<info->sector_count; ++i) {
                /*
                 * Check if whole sector is erased
                 */
                if (i != (info->sector_count-1))
			size = info->start[i+1] - info->start[i];
                else
			size = info->start[0] + info->size - info->start[i];
                erased = 1;
                flash = (volatile unsigned long *)info->start[i];
                size = size >> 2;        /* divide by 4 for longword access */
                for (k=0; k<size; k++)
		{
			if (*flash++ != 0xffffffff)
			{
				erased = 0;
				break;
			}
		}

		if ((i % 5) == 0)
			printf ("\n   ");
			printf (" %08lX%s%s",
				info->start[i],
				erased ? " E" : "  ",
				info->protect[i] ? "RO " : "   "
				);
			}
		printf ("\n");
		return;
	}

/*-----------------------------------------------------------------------
 */


/*-----------------------------------------------------------------------
 */

/*
 * The following code cannot be run from FLASH!
 */
	static ulong flash_get_size (vu_long *addr, flash_info_t *info)
		{
			short i;
			FLASH_WORD_SIZE value;
			ulong base = (ulong)addr;
			volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *)addr;

            DEBUGF("FLASH ADDR: %08x\n", (unsigned)addr );

			/* Write auto select command: read Manufacturer ID */
            udelay(10000);
			addr2[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
            udelay(1000);
			addr2[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
            udelay(1000);
			addr2[ADDR0] = (FLASH_WORD_SIZE)0x00900090;
            udelay(1000);

#ifdef CONFIG_ADCIOP
			value = addr2[2];
#else
			value = addr2[0];
#endif

			DEBUGF("FLASH MANUFACT: %x\n", value);

			switch (value) {
			case (FLASH_WORD_SIZE)AMD_MANUFACT:
				info->flash_id = FLASH_MAN_AMD;
				break;
			case (FLASH_WORD_SIZE)FUJ_MANUFACT:
				info->flash_id = FLASH_MAN_FUJ;
				break;
			case (FLASH_WORD_SIZE)SST_MANUFACT:
				info->flash_id = FLASH_MAN_SST;
				break;
			case (FLASH_WORD_SIZE)STM_MANUFACT:
				info->flash_id = FLASH_MAN_STM;
				break;
			default:
				info->flash_id = FLASH_UNKNOWN;
				info->sector_count = 0;
				info->size = 0;
				return (0);			/* no or unknown flash	*/
			}

#ifdef CONFIG_ADCIOP
			value = addr2[0];			/* device ID		*/
			debug ("\ndev_code=%x\n", value);
#else
			value = addr2[1];			/* device ID		*/
#endif

			DEBUGF("\nFLASH DEVICEID: %x\n", value);

			switch (value) {
			case (FLASH_WORD_SIZE)AMD_ID_F016D:
				info->flash_id += FLASH_AMD016;
				info->sector_count = 32;
				info->size = 0x00200000;
				break;				/* => 2 MB		*/
                        case (FLASH_WORD_SIZE)STM_ID_F040B:
                                info->flash_id += FLASH_AM040;
                                info->sector_count = 8;
                                info->size = 0x0080000; /* => 512 ko */
                                break;				
			case (FLASH_WORD_SIZE)AMD_ID_F040B:
				info->flash_id += FLASH_AM040;
				info->sector_count = 8;
				info->size = 0x0080000; /* => 512 ko */
				break;
			case (FLASH_WORD_SIZE)AMD_ID_LV400T:
				info->flash_id += FLASH_AM400T;
				info->sector_count = 11;
				info->size = 0x00080000;
				break;				/* => 0.5 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV400B:
				info->flash_id += FLASH_AM400B;
				info->sector_count = 11;
				info->size = 0x00080000;
				break;				/* => 0.5 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV800T:
				info->flash_id += FLASH_AM800T;
				info->sector_count = 19;
				info->size = 0x00100000;
				break;				/* => 1 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV800B:
				info->flash_id += FLASH_AM800B;
				info->sector_count = 19;
				info->size = 0x00100000;
				break;				/* => 1 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV160T:
				info->flash_id += FLASH_AM160T;
				info->sector_count = 35;
				info->size = 0x00200000;
				break;				/* => 2 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV160B:
				info->flash_id += FLASH_AM160B;
				info->sector_count = 35;
				info->size = 0x00200000;
				break;				/* => 2 MB		*/
#if 0	/* enable when device IDs are available */
			case (FLASH_WORD_SIZE)AMD_ID_LV320T:
				info->flash_id += FLASH_AM320T;
				info->sector_count = 67;
				info->size = 0x00400000;
				break;				/* => 4 MB		*/

			case (FLASH_WORD_SIZE)AMD_ID_LV320B:
				info->flash_id += FLASH_AM320B;
				info->sector_count = 67;
				info->size = 0x00400000;
				break;				/* => 4 MB		*/
#endif
			case (FLASH_WORD_SIZE)SST_ID_xF800A:
				info->flash_id += FLASH_SST800A;
				info->sector_count = 16;
				info->size = 0x00100000;
				break;				/* => 1 MB		*/

			case (FLASH_WORD_SIZE)SST_ID_xF160A:
				info->flash_id += FLASH_SST160A;
				info->sector_count = 32;
				info->size = 0x00200000;
				break;				/* => 2 MB		*/

			default:
				info->flash_id = FLASH_UNKNOWN;
				return (0);			/* => no or unknown flash */

			}

			/* set up sector start address table */
			if (((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) ||
			    (info->flash_id  == FLASH_AM040) ||
			    (info->flash_id  == FLASH_AMD016)) {
				for (i = 0; i < info->sector_count; i++)
					info->start[i] = base + (i * 0x00010000);
			} else {
				if (info->flash_id & FLASH_BTYPE) {
					/* set sector offsets for bottom boot block type	*/
					info->start[0] = base + 0x00000000;
					info->start[1] = base + 0x00004000;
					info->start[2] = base + 0x00006000;
					info->start[3] = base + 0x00008000;
					for (i = 4; i < info->sector_count; i++) {
						info->start[i] = base + (i * 0x00010000) - 0x00030000;
					}
				} else {
					/* set sector offsets for top boot block type		*/
					i = info->sector_count - 1;
					info->start[i--] = base + info->size - 0x00004000;
					info->start[i--] = base + info->size - 0x00006000;
					info->start[i--] = base + info->size - 0x00008000;
					for (; i >= 0; i--) {
						info->start[i] = base + i * 0x00010000;
					}
				}
			}

			/* check for protected sectors */
			for (i = 0; i < info->sector_count; i++) {
				/* read sector protection at sector address, (A7 .. A0) = 0x02 */
				/* D0 = 1 if protected */
#ifdef CONFIG_ADCIOP
				addr2 = (volatile FLASH_WORD_SIZE *)(info->start[i]);
				info->protect[i] = addr2[4] & 1;
#else
				addr2 = (volatile FLASH_WORD_SIZE *)(info->start[i]);
				if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST)
					info->protect[i] = 0;
				else
					info->protect[i] = addr2[2] & 1;
#endif
			}

			/*
			 * Prevent writes to uninitialized FLASH.
			 */
			if (info->flash_id != FLASH_UNKNOWN) {
#if 0 /* test-only */
#ifdef CONFIG_ADCIOP
				addr2 = (volatile unsigned char *)info->start[0];
				addr2[ADDR0] = 0xAA;
				addr2[ADDR1] = 0x55;
				addr2[ADDR0] = 0xF0;  /* reset bank */
#else
				addr2 = (FLASH_WORD_SIZE *)info->start[0];
				*addr2 = (FLASH_WORD_SIZE)0x00F000F0;	/* reset bank */
#endif
#else /* test-only */
				addr2 = (FLASH_WORD_SIZE *)info->start[0];
				*addr2 = (FLASH_WORD_SIZE)0x00F000F0;	/* reset bank */
#endif /* test-only */
			}

			return (info->size);
		}

	int wait_for_DQ7(flash_info_t *info, int sect)
		{
			ulong start, now, last;
			volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[sect]);

			start = get_timer (0);
			last  = start;
			while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) {
				if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
					printf ("Timeout\n");
					return -1;
				}
				/* show that we're waiting */
				if ((now - last) > 1000) {  /* every second */
					putc ('.');
					last = now;
				}
			}
			return 0;
		}

/*-----------------------------------------------------------------------
 */

	int	flash_erase (flash_info_t *info, int s_first, int s_last)
		{
			volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[0]);
			volatile FLASH_WORD_SIZE *addr2;
			int flag, prot, sect, l_sect;
			int i;

			if ((s_first < 0) || (s_first > s_last)) {
				if (info->flash_id == FLASH_UNKNOWN) {
					printf ("- missing\n");
				} else {
					printf ("- no sectors to erase\n");
				}
				return 1;
			}

			if (info->flash_id == FLASH_UNKNOWN) {
				printf ("Can't erase unknown flash type - aborted\n");
				return 1;
			}

			prot = 0;
			for (sect=s_first; sect<=s_last; ++sect) {
				if (info->protect[sect]) {
					prot++;
				}
			}

			if (prot) {
				printf ("- Warning: %d protected sectors will not be erased!\n",
					prot);
			} else {
				printf ("\n");
			}

			l_sect = -1;

			/* Disable interrupts which might cause a timeout here */
			flag = disable_interrupts();

			/* Start erase on unprotected sectors */
			for (sect = s_first; sect<=s_last; sect++) {
				if (info->protect[sect] == 0) {	/* not protected */
					addr2 = (FLASH_WORD_SIZE *)(info->start[sect]);
					printf("Erasing sector %p\n", addr2);

					if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_SST) {
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
						addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00800080;
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
						addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
						addr2[0] = (FLASH_WORD_SIZE)0x00500050;  /* block erase */
						for (i=0; i<50; i++)
							udelay(1000);  /* wait 1 ms */
					} else {
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
						addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00800080;
						addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
						addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
						addr2[0] = (FLASH_WORD_SIZE)0x00300030;  /* sector erase */
					}
					l_sect = sect;
					/*
					 * Wait for each sector to complete, it's more
					 * reliable.  According to AMD Spec, you must
					 * issue all erase commands within a specified
					 * timeout.  This has been seen to fail, especially
					 * if printf()s are included (for debug)!!
					 */
					wait_for_DQ7(info, sect);
				}
			}

			/* re-enable interrupts if necessary */
			if (flag)
				enable_interrupts();

			/* wait at least 80us - let's wait 1 ms */
			udelay (1000);

#if 0
			/*
			 * We wait for the last triggered sector
			 */
			if (l_sect < 0)
				goto DONE;
			wait_for_DQ7(info, l_sect);

		DONE:
#endif
			/* reset to read mode */
			addr = (FLASH_WORD_SIZE *)info->start[0];
			addr[0] = (FLASH_WORD_SIZE)0x00F000F0;	/* reset bank */

			printf (" done\n");
			return 0;
		}

/*-----------------------------------------------------------------------
 * Copy memory to flash, returns:
 * 0 - OK
 * 1 - write timeout
 * 2 - Flash not erased
 */

	int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
		{
			ulong cp, wp, data;
			int i, l, rc;

			wp = (addr & ~3);	/* get lower word aligned address */

			/*
			 * handle unaligned start bytes
			 */
			if ((l = addr - wp) != 0) {
				data = 0;
				for (i=0, cp=wp; i<l; ++i, ++cp) {
					data = (data << 8) | (*(uchar *)cp);
				}
				for (; i<4 && cnt>0; ++i) {
					data = (data << 8) | *src++;
					--cnt;
					++cp;
				}
				for (; cnt==0 && i<4; ++i, ++cp) {
					data = (data << 8) | (*(uchar *)cp);
				}

				if ((rc = write_word(info, wp, data)) != 0) {
					return (rc);
				}
				wp += 4;
			}

			/*
			 * handle word aligned part
			 */
			while (cnt >= 4) {
				data = 0;
				for (i=0; i<4; ++i) {
					data = (data << 8) | *src++;
				}
				if ((rc = write_word(info, wp, data)) != 0) {
					return (rc);
				}
				wp  += 4;
				cnt -= 4;
			}

			if (cnt == 0) {
				return (0);
			}

			/*
			 * handle unaligned tail bytes
			 */
			data = 0;
			for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) {
				data = (data << 8) | *src++;
				--cnt;
			}
			for (; i<4; ++i, ++cp) {
				data = (data << 8) | (*(uchar *)cp);
			}

			return (write_word(info, wp, data));
		}

/*-----------------------------------------------------------------------
 * Write a word to Flash, returns:
 * 0 - OK
 * 1 - write timeout
 * 2 - Flash not erased
 */
	static int write_word (flash_info_t * info, ulong dest, ulong data)
		{
			volatile FLASH_WORD_SIZE *addr2 = (FLASH_WORD_SIZE *) (info->start[0]);
			volatile FLASH_WORD_SIZE *dest2 = (FLASH_WORD_SIZE *) dest;
			volatile FLASH_WORD_SIZE *data2 = (FLASH_WORD_SIZE *) & data;
			ulong start;
			int i;

			/* Check if Flash is (sufficiently) erased */
			if ((*((volatile FLASH_WORD_SIZE *) dest) &
			     (FLASH_WORD_SIZE) data) != (FLASH_WORD_SIZE) data) {
				return (2);
			}

			for (i = 0; i < 4 / sizeof (FLASH_WORD_SIZE); i++) {
				int flag;

				/* Disable interrupts which might cause a timeout here */
				flag = disable_interrupts ();

				addr2[ADDR0] = (FLASH_WORD_SIZE) 0x00AA00AA;
				addr2[ADDR1] = (FLASH_WORD_SIZE) 0x00550055;
				addr2[ADDR0] = (FLASH_WORD_SIZE) 0x00A000A0;

				dest2[i] = data2[i];

				/* re-enable interrupts if necessary */
				if (flag)
					enable_interrupts ();

				/* data polling for D7 */
				start = get_timer (0);
				while ((dest2[i] & (FLASH_WORD_SIZE) 0x00800080) !=
				       (data2[i] & (FLASH_WORD_SIZE) 0x00800080)) {

					if (get_timer (start) > CFG_FLASH_WRITE_TOUT) {
						return (1);
					}
				}
			}

			return (0);
		}

/*-----------------------------------------------------------------------
 */
