Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bus: mvebu-mbus: Remove open coded "ranges" parsing

"ranges" is a standard property, and we have common helper functions for
parsing it, so let's use them.

Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Gregory Clement <gregory.clement@bootlin.com>
Link: https://lore.kernel.org/r/20230216181204.2895676-1-robh@kernel.org
Signed-off-by: Rob Herring <robh@kernel.org>

+8 -50
+8 -50
drivers/bus/mvebu-mbus.c
··· 1179 1179 return 0; 1180 1180 } 1181 1181 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 - 1218 1182 static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus, 1219 1183 struct device_node *np) 1220 1184 { 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; 1224 1188 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); 1228 1190 if (ret < 0) 1229 - return ret; 1191 + return 0; 1230 1192 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); 1233 1195 u8 target, attr; 1234 1196 1235 1197 /* 1236 1198 * An entry with a non-zero custom field do not 1237 1199 * correspond to a static window, so skip it. 1238 1200 */ 1239 - windowid = of_read_number(r, 1); 1240 1201 if (CUSTOM(windowid)) 1241 1202 continue; 1242 1203 1243 1204 target = TARGET(windowid); 1244 1205 attr = ATTR(windowid); 1245 1206 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); 1250 1208 if (ret < 0) 1251 1209 return ret; 1252 1210 }