blob: bf326188977ac26e863f5dc50c1f76e448f632dd [file] [log] [blame]
/*
* 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);
}