[PATCH v5 1/3] mtd: nand: vf610_nfc: make use of ->exec_op()

Stefan Agner stefan at agner.ch
Sat Mar 3 14:04:05 PST 2018


On 27.02.2018 22:28, Boris Brezillon wrote:
> On Mon, 26 Feb 2018 22:18:53 +0100
> Stefan Agner <stefan at agner.ch> wrote:
> 
>> This reworks the driver to make use of ->exec_op() callback. The
>> command sequencer of the VF610 NFC aligns well with the new ops
>> interface.
>>
>> The operations are translated to a NFC command code while filling
>> the necessary registers. Instead of using the special status and
>> read ID command codes (which require to read status/ID from
>> special registers instead of the regular data area) the driver
>> now now uses the main data buffer for all commands. This
>> simplifies the driver as no special casing is needed.
>>
>> For control data (status byte, id bytes and parameter page) the
>> driver needs to reverse byte order for little endian CPUs since
>> the controller seems to store the bytes in big endian order in
>> the data buffer.
>>
>> The current state seems to pass MTD tests on a Colibri VF61.
> 
> Nice. If you don't mind, I'd like coding style issues reported by
> checkpatch to be fixed (see below diff). If you're happy with the diff,
> no need to resend a new version, I'll just fix it when applying.

I realized I also did not adhere to the new subject rule. Will apply
your changes and resend a final version.

--
Stefan

> 
> --->8---
> diff --git a/drivers/mtd/nand/raw/vf610_nfc.c b/drivers/mtd/nand/raw/vf610_nfc.c
> index 9d1fb6df0e22..ae85ae9e3727 100644
> --- a/drivers/mtd/nand/raw/vf610_nfc.c
> +++ b/drivers/mtd/nand/raw/vf610_nfc.c
> @@ -113,12 +113,12 @@
>  /* NFC_COL_ADDR Field */
>  #define COL_ADDR_MASK				0x0000FFFF
>  #define COL_ADDR_SHIFT				0
> -#define COL_ADDR(pos, val)			((val & 0xFF) << (8 * (pos)))
> +#define COL_ADDR(pos, val)			(((val) & 0xFF) << (8 * (pos)))
>  
>  /* NFC_ROW_ADDR Field */
>  #define ROW_ADDR_MASK				0x00FFFFFF
>  #define ROW_ADDR_SHIFT				0
> -#define ROW_ADDR(pos, val)			((val & 0xFF) << (8 * (pos)))
> +#define ROW_ADDR(pos, val)			(((val) & 0xFF) << (8 * (pos)))
>  
>  #define ROW_ADDR_CHIP_SEL_RB_MASK		0xF0000000
>  #define ROW_ADDR_CHIP_SEL_RB_SHIFT		28
> @@ -280,6 +280,7 @@ static inline void vf610_nfc_rd_from_sram(void
> *dst, const void __iomem *src,
>  
>  		for (i = 0; i < len; i += 4) {
>  			u32 val = be32_to_cpu(__raw_readl(src + i));
> +
>  			memcpy(dst + i, &val, min(sizeof(val), len - i));
>  		}
>  	} else {
> @@ -314,6 +315,7 @@ static inline void vf610_nfc_wr_to_sram(void
> __iomem *dst, const void *src,
>  
>  		for (i = 0; i < len; i += 4) {
>  			u32 val;
> +
>  			memcpy(&val, src + i, min(sizeof(val), len - i));
>  			__raw_writel(cpu_to_be32(val), dst + i);
>  		}
> @@ -617,8 +619,8 @@ static inline void vf610_nfc_run(struct vf610_nfc
> *nfc, u32 col, u32 row,
>  	vf610_nfc_done(nfc);
>  }
>  
> -static inline const struct nand_op_instr *vf610_get_next_instr(
> -	const struct nand_subop *subop, int *op_id)
> +static inline const struct nand_op_instr *
> +vf610_get_next_instr(const struct nand_subop *subop, int *op_id)
>  {
>  	if (*op_id + 1 >= subop->ninstrs)
>  		return NULL;
> @@ -629,7 +631,7 @@ static inline const struct nand_op_instr
> *vf610_get_next_instr(
>  }
>  
>  static int vf610_nfc_cmd(struct nand_chip *chip,
> -				const struct nand_subop *subop)
> +			 const struct nand_subop *subop)
>  {
>  	const struct nand_op_instr *instr;
>  	struct vf610_nfc *nfc = chip_to_nfc(chip);
> @@ -660,6 +662,7 @@ static int vf610_nfc_cmd(struct nand_chip *chip,
>  
>  		for (; i < naddrs; i++) {
>  			u8 val = instr->ctx.addr.addrs[i];
> +
>  			if (i < 2)
>  				col |= COL_ADDR(i, val);
>  			else
> @@ -732,15 +735,13 @@ static int vf610_nfc_cmd(struct nand_chip *chip,
>  }
>  
>  static const struct nand_op_parser vf610_nfc_op_parser = NAND_OP_PARSER(
> -	NAND_OP_PARSER_PATTERN(
> -		vf610_nfc_cmd,
> +	NAND_OP_PARSER_PATTERN(vf610_nfc_cmd,
>  		NAND_OP_PARSER_PAT_CMD_ELEM(true),
>  		NAND_OP_PARSER_PAT_ADDR_ELEM(true, 5),
>  		NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, PAGE_2K + OOB_MAX),
>  		NAND_OP_PARSER_PAT_CMD_ELEM(true),
>  		NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)),
> -	NAND_OP_PARSER_PATTERN(
> -		vf610_nfc_cmd,
> +	NAND_OP_PARSER_PATTERN(vf610_nfc_cmd,
>  		NAND_OP_PARSER_PAT_CMD_ELEM(true),
>  		NAND_OP_PARSER_PAT_ADDR_ELEM(true, 5),
>  		NAND_OP_PARSER_PAT_CMD_ELEM(true),
> @@ -752,7 +753,8 @@ static int vf610_nfc_exec_op(struct nand_chip *chip,
>  			     const struct nand_operation *op,
>  			     bool check_only)
>  {
> -	return nand_op_parser_exec_op(chip, &vf610_nfc_op_parser, op, check_only);
> +	return nand_op_parser_exec_op(chip, &vf610_nfc_op_parser, op,
> +				      check_only);
>  }
>  
>  /*
> @@ -895,8 +897,9 @@ static int vf610_nfc_write_page(struct mtd_info
> *mtd, struct nand_chip *chip,
>  	return ret;
>  }
>  
> -static int vf610_nfc_read_page_raw(struct mtd_info *mtd, struct
> nand_chip *chip,
> -				uint8_t *buf, int oob_required, int page)
> +static int vf610_nfc_read_page_raw(struct mtd_info *mtd,
> +				   struct nand_chip *chip, u8 *buf,
> +				   int oob_required, int page)
>  {
>  	struct vf610_nfc *nfc = mtd_to_nfc(mtd);
>  	int ret;
> @@ -908,8 +911,9 @@ static int vf610_nfc_read_page_raw(struct mtd_info
> *mtd, struct nand_chip *chip,
>  	return ret;
>  }
>  
> -static int vf610_nfc_write_page_raw(struct mtd_info *mtd, struct
> nand_chip *chip,
> -				const uint8_t *buf, int oob_required, int page)
> +static int vf610_nfc_write_page_raw(struct mtd_info *mtd,
> +				    struct nand_chip *chip, const u8 *buf,
> +				    int oob_required, int page)
>  {
>  	struct vf610_nfc *nfc = mtd_to_nfc(mtd);
>  	int ret;
> @@ -928,7 +932,7 @@ static int vf610_nfc_write_page_raw(struct
> mtd_info *mtd, struct nand_chip *chip
>  }
>  
>  static int vf610_nfc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
> -			int page)
> +			      int page)
>  {
>  	struct vf610_nfc *nfc = mtd_to_nfc(mtd);
>  	int ret;
> @@ -941,7 +945,7 @@ static int vf610_nfc_read_oob(struct mtd_info
> *mtd, struct nand_chip *chip,
>  }
>  
>  static int vf610_nfc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
> -			int page)
> +			       int page)
>  {
>  	struct vf610_nfc *nfc = mtd_to_nfc(mtd);
>  	int ret;



More information about the linux-mtd mailing list