mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

So far, the SPINAND_PAGE_READ_FROM_CACHE_OP macro was taking a first argument, "fast", which was inducing the possibility to support higher bus frequencies than with the normal (slower) read from cache alternative. In practice, without frequency change on the bus, this was likely without effect, besides perhaps allowing another variant of the same command, that could run at the default highest speed. If we want to support this fully, we need to add a frequency parameter to the slowest command. But before we do that, let's drop the "fast" boolean from the macro and duplicate it, this will further help supporting having different frequencies allowed for each variant. The change is also of course propagated to all users. It has the nice effect to have all macros aligned on the same pattern. Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
106 lines
2.9 KiB
C
106 lines
2.9 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Copyright (c) 2023, SberDevices. All Rights Reserved.
|
|
*
|
|
* Author: Martin Kurbanov <mmkurbanov@salutedevices.com>
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/mtd/spinand.h>
|
|
|
|
#define SPINAND_MFR_FORESEE 0xCD
|
|
|
|
static SPINAND_OP_VARIANTS(read_cache_variants,
|
|
SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
|
SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
|
|
SPINAND_PAGE_READ_FROM_CACHE_FAST_OP(0, 1, NULL, 0),
|
|
SPINAND_PAGE_READ_FROM_CACHE_OP(0, 1, NULL, 0));
|
|
|
|
static SPINAND_OP_VARIANTS(write_cache_variants,
|
|
SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
|
|
SPINAND_PROG_LOAD(true, 0, NULL, 0));
|
|
|
|
static SPINAND_OP_VARIANTS(update_cache_variants,
|
|
SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
|
|
SPINAND_PROG_LOAD(false, 0, NULL, 0));
|
|
|
|
static int f35sqa002g_ooblayout_ecc(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
return -ERANGE;
|
|
}
|
|
|
|
static int f35sqa002g_ooblayout_free(struct mtd_info *mtd, int section,
|
|
struct mtd_oob_region *region)
|
|
{
|
|
if (section)
|
|
return -ERANGE;
|
|
|
|
/* Reserve 2 bytes for the BBM. */
|
|
region->offset = 2;
|
|
region->length = 62;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct mtd_ooblayout_ops f35sqa002g_ooblayout = {
|
|
.ecc = f35sqa002g_ooblayout_ecc,
|
|
.free = f35sqa002g_ooblayout_free,
|
|
};
|
|
|
|
static int f35sqa002g_ecc_get_status(struct spinand_device *spinand, u8 status)
|
|
{
|
|
struct nand_device *nand = spinand_to_nand(spinand);
|
|
|
|
switch (status & STATUS_ECC_MASK) {
|
|
case STATUS_ECC_NO_BITFLIPS:
|
|
return 0;
|
|
|
|
case STATUS_ECC_HAS_BITFLIPS:
|
|
return nanddev_get_ecc_conf(nand)->strength;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* More than 1-bit error was detected in one or more sectors and
|
|
* cannot be corrected.
|
|
*/
|
|
return -EBADMSG;
|
|
}
|
|
|
|
static const struct spinand_info foresee_spinand_table[] = {
|
|
SPINAND_INFO("F35SQA002G",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x72, 0x72),
|
|
NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
|
|
NAND_ECCREQ(1, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_variants,
|
|
&update_cache_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
|
f35sqa002g_ecc_get_status)),
|
|
SPINAND_INFO("F35SQA001G",
|
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x71, 0x71),
|
|
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
|
NAND_ECCREQ(1, 512),
|
|
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
|
&write_cache_variants,
|
|
&update_cache_variants),
|
|
SPINAND_HAS_QE_BIT,
|
|
SPINAND_ECCINFO(&f35sqa002g_ooblayout,
|
|
f35sqa002g_ecc_get_status)),
|
|
};
|
|
|
|
static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = {
|
|
};
|
|
|
|
const struct spinand_manufacturer foresee_spinand_manufacturer = {
|
|
.id = SPINAND_MFR_FORESEE,
|
|
.name = "FORESEE",
|
|
.chips = foresee_spinand_table,
|
|
.nchips = ARRAY_SIZE(foresee_spinand_table),
|
|
.ops = &foresee_spinand_manuf_ops,
|
|
};
|