@@ -1573,52 +1573,6 @@ spi_nor_find_best_erase_type(const struct spi_nor_erase_map *map,
15731573 return NULL ;
15741574}
15751575
1576- static u64 spi_nor_region_is_last (const struct spi_nor_erase_region * region )
1577- {
1578- return region -> flags & SNOR_LAST_REGION ;
1579- }
1580-
1581- /**
1582- * spi_nor_region_next() - get the next spi nor region
1583- * @region: pointer to a structure that describes a SPI NOR erase region
1584- *
1585- * Return: the next spi nor region or NULL if last region.
1586- */
1587- struct spi_nor_erase_region *
1588- spi_nor_region_next (struct spi_nor_erase_region * region )
1589- {
1590- if (spi_nor_region_is_last (region ))
1591- return NULL ;
1592- region ++ ;
1593- return region ;
1594- }
1595-
1596- /**
1597- * spi_nor_find_erase_region() - find the region of the serial flash memory in
1598- * which the offset fits
1599- * @map: the erase map of the SPI NOR
1600- * @addr: offset in the serial flash memory
1601- *
1602- * Return: a pointer to the spi_nor_erase_region struct, ERR_PTR(-errno)
1603- * otherwise.
1604- */
1605- static struct spi_nor_erase_region *
1606- spi_nor_find_erase_region (const struct spi_nor_erase_map * map , u64 addr )
1607- {
1608- struct spi_nor_erase_region * region = map -> regions ;
1609- u64 region_end = region -> offset + region -> size ;
1610-
1611- while (addr < region -> offset || addr >= region_end ) {
1612- region = spi_nor_region_next (region );
1613- if (!region )
1614- return ERR_PTR (- EINVAL );
1615-
1616- region_end = region -> offset + region -> size ;
1617- }
1618-
1619- return region ;
1620- }
1621-
16221576/**
16231577 * spi_nor_init_erase_cmd() - initialize an erase command
16241578 * @region: pointer to a structure that describes a SPI NOR erase region
@@ -1685,44 +1639,36 @@ static int spi_nor_init_erase_cmd_list(struct spi_nor *nor,
16851639 struct spi_nor_erase_region * region ;
16861640 struct spi_nor_erase_command * cmd = NULL ;
16871641 u64 region_end ;
1642+ unsigned int i ;
16881643 int ret = - EINVAL ;
16891644
1690- region = spi_nor_find_erase_region (map , addr );
1691- if (IS_ERR (region ))
1692- return PTR_ERR (region );
1693-
1694- region_end = region -> offset + region -> size ;
1645+ for (i = 0 ; i < map -> n_regions && len ; i ++ ) {
1646+ region = & map -> regions [i ];
1647+ region_end = region -> offset + region -> size ;
16951648
1696- while (len ) {
1697- erase = spi_nor_find_best_erase_type (map , region , addr , len );
1698- if (!erase )
1699- goto destroy_erase_cmd_list ;
1700-
1701- if (prev_erase != erase ||
1702- erase -> size != cmd -> size ||
1703- region -> flags & SNOR_OVERLAID_REGION ) {
1704- cmd = spi_nor_init_erase_cmd (region , erase );
1705- if (IS_ERR (cmd )) {
1706- ret = PTR_ERR (cmd );
1649+ while (len && addr >= region -> offset && addr < region_end ) {
1650+ erase = spi_nor_find_best_erase_type (map , region , addr ,
1651+ len );
1652+ if (!erase )
17071653 goto destroy_erase_cmd_list ;
1708- }
1709-
1710- list_add_tail (& cmd -> list , erase_list );
1711- } else {
1712- cmd -> count ++ ;
1713- }
17141654
1715- addr += cmd -> size ;
1716- len -= cmd -> size ;
1655+ if (prev_erase != erase || erase -> size != cmd -> size ||
1656+ region -> flags & SNOR_OVERLAID_REGION ) {
1657+ cmd = spi_nor_init_erase_cmd (region , erase );
1658+ if (IS_ERR (cmd )) {
1659+ ret = PTR_ERR (cmd );
1660+ goto destroy_erase_cmd_list ;
1661+ }
1662+
1663+ list_add_tail (& cmd -> list , erase_list );
1664+ } else {
1665+ cmd -> count ++ ;
1666+ }
17171667
1718- if (len && addr >= region_end ) {
1719- region = spi_nor_region_next (region );
1720- if (!region )
1721- goto destroy_erase_cmd_list ;
1722- region_end = region -> offset + region -> size ;
1668+ len -= cmd -> size ;
1669+ addr += cmd -> size ;
1670+ prev_erase = erase ;
17231671 }
1724-
1725- prev_erase = erase ;
17261672 }
17271673
17281674 return 0 ;
@@ -2463,8 +2409,8 @@ void spi_nor_init_uniform_erase_map(struct spi_nor_erase_map *map,
24632409 map -> uniform_region .offset = 0 ;
24642410 map -> uniform_region .size = flash_size ;
24652411 map -> uniform_region .erase_mask = erase_mask ;
2466- map -> uniform_region .flags = SNOR_LAST_REGION ;
24672412 map -> regions = & map -> uniform_region ;
2413+ map -> n_regions = 1 ;
24682414}
24692415
24702416int spi_nor_post_bfpt_fixups (struct spi_nor * nor ,
0 commit comments