Skip to content

Commit 829ec64

Browse files
committed
mtd: spi-nor: Trim what is exposed in spi-nor.h
The SPI NOR controllers drivers must not be able to use structures that are meant just for the SPI NOR core. struct spi_nor_flash_parameter is filled at run-time with info gathered from flash_info, manufacturer and sfdp data. struct spi_nor_flash_parameter should be opaque to the SPI NOR controller drivers, make sure it is. spi_nor_option_flags, spi_nor_read_command, spi_nor_pp_command, spi_nor_read_command_index and spi_nor_pp_command_index are defined for the core use, make sure they are opaque to the SPI NOR controller drivers. Signed-off-by: Tudor Ambarus <[email protected]> Reviewed-by: Boris Brezillon <[email protected]> Reviewed-by: Vignesh Raghavendra <[email protected]>
1 parent d3c4bb3 commit 829ec64

File tree

11 files changed

+294
-296
lines changed

11 files changed

+294
-296
lines changed

drivers/mtd/spi-nor/core.c

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -778,15 +778,15 @@ static int spi_nor_write_16bit_sr_and_check(struct spi_nor *nor, u8 sr1)
778778
ret = spi_nor_read_cr(nor, &sr_cr[1]);
779779
if (ret)
780780
return ret;
781-
} else if (nor->params.quad_enable) {
781+
} else if (nor->params->quad_enable) {
782782
/*
783783
* If the Status Register 2 Read command (35h) is not
784784
* supported, we should at least be sure we don't
785785
* change the value of the SR2 Quad Enable bit.
786786
*
787787
* We can safely assume that when the Quad Enable method is
788788
* set, the value of the QE bit is one, as a consequence of the
789-
* nor->params.quad_enable() call.
789+
* nor->params->quad_enable() call.
790790
*
791791
* We can safely assume that the Quad Enable bit is present in
792792
* the Status Register 2 at BIT(1). According to the JESD216
@@ -1051,14 +1051,19 @@ static u8 spi_nor_convert_3to4_erase(u8 opcode)
10511051
ARRAY_SIZE(spi_nor_3to4_erase));
10521052
}
10531053

1054+
static bool spi_nor_has_uniform_erase(const struct spi_nor *nor)
1055+
{
1056+
return !!nor->params->erase_map.uniform_erase_type;
1057+
}
1058+
10541059
static void spi_nor_set_4byte_opcodes(struct spi_nor *nor)
10551060
{
10561061
nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode);
10571062
nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode);
10581063
nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode);
10591064

10601065
if (!spi_nor_has_uniform_erase(nor)) {
1061-
struct spi_nor_erase_map *map = &nor->params.erase_map;
1066+
struct spi_nor_erase_map *map = &nor->params->erase_map;
10621067
struct spi_nor_erase_type *erase;
10631068
int i;
10641069

@@ -1095,10 +1100,10 @@ void spi_nor_unlock_and_unprep(struct spi_nor *nor)
10951100

10961101
static u32 spi_nor_convert_addr(struct spi_nor *nor, loff_t addr)
10971102
{
1098-
if (!nor->params.convert_addr)
1103+
if (!nor->params->convert_addr)
10991104
return addr;
11001105

1101-
return nor->params.convert_addr(nor, addr);
1106+
return nor->params->convert_addr(nor, addr);
11021107
}
11031108

11041109
/*
@@ -1203,6 +1208,16 @@ spi_nor_find_best_erase_type(const struct spi_nor_erase_map *map,
12031208
return NULL;
12041209
}
12051210

1211+
static u64 spi_nor_region_is_last(const struct spi_nor_erase_region *region)
1212+
{
1213+
return region->offset & SNOR_LAST_REGION;
1214+
}
1215+
1216+
static u64 spi_nor_region_end(const struct spi_nor_erase_region *region)
1217+
{
1218+
return (region->offset & ~SNOR_ERASE_FLAGS_MASK) + region->size;
1219+
}
1220+
12061221
/**
12071222
* spi_nor_region_next() - get the next spi nor region
12081223
* @region: pointer to a structure that describes a SPI NOR erase region
@@ -1307,7 +1322,7 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
13071322
struct list_head *erase_list,
13081323
u64 addr, u32 len)
13091324
{
1310-
const struct spi_nor_erase_map *map = &nor->params.erase_map;
1325+
const struct spi_nor_erase_map *map = &nor->params->erase_map;
13111326
const struct spi_nor_erase_type *erase, *prev_erase = NULL;
13121327
struct spi_nor_erase_region *region;
13131328
struct spi_nor_erase_command *cmd = NULL;
@@ -1793,7 +1808,7 @@ static int spi_nor_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
17931808
if (ret)
17941809
return ret;
17951810

1796-
ret = nor->params.locking_ops->lock(nor, ofs, len);
1811+
ret = nor->params->locking_ops->lock(nor, ofs, len);
17971812

17981813
spi_nor_unlock_and_unprep(nor);
17991814
return ret;
@@ -1808,7 +1823,7 @@ static int spi_nor_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
18081823
if (ret)
18091824
return ret;
18101825

1811-
ret = nor->params.locking_ops->unlock(nor, ofs, len);
1826+
ret = nor->params->locking_ops->unlock(nor, ofs, len);
18121827

18131828
spi_nor_unlock_and_unprep(nor);
18141829
return ret;
@@ -1823,7 +1838,7 @@ static int spi_nor_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
18231838
if (ret)
18241839
return ret;
18251840

1826-
ret = nor->params.locking_ops->is_locked(nor, ofs, len);
1841+
ret = nor->params->locking_ops->is_locked(nor, ofs, len);
18271842

18281843
spi_nor_unlock_and_unprep(nor);
18291844
return ret;
@@ -2288,7 +2303,7 @@ static int spi_nor_spimem_check_pp(struct spi_nor *nor,
22882303
static void
22892304
spi_nor_spimem_adjust_hwcaps(struct spi_nor *nor, u32 *hwcaps)
22902305
{
2291-
struct spi_nor_flash_parameter *params = &nor->params;
2306+
struct spi_nor_flash_parameter *params = nor->params;
22922307
unsigned int cap;
22932308

22942309
/* DTR modes are not supported yet, mask them all. */
@@ -2387,7 +2402,7 @@ static int spi_nor_select_read(struct spi_nor *nor,
23872402
if (cmd < 0)
23882403
return -EINVAL;
23892404

2390-
read = &nor->params.reads[cmd];
2405+
read = &nor->params->reads[cmd];
23912406
nor->read_opcode = read->opcode;
23922407
nor->read_proto = read->proto;
23932408

@@ -2418,7 +2433,7 @@ static int spi_nor_select_pp(struct spi_nor *nor,
24182433
if (cmd < 0)
24192434
return -EINVAL;
24202435

2421-
pp = &nor->params.page_programs[cmd];
2436+
pp = &nor->params->page_programs[cmd];
24222437
nor->program_opcode = pp->opcode;
24232438
nor->write_proto = pp->proto;
24242439
return 0;
@@ -2479,7 +2494,7 @@ spi_nor_select_uniform_erase(struct spi_nor_erase_map *map,
24792494

24802495
static int spi_nor_select_erase(struct spi_nor *nor)
24812496
{
2482-
struct spi_nor_erase_map *map = &nor->params.erase_map;
2497+
struct spi_nor_erase_map *map = &nor->params->erase_map;
24832498
const struct spi_nor_erase_type *erase = NULL;
24842499
struct mtd_info *mtd = &nor->mtd;
24852500
u32 wanted_size = nor->info->sector_size;
@@ -2528,7 +2543,7 @@ static int spi_nor_select_erase(struct spi_nor *nor)
25282543
static int spi_nor_default_setup(struct spi_nor *nor,
25292544
const struct spi_nor_hwcaps *hwcaps)
25302545
{
2531-
struct spi_nor_flash_parameter *params = &nor->params;
2546+
struct spi_nor_flash_parameter *params = nor->params;
25322547
u32 ignored_mask, shared_mask;
25332548
int err;
25342549

@@ -2589,10 +2604,10 @@ static int spi_nor_default_setup(struct spi_nor *nor,
25892604
static int spi_nor_setup(struct spi_nor *nor,
25902605
const struct spi_nor_hwcaps *hwcaps)
25912606
{
2592-
if (!nor->params.setup)
2607+
if (!nor->params->setup)
25932608
return 0;
25942609

2595-
return nor->params.setup(nor, hwcaps);
2610+
return nor->params->setup(nor, hwcaps);
25962611
}
25972612

25982613
/**
@@ -2622,13 +2637,13 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor)
26222637
{
26232638
struct spi_nor_flash_parameter sfdp_params;
26242639

2625-
memcpy(&sfdp_params, &nor->params, sizeof(sfdp_params));
2640+
memcpy(&sfdp_params, nor->params, sizeof(sfdp_params));
26262641

26272642
if (spi_nor_parse_sfdp(nor, &sfdp_params)) {
26282643
nor->addr_width = 0;
26292644
nor->flags &= ~SNOR_F_4B_OPCODES;
26302645
} else {
2631-
memcpy(&nor->params, &sfdp_params, sizeof(nor->params));
2646+
memcpy(nor->params, &sfdp_params, sizeof(*nor->params));
26322647
}
26332648
}
26342649

@@ -2639,7 +2654,7 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor)
26392654
*/
26402655
static void spi_nor_info_init_params(struct spi_nor *nor)
26412656
{
2642-
struct spi_nor_flash_parameter *params = &nor->params;
2657+
struct spi_nor_flash_parameter *params = nor->params;
26432658
struct spi_nor_erase_map *map = &params->erase_map;
26442659
const struct flash_info *info = nor->info;
26452660
struct device_node *np = spi_nor_get_flash_node(nor);
@@ -2758,8 +2773,8 @@ static void spi_nor_late_init_params(struct spi_nor *nor)
27582773
* NOR protection support. When locking_ops are not provided, we pick
27592774
* the default ones.
27602775
*/
2761-
if (nor->flags & SNOR_F_HAS_LOCK && !nor->params.locking_ops)
2762-
nor->params.locking_ops = &spi_nor_sr_locking_ops;
2776+
if (nor->flags & SNOR_F_HAS_LOCK && !nor->params->locking_ops)
2777+
nor->params->locking_ops = &spi_nor_sr_locking_ops;
27632778
}
27642779

27652780
/**
@@ -2799,8 +2814,12 @@ static void spi_nor_late_init_params(struct spi_nor *nor)
27992814
* ->default_init() hook or the SFDP parser do not set specific params.
28002815
* spi_nor_late_init_params()
28012816
*/
2802-
static void spi_nor_init_params(struct spi_nor *nor)
2817+
static int spi_nor_init_params(struct spi_nor *nor)
28032818
{
2819+
nor->params = devm_kzalloc(nor->dev, sizeof(*nor->params), GFP_KERNEL);
2820+
if (!nor->params)
2821+
return -ENOMEM;
2822+
28042823
spi_nor_info_init_params(nor);
28052824

28062825
spi_nor_manufacturer_init_params(nor);
@@ -2812,6 +2831,8 @@ static void spi_nor_init_params(struct spi_nor *nor)
28122831
spi_nor_post_sfdp_fixups(nor);
28132832

28142833
spi_nor_late_init_params(nor);
2834+
2835+
return 0;
28152836
}
28162837

28172838
/**
@@ -2822,14 +2843,14 @@ static void spi_nor_init_params(struct spi_nor *nor)
28222843
*/
28232844
static int spi_nor_quad_enable(struct spi_nor *nor)
28242845
{
2825-
if (!nor->params.quad_enable)
2846+
if (!nor->params->quad_enable)
28262847
return 0;
28272848

28282849
if (!(spi_nor_get_protocol_width(nor->read_proto) == 4 ||
28292850
spi_nor_get_protocol_width(nor->write_proto) == 4))
28302851
return 0;
28312852

2832-
return nor->params.quad_enable(nor);
2853+
return nor->params->quad_enable(nor);
28332854
}
28342855

28352856
/**
@@ -2844,7 +2865,7 @@ static int spi_nor_quad_enable(struct spi_nor *nor)
28442865
static int spi_nor_unlock_all(struct spi_nor *nor)
28452866
{
28462867
if (nor->flags & SNOR_F_HAS_LOCK)
2847-
return spi_nor_unlock(&nor->mtd, 0, nor->params.size);
2868+
return spi_nor_unlock(&nor->mtd, 0, nor->params->size);
28482869

28492870
return 0;
28502871
}
@@ -2875,7 +2896,7 @@ static int spi_nor_init(struct spi_nor *nor)
28752896
*/
28762897
WARN_ONCE(nor->flags & SNOR_F_BROKEN_RESET,
28772898
"enabling reset hack; may not recover from unexpected reboots\n");
2878-
nor->params.set_4byte_addr_mode(nor, true);
2899+
nor->params->set_4byte_addr_mode(nor, true);
28792900
}
28802901

28812902
return 0;
@@ -2899,7 +2920,7 @@ void spi_nor_restore(struct spi_nor *nor)
28992920
/* restore the addressing mode */
29002921
if (nor->addr_width == 4 && !(nor->flags & SNOR_F_4B_OPCODES) &&
29012922
nor->flags & SNOR_F_BROKEN_RESET)
2902-
nor->params.set_4byte_addr_mode(nor, false);
2923+
nor->params->set_4byte_addr_mode(nor, false);
29032924
}
29042925
EXPORT_SYMBOL_GPL(spi_nor_restore);
29052926

@@ -3004,7 +3025,6 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
30043025
struct device *dev = nor->dev;
30053026
struct mtd_info *mtd = &nor->mtd;
30063027
struct device_node *np = spi_nor_get_flash_node(nor);
3007-
struct spi_nor_flash_parameter *params = &nor->params;
30083028
int ret;
30093029
int i;
30103030

@@ -3055,20 +3075,22 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
30553075
mtd->_write = spi_nor_write;
30563076

30573077
/* Init flash parameters based on flash_info struct and SFDP */
3058-
spi_nor_init_params(nor);
3078+
ret = spi_nor_init_params(nor);
3079+
if (ret)
3080+
return ret;
30593081

30603082
if (!mtd->name)
30613083
mtd->name = dev_name(dev);
30623084
mtd->priv = nor;
30633085
mtd->type = MTD_NORFLASH;
30643086
mtd->writesize = 1;
30653087
mtd->flags = MTD_CAP_NORFLASH;
3066-
mtd->size = params->size;
3088+
mtd->size = nor->params->size;
30673089
mtd->_erase = spi_nor_erase;
30683090
mtd->_read = spi_nor_read;
30693091
mtd->_resume = spi_nor_resume;
30703092

3071-
if (nor->params.locking_ops) {
3093+
if (nor->params->locking_ops) {
30723094
mtd->_lock = spi_nor_lock;
30733095
mtd->_unlock = spi_nor_unlock;
30743096
mtd->_is_locked = spi_nor_is_locked;
@@ -3091,7 +3113,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
30913113
mtd->flags |= MTD_NO_ERASE;
30923114

30933115
mtd->dev.parent = dev;
3094-
nor->page_size = params->page_size;
3116+
nor->page_size = nor->params->page_size;
30953117
mtd->writebufsize = nor->page_size;
30963118

30973119
if (of_property_read_bool(np, "broken-flash-reset"))

0 commit comments

Comments
 (0)