@@ -778,15 +778,15 @@ static int spi_nor_write_16bit_sr_and_check(struct spi_nor *nor, u8 sr1)
778
778
ret = spi_nor_read_cr (nor , & sr_cr [1 ]);
779
779
if (ret )
780
780
return ret ;
781
- } else if (nor -> params . quad_enable ) {
781
+ } else if (nor -> params -> quad_enable ) {
782
782
/*
783
783
* If the Status Register 2 Read command (35h) is not
784
784
* supported, we should at least be sure we don't
785
785
* change the value of the SR2 Quad Enable bit.
786
786
*
787
787
* We can safely assume that when the Quad Enable method is
788
788
* 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.
790
790
*
791
791
* We can safely assume that the Quad Enable bit is present in
792
792
* the Status Register 2 at BIT(1). According to the JESD216
@@ -1051,14 +1051,19 @@ static u8 spi_nor_convert_3to4_erase(u8 opcode)
1051
1051
ARRAY_SIZE (spi_nor_3to4_erase ));
1052
1052
}
1053
1053
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
+
1054
1059
static void spi_nor_set_4byte_opcodes (struct spi_nor * nor )
1055
1060
{
1056
1061
nor -> read_opcode = spi_nor_convert_3to4_read (nor -> read_opcode );
1057
1062
nor -> program_opcode = spi_nor_convert_3to4_program (nor -> program_opcode );
1058
1063
nor -> erase_opcode = spi_nor_convert_3to4_erase (nor -> erase_opcode );
1059
1064
1060
1065
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 ;
1062
1067
struct spi_nor_erase_type * erase ;
1063
1068
int i ;
1064
1069
@@ -1095,10 +1100,10 @@ void spi_nor_unlock_and_unprep(struct spi_nor *nor)
1095
1100
1096
1101
static u32 spi_nor_convert_addr (struct spi_nor * nor , loff_t addr )
1097
1102
{
1098
- if (!nor -> params . convert_addr )
1103
+ if (!nor -> params -> convert_addr )
1099
1104
return addr ;
1100
1105
1101
- return nor -> params . convert_addr (nor , addr );
1106
+ return nor -> params -> convert_addr (nor , addr );
1102
1107
}
1103
1108
1104
1109
/*
@@ -1203,6 +1208,16 @@ spi_nor_find_best_erase_type(const struct spi_nor_erase_map *map,
1203
1208
return NULL ;
1204
1209
}
1205
1210
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
+
1206
1221
/**
1207
1222
* spi_nor_region_next() - get the next spi nor region
1208
1223
* @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,
1307
1322
struct list_head * erase_list ,
1308
1323
u64 addr , u32 len )
1309
1324
{
1310
- const struct spi_nor_erase_map * map = & nor -> params . erase_map ;
1325
+ const struct spi_nor_erase_map * map = & nor -> params -> erase_map ;
1311
1326
const struct spi_nor_erase_type * erase , * prev_erase = NULL ;
1312
1327
struct spi_nor_erase_region * region ;
1313
1328
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)
1793
1808
if (ret )
1794
1809
return ret ;
1795
1810
1796
- ret = nor -> params . locking_ops -> lock (nor , ofs , len );
1811
+ ret = nor -> params -> locking_ops -> lock (nor , ofs , len );
1797
1812
1798
1813
spi_nor_unlock_and_unprep (nor );
1799
1814
return ret ;
@@ -1808,7 +1823,7 @@ static int spi_nor_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1808
1823
if (ret )
1809
1824
return ret ;
1810
1825
1811
- ret = nor -> params . locking_ops -> unlock (nor , ofs , len );
1826
+ ret = nor -> params -> locking_ops -> unlock (nor , ofs , len );
1812
1827
1813
1828
spi_nor_unlock_and_unprep (nor );
1814
1829
return ret ;
@@ -1823,7 +1838,7 @@ static int spi_nor_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1823
1838
if (ret )
1824
1839
return ret ;
1825
1840
1826
- ret = nor -> params . locking_ops -> is_locked (nor , ofs , len );
1841
+ ret = nor -> params -> locking_ops -> is_locked (nor , ofs , len );
1827
1842
1828
1843
spi_nor_unlock_and_unprep (nor );
1829
1844
return ret ;
@@ -2288,7 +2303,7 @@ static int spi_nor_spimem_check_pp(struct spi_nor *nor,
2288
2303
static void
2289
2304
spi_nor_spimem_adjust_hwcaps (struct spi_nor * nor , u32 * hwcaps )
2290
2305
{
2291
- struct spi_nor_flash_parameter * params = & nor -> params ;
2306
+ struct spi_nor_flash_parameter * params = nor -> params ;
2292
2307
unsigned int cap ;
2293
2308
2294
2309
/* DTR modes are not supported yet, mask them all. */
@@ -2387,7 +2402,7 @@ static int spi_nor_select_read(struct spi_nor *nor,
2387
2402
if (cmd < 0 )
2388
2403
return - EINVAL ;
2389
2404
2390
- read = & nor -> params . reads [cmd ];
2405
+ read = & nor -> params -> reads [cmd ];
2391
2406
nor -> read_opcode = read -> opcode ;
2392
2407
nor -> read_proto = read -> proto ;
2393
2408
@@ -2418,7 +2433,7 @@ static int spi_nor_select_pp(struct spi_nor *nor,
2418
2433
if (cmd < 0 )
2419
2434
return - EINVAL ;
2420
2435
2421
- pp = & nor -> params . page_programs [cmd ];
2436
+ pp = & nor -> params -> page_programs [cmd ];
2422
2437
nor -> program_opcode = pp -> opcode ;
2423
2438
nor -> write_proto = pp -> proto ;
2424
2439
return 0 ;
@@ -2479,7 +2494,7 @@ spi_nor_select_uniform_erase(struct spi_nor_erase_map *map,
2479
2494
2480
2495
static int spi_nor_select_erase (struct spi_nor * nor )
2481
2496
{
2482
- struct spi_nor_erase_map * map = & nor -> params . erase_map ;
2497
+ struct spi_nor_erase_map * map = & nor -> params -> erase_map ;
2483
2498
const struct spi_nor_erase_type * erase = NULL ;
2484
2499
struct mtd_info * mtd = & nor -> mtd ;
2485
2500
u32 wanted_size = nor -> info -> sector_size ;
@@ -2528,7 +2543,7 @@ static int spi_nor_select_erase(struct spi_nor *nor)
2528
2543
static int spi_nor_default_setup (struct spi_nor * nor ,
2529
2544
const struct spi_nor_hwcaps * hwcaps )
2530
2545
{
2531
- struct spi_nor_flash_parameter * params = & nor -> params ;
2546
+ struct spi_nor_flash_parameter * params = nor -> params ;
2532
2547
u32 ignored_mask , shared_mask ;
2533
2548
int err ;
2534
2549
@@ -2589,10 +2604,10 @@ static int spi_nor_default_setup(struct spi_nor *nor,
2589
2604
static int spi_nor_setup (struct spi_nor * nor ,
2590
2605
const struct spi_nor_hwcaps * hwcaps )
2591
2606
{
2592
- if (!nor -> params . setup )
2607
+ if (!nor -> params -> setup )
2593
2608
return 0 ;
2594
2609
2595
- return nor -> params . setup (nor , hwcaps );
2610
+ return nor -> params -> setup (nor , hwcaps );
2596
2611
}
2597
2612
2598
2613
/**
@@ -2622,13 +2637,13 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor)
2622
2637
{
2623
2638
struct spi_nor_flash_parameter sfdp_params ;
2624
2639
2625
- memcpy (& sfdp_params , & nor -> params , sizeof (sfdp_params ));
2640
+ memcpy (& sfdp_params , nor -> params , sizeof (sfdp_params ));
2626
2641
2627
2642
if (spi_nor_parse_sfdp (nor , & sfdp_params )) {
2628
2643
nor -> addr_width = 0 ;
2629
2644
nor -> flags &= ~SNOR_F_4B_OPCODES ;
2630
2645
} else {
2631
- memcpy (& nor -> params , & sfdp_params , sizeof (nor -> params ));
2646
+ memcpy (nor -> params , & sfdp_params , sizeof (* nor -> params ));
2632
2647
}
2633
2648
}
2634
2649
@@ -2639,7 +2654,7 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor)
2639
2654
*/
2640
2655
static void spi_nor_info_init_params (struct spi_nor * nor )
2641
2656
{
2642
- struct spi_nor_flash_parameter * params = & nor -> params ;
2657
+ struct spi_nor_flash_parameter * params = nor -> params ;
2643
2658
struct spi_nor_erase_map * map = & params -> erase_map ;
2644
2659
const struct flash_info * info = nor -> info ;
2645
2660
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)
2758
2773
* NOR protection support. When locking_ops are not provided, we pick
2759
2774
* the default ones.
2760
2775
*/
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 ;
2763
2778
}
2764
2779
2765
2780
/**
@@ -2799,8 +2814,12 @@ static void spi_nor_late_init_params(struct spi_nor *nor)
2799
2814
* ->default_init() hook or the SFDP parser do not set specific params.
2800
2815
* spi_nor_late_init_params()
2801
2816
*/
2802
- static void spi_nor_init_params (struct spi_nor * nor )
2817
+ static int spi_nor_init_params (struct spi_nor * nor )
2803
2818
{
2819
+ nor -> params = devm_kzalloc (nor -> dev , sizeof (* nor -> params ), GFP_KERNEL );
2820
+ if (!nor -> params )
2821
+ return - ENOMEM ;
2822
+
2804
2823
spi_nor_info_init_params (nor );
2805
2824
2806
2825
spi_nor_manufacturer_init_params (nor );
@@ -2812,6 +2831,8 @@ static void spi_nor_init_params(struct spi_nor *nor)
2812
2831
spi_nor_post_sfdp_fixups (nor );
2813
2832
2814
2833
spi_nor_late_init_params (nor );
2834
+
2835
+ return 0 ;
2815
2836
}
2816
2837
2817
2838
/**
@@ -2822,14 +2843,14 @@ static void spi_nor_init_params(struct spi_nor *nor)
2822
2843
*/
2823
2844
static int spi_nor_quad_enable (struct spi_nor * nor )
2824
2845
{
2825
- if (!nor -> params . quad_enable )
2846
+ if (!nor -> params -> quad_enable )
2826
2847
return 0 ;
2827
2848
2828
2849
if (!(spi_nor_get_protocol_width (nor -> read_proto ) == 4 ||
2829
2850
spi_nor_get_protocol_width (nor -> write_proto ) == 4 ))
2830
2851
return 0 ;
2831
2852
2832
- return nor -> params . quad_enable (nor );
2853
+ return nor -> params -> quad_enable (nor );
2833
2854
}
2834
2855
2835
2856
/**
@@ -2844,7 +2865,7 @@ static int spi_nor_quad_enable(struct spi_nor *nor)
2844
2865
static int spi_nor_unlock_all (struct spi_nor * nor )
2845
2866
{
2846
2867
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 );
2848
2869
2849
2870
return 0 ;
2850
2871
}
@@ -2875,7 +2896,7 @@ static int spi_nor_init(struct spi_nor *nor)
2875
2896
*/
2876
2897
WARN_ONCE (nor -> flags & SNOR_F_BROKEN_RESET ,
2877
2898
"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);
2879
2900
}
2880
2901
2881
2902
return 0 ;
@@ -2899,7 +2920,7 @@ void spi_nor_restore(struct spi_nor *nor)
2899
2920
/* restore the addressing mode */
2900
2921
if (nor -> addr_width == 4 && !(nor -> flags & SNOR_F_4B_OPCODES ) &&
2901
2922
nor -> flags & SNOR_F_BROKEN_RESET )
2902
- nor -> params . set_4byte_addr_mode (nor , false);
2923
+ nor -> params -> set_4byte_addr_mode (nor , false);
2903
2924
}
2904
2925
EXPORT_SYMBOL_GPL (spi_nor_restore );
2905
2926
@@ -3004,7 +3025,6 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
3004
3025
struct device * dev = nor -> dev ;
3005
3026
struct mtd_info * mtd = & nor -> mtd ;
3006
3027
struct device_node * np = spi_nor_get_flash_node (nor );
3007
- struct spi_nor_flash_parameter * params = & nor -> params ;
3008
3028
int ret ;
3009
3029
int i ;
3010
3030
@@ -3055,20 +3075,22 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
3055
3075
mtd -> _write = spi_nor_write ;
3056
3076
3057
3077
/* 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 ;
3059
3081
3060
3082
if (!mtd -> name )
3061
3083
mtd -> name = dev_name (dev );
3062
3084
mtd -> priv = nor ;
3063
3085
mtd -> type = MTD_NORFLASH ;
3064
3086
mtd -> writesize = 1 ;
3065
3087
mtd -> flags = MTD_CAP_NORFLASH ;
3066
- mtd -> size = params -> size ;
3088
+ mtd -> size = nor -> params -> size ;
3067
3089
mtd -> _erase = spi_nor_erase ;
3068
3090
mtd -> _read = spi_nor_read ;
3069
3091
mtd -> _resume = spi_nor_resume ;
3070
3092
3071
- if (nor -> params . locking_ops ) {
3093
+ if (nor -> params -> locking_ops ) {
3072
3094
mtd -> _lock = spi_nor_lock ;
3073
3095
mtd -> _unlock = spi_nor_unlock ;
3074
3096
mtd -> _is_locked = spi_nor_is_locked ;
@@ -3091,7 +3113,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name,
3091
3113
mtd -> flags |= MTD_NO_ERASE ;
3092
3114
3093
3115
mtd -> dev .parent = dev ;
3094
- nor -> page_size = params -> page_size ;
3116
+ nor -> page_size = nor -> params -> page_size ;
3095
3117
mtd -> writebufsize = nor -> page_size ;
3096
3118
3097
3119
if (of_property_read_bool (np , "broken-flash-reset" ))
0 commit comments