You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'nand/for-4.10' of github.com:linux-nand/linux
From Boris Brezillon:
"""
This pull request contains the following notable changes:
- new tango NAND controller driver
- new ox820 NAND controller driver
- addition of a new full-ID entry in the nand_ids table
- rework of the s3c240 driver to support DT
- extension of the nand_sdr_timings to expose tCCS, tPROG and tR
- addition of a new flag to ask the core to wait for tCCS when sending
a RNDIN/RNDOUT command
- addition of a new flag to ask the core to let the controller driver
send the READ/PROGPAGE command
This pull request also contains minor fixes/cleanup/cosmetic changes:
- properly support 512 ECC step size in the sunxi driver
- improve the error messages in the pxa probe path
- fix module autoload in the omap2 driver
- cleanup of several nand drivers to return nand_scan{_tail}() error
code instead of returning -EIO
- various cleanups in the denali driver
- cleanups in the ooblayout handling (MTD core)
- fix an error check in nandsim
"""
This commit is contained in:
@@ -1274,8 +1274,8 @@ static int mtd_ooblayout_get_bytes(struct mtd_info *mtd, u8 *buf,
|
||||
int section,
|
||||
struct mtd_oob_region *oobregion))
|
||||
{
|
||||
struct mtd_oob_region oobregion = { };
|
||||
int section = 0, ret;
|
||||
struct mtd_oob_region oobregion;
|
||||
int section, ret;
|
||||
|
||||
ret = mtd_ooblayout_find_region(mtd, start, §ion,
|
||||
&oobregion, iter);
|
||||
@@ -1283,7 +1283,7 @@ static int mtd_ooblayout_get_bytes(struct mtd_info *mtd, u8 *buf,
|
||||
while (!ret) {
|
||||
int cnt;
|
||||
|
||||
cnt = oobregion.length > nbytes ? nbytes : oobregion.length;
|
||||
cnt = min_t(int, nbytes, oobregion.length);
|
||||
memcpy(buf, oobbuf + oobregion.offset, cnt);
|
||||
buf += cnt;
|
||||
nbytes -= cnt;
|
||||
@@ -1317,8 +1317,8 @@ static int mtd_ooblayout_set_bytes(struct mtd_info *mtd, const u8 *buf,
|
||||
int section,
|
||||
struct mtd_oob_region *oobregion))
|
||||
{
|
||||
struct mtd_oob_region oobregion = { };
|
||||
int section = 0, ret;
|
||||
struct mtd_oob_region oobregion;
|
||||
int section, ret;
|
||||
|
||||
ret = mtd_ooblayout_find_region(mtd, start, §ion,
|
||||
&oobregion, iter);
|
||||
@@ -1326,7 +1326,7 @@ static int mtd_ooblayout_set_bytes(struct mtd_info *mtd, const u8 *buf,
|
||||
while (!ret) {
|
||||
int cnt;
|
||||
|
||||
cnt = oobregion.length > nbytes ? nbytes : oobregion.length;
|
||||
cnt = min_t(int, nbytes, oobregion.length);
|
||||
memcpy(oobbuf + oobregion.offset, buf, cnt);
|
||||
buf += cnt;
|
||||
nbytes -= cnt;
|
||||
@@ -1354,7 +1354,7 @@ static int mtd_ooblayout_count_bytes(struct mtd_info *mtd,
|
||||
int section,
|
||||
struct mtd_oob_region *oobregion))
|
||||
{
|
||||
struct mtd_oob_region oobregion = { };
|
||||
struct mtd_oob_region oobregion;
|
||||
int section = 0, ret, nbytes = 0;
|
||||
|
||||
while (1) {
|
||||
|
||||
@@ -179,15 +179,6 @@ config MTD_NAND_S3C2410_DEBUG
|
||||
help
|
||||
Enable debugging of the S3C NAND driver
|
||||
|
||||
config MTD_NAND_S3C2410_HWECC
|
||||
bool "Samsung S3C NAND Hardware ECC"
|
||||
depends on MTD_NAND_S3C2410
|
||||
help
|
||||
Enable the use of the controller's internal ECC generator when
|
||||
using NAND. Early versions of the chips have had problems with
|
||||
incorrect ECC generation, and if using these, the default of
|
||||
software ECC is preferable.
|
||||
|
||||
config MTD_NAND_NDFC
|
||||
tristate "NDFC NanD Flash Controller"
|
||||
depends on 4xx
|
||||
@@ -205,6 +196,13 @@ config MTD_NAND_S3C2410_CLKSTOP
|
||||
when the is NAND chip selected or released, but will save
|
||||
approximately 5mA of power when there is nothing happening.
|
||||
|
||||
config MTD_NAND_TANGO
|
||||
tristate "NAND Flash support for Tango chips"
|
||||
depends on ARCH_TANGO || COMPILE_TEST
|
||||
depends on HAS_DMA
|
||||
help
|
||||
Enables the NAND Flash controller on Tango chips.
|
||||
|
||||
config MTD_NAND_DISKONCHIP
|
||||
tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation)"
|
||||
depends on HAS_IOMEM
|
||||
@@ -426,6 +424,11 @@ config MTD_NAND_ORION
|
||||
No board specific support is done by this driver, each board
|
||||
must advertise a platform_device for the driver to attach.
|
||||
|
||||
config MTD_NAND_OXNAS
|
||||
tristate "NAND Flash support for Oxford Semiconductor SoC"
|
||||
help
|
||||
This enables the NAND flash controller on Oxford Semiconductor SoCs.
|
||||
|
||||
config MTD_NAND_FSL_ELBC
|
||||
tristate "NAND support for Freescale eLBC controllers"
|
||||
depends on FSL_SOC
|
||||
|
||||
@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_NAND_DENALI_DT) += denali_dt.o
|
||||
obj-$(CONFIG_MTD_NAND_AU1550) += au1550nd.o
|
||||
obj-$(CONFIG_MTD_NAND_BF5XX) += bf5xx_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_S3C2410) += s3c2410.o
|
||||
obj-$(CONFIG_MTD_NAND_TANGO) += tango_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_DAVINCI) += davinci_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_DISKONCHIP) += diskonchip.o
|
||||
obj-$(CONFIG_MTD_NAND_DOCG4) += docg4.o
|
||||
@@ -35,6 +36,7 @@ obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_OXNAS) += oxnas_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_FSL_ELBC) += fsl_elbc_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_FSL_IFC) += fsl_ifc_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_FSL_UPM) += fsl_upm.o
|
||||
|
||||
@@ -234,10 +234,9 @@ static int ams_delta_init(struct platform_device *pdev)
|
||||
goto out_gpio;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan(ams_delta_mtd, 1)) {
|
||||
err = -ENXIO;
|
||||
err = nand_scan(ams_delta_mtd, 1);
|
||||
if (err)
|
||||
goto out_mtd;
|
||||
}
|
||||
|
||||
/* Register the partitions */
|
||||
mtd_device_register(ams_delta_mtd, partition_info,
|
||||
|
||||
@@ -2267,10 +2267,9 @@ static int atmel_nand_probe(struct platform_device *pdev)
|
||||
dev_info(host->dev, "No DMA support for NAND access.\n");
|
||||
|
||||
/* first scan to find the device and get the page size */
|
||||
if (nand_scan_ident(mtd, 1, NULL)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_ident(mtd, 1, NULL);
|
||||
if (res)
|
||||
goto err_scan_ident;
|
||||
}
|
||||
|
||||
if (host->board.on_flash_bbt || on_flash_bbt)
|
||||
nand_chip->bbt_options |= NAND_BBT_USE_FLASH;
|
||||
@@ -2304,10 +2303,9 @@ static int atmel_nand_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* second phase scan */
|
||||
if (nand_scan_tail(mtd)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_tail(mtd);
|
||||
if (res)
|
||||
goto err_scan_tail;
|
||||
}
|
||||
|
||||
mtd->name = "atmel_nand";
|
||||
res = mtd_device_register(mtd, host->board.parts,
|
||||
|
||||
@@ -2209,8 +2209,9 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
||||
nand_writereg(ctrl, cfg_offs,
|
||||
nand_readreg(ctrl, cfg_offs) & ~CFG_BUS_WIDTH);
|
||||
|
||||
if (nand_scan_ident(mtd, 1, NULL))
|
||||
return -ENXIO;
|
||||
ret = nand_scan_ident(mtd, 1, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
chip->options |= NAND_NO_SUBPAGE_WRITE;
|
||||
/*
|
||||
@@ -2234,8 +2235,9 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (nand_scan_tail(mtd))
|
||||
return -ENXIO;
|
||||
ret = nand_scan_tail(mtd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return mtd_device_register(mtd, NULL, 0);
|
||||
}
|
||||
|
||||
@@ -725,10 +725,9 @@ static int cafe_nand_probe(struct pci_dev *pdev,
|
||||
usedma = 0;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan_ident(mtd, 2, NULL)) {
|
||||
err = -ENXIO;
|
||||
err = nand_scan_ident(mtd, 2, NULL);
|
||||
if (err)
|
||||
goto out_irq;
|
||||
}
|
||||
|
||||
cafe->dmabuf = dma_alloc_coherent(&cafe->pdev->dev,
|
||||
2112 + sizeof(struct nand_buffers) +
|
||||
|
||||
@@ -195,9 +195,9 @@ static int __init cmx270_init(void)
|
||||
this->write_buf = cmx270_write_buf;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan (cmx270_nand_mtd, 1)) {
|
||||
ret = nand_scan(cmx270_nand_mtd, 1);
|
||||
if (ret) {
|
||||
pr_notice("No NAND device\n");
|
||||
ret = -ENXIO;
|
||||
goto err_scan;
|
||||
}
|
||||
|
||||
|
||||
@@ -242,10 +242,9 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
|
||||
}
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan(new_mtd, 1)) {
|
||||
err = -ENXIO;
|
||||
err = nand_scan(new_mtd, 1);
|
||||
if (err)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
cs553x_mtd[cs] = new_mtd;
|
||||
goto out;
|
||||
|
||||
+21
-80
@@ -21,7 +21,6 @@
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -182,9 +181,6 @@ static uint16_t denali_nand_reset(struct denali_nand_info *denali)
|
||||
{
|
||||
int i;
|
||||
|
||||
dev_dbg(denali->dev, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
for (i = 0; i < denali->max_banks; i++)
|
||||
iowrite32(INTR_STATUS__RST_COMP | INTR_STATUS__TIME_OUT,
|
||||
denali->flash_reg + INTR_STATUS(i));
|
||||
@@ -234,9 +230,6 @@ static void nand_onfi_timing_set(struct denali_nand_info *denali,
|
||||
uint16_t acc_clks;
|
||||
uint16_t addr_2_data, re_2_we, re_2_re, we_2_re, cs_cnt;
|
||||
|
||||
dev_dbg(denali->dev, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
en_lo = CEIL_DIV(Trp[mode], CLK_X);
|
||||
en_hi = CEIL_DIV(Treh[mode], CLK_X);
|
||||
#if ONFI_BLOOM_TIME
|
||||
@@ -403,7 +396,7 @@ static void get_hynix_nand_para(struct denali_nand_info *denali,
|
||||
break;
|
||||
default:
|
||||
dev_warn(denali->dev,
|
||||
"Spectra: Unknown Hynix NAND (Device ID: 0x%x).\n"
|
||||
"Unknown Hynix NAND (Device ID: 0x%x).\n"
|
||||
"Will use default parameter values instead.\n",
|
||||
device_id);
|
||||
}
|
||||
@@ -474,33 +467,6 @@ static void detect_max_banks(struct denali_nand_info *denali)
|
||||
denali->max_banks = 1 << (features & FEATURES__N_BANKS);
|
||||
}
|
||||
|
||||
static void detect_partition_feature(struct denali_nand_info *denali)
|
||||
{
|
||||
/*
|
||||
* For MRST platform, denali->fwblks represent the
|
||||
* number of blocks firmware is taken,
|
||||
* FW is in protect partition and MTD driver has no
|
||||
* permission to access it. So let driver know how many
|
||||
* blocks it can't touch.
|
||||
*/
|
||||
if (ioread32(denali->flash_reg + FEATURES) & FEATURES__PARTITION) {
|
||||
if ((ioread32(denali->flash_reg + PERM_SRC_ID(1)) &
|
||||
PERM_SRC_ID__SRCID) == SPECTRA_PARTITION_ID) {
|
||||
denali->fwblks =
|
||||
((ioread32(denali->flash_reg + MIN_MAX_BANK(1)) &
|
||||
MIN_MAX_BANK__MIN_VALUE) *
|
||||
denali->blksperchip)
|
||||
+
|
||||
(ioread32(denali->flash_reg + MIN_BLK_ADDR(1)) &
|
||||
MIN_BLK_ADDR__VALUE);
|
||||
} else {
|
||||
denali->fwblks = SPECTRA_START_BLOCK;
|
||||
}
|
||||
} else {
|
||||
denali->fwblks = SPECTRA_START_BLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
static uint16_t denali_nand_timing_set(struct denali_nand_info *denali)
|
||||
{
|
||||
uint16_t status = PASS;
|
||||
@@ -508,9 +474,6 @@ static uint16_t denali_nand_timing_set(struct denali_nand_info *denali)
|
||||
uint8_t maf_id, device_id;
|
||||
int i;
|
||||
|
||||
dev_dbg(denali->dev, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
/*
|
||||
* Use read id method to get device ID and other params.
|
||||
* For some NAND chips, controller can't report the correct
|
||||
@@ -552,8 +515,6 @@ static uint16_t denali_nand_timing_set(struct denali_nand_info *denali)
|
||||
|
||||
find_valid_banks(denali);
|
||||
|
||||
detect_partition_feature(denali);
|
||||
|
||||
/*
|
||||
* If the user specified to override the default timings
|
||||
* with a specific ONFI mode, we apply those changes here.
|
||||
@@ -567,9 +528,6 @@ static uint16_t denali_nand_timing_set(struct denali_nand_info *denali)
|
||||
static void denali_set_intr_modes(struct denali_nand_info *denali,
|
||||
uint16_t INT_ENABLE)
|
||||
{
|
||||
dev_dbg(denali->dev, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
if (INT_ENABLE)
|
||||
iowrite32(1, denali->flash_reg + GLOBAL_INT_ENABLE);
|
||||
else
|
||||
@@ -605,7 +563,6 @@ static void denali_irq_init(struct denali_nand_info *denali)
|
||||
static void denali_irq_cleanup(int irqnum, struct denali_nand_info *denali)
|
||||
{
|
||||
denali_set_intr_modes(denali, false);
|
||||
free_irq(irqnum, denali);
|
||||
}
|
||||
|
||||
static void denali_irq_enable(struct denali_nand_info *denali,
|
||||
@@ -1437,9 +1394,6 @@ static struct nand_bbt_descr bbt_mirror_descr = {
|
||||
/* initialize driver data structures */
|
||||
static void denali_drv_init(struct denali_nand_info *denali)
|
||||
{
|
||||
denali->idx = 0;
|
||||
|
||||
/* setup interrupt handler */
|
||||
/*
|
||||
* the completion object will be used to notify
|
||||
* the callee that the interrupt is done
|
||||
@@ -1485,14 +1439,12 @@ int denali_init(struct denali_nand_info *denali)
|
||||
denali_hw_init(denali);
|
||||
denali_drv_init(denali);
|
||||
|
||||
/*
|
||||
* denali_isr register is done after all the hardware
|
||||
* initilization is finished
|
||||
*/
|
||||
if (request_irq(denali->irq, denali_isr, IRQF_SHARED,
|
||||
DENALI_NAND_NAME, denali)) {
|
||||
pr_err("Spectra: Unable to allocate IRQ\n");
|
||||
return -ENODEV;
|
||||
/* Request IRQ after all the hardware initialization is finished */
|
||||
ret = devm_request_irq(denali->dev, denali->irq, denali_isr,
|
||||
IRQF_SHARED, DENALI_NAND_NAME, denali);
|
||||
if (ret) {
|
||||
dev_err(denali->dev, "Unable to request IRQ\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* now that our ISR is registered, we can enable interrupts */
|
||||
@@ -1510,10 +1462,9 @@ int denali_init(struct denali_nand_info *denali)
|
||||
* this is the first stage in a two step process to register
|
||||
* with the nand subsystem
|
||||
*/
|
||||
if (nand_scan_ident(mtd, denali->max_banks, NULL)) {
|
||||
ret = -ENXIO;
|
||||
ret = nand_scan_ident(mtd, denali->max_banks, NULL);
|
||||
if (ret)
|
||||
goto failed_req_irq;
|
||||
}
|
||||
|
||||
/* allocate the right size buffer now */
|
||||
devm_kfree(denali->dev, denali->buf.buf);
|
||||
@@ -1528,7 +1479,7 @@ int denali_init(struct denali_nand_info *denali)
|
||||
/* Is 32-bit DMA supported? */
|
||||
ret = dma_set_mask(denali->dev, DMA_BIT_MASK(32));
|
||||
if (ret) {
|
||||
pr_err("Spectra: no usable DMA configuration\n");
|
||||
dev_err(denali->dev, "No usable DMA configuration\n");
|
||||
goto failed_req_irq;
|
||||
}
|
||||
|
||||
@@ -1536,7 +1487,7 @@ int denali_init(struct denali_nand_info *denali)
|
||||
mtd->writesize + mtd->oobsize,
|
||||
DMA_BIDIRECTIONAL);
|
||||
if (dma_mapping_error(denali->dev, denali->buf.dma_buf)) {
|
||||
dev_err(denali->dev, "Spectra: failed to map DMA buffer\n");
|
||||
dev_err(denali->dev, "Failed to map DMA buffer\n");
|
||||
ret = -EIO;
|
||||
goto failed_req_irq;
|
||||
}
|
||||
@@ -1547,16 +1498,16 @@ int denali_init(struct denali_nand_info *denali)
|
||||
* the real pagesize and anything necessery
|
||||
*/
|
||||
denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED);
|
||||
denali->nand.chipsize <<= (denali->devnum - 1);
|
||||
denali->nand.page_shift += (denali->devnum - 1);
|
||||
denali->nand.chipsize <<= denali->devnum - 1;
|
||||
denali->nand.page_shift += denali->devnum - 1;
|
||||
denali->nand.pagemask = (denali->nand.chipsize >>
|
||||
denali->nand.page_shift) - 1;
|
||||
denali->nand.bbt_erase_shift += (denali->devnum - 1);
|
||||
denali->nand.bbt_erase_shift += denali->devnum - 1;
|
||||
denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift;
|
||||
denali->nand.chip_shift += (denali->devnum - 1);
|
||||
mtd->writesize <<= (denali->devnum - 1);
|
||||
mtd->oobsize <<= (denali->devnum - 1);
|
||||
mtd->erasesize <<= (denali->devnum - 1);
|
||||
denali->nand.chip_shift += denali->devnum - 1;
|
||||
mtd->writesize <<= denali->devnum - 1;
|
||||
mtd->oobsize <<= denali->devnum - 1;
|
||||
mtd->erasesize <<= denali->devnum - 1;
|
||||
mtd->size = denali->nand.numchips * denali->nand.chipsize;
|
||||
denali->bbtskipbytes *= denali->devnum;
|
||||
|
||||
@@ -1606,14 +1557,6 @@ int denali_init(struct denali_nand_info *denali)
|
||||
denali->nand.ecc.bytes *= denali->devnum;
|
||||
denali->nand.ecc.strength *= denali->devnum;
|
||||
|
||||
/*
|
||||
* Let driver know the total blocks number and how many blocks
|
||||
* contained by each nand chip. blksperchip will help driver to
|
||||
* know how many blocks is taken by FW.
|
||||
*/
|
||||
denali->totalblks = mtd->size >> denali->nand.phys_erase_shift;
|
||||
denali->blksperchip = denali->totalblks / denali->nand.numchips;
|
||||
|
||||
/* override the default read operations */
|
||||
denali->nand.ecc.size = ECC_SECTOR_SIZE * denali->devnum;
|
||||
denali->nand.ecc.read_page = denali_read_page;
|
||||
@@ -1624,15 +1567,13 @@ int denali_init(struct denali_nand_info *denali)
|
||||
denali->nand.ecc.write_oob = denali_write_oob;
|
||||
denali->nand.erase = denali_erase;
|
||||
|
||||
if (nand_scan_tail(mtd)) {
|
||||
ret = -ENXIO;
|
||||
ret = nand_scan_tail(mtd);
|
||||
if (ret)
|
||||
goto failed_req_irq;
|
||||
}
|
||||
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(denali->dev, "Spectra: Failed to register MTD: %d\n",
|
||||
ret);
|
||||
dev_err(denali->dev, "Failed to register MTD: %d\n", ret);
|
||||
goto failed_req_irq;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -383,14 +383,6 @@
|
||||
#define CLK_X 5
|
||||
#define CLK_MULTI 4
|
||||
|
||||
/* spectraswconfig.h */
|
||||
#define CMD_DMA 0
|
||||
|
||||
#define SPECTRA_PARTITION_ID 0
|
||||
/**** Block Table and Reserved Block Parameters *****/
|
||||
#define SPECTRA_START_BLOCK 3
|
||||
#define NUM_FREE_BLOCKS_GATE 30
|
||||
|
||||
/* KBV - Updated to LNW scratch register address */
|
||||
#define SCRATCH_REG_ADDR CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR
|
||||
#define SCRATCH_REG_SIZE 64
|
||||
@@ -467,13 +459,9 @@ struct denali_nand_info {
|
||||
spinlock_t irq_lock;
|
||||
uint32_t irq_status;
|
||||
int irq_debug_array[32];
|
||||
int idx;
|
||||
int irq;
|
||||
|
||||
uint32_t devnum; /* represent how many nands connected */
|
||||
uint32_t fwblks; /* represent how many blocks FW used */
|
||||
uint32_t totalblks;
|
||||
uint32_t blksperchip;
|
||||
uint32_t bbtskipbytes;
|
||||
uint32_t max_banks;
|
||||
};
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "denali.h"
|
||||
|
||||
@@ -110,7 +109,7 @@ static int denali_dt_remove(struct platform_device *ofdev)
|
||||
struct denali_dt *dt = platform_get_drvdata(ofdev);
|
||||
|
||||
denali_remove(&dt->denali);
|
||||
clk_disable(dt->clk);
|
||||
clk_disable_unprepare(dt->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "denali.h"
|
||||
|
||||
|
||||
@@ -926,8 +926,8 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
|
||||
/*
|
||||
* Scan to find existence of the device
|
||||
*/
|
||||
if (nand_scan_ident(mtd, 1, NULL)) {
|
||||
ret = -ENXIO;
|
||||
ret = nand_scan_ident(mtd, 1, NULL);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "No NAND Device found!\n");
|
||||
goto err_scan_ident;
|
||||
}
|
||||
@@ -992,10 +992,9 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* Second stage of scan to fill MTD data-structures */
|
||||
if (nand_scan_tail(mtd)) {
|
||||
ret = -ENXIO;
|
||||
ret = nand_scan_tail(mtd);
|
||||
if (ret)
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
/*
|
||||
* The partition information can is accessed by (in the same precedence)
|
||||
|
||||
@@ -286,10 +286,9 @@ static int gpio_nand_probe(struct platform_device *pdev)
|
||||
if (gpio_is_valid(gpiomtd->plat.gpio_nwp))
|
||||
gpio_direction_output(gpiomtd->plat.gpio_nwp, 1);
|
||||
|
||||
if (nand_scan(mtd, 1)) {
|
||||
ret = -ENXIO;
|
||||
ret = nand_scan(mtd, 1);
|
||||
if (ret)
|
||||
goto err_wp;
|
||||
}
|
||||
|
||||
if (gpiomtd->plat.adjust_parts)
|
||||
gpiomtd->plat.adjust_parts(&gpiomtd->plat, mtd->size);
|
||||
|
||||
@@ -774,10 +774,8 @@ static int hisi_nfc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
ret = nand_scan_ident(mtd, max_chips, NULL);
|
||||
if (ret) {
|
||||
ret = -ENODEV;
|
||||
if (ret)
|
||||
goto err_res;
|
||||
}
|
||||
|
||||
host->buffer = dmam_alloc_coherent(dev, mtd->writesize + mtd->oobsize,
|
||||
&host->dma_buffer, GFP_KERNEL);
|
||||
|
||||
@@ -747,10 +747,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
* Scan to find existance of the device and
|
||||
* Get the type of NAND device SMALL block or LARGE block
|
||||
*/
|
||||
if (nand_scan_ident(mtd, 1, NULL)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_ident(mtd, 1, NULL);
|
||||
if (res)
|
||||
goto err_exit3;
|
||||
}
|
||||
|
||||
host->dma_buf = devm_kzalloc(&pdev->dev, mtd->writesize, GFP_KERNEL);
|
||||
if (!host->dma_buf) {
|
||||
@@ -793,10 +792,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
* Fills out all the uninitialized function pointers with the defaults
|
||||
* And scans for a bad block table if appropriate.
|
||||
*/
|
||||
if (nand_scan_tail(mtd)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_tail(mtd);
|
||||
if (res)
|
||||
goto err_exit4;
|
||||
}
|
||||
|
||||
mtd->name = DRV_NAME;
|
||||
|
||||
|
||||
@@ -894,10 +894,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* Find NAND device */
|
||||
if (nand_scan_ident(mtd, 1, NULL)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_ident(mtd, 1, NULL);
|
||||
if (res)
|
||||
goto err_exit3;
|
||||
}
|
||||
|
||||
/* OOB and ECC CPU and DMA work areas */
|
||||
host->ecc_buf = (uint32_t *)(host->data_buf + LPC32XX_DMA_DATA_SIZE);
|
||||
@@ -929,10 +928,9 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
/*
|
||||
* Fills out all the uninitialized function pointers with the defaults
|
||||
*/
|
||||
if (nand_scan_tail(mtd)) {
|
||||
res = -ENXIO;
|
||||
res = nand_scan_tail(mtd);
|
||||
if (res)
|
||||
goto err_exit3;
|
||||
}
|
||||
|
||||
mtd->name = "nxp_lpc3220_slc";
|
||||
res = mtd_device_register(mtd, host->ncfg->parts,
|
||||
|
||||
@@ -777,9 +777,9 @@ static int mpc5121_nfc_probe(struct platform_device *op)
|
||||
}
|
||||
|
||||
/* Detect NAND chips */
|
||||
if (nand_scan(mtd, be32_to_cpup(chips_no))) {
|
||||
retval = nand_scan(mtd, be32_to_cpup(chips_no));
|
||||
if (retval) {
|
||||
dev_err(dev, "NAND Flash not found !\n");
|
||||
retval = -ENXIO;
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
@@ -1297,7 +1297,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
|
||||
|
||||
ret = nand_scan_ident(mtd, nsels, NULL);
|
||||
if (ret)
|
||||
return -ENODEV;
|
||||
return ret;
|
||||
|
||||
/* store bbt magic in page, cause OOB is not protected */
|
||||
if (nand->bbt_options & NAND_BBT_USE_FLASH)
|
||||
@@ -1323,7 +1323,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
|
||||
|
||||
ret = nand_scan_tail(mtd);
|
||||
if (ret)
|
||||
return -ENODEV;
|
||||
return ret;
|
||||
|
||||
ret = mtd_device_parse_register(mtd, NULL, NULL, NULL, 0);
|
||||
if (ret) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user