/* * Write one dword ``x'' to flash memory at offset ``offset''. ``offset'' * must be 32 bits, i.e. it must be on a dword boundary. * * Returns 1 if successful, 0 otherwise. */ static inline int write_dword (__u32 offset,__u32 x) { __u32 status; #ifdef LART_DEBUG printk (KERN_DEBUG "%s(): 0x%.8x <- 0x%.8x\n",__FUNCTION__,offset,x); #endif /* setup writing */ write32 (DATA_TO_FLASH (PGM_SETUP),offset); /* write the data */ write32 (x,offset); /* wait for the write to finish */ do { write32 (DATA_TO_FLASH (STATUS_READ),offset); status = FLASH_TO_DATA (read32 (offset)); } while ((~status & STATUS_BUSY) != 0); /* put the flash back into command mode */ write32 (DATA_TO_FLASH (READ_ARRAY),offset); /* was the write successfull? */ if ((status & STATUS_PGM_ERR) || read32 (offset) != x) { printk (KERN_WARNING "%s: write error at address 0x%.8x.\n",module_name,offset); return (0); } return (1); }
/* * Erase one block of flash memory at offset ``offset'' which is any * address within the block which should be erased. * * Returns 1 if successful, 0 otherwise. */ static inline int erase_block (__u32 offset) { __u32 status; #ifdef LART_DEBUG printk (KERN_DEBUG "%s(): 0x%.8x\n",__FUNCTION__,offset); #endif /* erase and confirm */ write32 (DATA_TO_FLASH (ERASE_SETUP),offset); write32 (DATA_TO_FLASH (ERASE_CONFIRM),offset); /* wait for block erase to finish */ do { write32 (DATA_TO_FLASH (STATUS_READ),offset); status = FLASH_TO_DATA (read32 (offset)); } while ((~status & STATUS_BUSY) != 0); /* put the flash back into command mode */ write32 (DATA_TO_FLASH (READ_ARRAY),offset); /* was the erase successfull? */ if ((status & STATUS_ERASE_ERR)) { printk (KERN_WARNING "%s: erase error at address 0x%.8x.\n",module_name,offset); return (0); } return (1); }
/* * Probe for 16mbit flash memory on a LART board without doing * too much damage. Since we need to write 1 dword to memory, * we're f**cked if this happens to be DRAM since we can't * restore the memory (otherwise we might exit Read Array mode). * * Returns 1 if we found 16mbit flash memory on LART, 0 otherwise. */ static int flash_probe (void) { __u32 manufacturer,devtype; /* setup "Read Identifier Codes" mode */ write32 (DATA_TO_FLASH (READ_ID_CODES),0x00000000); /* probe U2. U2/U3 returns the same data since the first 3 * address lines is mangled in the same way */ manufacturer = FLASH_TO_DATA (read32 (ADDR_TO_FLASH_U2 (0x00000000))); devtype = FLASH_TO_DATA (read32 (ADDR_TO_FLASH_U2 (0x00000001))); /* put the flash back into command mode */ write32 (DATA_TO_FLASH (READ_ARRAY),0x00000000); return (manufacturer == FLASH_MANUFACTURER && (devtype == FLASH_DEVICE_16mbit_TOP || FLASH_DEVICE_16mbit_BOTTOM)); }
/* * Erase one block of flash memory at offset ``offset'' which is any * address within the block which should be erased. * * Returns 1 if successful, 0 otherwise. */ static inline int erase_block (__u32 offset) { __u32 status; #ifdef LART_DEBUG printk (KERN_DEBUG "%s(): 0x%.8x\n", __func__, offset); #endif /* erase and confirm */ write32 (DATA_TO_FLASH (ERASE_SETUP),offset); write32 (DATA_TO_FLASH (ERASE_CONFIRM),offset); /* wait for block erase to finish */ do { write32 (DATA_TO_FLASH (STATUS_READ),offset); status = FLASH_TO_DATA (read32 (offset)); } while ((~status & STATUS_BUSY) != 0); /* put the flash back into command mode */ write32 (DATA_TO_FLASH (READ_ARRAY),offset); <<<<<<< HEAD