/* write one byte to ec rom */ int ec_write_byte(unsigned int addr, unsigned char byte) { int ret = 0; /* enable spicmd writing. */ 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_WRITE_BYTE : SPICMD_WRITE_ENABLE failed.\n"); ret = -1; goto out; } /* write the address */ wrec(REG_XBISPIA2, (addr & 0xff0000) >> 16); wrec(REG_XBISPIA1, (addr & 0x00ff00) >> 8); wrec(REG_XBISPIA0, (addr & 0x0000ff) >> 0); wrec(REG_XBISPIDAT, byte); /* start action */ wrec(REG_XBISPICMD, SPICMD_BYTE_PROGRAM); if(rom_instruction_cycle(SPICMD_BYTE_PROGRAM) == EC_STATE_BUSY){ printf("EC_WRITE_BYTE : SPICMD_BYTE_PROGRAM failed.\n"); ret = -1; goto out; } out : /* disable spicmd writing. */ ec_stop_spi(); return ret; }
/* 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; }
/* read one byte from xbi interface */ static int ec_read_byte(unsigned int addr, unsigned char *byte) { int ret = 0; /* enable spicmd writing. */ ec_start_spi(); /* 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_READ_BYTE : SPICMD_WRITE_ENABLE failed.\n"); ret = -EINVAL; goto out; } /* write the address */ ec_write(REG_XBISPIA2, (addr & 0xff0000) >> 16); ec_write(REG_XBISPIA1, (addr & 0x00ff00) >> 8); ec_write(REG_XBISPIA0, (addr & 0x0000ff) >> 0); /* start action */ ec_write(REG_XBISPICMD, SPICMD_HIGH_SPEED_READ); if (rom_instruction_cycle(SPICMD_HIGH_SPEED_READ) == EC_STATE_BUSY) { printk(KERN_ERR "EC_READ_BYTE : SPICMD_HIGH_SPEED_READ failed.\n"); ret = -EINVAL; goto out; } *byte = ec_read(REG_XBISPIDAT); out: /* disable spicmd writing. */ ec_stop_spi(); return ret; }