@@ -1179,74 +1179,32 @@ static int __init mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
11791179 return 0 ;
11801180}
11811181
1182- static int __init
1183- mbus_parse_ranges (struct device_node * node ,
1184- int * addr_cells , int * c_addr_cells , int * c_size_cells ,
1185- int * cell_count , const __be32 * * ranges_start ,
1186- const __be32 * * ranges_end )
1187- {
1188- const __be32 * prop ;
1189- int ranges_len , tuple_len ;
1190-
1191- /* Allow a node with no 'ranges' property */
1192- * ranges_start = of_get_property (node , "ranges" , & ranges_len );
1193- if (* ranges_start == NULL ) {
1194- * addr_cells = * c_addr_cells = * c_size_cells = * cell_count = 0 ;
1195- * ranges_start = * ranges_end = NULL ;
1196- return 0 ;
1197- }
1198- * ranges_end = * ranges_start + ranges_len / sizeof (__be32 );
1199-
1200- * addr_cells = of_n_addr_cells (node );
1201-
1202- prop = of_get_property (node , "#address-cells" , NULL );
1203- * c_addr_cells = be32_to_cpup (prop );
1204-
1205- prop = of_get_property (node , "#size-cells" , NULL );
1206- * c_size_cells = be32_to_cpup (prop );
1207-
1208- * cell_count = * addr_cells + * c_addr_cells + * c_size_cells ;
1209- tuple_len = (* cell_count ) * sizeof (__be32 );
1210-
1211- if (ranges_len % tuple_len ) {
1212- pr_warn ("malformed ranges entry '%pOFn'\n" , node );
1213- return - EINVAL ;
1214- }
1215- return 0 ;
1216- }
1217-
12181182static int __init mbus_dt_setup (struct mvebu_mbus_state * mbus ,
12191183 struct device_node * np )
12201184{
1221- int addr_cells , c_addr_cells , c_size_cells ;
1222- int i , ret , cell_count ;
1223- const __be32 * r , * ranges_start , * ranges_end ;
1185+ int ret ;
1186+ struct of_range_parser parser ;
1187+ struct of_range range ;
12241188
1225- ret = mbus_parse_ranges (np , & addr_cells , & c_addr_cells ,
1226- & c_size_cells , & cell_count ,
1227- & ranges_start , & ranges_end );
1189+ ret = of_range_parser_init (& parser , np );
12281190 if (ret < 0 )
1229- return ret ;
1191+ return 0 ;
12301192
1231- for ( i = 0 , r = ranges_start ; r < ranges_end ; r += cell_count , i ++ ) {
1232- u32 windowid , base , size ;
1193+ for_each_of_range ( & parser , & range ) {
1194+ u32 windowid = upper_32_bits ( range . bus_addr ) ;
12331195 u8 target , attr ;
12341196
12351197 /*
12361198 * An entry with a non-zero custom field do not
12371199 * correspond to a static window, so skip it.
12381200 */
1239- windowid = of_read_number (r , 1 );
12401201 if (CUSTOM (windowid ))
12411202 continue ;
12421203
12431204 target = TARGET (windowid );
12441205 attr = ATTR (windowid );
12451206
1246- base = of_read_number (r + c_addr_cells , addr_cells );
1247- size = of_read_number (r + c_addr_cells + addr_cells ,
1248- c_size_cells );
1249- ret = mbus_dt_setup_win (mbus , base , size , target , attr );
1207+ ret = mbus_dt_setup_win (mbus , range .cpu_addr , range .size , target , attr );
12501208 if (ret < 0 )
12511209 return ret ;
12521210 }
0 commit comments