@@ -1158,7 +1158,7 @@ static u8 spi_nor_convert_3to4_erase(u8 opcode)
11581158
11591159static bool spi_nor_has_uniform_erase (const struct spi_nor * nor )
11601160{
1161- return !!nor -> params -> erase_map .uniform_erase_type ;
1161+ return !!nor -> params -> erase_map .uniform_region . erase_mask ;
11621162}
11631163
11641164static void spi_nor_set_4byte_opcodes (struct spi_nor * nor )
@@ -1542,23 +1542,22 @@ spi_nor_find_best_erase_type(const struct spi_nor_erase_map *map,
15421542 const struct spi_nor_erase_type * erase ;
15431543 u32 rem ;
15441544 int i ;
1545- u8 erase_mask = region -> offset & SNOR_ERASE_TYPE_MASK ;
15461545
15471546 /*
15481547 * Erase types are ordered by size, with the smallest erase type at
15491548 * index 0.
15501549 */
15511550 for (i = SNOR_ERASE_TYPE_MAX - 1 ; i >= 0 ; i -- ) {
15521551 /* Does the erase region support the tested erase type? */
1553- if (!(erase_mask & BIT (i )))
1552+ if (!(region -> erase_mask & BIT (i )))
15541553 continue ;
15551554
15561555 erase = & map -> erase_type [i ];
15571556 if (!erase -> size )
15581557 continue ;
15591558
15601559 /* Alignment is not mandatory for overlaid regions */
1561- if (region -> offset & SNOR_OVERLAID_REGION &&
1560+ if (region -> flags & SNOR_OVERLAID_REGION &&
15621561 region -> size <= len )
15631562 return erase ;
15641563
@@ -1576,12 +1575,7 @@ spi_nor_find_best_erase_type(const struct spi_nor_erase_map *map,
15761575
15771576static u64 spi_nor_region_is_last (const struct spi_nor_erase_region * region )
15781577{
1579- return region -> offset & SNOR_LAST_REGION ;
1580- }
1581-
1582- static u64 spi_nor_region_end (const struct spi_nor_erase_region * region )
1583- {
1584- return (region -> offset & ~SNOR_ERASE_FLAGS_MASK ) + region -> size ;
1578+ return region -> flags & SNOR_LAST_REGION ;
15851579}
15861580
15871581/**
@@ -1612,16 +1606,14 @@ static struct spi_nor_erase_region *
16121606spi_nor_find_erase_region (const struct spi_nor_erase_map * map , u64 addr )
16131607{
16141608 struct spi_nor_erase_region * region = map -> regions ;
1615- u64 region_start = region -> offset & ~SNOR_ERASE_FLAGS_MASK ;
1616- u64 region_end = region_start + region -> size ;
1609+ u64 region_end = region -> offset + region -> size ;
16171610
1618- while (addr < region_start || addr >= region_end ) {
1611+ while (addr < region -> offset || addr >= region_end ) {
16191612 region = spi_nor_region_next (region );
16201613 if (!region )
16211614 return ERR_PTR (- EINVAL );
16221615
1623- region_start = region -> offset & ~SNOR_ERASE_FLAGS_MASK ;
1624- region_end = region_start + region -> size ;
1616+ region_end = region -> offset + region -> size ;
16251617 }
16261618
16271619 return region ;
@@ -1649,7 +1641,7 @@ spi_nor_init_erase_cmd(const struct spi_nor_erase_region *region,
16491641 cmd -> opcode = erase -> opcode ;
16501642 cmd -> count = 1 ;
16511643
1652- if (region -> offset & SNOR_OVERLAID_REGION )
1644+ if (region -> flags & SNOR_OVERLAID_REGION )
16531645 cmd -> size = region -> size ;
16541646 else
16551647 cmd -> size = erase -> size ;
@@ -1699,7 +1691,7 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
16991691 if (IS_ERR (region ))
17001692 return PTR_ERR (region );
17011693
1702- region_end = spi_nor_region_end ( region ) ;
1694+ region_end = region -> offset + region -> size ;
17031695
17041696 while (len ) {
17051697 erase = spi_nor_find_best_erase_type (map , region , addr , len );
@@ -1708,7 +1700,7 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
17081700
17091701 if (prev_erase != erase ||
17101702 erase -> size != cmd -> size ||
1711- region -> offset & SNOR_OVERLAID_REGION ) {
1703+ region -> flags & SNOR_OVERLAID_REGION ) {
17121704 cmd = spi_nor_init_erase_cmd (region , erase );
17131705 if (IS_ERR (cmd )) {
17141706 ret = PTR_ERR (cmd );
@@ -1727,7 +1719,7 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
17271719 region = spi_nor_region_next (region );
17281720 if (!region )
17291721 goto destroy_erase_cmd_list ;
1730- region_end = spi_nor_region_end ( region ) ;
1722+ region_end = region -> offset + region -> size ;
17311723 }
17321724
17331725 prev_erase = erase ;
@@ -2468,12 +2460,11 @@ void spi_nor_mask_erase_type(struct spi_nor_erase_type *erase)
24682460void spi_nor_init_uniform_erase_map (struct spi_nor_erase_map * map ,
24692461 u8 erase_mask , u64 flash_size )
24702462{
2471- /* Offset 0 with erase_mask and SNOR_LAST_REGION bit set */
2472- map -> uniform_region .offset = (erase_mask & SNOR_ERASE_TYPE_MASK ) |
2473- SNOR_LAST_REGION ;
2463+ map -> uniform_region .offset = 0 ;
24742464 map -> uniform_region .size = flash_size ;
2465+ map -> uniform_region .erase_mask = erase_mask ;
2466+ map -> uniform_region .flags = SNOR_LAST_REGION ;
24752467 map -> regions = & map -> uniform_region ;
2476- map -> uniform_erase_type = erase_mask ;
24772468}
24782469
24792470int spi_nor_post_bfpt_fixups (struct spi_nor * nor ,
@@ -2560,7 +2551,7 @@ spi_nor_select_uniform_erase(struct spi_nor_erase_map *map)
25602551{
25612552 const struct spi_nor_erase_type * tested_erase , * erase = NULL ;
25622553 int i ;
2563- u8 uniform_erase_type = map -> uniform_erase_type ;
2554+ u8 uniform_erase_type = map -> uniform_region . erase_mask ;
25642555
25652556 /*
25662557 * Search for the biggest erase size, except for when compiled
@@ -2599,8 +2590,7 @@ spi_nor_select_uniform_erase(struct spi_nor_erase_map *map)
25992590 return NULL ;
26002591
26012592 /* Disable all other Sector Erase commands. */
2602- map -> uniform_erase_type &= ~SNOR_ERASE_TYPE_MASK ;
2603- map -> uniform_erase_type |= BIT (erase - map -> erase_type );
2593+ map -> uniform_region .erase_mask = BIT (erase - map -> erase_type );
26042594 return erase ;
26052595}
26062596
0 commit comments