Exemple #1
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;
	}

	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;
}
Exemple #2
0
/* 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;
}
Exemple #5
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);
}