/* To see if the ec is in busy state or not. */ static inline int ec_flash_busy(unsigned long timeout) { /* assurance the first command be going to rom */ if( ec_instruction_cycle() < 0 ){ return EC_STATE_BUSY; } timeout = timeout / EC_MAX_DELAY_UNIT; while(timeout-- > 0){ /* check the rom's status of busy flag */ wrec(REG_XBISPICMD, SPICMD_READ_STATUS); if( ec_instruction_cycle() < 0 ){ return EC_STATE_BUSY; } if((rdec(REG_XBISPIDAT) & 0x01) == 0x00){ return EC_STATE_IDLE; } udelay(EC_MAX_DELAY_UNIT); } if( timeout <= 0 ){ printf("EC_FLASH_BUSY : timeout for check rom flag.\n"); return EC_STATE_BUSY; } return EC_STATE_IDLE; }
/* Starts to execute the protect SPI ROM function. */ int EC_ROM_start_protect(void) { unsigned char status; int j; /* we should start spi access firstly */ ec_start_spi(); /* enable write spi flash */ wrec(REG_XBISPICMD, SPICMD_WRITE_ENABLE); if(rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY){ printf("EC_PROGRAM_ROM : SPICMD_WRITE_ENABLE failed.\n"); goto out1; } /* protect the status register of rom */ wrec(REG_XBISPICMD, SPICMD_READ_STATUS); if(rom_instruction_cycle(SPICMD_READ_STATUS) == EC_STATE_BUSY){ printf("EC_PROGRAM_ROM : SPICMD_READ_STATUS failed.\n"); goto out1; } status = rdec(REG_XBISPIDAT); wrec(REG_XBISPIDAT, status | 0x1C); if(ec_instruction_cycle() < 0){ printf("EC_PROGRAM_ROM : write status value failed.\n"); goto out1; } wrec(REG_XBISPICMD, SPICMD_WRITE_STATUS); if(rom_instruction_cycle(SPICMD_WRITE_STATUS) == EC_STATE_BUSY){ printf("EC_PROGRAM_ROM : SPICMD_WRITE_STATUS failed.\n"); goto out1; } /* disable the write action to spi rom */ wrec(REG_XBISPICMD, SPICMD_WRITE_DISABLE); if(rom_instruction_cycle(SPICMD_WRITE_DISABLE) == EC_STATE_BUSY){ printf("EC_PROGRAM_ROM : SPICMD_WRITE_DISABLE failed.\n"); goto out1; } out1: /* we should stop spi access firstly */ ec_stop_spi(); out: /* for security */ //for(j = 0; j < 2000; j++) // udelay(1000); /* exit from the reset mode */ //ec_exit_reset_mode(); return 0; }
/* To see if the ec is in busy state or not. */ static inline int ec_flash_busy(unsigned long timeout) { /* assurance the first command be going to rom */ if (ec_instruction_cycle() < 0) return EC_STATE_BUSY; #if 1 timeout = timeout / EC_MAX_DELAY_UNIT; while (timeout-- > 0) { /* check the rom's status of busy flag */ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS); if (ec_instruction_cycle() < 0) return EC_STATE_BUSY; if ((ec_read(REG_XBISPIDAT) & 0x01) == 0x00) return EC_STATE_IDLE; udelay(EC_MAX_DELAY_UNIT); } if (timeout <= 0) { printk(KERN_ERR "EC_FLASH_BUSY : timeout for check rom flag.\n"); return EC_STATE_BUSY; } #else /* check the rom's status of busy flag */ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS); if (ec_instruction_cycle() < 0) return EC_STATE_BUSY; timeout = timeout / EC_MAX_DELAY_UNIT; while (timeout-- > 0) { if ((ec_read(REG_XBISPIDAT) & 0x01) == 0x00) return EC_STATE_IDLE; udelay(EC_MAX_DELAY_UNIT); } if (timeout <= 0) { printk(KERN_ERR "EC_FLASH_BUSY : timeout for check rom flag.\n"); return EC_STATE_BUSY; } #endif return EC_STATE_IDLE; }
/* EC_ROM_unprotect function code */ static int EC_ROM_unprotect(void) { unsigned char status; /* enable write spi flash */ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE); if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) { printk(KERN_ERR "EC_UNIT_ERASE : SPICMD_WRITE_ENABLE failed.\n"); return 1; } /* unprotect the status register of rom */ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS); if (rom_instruction_cycle(SPICMD_READ_STATUS) == EC_STATE_BUSY) { printk(KERN_ERR "EC_UNIT_ERASE : SPICMD_READ_STATUS failed.\n"); return 1; } status = ec_read(REG_XBISPIDAT); ec_write(REG_XBISPIDAT, status & 0x02); if (ec_instruction_cycle() < 0) { printk(KERN_ERR "EC_UNIT_ERASE : write status value failed.\n"); return 1; } ec_write(REG_XBISPICMD, SPICMD_WRITE_STATUS); if (rom_instruction_cycle(SPICMD_WRITE_STATUS) == EC_STATE_BUSY) { printk(KERN_ERR "EC_UNIT_ERASE : SPICMD_WRITE_STATUS failed.\n"); return 1; } /* enable write spi flash */ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE); if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) { printk(KERN_ERR "EC_UNIT_ERASE : SPICMD_WRITE_ENABLE failed.\n"); return 1; } return 0; }
int rom_instruction_cycle(unsigned char cmd) { unsigned long timeout = 0; switch(cmd){ case SPICMD_READ_STATUS : case SPICMD_WRITE_ENABLE : case SPICMD_WRITE_DISABLE : case SPICMD_READ_BYTE : case SPICMD_HIGH_SPEED_READ : timeout = 0; break; case SPICMD_WRITE_STATUS : timeout = 300 * 1000; break; case SPICMD_BYTE_PROGRAM : timeout = 5 * 1000; break; case SPICMD_SST_SEC_ERASE : case SPICMD_SEC_ERASE : timeout = 1000 * 1000; break; case SPICMD_SST_BLK_ERASE : case SPICMD_BLK_ERASE : timeout = 3 * 1000 * 1000; break; case SPICMD_SST_CHIP_ERASE : case SPICMD_CHIP_ERASE : timeout = 20 * 1000 * 1000; break; default : timeout = EC_SPICMD_STANDARD_TIMEOUT; } if(timeout == 0){ return ec_instruction_cycle(); } if(timeout < EC_SPICMD_STANDARD_TIMEOUT) timeout = EC_SPICMD_STANDARD_TIMEOUT; return ec_flash_busy(timeout); }