OneNAND: handle byte access on BufferRAM
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
This commit is contained in:
parent
628bee6593
commit
9c01f87db1
|
@ -373,6 +373,17 @@ static int onenand_read_bufferram(struct mtd_info *mtd, int area,
|
||||||
|
|
||||||
bufferram += onenand_bufferram_offset(mtd, area);
|
bufferram += onenand_bufferram_offset(mtd, area);
|
||||||
|
|
||||||
|
if (ONENAND_CHECK_BYTE_ACCESS(count)) {
|
||||||
|
unsigned short word;
|
||||||
|
|
||||||
|
/* Align with word(16-bit) size */
|
||||||
|
count--;
|
||||||
|
|
||||||
|
/* Read word and save byte */
|
||||||
|
word = this->read_word(bufferram + offset + count);
|
||||||
|
buffer[count] = (word & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(buffer, bufferram + offset, count);
|
memcpy(buffer, bufferram + offset, count);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -400,6 +411,17 @@ static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
|
||||||
|
|
||||||
this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
|
this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
|
||||||
|
|
||||||
|
if (ONENAND_CHECK_BYTE_ACCESS(count)) {
|
||||||
|
unsigned short word;
|
||||||
|
|
||||||
|
/* Align with word(16-bit) size */
|
||||||
|
count--;
|
||||||
|
|
||||||
|
/* Read word and save byte */
|
||||||
|
word = this->read_word(bufferram + offset + count);
|
||||||
|
buffer[count] = (word & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(buffer, bufferram + offset, count);
|
memcpy(buffer, bufferram + offset, count);
|
||||||
|
|
||||||
this->mmcontrol(mtd, 0);
|
this->mmcontrol(mtd, 0);
|
||||||
|
@ -427,6 +449,22 @@ static int onenand_write_bufferram(struct mtd_info *mtd, int area,
|
||||||
|
|
||||||
bufferram += onenand_bufferram_offset(mtd, area);
|
bufferram += onenand_bufferram_offset(mtd, area);
|
||||||
|
|
||||||
|
if (ONENAND_CHECK_BYTE_ACCESS(count)) {
|
||||||
|
unsigned short word;
|
||||||
|
int byte_offset;
|
||||||
|
|
||||||
|
/* Align with word(16-bit) size */
|
||||||
|
count--;
|
||||||
|
|
||||||
|
/* Calculate byte access offset */
|
||||||
|
byte_offset = offset + count;
|
||||||
|
|
||||||
|
/* Read word and save byte */
|
||||||
|
word = this->read_word(bufferram + byte_offset);
|
||||||
|
word = (word & ~0xff) | buffer[count];
|
||||||
|
this->write_word(word, bufferram + byte_offset);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(bufferram + offset, buffer, count);
|
memcpy(bufferram + offset, buffer, count);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -130,6 +130,9 @@ struct onenand_chip {
|
||||||
#define ONENAND_SET_SYS_CFG1(v, this) \
|
#define ONENAND_SET_SYS_CFG1(v, this) \
|
||||||
(this->write_word(v, this->base + ONENAND_REG_SYS_CFG1))
|
(this->write_word(v, this->base + ONENAND_REG_SYS_CFG1))
|
||||||
|
|
||||||
|
/* Check byte access in OneNAND */
|
||||||
|
#define ONENAND_CHECK_BYTE_ACCESS(addr) (addr & 0x1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Options bits
|
* Options bits
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue