OneNAND: handle byte access on BufferRAM
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
This commit is contained in:
parent
628bee6593
commit
9c01f87db1
2 changed files with 41 additions and 0 deletions
|
@ -373,6 +373,17 @@ static int onenand_read_bufferram(struct mtd_info *mtd, int 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -130,6 +130,9 @@ struct onenand_chip {
|
|||
#define ONENAND_SET_SYS_CFG1(v, this) \
|
||||
(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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue