/* Enable/disable 4-byte addressing mode. */ static inline int set_4byte(struct spi_nor *nor, u32 jedec_id, int enable) { int status; bool need_wren = false; u8 cmd; switch (JEDEC_MFR(jedec_id)) { case CFI_MFR_ST: /* Micron, actually */ /* Some Micron need WREN command; all will accept it */ need_wren = true; case CFI_MFR_MACRONIX: case 0xEF /* winbond */: if (need_wren) write_enable(nor); cmd = enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B; status = nor->write_reg(nor, cmd, NULL, 0, 0); if (need_wren) write_disable(nor); return status; default: /* Spansion style */ nor->cmd_buf[0] = enable << 7; return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1, 0); } }
/* * Enable/disable 4-byte addressing mode. */ static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable) { int status; bool need_wren = false; switch (JEDEC_MFR(jedec_id)) { case CFI_MFR_ST: /* Micron, actually */ /* Some Micron need WREN command; all will accept it */ need_wren = true; case CFI_MFR_MACRONIX: case 0xEF /* winbond */: if (need_wren) write_enable(flash); flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B; status = spi_write(flash->spi, flash->command, 1); if (need_wren) write_disable(flash); return status; default: /* Spansion style */ flash->command[0] = OPCODE_BRWR; flash->command[1] = enable << 7; return spi_write(flash->spi, flash->command, 2); } }
/* Enable/disable 4-byte addressing mode. */ static inline int set_4byte(struct spi_nor *nor, const struct flash_info *info, int enable) { int status; bool need_wren = false; u8 cmd; switch (JEDEC_MFR(info)) { case SNOR_MFR_MICRON: /* Some Micron need WREN command; all will accept it */ need_wren = true; case SNOR_MFR_MACRONIX: case SNOR_MFR_WINBOND: if (need_wren) write_enable(nor); cmd = enable ? SPINOR_OP_EN4B : SPINOR_OP_EX4B; status = nor->write_reg(nor, cmd, NULL, 0); if (need_wren) write_disable(nor); return status; default: /* Spansion style */ nor->cmd_buf[0] = enable << 7; return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1); } }
static void g_text(XA_TREE *wt, RECT r, RECT *o, char *text, int state) { /* HR: only center the text. ;-) */ r.y += (r.h-screen.c_max_h) / 2; if (!MONO and (state&DISABLED) != 0) { t_color(screen.dial_colours.lit_col); v_gtext(C.vh, r.x+1, r.y+1, text); t_color(screen.dial_colours.shadow_col); v_gtext(C.vh, r.x, r.y, text); done(DISABLED); othw t_color(menu_dis_col(wt)); /* HR */ ob_text(wt, &r, o, nil, text, 0, (state&WHITEBAK) ? (state>>8)&0x7f : -1); if (state&DISABLED) { write_disable(&wt->r, screen.dial_colours.bg_col); done(DISABLED); } }
static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) { struct spi_nor *nor = mtd_to_spi_nor(mtd); size_t actual; int ret; dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_WRITE); if (ret) return ret; /* Wait until finished previous write command. */ ret = wait_till_ready(nor); if (ret) goto time_out; write_enable(nor); nor->sst_write_second = false; actual = to % 2; /* Start write from odd address. */ if (actual) { nor->program_opcode = SPINOR_OP_BP; /* write one byte. */ nor->write(nor, to, 1, retlen, buf); ret = wait_till_ready(nor); if (ret) goto time_out; } to += actual; /* Write out most of the data here. */ for (; actual < len - 1; actual += 2) { nor->program_opcode = SPINOR_OP_AAI_WP; /* write two bytes. */ nor->write(nor, to, 2, retlen, buf + actual); ret = wait_till_ready(nor); if (ret) goto time_out; to += 2; nor->sst_write_second = true; } nor->sst_write_second = false; write_disable(nor); ret = wait_till_ready(nor); if (ret) goto time_out; /* Write out trailing byte if it exists. */ if (actual != len) { write_enable(nor); nor->program_opcode = SPINOR_OP_BP; nor->write(nor, to, 1, retlen, buf + actual); ret = wait_till_ready(nor); if (ret) goto time_out; write_disable(nor); } time_out: spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); return ret; }
static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) { struct m25p *flash = mtd_to_m25p(mtd); struct spi_transfer t[2]; struct spi_message m; size_t actual; int cmd_sz, ret; if (retlen) *retlen = 0; /* sanity checks */ if (!len) return 0; if (to + len > flash->mtd.size) return -EINVAL; spi_message_init(&m); memset(t, 0, (sizeof t)); t[0].tx_buf = flash->command; t[0].len = CMD_SIZE; spi_message_add_tail(&t[0], &m); t[1].tx_buf = buf; spi_message_add_tail(&t[1], &m); mutex_lock(&flash->lock); /* Wait until finished previous write command. */ ret = wait_till_ready(flash); if (ret) goto time_out; write_enable(flash); actual = to % 2; /* Start write from odd address. */ if (actual) { flash->command[0] = OPCODE_BP; flash->command[1] = to >> 16; flash->command[2] = to >> 8; flash->command[3] = to; /* write one byte. */ t[1].len = 1; spi_sync(flash->spi, &m); ret = wait_till_ready(flash); if (ret) goto time_out; *retlen += m.actual_length - CMD_SIZE; } to += actual; flash->command[0] = OPCODE_AAI_WP; flash->command[1] = to >> 16; flash->command[2] = to >> 8; flash->command[3] = to; cmd_sz = CMD_SIZE; for (; actual < len - 1; actual += 2) { t[0].len = cmd_sz; /* write two bytes. */ t[1].len = 2; t[1].tx_buf = buf + actual; spi_sync(flash->spi, &m); ret = wait_till_ready(flash); if (ret) goto time_out; *retlen += m.actual_length - cmd_sz; cmd_sz = 1; to += 2; } write_disable(flash); ret = wait_till_ready(flash); if (ret) goto time_out; if (actual != len) { write_enable(flash); flash->command[0] = OPCODE_BP; flash->command[1] = to >> 16; flash->command[2] = to >> 8; flash->command[3] = to; t[0].len = CMD_SIZE; t[1].len = 1; t[1].tx_buf = buf + actual; spi_sync(flash->spi, &m); ret = wait_till_ready(flash); if (ret) goto time_out; *retlen += m.actual_length - CMD_SIZE; write_disable(flash); }