| /* |
| * Copyright (C) 2018 Synaptics Incorporated. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND |
| * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, |
| * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY |
| * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR |
| * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE |
| * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND |
| * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF |
| * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT |
| * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY |
| * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS. |
| */ |
| |
| #include "common.h" |
| #include "nand_drv.h" |
| |
| int lgpl_printf(const char *format, ...); |
| |
| #define DO_TRACE_LOG (0) |
| |
| #if DO_TRACE_LOG |
| #define TRACE_LOG lgpl_printf |
| #else |
| #define TRACE_LOG(fmt...) |
| #endif |
| |
| |
| extern struct mv_nand_data nand_data ; |
| extern int init_nand_data(struct mv_nand_data * board); |
| |
| int is_blank(const void *buf, size_t size) |
| { |
| size_t i; |
| const unsigned int *data = (const unsigned int *)buf; |
| size /= sizeof(data[0]); |
| |
| for (i = 0; i < size; i++) |
| if (data[i] != 0xffffffff) |
| return 0; |
| return 1; |
| } |
| |
| /******************************************************** |
| * FUNCTION: return the block status, good or bad |
| * PARAM: addr - flash page memory address |
| * RETURN: 0 - good block |
| * 1 - bad block |
| *******************************************************/ |
| int is_block_bad(loff_t addr) |
| { |
| TRACE_LOG("is_block_bad(addr=0x%08X)\n", (int)addr); |
| return mv_nand_block_bad(addr, 0); |
| } |
| |
| /******************************************************** |
| * FUNCTION: read a page |
| * PARAM: addr - flash page memory address |
| * pbuf - buffer to hold data |
| * RETURN: 0 - succeed |
| * -1 - fail |
| *******************************************************/ |
| int NFlash_PageRead(loff_t ofs, int *buf) |
| { |
| int ret = 0; |
| TRACE_LOG("NFlash_PageRead(addr=0x%08X, pbuf=0x%08X)\n", (int)ofs, (intptr_t)buf); |
| ret = mv_nand_read_block(ofs, (char*)buf, nand_page_size()); |
| if(ret != nand_page_size()) |
| return -1; |
| return 0; |
| } |
| |
| /******************************************************** |
| * FUNCTION: write a page |
| * PARAM: off - flash page memory address |
| * buf - buffer to hold data |
| * RETURN: 0 - succeed |
| * -1 - fail |
| *******************************************************/ |
| inline int NFlash_PageWrite(loff_t ofs, int *buf) |
| { |
| int ret = 0; |
| TRACE_LOG("NFlash_PageWrite(addr=0x%08X, pbuf=0x%08X)\n", (int)ofs, (int)buf); |
| ret = mv_nand_write_block(ofs, (char *)buf, nand_page_size()); |
| if(ret != nand_page_size()) |
| return -1; |
| return 0; |
| } |
| |
| /******************************************************** |
| * FUNCTION: erase a block |
| * PARAM: ofs - flash page memory address |
| * RETURN: 0 - succeed |
| * -1 - fail |
| *******************************************************/ |
| inline int NFlash_Erase(loff_t ofs) |
| { |
| return mv_nand_erase(ofs); |
| } |
| |
| /******************************************************** |
| * FUNCTION: mark one block as bad |
| * PARAM: ofs - flash page memory address |
| * RETURN: 0 - succeed |
| * -1 - fail |
| *******************************************************/ |
| inline int NFlash_Markbad(loff_t ofs) |
| { |
| int ret = mv_nand_mark_badblock(ofs, 0); |
| return ret * (-1); |
| } |