Re: [PATCH v7 6/8] spi: spi-qpic: add driver for QCOM SPI NAND flash Interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Md,

kernel test robot noticed the following build errors:

[auto build test ERROR on mtd/nand/next]
[also build test ERROR on broonie-spi/for-next robh/for-next linus/master v6.10 next-20240724]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Md-Sadre-Alam/spi-dt-bindings-Introduce-qcom-spi-qpic-snand/20240724-195819
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next
patch link:    https://lore.kernel.org/r/20240724114225.2176448-7-quic_mdalam%40quicinc.com
patch subject: [PATCH v7 6/8] spi: spi-qpic: add driver for QCOM SPI NAND flash Interface
config: xtensa-allyesconfig (https://download.01.org/0day-ci/archive/20240725/202407250710.knYmJebL-lkp@xxxxxxxxx/config)
compiler: xtensa-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240725/202407250710.knYmJebL-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202407250710.knYmJebL-lkp@xxxxxxxxx/

All error/warnings (new ones prefixed by >>):

   drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_init':
>> drivers/spi/spi-qpic-snand.c:174:25: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
     174 |         snand_cfg_val = FIELD_PREP(CLK_CNTR_INIT_VAL_VEC_MASK, CLK_CNTR_INIT_VAL_VEC) |
         |                         ^~~~~~~~~~
   drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_ecc_init_ctx_pipelined':
>> drivers/spi/spi-qpic-snand.c:247:42: warning: variable 'steps' set but not used [-Wunused-but-set-variable]
     247 |         int step_size = 0, strength = 0, steps;
         |                                          ^~~~~
   drivers/spi/spi-qpic-snand.c: In function 'qcom_spi_write_page':
   drivers/spi/spi-qpic-snand.c:1261:30: warning: variable 's_op' set but not used [-Wunused-but-set-variable]
    1261 |         struct qpic_snand_op s_op = {};
         |                              ^~~~
   drivers/spi/spi-qpic-snand.c: At top level:
   drivers/spi/spi-qpic-snand.c:1632:19: error: initialization of 'int (*)(struct platform_device *)' from incompatible pointer type 'void (*)(struct platform_device *)' [-Wincompatible-pointer-types]
    1632 |         .remove = qcom_spi_remove,
         |                   ^~~~~~~~~~~~~~~
   drivers/spi/spi-qpic-snand.c:1632:19: note: (near initialization for 'qcom_spi_driver.remove')


vim +/FIELD_PREP +174 drivers/spi/spi-qpic-snand.c

   168	
   169	static int qcom_spi_init(struct qcom_nand_controller *snandc)
   170	{
   171		u32 snand_cfg_val = 0x0;
   172		int ret;
   173	
 > 174		snand_cfg_val = FIELD_PREP(CLK_CNTR_INIT_VAL_VEC_MASK, CLK_CNTR_INIT_VAL_VEC) |
   175				FIELD_PREP(LOAD_CLK_CNTR_INIT_EN, 0) |
   176				FIELD_PREP(FEA_STATUS_DEV_ADDR_MASK, FEA_STATUS_DEV_ADDR) |
   177				FIELD_PREP(SPI_CFG, 0);
   178	
   179		snandc->regs->spi_cfg = snand_cfg_val;
   180		snandc->regs->num_addr_cycle = SPI_NUM_ADDR;
   181		snandc->regs->busy_wait_cnt = SPI_WAIT_CNT;
   182	
   183		qcom_write_reg_dma(snandc, &snandc->regs->spi_cfg, NAND_FLASH_SPI_CFG, 1, 0);
   184	
   185		snand_cfg_val &= ~LOAD_CLK_CNTR_INIT_EN;
   186		snandc->regs->spi_cfg = snand_cfg_val;
   187	
   188		qcom_write_reg_dma(snandc, &snandc->regs->spi_cfg, NAND_FLASH_SPI_CFG, 1, 0);
   189	
   190		qcom_write_reg_dma(snandc, &snandc->regs->num_addr_cycle, NAND_NUM_ADDR_CYCLES, 1, 0);
   191		qcom_write_reg_dma(snandc, &snandc->regs->busy_wait_cnt, NAND_BUSY_CHECK_WAIT_CNT, 1,
   192				   NAND_BAM_NEXT_SGL);
   193	
   194		ret = qcom_submit_descs(snandc);
   195		if (ret) {
   196			dev_err(snandc->dev, "failure in submitting spi init descriptor\n");
   197			return ret;
   198		}
   199	
   200		return ret;
   201	}
   202	
   203	static int qcom_spi_ooblayout_ecc(struct mtd_info *mtd, int section,
   204					  struct mtd_oob_region *oobregion)
   205	{
   206		struct nand_device *nand = mtd_to_nanddev(mtd);
   207		struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
   208		struct qpic_ecc *qecc = snandc->qspi->ecc;
   209	
   210		if (section > 1)
   211			return -ERANGE;
   212	
   213		oobregion->length = qecc->ecc_bytes_hw + qecc->spare_bytes;
   214		oobregion->offset = mtd->oobsize - oobregion->length;
   215	
   216		return 0;
   217	}
   218	
   219	static int qcom_spi_ooblayout_free(struct mtd_info *mtd, int section,
   220					   struct mtd_oob_region *oobregion)
   221	{
   222		struct nand_device *nand = mtd_to_nanddev(mtd);
   223		struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
   224		struct qpic_ecc *qecc = snandc->qspi->ecc;
   225	
   226		if (section)
   227			return -ERANGE;
   228	
   229		oobregion->length = qecc->steps * 4;
   230		oobregion->offset = ((qecc->steps - 1) * qecc->bytes) + qecc->bbm_size;
   231	
   232		return 0;
   233	}
   234	
   235	static const struct mtd_ooblayout_ops qcom_spi_ooblayout = {
   236		.ecc = qcom_spi_ooblayout_ecc,
   237		.free = qcom_spi_ooblayout_free,
   238	};
   239	
   240	static int qcom_spi_ecc_init_ctx_pipelined(struct nand_device *nand)
   241	{
   242		struct qcom_nand_controller *snandc = nand_to_qcom_snand(nand);
   243		struct nand_ecc_props *conf = &nand->ecc.ctx.conf;
   244		struct nand_ecc_props *reqs = &nand->ecc.requirements;
   245		struct nand_ecc_props *user = &nand->ecc.user_conf;
   246		struct mtd_info *mtd = nanddev_to_mtd(nand);
 > 247		int step_size = 0, strength = 0, steps;
   248		int cwperpage, bad_block_byte;
   249		struct qpic_ecc *ecc_cfg;
   250	
   251		cwperpage = mtd->writesize / NANDC_STEP_SIZE;
   252		snandc->qspi->num_cw = cwperpage;
   253	
   254		ecc_cfg = kzalloc(sizeof(*ecc_cfg), GFP_KERNEL);
   255		if (!ecc_cfg)
   256			return -ENOMEM;
   257		snandc->qspi->oob_buf = kzalloc(mtd->writesize + mtd->oobsize,
   258						GFP_KERNEL);
   259		if (!snandc->qspi->oob_buf)
   260			return -ENOMEM;
   261	
   262		memset(snandc->qspi->oob_buf, 0xff, mtd->writesize + mtd->oobsize);
   263	
   264		nand->ecc.ctx.priv = ecc_cfg;
   265		snandc->qspi->mtd = mtd;
   266	
   267		if (user->step_size && user->strength) {
   268			step_size = user->step_size;
   269			strength = user->strength;
   270		} else if (reqs->step_size && reqs->strength) {
   271			step_size = reqs->step_size;
   272			strength = reqs->strength;
   273		}
   274	
   275		if (step_size && strength)
   276			steps = mtd->writesize / step_size;
   277	
   278		ecc_cfg->ecc_bytes_hw = 7;
   279		ecc_cfg->spare_bytes = 4;
   280		ecc_cfg->bbm_size = 1;
   281		ecc_cfg->bch_enabled = true;
   282		ecc_cfg->bytes = ecc_cfg->ecc_bytes_hw + ecc_cfg->spare_bytes + ecc_cfg->bbm_size;
   283	
   284		ecc_cfg->steps = 4;
   285		ecc_cfg->strength = 4;
   286		ecc_cfg->step_size = 512;
   287		ecc_cfg->cw_data = 516;
   288		ecc_cfg->cw_size = ecc_cfg->cw_data + ecc_cfg->bytes;
   289		bad_block_byte = mtd->writesize - ecc_cfg->cw_size * (cwperpage - 1) + 1;
   290	
   291		mtd_set_ooblayout(mtd, &qcom_spi_ooblayout);
   292	
   293		ecc_cfg->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
   294				FIELD_PREP(UD_SIZE_BYTES_MASK, ecc_cfg->cw_data) |
   295				FIELD_PREP(DISABLE_STATUS_AFTER_WRITE, 1) |
   296				FIELD_PREP(NUM_ADDR_CYCLES_MASK, 3) |
   297				FIELD_PREP(ECC_PARITY_SIZE_BYTES_RS, ecc_cfg->ecc_bytes_hw) |
   298				FIELD_PREP(STATUS_BFR_READ, 0) |
   299				FIELD_PREP(SET_RD_MODE_AFTER_STATUS, 1) |
   300				FIELD_PREP(SPARE_SIZE_BYTES_MASK, ecc_cfg->spare_bytes);
   301	
   302		ecc_cfg->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 0) |
   303				FIELD_PREP(CS_ACTIVE_BSY, 0) |
   304				FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, bad_block_byte) |
   305				FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 0) |
   306				FIELD_PREP(WR_RD_BSY_GAP_MASK, 20) |
   307				FIELD_PREP(WIDE_FLASH, 0) |
   308				FIELD_PREP(ENABLE_BCH_ECC, ecc_cfg->bch_enabled);
   309	
   310		ecc_cfg->cfg0_raw = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
   311				    FIELD_PREP(NUM_ADDR_CYCLES_MASK, 3) |
   312				    FIELD_PREP(UD_SIZE_BYTES_MASK, ecc_cfg->cw_size) |
   313				    FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
   314	
   315		ecc_cfg->cfg1_raw = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 0) |
   316				    FIELD_PREP(CS_ACTIVE_BSY, 0) |
   317				    FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
   318				    FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
   319				    FIELD_PREP(WR_RD_BSY_GAP_MASK, 20) |
   320				    FIELD_PREP(WIDE_FLASH, 0) |
   321				    FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
   322	
   323		ecc_cfg->ecc_bch_cfg = FIELD_PREP(ECC_CFG_ECC_DISABLE, !ecc_cfg->bch_enabled) |
   324				       FIELD_PREP(ECC_SW_RESET, 0) |
   325				       FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, ecc_cfg->cw_data) |
   326				       FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
   327				       FIELD_PREP(ECC_MODE_MASK, 0) |
   328				       FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, ecc_cfg->ecc_bytes_hw);
   329	
   330		ecc_cfg->ecc_buf_cfg = 0x203 << NUM_STEPS;
   331		ecc_cfg->clrflashstatus = FS_READY_BSY_N;
   332		ecc_cfg->clrreadstatus = 0xc0;
   333	
   334		conf->step_size = ecc_cfg->step_size;
   335		conf->strength = ecc_cfg->strength;
   336	
   337		snandc->regs->erased_cw_detect_cfg_clr = cpu_to_le32(CLR_ERASED_PAGE_DET);
   338		snandc->regs->erased_cw_detect_cfg_set = cpu_to_le32(SET_ERASED_PAGE_DET);
   339	
   340		dev_dbg(snandc->dev, "ECC strength: %u bits per %u bytes\n",
   341			ecc_cfg->strength, ecc_cfg->step_size);
   342	
   343		return 0;
   344	}
   345	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux