Commit 9c01f87d authored by Kyungmin Park's avatar Kyungmin Park Committed by Jarkko Lavinen

OneNAND: handle byte access on BufferRAM

Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent 628bee65
...@@ -373,6 +373,17 @@ static int onenand_read_bufferram(struct mtd_info *mtd, int area, ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment