sdk-hwV1.3/lichee/linux-4.9/drivers/mtd/awnand/spinand/sunxi-common.c

74 lines
2.0 KiB
C

/*
* sunxi-nftl-core.c for sunxi spi nand base on nftl.
*
* Copyright (C) 2019 Allwinner.
* SPDX-License-Identifier: GPL-2.0
*/
#define pr_fmt(fmt) "sunxi-spinand: " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/of.h>
#include <linux/spi/spi.h>
#include <linux/sunxi-sid.h>
#include <linux/uaccess.h>
#include "sunxi-spinand.h"
static int ubootblks = -1;
module_param(ubootblks, int, 0400);
MODULE_PARM_DESC(ubootblks, "block count for uboot");
void aw_spinand_uboot_blknum(struct aw_spinand *spinand, unsigned int *start,
unsigned int *end)
{
struct aw_spinand_chip *chip = spinand_to_chip(spinand);
struct aw_spinand_info *info = chip->info;
unsigned int blksize = info->phy_block_size(chip);
unsigned int pagecnt = blksize / info->phy_page_size(chip);
unsigned int _start, _end;
/* small nand:block size < 1MB; reserve 4M for uboot */
if (blksize <= SZ_128K) {
_start = UBOOT_START_BLOCK_SMALLNAND;
_end = _start + 32;
} else if (blksize <= SZ_256K) {
_start = UBOOT_START_BLOCK_SMALLNAND;
_end = _start + 16;
} else if (blksize <= SZ_512K) {
_start = UBOOT_START_BLOCK_SMALLNAND;
_end = _start + 8;
} else if (blksize <= SZ_1M && pagecnt <= 128) {
_start = UBOOT_START_BLOCK_SMALLNAND;
_end = _start + 4;
/* big nand; reserve at least 20M for uboot */
} else if (blksize <= SZ_1M && pagecnt > 128) {
_start = UBOOT_START_BLOCK_BIGNAND;
_end = _start + 20;
} else if (blksize <= SZ_2M) {
_start = UBOOT_START_BLOCK_BIGNAND;
_end = _start + 10;
} else {
_start = UBOOT_START_BLOCK_BIGNAND;
_end = _start + 8;
}
if (ubootblks > 0)
_end = _start + ubootblks;
else
/* update parameter to /sys */
ubootblks = _end - _start;
if (start)
*start = _start;
if (end)
*end = _end;
}
EXPORT_SYMBOL(aw_spinand_uboot_blknum);
MODULE_AUTHOR("cuizhikui <cuizhikui@allwinnertech.com>");
MODULE_DESCRIPTION("Allwinner's spinand mtd and nftl driver common port");