Commit d21b4338 authored by Richard Genoud's avatar Richard Genoud Committed by Miquel Raynal
Browse files

mtd: rawnand: sunxi: introduce ecc_mode_mask in sunxi_nfc_caps

The H6/H616 ECC_MODE field is not at the same offset, and has not the
same size.
So move the mask into sunxi_nfc_caps.

Also, introduce a non compile-time field_prep() because FIELD_PREP()
doesn't work with non compile-time constant.

No functional change.

Link: https://lore.kernel.org/all/cover.1761588465.git.geert+renesas@glider.be


Signed-off-by: default avatarRichard Genoud <richard.genoud@bootlin.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
parent 8c1b28ab
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -29,8 +29,9 @@
#include <linux/iopoll.h>
#include <linux/reset.h>

/* non compile-time field get */
/* non compile-time field get/prep */
#define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
#define field_prep(_mask, _val) (((_val) << (ffs(_mask) - 1)) & (_mask))

#define NFC_REG_CTL		0x0000
#define NFC_REG_ST		0x0004
@@ -145,8 +146,8 @@
#define NFC_ECC_BLOCK_512	BIT(5)
#define NFC_RANDOM_EN		BIT(9)
#define NFC_RANDOM_DIRECTION	BIT(10)
#define NFC_ECC_MODE_MSK	GENMASK(15, 12)
#define NFC_ECC_MODE(x)		((x) << 12)
#define NFC_ECC_MODE_MSK(nfc)	(nfc->caps->ecc_mode_mask)
#define NFC_ECC_MODE(nfc, x)	field_prep(NFC_ECC_MODE_MSK(nfc), (x))
#define NFC_RANDOM_SEED_MSK	GENMASK(30, 16)
#define NFC_RANDOM_SEED(x)	((x) << 16)

@@ -238,6 +239,7 @@ static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
 * @reg_ecc_err_cnt:	ECC error counter register
 * @reg_user_data:	User data register
 * @reg_pat_found:	Data Pattern Status Register
 * @ecc_mode_mask:	ECC_MODE mask in NFC_ECC_CTL register
 * @pat_found_mask:	ECC_PAT_FOUND mask in NFC_REG_PAT_FOUND register
 * @dma_maxburst:	DMA maxburst
 * @ecc_strengths:	Available ECC strengths array
@@ -250,6 +252,7 @@ struct sunxi_nfc_caps {
	unsigned int reg_ecc_err_cnt;
	unsigned int reg_user_data;
	unsigned int reg_pat_found;
	unsigned int ecc_mode_mask;
	unsigned int pat_found_mask;
	unsigned int dma_maxburst;
	const u8 *ecc_strengths;
@@ -1757,7 +1760,7 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
	ecc->read_oob_raw = nand_read_oob_std;
	ecc->write_oob_raw = nand_write_oob_std;

	sunxi_nand->ecc.ecc_ctl = NFC_ECC_MODE(i) | NFC_ECC_EXCEPTION |
	sunxi_nand->ecc.ecc_ctl = NFC_ECC_MODE(nfc, i) | NFC_ECC_EXCEPTION |
				  NFC_ECC_PIPELINE | NFC_ECC_EN;

	if (ecc->size == 512) {
@@ -2227,6 +2230,7 @@ static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = {
	.reg_ecc_err_cnt = NFC_REG_A10_ECC_ERR_CNT,
	.reg_user_data = NFC_REG_A10_USER_DATA,
	.reg_pat_found = NFC_REG_ECC_ST,
	.ecc_mode_mask = GENMASK(15, 12),
	.pat_found_mask = GENMASK(31, 16),
	.dma_maxburst = 4,
	.ecc_strengths = sunxi_ecc_strengths_a10,
@@ -2240,6 +2244,7 @@ static const struct sunxi_nfc_caps sunxi_nfc_a23_caps = {
	.reg_ecc_err_cnt = NFC_REG_A10_ECC_ERR_CNT,
	.reg_user_data = NFC_REG_A10_USER_DATA,
	.reg_pat_found = NFC_REG_ECC_ST,
	.ecc_mode_mask = GENMASK(15, 12),
	.pat_found_mask = GENMASK(31, 16),
	.dma_maxburst = 8,
	.ecc_strengths = sunxi_ecc_strengths_a10,