123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- From: =?UTF-8?q?Ezequiel=20Garc=C3=ADa?= <ezequiel@vanguardiasur.com.ar>
- Date: Wed, 4 Nov 2015 13:13:42 -0300
- Subject: [PATCH] mtd: pxa3xx_nand: Fix initial controller configuration
- The Data Flash Control Register (NDCR) contains two types
- of parameters: those that are needed for device identification,
- and those that can only be set after device identification.
- Therefore, the driver can't set them all at once and instead
- needs to configure the first group before nand_scan_ident()
- and the second group later.
- Let's split pxa3xx_nand_config in two halves, and set the
- parameters that depend on the device geometry once this is known.
- Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
- Signed-off-by: Brian Norris <computersforpeace@gmail.com>
- ---
- --- a/drivers/mtd/nand/pxa3xx_nand.c
- +++ b/drivers/mtd/nand/pxa3xx_nand.c
- @@ -1420,34 +1420,43 @@ static int pxa3xx_nand_waitfunc(struct m
- return NAND_STATUS_READY;
- }
-
- -static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info)
- +static int pxa3xx_nand_config_ident(struct pxa3xx_nand_info *info)
- {
- struct platform_device *pdev = info->pdev;
- struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
- - struct pxa3xx_nand_host *host = info->host[info->cs];
- - struct mtd_info *mtd = host->mtd;
- - struct nand_chip *chip = mtd->priv;
-
- - /* configure default flash values */
- + /* Configure default flash values */
- + info->chunk_size = PAGE_CHUNK_SIZE;
- info->reg_ndcr = 0x0; /* enable all interrupts */
- info->reg_ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
- info->reg_ndcr |= NDCR_RD_ID_CNT(READ_ID_BYTES);
- - info->reg_ndcr |= NDCR_SPARE_EN; /* enable spare by default */
- + info->reg_ndcr |= NDCR_SPARE_EN;
- +
- + return 0;
- +}
- +
- +static void pxa3xx_nand_config_tail(struct pxa3xx_nand_info *info)
- +{
- + struct pxa3xx_nand_host *host = info->host[info->cs];
- + struct mtd_info *mtd = host->mtd;
- + struct nand_chip *chip = mtd->priv;
- +
- info->reg_ndcr |= (host->col_addr_cycles == 2) ? NDCR_RA_START : 0;
- info->reg_ndcr |= (chip->page_shift == 6) ? NDCR_PG_PER_BLK : 0;
- info->reg_ndcr |= (mtd->writesize == 2048) ? NDCR_PAGE_SZ : 0;
- -
- - return 0;
- }
-
- static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info)
- {
- + struct platform_device *pdev = info->pdev;
- + struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
- uint32_t ndcr = nand_readl(info, NDCR);
-
- /* Set an initial chunk size */
- info->chunk_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512;
- info->reg_ndcr = ndcr &
- ~(NDCR_INT_MASK | NDCR_ND_ARB_EN | NFCV1_NDCR_ARB_CNTL);
- + info->reg_ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
- info->ndtr0cs0 = nand_readl(info, NDTR0CS0);
- info->ndtr1cs0 = nand_readl(info, NDTR1CS0);
- return 0;
- @@ -1636,10 +1645,7 @@ static int pxa3xx_nand_scan(struct mtd_i
- if (pdata->keep_config && !pxa3xx_nand_detect_config(info))
- goto KEEP_CONFIG;
-
- - /* Set a default chunk size */
- - info->chunk_size = PAGE_CHUNK_SIZE;
- -
- - ret = pxa3xx_nand_config_flash(info);
- + ret = pxa3xx_nand_config_ident(info);
- if (ret)
- return ret;
-
- @@ -1652,7 +1658,6 @@ static int pxa3xx_nand_scan(struct mtd_i
- }
-
- KEEP_CONFIG:
- - info->reg_ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
- if (info->reg_ndcr & NDCR_DWIDTH_M)
- chip->options |= NAND_BUSWIDTH_16;
-
- @@ -1737,6 +1742,10 @@ KEEP_CONFIG:
- host->row_addr_cycles = 3;
- else
- host->row_addr_cycles = 2;
- +
- + if (!pdata->keep_config)
- + pxa3xx_nand_config_tail(info);
- +
- return nand_scan_tail(mtd);
- }
-
|