|
|
|
@ -174,6 +174,7 @@ struct ar934x_nfc { |
|
|
|
|
struct device *parent; |
|
|
|
|
void __iomem *base; |
|
|
|
|
void (*select_chip)(int chip_no); |
|
|
|
|
bool swap_dma; |
|
|
|
|
int irq; |
|
|
|
|
wait_queue_head_t irq_waitq; |
|
|
|
|
|
|
|
|
@ -190,6 +191,8 @@ struct ar934x_nfc { |
|
|
|
|
unsigned int buf_size; |
|
|
|
|
int buf_index; |
|
|
|
|
|
|
|
|
|
bool read_id; |
|
|
|
|
|
|
|
|
|
int erase1_page_addr; |
|
|
|
|
|
|
|
|
|
int rndout_page_addr; |
|
|
|
@ -591,7 +594,10 @@ ar934x_nfc_read_status(struct ar934x_nfc *nfc) |
|
|
|
|
nfc_dbg(nfc, "read status, cmd:%08x status:%02x\n", |
|
|
|
|
cmd_reg, (status & 0xff)); |
|
|
|
|
|
|
|
|
|
nfc->buf[0 ^ 3] = status; |
|
|
|
|
if (nfc->swap_dma) |
|
|
|
|
nfc->buf[0 ^ 3] = status; |
|
|
|
|
else |
|
|
|
|
nfc->buf[0] = status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
@ -600,6 +606,7 @@ ar934x_nfc_cmdfunc(struct mtd_info *mtd, unsigned int command, int column, |
|
|
|
|
{ |
|
|
|
|
struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd); |
|
|
|
|
|
|
|
|
|
nfc->read_id = false; |
|
|
|
|
if (command != NAND_CMD_PAGEPROG) |
|
|
|
|
nfc->buf_index = 0; |
|
|
|
|
|
|
|
|
@ -609,6 +616,7 @@ ar934x_nfc_cmdfunc(struct mtd_info *mtd, unsigned int command, int column, |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case NAND_CMD_READID: |
|
|
|
|
nfc->read_id = true; |
|
|
|
|
ar934x_nfc_send_readid(nfc, command); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -717,13 +725,15 @@ static u8 |
|
|
|
|
ar934x_nfc_read_byte(struct mtd_info *mtd) |
|
|
|
|
{ |
|
|
|
|
struct ar934x_nfc *nfc = mtd_to_ar934x_nfc(mtd); |
|
|
|
|
unsigned int buf_index; |
|
|
|
|
u8 data; |
|
|
|
|
|
|
|
|
|
WARN_ON(nfc->buf_index >= nfc->buf_size); |
|
|
|
|
|
|
|
|
|
buf_index = nfc->buf_index ^ 3; |
|
|
|
|
data = nfc->buf[buf_index]; |
|
|
|
|
if (nfc->swap_dma || nfc->read_id) |
|
|
|
|
data = nfc->buf[nfc->buf_index ^ 3]; |
|
|
|
|
else |
|
|
|
|
data = nfc->buf[nfc->buf_index]; |
|
|
|
|
|
|
|
|
|
nfc->buf_index++; |
|
|
|
|
|
|
|
|
|
return data; |
|
|
|
@ -737,9 +747,16 @@ ar934x_nfc_write_buf(struct mtd_info *mtd, const u8 *buf, int len) |
|
|
|
|
|
|
|
|
|
WARN_ON(nfc->buf_index + len > nfc->buf_size); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
nfc->buf[nfc->buf_index ^ 3] = buf[i]; |
|
|
|
|
nfc->buf_index++; |
|
|
|
|
if (nfc->swap_dma) { |
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
nfc->buf[nfc->buf_index ^ 3] = buf[i]; |
|
|
|
|
nfc->buf_index++; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
nfc->buf[nfc->buf_index] = buf[i]; |
|
|
|
|
nfc->buf_index++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -754,9 +771,16 @@ ar934x_nfc_read_buf(struct mtd_info *mtd, u8 *buf, int len) |
|
|
|
|
|
|
|
|
|
buf_index = nfc->buf_index; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
buf[i] = nfc->buf[buf_index ^ 3]; |
|
|
|
|
buf_index++; |
|
|
|
|
if (nfc->swap_dma || nfc->read_id) { |
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
buf[i] = nfc->buf[buf_index ^ 3]; |
|
|
|
|
buf_index++; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (i = 0; i < len; i++) { |
|
|
|
|
buf[i] = nfc->buf[buf_index]; |
|
|
|
|
buf_index++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
nfc->buf_index = buf_index; |
|
|
|
@ -1028,6 +1052,7 @@ ar934x_nfc_probe(struct platform_device *pdev) |
|
|
|
|
|
|
|
|
|
nfc->parent = &pdev->dev; |
|
|
|
|
nfc->select_chip = pdata->select_chip; |
|
|
|
|
nfc->swap_dma = pdata->swap_dma; |
|
|
|
|
|
|
|
|
|
nand = &nfc->nand_chip; |
|
|
|
|
mtd = &nfc->mtd; |
|
|
|
|