Skip to content

Commit 869acb8

Browse files
committed
Merge tag 'nand/for-6.12' into mtd/next
* Raw NAND changes The use of for_each_child_of_node_scoped() has been spread into the subsystem drivers. Aside from that, a couple of exit path have been fixed (mtk, denali), the TI GPMC bindings have been enhanced to comply with up-to-date partition descriptions and as always there is a load of small and misc fixes. * SPI-NAND changes The most impacting series this cycle is bringing support for continuous reads in the SPI-NAND subsystem. This is a feature already merged in the raw NAND subsystem which allows optimizing the internal fetch times in the chip while reading sequential pages within an eraseblock. For now only Macronix NANDs benefit from this feature. While we are talking about Macronix, some of their chip need an explicit action for selecting a different plane, and support for it has also been brought. The bitflip threshold has also been set to the same arbitrary level as in the raw NAND subsystem to optimize wear leveling decisions, and finally support for a new Winbond chip has been added.
2 parents 5d09909 + 475aade commit 869acb8

22 files changed

+559
-289
lines changed

Documentation/devicetree/bindings/mtd/ti,gpmc-nand.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,9 @@ properties:
6161
GPIO connection to R/B signal from NAND chip
6262
maxItems: 1
6363

64-
patternProperties:
65-
"@[0-9a-f]+$":
66-
$ref: /schemas/mtd/partitions/partition.yaml
67-
6864
allOf:
6965
- $ref: /schemas/memory-controllers/ti,gpmc-child.yaml
66+
- $ref: mtd.yaml#
7067

7168
required:
7269
- compatible

drivers/mtd/nand/raw/arasan-nand-controller.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,7 +1360,7 @@ static void anfc_chips_cleanup(struct arasan_nfc *nfc)
13601360

13611361
static int anfc_chips_init(struct arasan_nfc *nfc)
13621362
{
1363-
struct device_node *np = nfc->dev->of_node, *nand_np;
1363+
struct device_node *np = nfc->dev->of_node;
13641364
int nchips = of_get_child_count(np);
13651365
int ret;
13661366

@@ -1370,10 +1370,9 @@ static int anfc_chips_init(struct arasan_nfc *nfc)
13701370
return -EINVAL;
13711371
}
13721372

1373-
for_each_child_of_node(np, nand_np) {
1373+
for_each_child_of_node_scoped(np, nand_np) {
13741374
ret = anfc_chip_init(nfc, nand_np);
13751375
if (ret) {
1376-
of_node_put(nand_np);
13771376
anfc_chips_cleanup(nfc);
13781377
break;
13791378
}

drivers/mtd/nand/raw/atmel/nand-controller.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2049,7 +2049,10 @@ static int atmel_nand_controller_init(struct atmel_nand_controller *nc,
20492049
dma_cap_set(DMA_MEMCPY, mask);
20502050

20512051
nc->dmac = dma_request_channel(mask, NULL, NULL);
2052-
if (!nc->dmac)
2052+
if (nc->dmac)
2053+
dev_info(nc->dev, "using %s for DMA transfers\n",
2054+
dma_chan_name(nc->dmac));
2055+
else
20532056
dev_err(nc->dev, "Failed to request DMA channel\n");
20542057
}
20552058

drivers/mtd/nand/raw/cadence-nand-controller.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,7 +2836,6 @@ static void cadence_nand_chips_cleanup(struct cdns_nand_ctrl *cdns_ctrl)
28362836
static int cadence_nand_chips_init(struct cdns_nand_ctrl *cdns_ctrl)
28372837
{
28382838
struct device_node *np = cdns_ctrl->dev->of_node;
2839-
struct device_node *nand_np;
28402839
int max_cs = cdns_ctrl->caps2.max_banks;
28412840
int nchips, ret;
28422841

@@ -2849,10 +2848,9 @@ static int cadence_nand_chips_init(struct cdns_nand_ctrl *cdns_ctrl)
28492848
return -EINVAL;
28502849
}
28512850

2852-
for_each_child_of_node(np, nand_np) {
2851+
for_each_child_of_node_scoped(np, nand_np) {
28532852
ret = cadence_nand_chip_init(cdns_ctrl, nand_np);
28542853
if (ret) {
2855-
of_node_put(nand_np);
28562854
cadence_nand_chips_cleanup(cdns_ctrl);
28572855
return ret;
28582856
}

drivers/mtd/nand/raw/davinci_nand.c

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,71 @@
2020
#include <linux/slab.h>
2121
#include <linux/of.h>
2222

23-
#include <linux/platform_data/mtd-davinci.h>
24-
#include <linux/platform_data/mtd-davinci-aemif.h>
23+
#define NRCSR_OFFSET 0x00
24+
#define NANDFCR_OFFSET 0x60
25+
#define NANDFSR_OFFSET 0x64
26+
#define NANDF1ECC_OFFSET 0x70
27+
28+
/* 4-bit ECC syndrome registers */
29+
#define NAND_4BIT_ECC_LOAD_OFFSET 0xbc
30+
#define NAND_4BIT_ECC1_OFFSET 0xc0
31+
#define NAND_4BIT_ECC2_OFFSET 0xc4
32+
#define NAND_4BIT_ECC3_OFFSET 0xc8
33+
#define NAND_4BIT_ECC4_OFFSET 0xcc
34+
#define NAND_ERR_ADD1_OFFSET 0xd0
35+
#define NAND_ERR_ADD2_OFFSET 0xd4
36+
#define NAND_ERR_ERRVAL1_OFFSET 0xd8
37+
#define NAND_ERR_ERRVAL2_OFFSET 0xdc
38+
39+
/* NOTE: boards don't need to use these address bits
40+
* for ALE/CLE unless they support booting from NAND.
41+
* They're used unless platform data overrides them.
42+
*/
43+
#define MASK_ALE 0x08
44+
#define MASK_CLE 0x10
45+
46+
struct davinci_nand_pdata {
47+
uint32_t mask_ale;
48+
uint32_t mask_cle;
49+
50+
/*
51+
* 0-indexed chip-select number of the asynchronous
52+
* interface to which the NAND device has been connected.
53+
*
54+
* So, if you have NAND connected to CS3 of DA850, you
55+
* will pass '1' here. Since the asynchronous interface
56+
* on DA850 starts from CS2.
57+
*/
58+
uint32_t core_chipsel;
59+
60+
/* for packages using two chipselects */
61+
uint32_t mask_chipsel;
62+
63+
/* board's default static partition info */
64+
struct mtd_partition *parts;
65+
unsigned int nr_parts;
66+
67+
/* none == NAND_ECC_ENGINE_TYPE_NONE (strongly *not* advised!!)
68+
* soft == NAND_ECC_ENGINE_TYPE_SOFT
69+
* else == NAND_ECC_ENGINE_TYPE_ON_HOST, according to ecc_bits
70+
*
71+
* All DaVinci-family chips support 1-bit hardware ECC.
72+
* Newer ones also support 4-bit ECC, but are awkward
73+
* using it with large page chips.
74+
*/
75+
enum nand_ecc_engine_type engine_type;
76+
enum nand_ecc_placement ecc_placement;
77+
u8 ecc_bits;
78+
79+
/* e.g. NAND_BUSWIDTH_16 */
80+
unsigned int options;
81+
/* e.g. NAND_BBT_USE_FLASH */
82+
unsigned int bbt_options;
83+
84+
/* Main and mirror bbt descriptor overrides */
85+
struct nand_bbt_descr *bbt_td;
86+
struct nand_bbt_descr *bbt_md;
87+
};
2588

2689
/*
2790
* This is a device driver for the NAND flash controller found on the
@@ -54,8 +117,6 @@ struct davinci_nand_info {
54117
uint32_t mask_cle;
55118

56119
uint32_t core_chipsel;
57-
58-
struct davinci_aemif_timing *timing;
59120
};
60121

61122
static DEFINE_SPINLOCK(davinci_nand_lock);
@@ -775,7 +836,6 @@ static int nand_davinci_probe(struct platform_device *pdev)
775836
info->chip.options = pdata->options;
776837
info->chip.bbt_td = pdata->bbt_td;
777838
info->chip.bbt_md = pdata->bbt_md;
778-
info->timing = pdata->timing;
779839

780840
info->current_cs = info->vaddr;
781841
info->core_chipsel = pdata->core_chipsel;

drivers/mtd/nand/raw/denali_dt.c

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,15 @@ static int denali_dt_probe(struct platform_device *pdev)
145145
if (IS_ERR(denali->host))
146146
return PTR_ERR(denali->host);
147147

148-
dt->clk = devm_clk_get(dev, "nand");
148+
dt->clk = devm_clk_get_enabled(dev, "nand");
149149
if (IS_ERR(dt->clk))
150150
return PTR_ERR(dt->clk);
151151

152-
dt->clk_x = devm_clk_get(dev, "nand_x");
152+
dt->clk_x = devm_clk_get_enabled(dev, "nand_x");
153153
if (IS_ERR(dt->clk_x))
154154
return PTR_ERR(dt->clk_x);
155155

156-
dt->clk_ecc = devm_clk_get(dev, "ecc");
156+
dt->clk_ecc = devm_clk_get_enabled(dev, "ecc");
157157
if (IS_ERR(dt->clk_ecc))
158158
return PTR_ERR(dt->clk_ecc);
159159

@@ -165,18 +165,6 @@ static int denali_dt_probe(struct platform_device *pdev)
165165
if (IS_ERR(dt->rst_reg))
166166
return PTR_ERR(dt->rst_reg);
167167

168-
ret = clk_prepare_enable(dt->clk);
169-
if (ret)
170-
return ret;
171-
172-
ret = clk_prepare_enable(dt->clk_x);
173-
if (ret)
174-
goto out_disable_clk;
175-
176-
ret = clk_prepare_enable(dt->clk_ecc);
177-
if (ret)
178-
goto out_disable_clk_x;
179-
180168
denali->clk_rate = clk_get_rate(dt->clk);
181169
denali->clk_x_rate = clk_get_rate(dt->clk_x);
182170

@@ -187,7 +175,7 @@ static int denali_dt_probe(struct platform_device *pdev)
187175
*/
188176
ret = reset_control_deassert(dt->rst_reg);
189177
if (ret)
190-
goto out_disable_clk_ecc;
178+
return ret;
191179

192180
ret = reset_control_deassert(dt->rst);
193181
if (ret)
@@ -222,12 +210,6 @@ static int denali_dt_probe(struct platform_device *pdev)
222210
reset_control_assert(dt->rst);
223211
out_assert_rst_reg:
224212
reset_control_assert(dt->rst_reg);
225-
out_disable_clk_ecc:
226-
clk_disable_unprepare(dt->clk_ecc);
227-
out_disable_clk_x:
228-
clk_disable_unprepare(dt->clk_x);
229-
out_disable_clk:
230-
clk_disable_unprepare(dt->clk);
231213

232214
return ret;
233215
}
@@ -239,9 +221,6 @@ static void denali_dt_remove(struct platform_device *pdev)
239221
denali_remove(&dt->controller);
240222
reset_control_assert(dt->rst);
241223
reset_control_assert(dt->rst_reg);
242-
clk_disable_unprepare(dt->clk_ecc);
243-
clk_disable_unprepare(dt->clk_x);
244-
clk_disable_unprepare(dt->clk);
245224
}
246225

247226
static struct platform_driver denali_dt_driver = {

drivers/mtd/nand/raw/denali_pci.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,20 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
7777
denali->reg = devm_ioremap(denali->dev, csr_base, csr_len);
7878
if (!denali->reg) {
7979
dev_err(&dev->dev, "Spectra: Unable to remap memory region\n");
80-
return -ENOMEM;
80+
ret = -ENOMEM;
81+
goto regions_release;
8182
}
8283

8384
denali->host = devm_ioremap(denali->dev, mem_base, mem_len);
8485
if (!denali->host) {
8586
dev_err(&dev->dev, "Spectra: ioremap failed!");
86-
return -ENOMEM;
87+
ret = -ENOMEM;
88+
goto regions_release;
8789
}
8890

8991
ret = denali_init(denali);
9092
if (ret)
91-
return ret;
93+
goto regions_release;
9294

9395
nsels = denali->nbanks;
9496

@@ -116,13 +118,16 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
116118

117119
out_remove_denali:
118120
denali_remove(denali);
121+
regions_release:
122+
pci_release_regions(dev);
119123
return ret;
120124
}
121125

122126
static void denali_pci_remove(struct pci_dev *dev)
123127
{
124128
struct denali_controller *denali = pci_get_drvdata(dev);
125129

130+
pci_release_regions(dev);
126131
denali_remove(denali);
127132
}
128133

drivers/mtd/nand/raw/marvell_nand.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,7 +2771,6 @@ static void marvell_nand_chips_cleanup(struct marvell_nfc *nfc)
27712771
static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc)
27722772
{
27732773
struct device_node *np = dev->of_node;
2774-
struct device_node *nand_np;
27752774
int max_cs = nfc->caps->max_cs_nb;
27762775
int nchips;
27772776
int ret;
@@ -2798,20 +2797,15 @@ static int marvell_nand_chips_init(struct device *dev, struct marvell_nfc *nfc)
27982797
return ret;
27992798
}
28002799

2801-
for_each_child_of_node(np, nand_np) {
2800+
for_each_child_of_node_scoped(np, nand_np) {
28022801
ret = marvell_nand_chip_init(dev, nfc, nand_np);
28032802
if (ret) {
2804-
of_node_put(nand_np);
2805-
goto cleanup_chips;
2803+
marvell_nand_chips_cleanup(nfc);
2804+
return ret;
28062805
}
28072806
}
28082807

28092808
return 0;
2810-
2811-
cleanup_chips:
2812-
marvell_nand_chips_cleanup(nfc);
2813-
2814-
return ret;
28152809
}
28162810

28172811
static int marvell_nfc_init_dma(struct marvell_nfc *nfc)

drivers/mtd/nand/raw/meson_nand.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,7 +1475,7 @@ meson_nfc_nand_chip_init(struct device *dev,
14751475
return 0;
14761476
}
14771477

1478-
static void meson_nfc_nand_chip_cleanup(struct meson_nfc *nfc)
1478+
static void meson_nfc_nand_chips_cleanup(struct meson_nfc *nfc)
14791479
{
14801480
struct meson_nfc_nand_chip *meson_chip;
14811481
struct mtd_info *mtd;
@@ -1495,14 +1495,12 @@ static int meson_nfc_nand_chips_init(struct device *dev,
14951495
struct meson_nfc *nfc)
14961496
{
14971497
struct device_node *np = dev->of_node;
1498-
struct device_node *nand_np;
14991498
int ret;
15001499

1501-
for_each_child_of_node(np, nand_np) {
1500+
for_each_child_of_node_scoped(np, nand_np) {
15021501
ret = meson_nfc_nand_chip_init(dev, nfc, nand_np);
15031502
if (ret) {
1504-
meson_nfc_nand_chip_cleanup(nfc);
1505-
of_node_put(nand_np);
1503+
meson_nfc_nand_chips_cleanup(nfc);
15061504
return ret;
15071505
}
15081506
}
@@ -1616,7 +1614,7 @@ static void meson_nfc_remove(struct platform_device *pdev)
16161614
{
16171615
struct meson_nfc *nfc = platform_get_drvdata(pdev);
16181616

1619-
meson_nfc_nand_chip_cleanup(nfc);
1617+
meson_nfc_nand_chips_cleanup(nfc);
16201618

16211619
meson_nfc_disable_clk(nfc);
16221620
}

drivers/mtd/nand/raw/mtk_nand.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,16 +1429,32 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc,
14291429
return 0;
14301430
}
14311431

1432+
static void mtk_nfc_nand_chips_cleanup(struct mtk_nfc *nfc)
1433+
{
1434+
struct mtk_nfc_nand_chip *mtk_chip;
1435+
struct nand_chip *chip;
1436+
int ret;
1437+
1438+
while (!list_empty(&nfc->chips)) {
1439+
mtk_chip = list_first_entry(&nfc->chips,
1440+
struct mtk_nfc_nand_chip, node);
1441+
chip = &mtk_chip->nand;
1442+
ret = mtd_device_unregister(nand_to_mtd(chip));
1443+
WARN_ON(ret);
1444+
nand_cleanup(chip);
1445+
list_del(&mtk_chip->node);
1446+
}
1447+
}
1448+
14321449
static int mtk_nfc_nand_chips_init(struct device *dev, struct mtk_nfc *nfc)
14331450
{
14341451
struct device_node *np = dev->of_node;
1435-
struct device_node *nand_np;
14361452
int ret;
14371453

1438-
for_each_child_of_node(np, nand_np) {
1454+
for_each_child_of_node_scoped(np, nand_np) {
14391455
ret = mtk_nfc_nand_chip_init(dev, nfc, nand_np);
14401456
if (ret) {
1441-
of_node_put(nand_np);
1457+
mtk_nfc_nand_chips_cleanup(nfc);
14421458
return ret;
14431459
}
14441460
}
@@ -1570,20 +1586,8 @@ static int mtk_nfc_probe(struct platform_device *pdev)
15701586
static void mtk_nfc_remove(struct platform_device *pdev)
15711587
{
15721588
struct mtk_nfc *nfc = platform_get_drvdata(pdev);
1573-
struct mtk_nfc_nand_chip *mtk_chip;
1574-
struct nand_chip *chip;
1575-
int ret;
1576-
1577-
while (!list_empty(&nfc->chips)) {
1578-
mtk_chip = list_first_entry(&nfc->chips,
1579-
struct mtk_nfc_nand_chip, node);
1580-
chip = &mtk_chip->nand;
1581-
ret = mtd_device_unregister(nand_to_mtd(chip));
1582-
WARN_ON(ret);
1583-
nand_cleanup(chip);
1584-
list_del(&mtk_chip->node);
1585-
}
15861589

1590+
mtk_nfc_nand_chips_cleanup(nfc);
15871591
mtk_ecc_release(nfc->ecc);
15881592
}
15891593

0 commit comments

Comments
 (0)